This script was spurred by the comments around the forum desiring a means to automatically trigger sound effects, but the direction I've taken it kind of results in being able to create small API scripts on-the-fly. <a href="https://github.com/Lithl/roll20-api-scripts/tree/t" rel="nofollow">https://github.com/Lithl/roll20-api-scripts/tree/t</a>... Depends on: splitArgs This is only version 0.2 right now, and it is still very much a work in progress. The primary features are: Create alias names for tracks or playlists in your jukebox. Aliases not only map a single word to a track or playlist, but also store a play duration and play mode (inorder/random/all-at-once) for playlists. The play mode of the alias does not need to match the one on the actual playlist. Dynamically bind expressions to Roll20 events (ready, chat:message, add:object, change:object[:property], and destroy:object) Use !play to play an alias directly Expressions also have access to a play(alias) function, which will play the named alias sound(s) So, here's an example of the script in use. First, we get a sound: Then, we create an alias for it: And bind an expression to an event: !triggersfx change:graphic play('crit') Moving a token will now play the first 2 seconds of the "Crit 2 by neijer" track. This example is very simple, of course, but most code you could put into an API script could be used in your expression. You also have access to "msg" (for chat:message events), and both "obj" and "prev" (for add/change/destroy events): !triggersfx change:graphic (obj.get('top') === prev.top && Math.abs(obj.get('left') - prev.left) > 225) ? play('crit') : 0 You can always view your existing aliases and triggers: The API buttons let you view the alias/trigger in full detail, or delete them: I'll admit that in its current state, the script isn't the most user-friendly, as it not only requires you to write JavaScript for your triggers, it requires you to write "functional" code, the paradigm of lambda calculus, which is not the standard for JavaScript. (You'll notice my example above uses a ternary operator rather than an if condition -- this is because the ternary operator is functional programming and if is not.) I still have more work to do, but I figure I would share, since it works as-is if you understand what you're doing. If nothing else, it showcases dynamic event binding in Roll20. (Speaking of which, because we have no means to un bind events in the API, if you delete a trigger you'll have to restart the sandbox before it actually stops applying.)