Homework 2

Max Jardetzky
MUSIC 220B (Winter 2021)
⟵ back to my portfolio


Generative Drum Machine + Soundscape: "Joystick Jam"

Files: performance.mp4, performance.wav, joystickjam.zip

Instructions: play the video/audio here or download and unzip the folder and open joystickjam.ck in miniAudicle



Description/Motivation:

Here were the instructions for this assignment:

Create an interactive software system, and compose a short piece by incorporating the following two elements:

element 1: element 2:
Initially, I really wanted to use my controller inputs while playing Rocket League to inform the high-level structure of a musical program.
However, I immediately ran into trouble trying to get miniAudicle to capture inputs while out of focus, and through research I soon found out that was impossible.

I began with the arpeggiator, running a predetermined cycle of chords with changes triggered by a button on the controller.
Adding chords and bass layers, I immediately implemented a function to gradually fade elements of choice in and out on their respective button presses.
Next, I located some drum samples, loaded them in, and programmed a kick sequence that chooses predetermined patterns based on a random number generator.
I made the snare trigger on beats 2 and 4 and the hihats on eighth notes, leaving those patterns static for simplicity's sake.

Having all the setup I needed, I went to work on the "generative" part. This began with programming in gradual tempo changes controlled by the player.
Next, I designed four modes meant for an xy-plane (joystick operation): split global gain, split global reverb, split global delay, and arpeggiator ADSR control.
When I say "split," I mean that one direction on the joystick corresponded to adjusting attributes for the synths and the other for the drums.
After playing around with settings for a bit, I arrived at a paradigm I was satisfied with.

Next, I wanted to create a dynamic low-pass filter, and I had used all but the triggers on the controller up to that point.
Because the input API used for the controller input in ChucK is prehistoric (sorry), the trigger input is constrained to one axis, limiting design possibilities.
I first tried to directly bind filter frequency to trigger axis position, but that opened the door for some nasty audio glitches and artifacting.
The next iteration (and the final) was to bind trigger axis position to positive/negative velocity and apply it to the frequency position at a constant rate.
This worked beautifully, and allowed for the high-precision filter control demonstrated in my performance.

Here is the control scheme I ended up using, if it interests you:

In addition, pressing any joystick down disables further input from it, effectively locking it in its current position; you must press it again to unlock it.

Thank you so much for your attention. I hope you thought this was cool!
- Max :)