Making generative sound and music with Ableton Live

I did a talk the other day at work on generative sound and music in Ableton Live. I didn't make any slides but some people asked if I had any so I thought it might be nice to instead make a quick blog post out of the topics I presented.

Patchwork, by Laurie Spiegel
The Wild Bull (Part 1), by Morton Subotnick

This is the kind of music I want to make. I have no idea how the above examples were produced, but I suspect each note and sound was not played or even programmed, considering the complexity of each piece. I also don't know how you come up with such complex sounds or patterns other than by discovering them by experimentation. So how can I use Live as a tool to generate sonic patterns and control sound in a way that better lets me explore it, rather than express an existing idea?

Sequencing and generating MIDI

Here's a simple sequencer implementation using Live's built-in MIDI effects:

A sequencer using Live's built-in MIDI effects

Here's how it works:

  1. Arpeggiator: used at trigger source; Rate controls rate of the sequence; Gate controls length of triggers
  2. Random: Mode determines whether or not the sequence will be played in order or randomly; Choices determines the length of the sequence; Chance determines likelihood of the next step being triggered or not
  3. Scale: notes will be quantized to the notes in the 2x2 grid

Sequencing values

Notes and velocity are the only available control inputs when using only Live, i. e. no external controllers or applications. You can route MIDI to different instruments or effects using the velocity and note filters of MIDI effect rack chains. Incoming velocity can be random or played, determining which chain will process MIDI.

Processing MIDI notes differently depending on their respective velocity

Audio feedback as a source of sound

Return channels can be fed back into themselves to provide sources of feedback—careful when doing this, you may hurt your ears or damage your speakers if you're not careful. I like sticking a Glue compressor at the end of each feedback channel to keep things under control. Feedback works best with effects that change over time, for example a frequency shifter followed by a simple delay effect:

Delay effect with dynamic pitch

Back to Max

I seem to have a love/hate relationship with Max. Every time I have an idea that for a Max patch the same thing happens: 1) bang out a rough working first iteration; 2) fix the obvious issues; 3) iterate, and get even more enthused about the project as things start sounding better. That's usually when the patch just stops working as expected or even at all. Turns out there are a few non-obvious things about Max that you need to be mindful of. For example, the position of elements in your patch will have an effect on the order in which events are processed. At first this seemed insane but I think I'm coming to see this as a useful feature (or maybe it's just a bad idea?) Another thing that I recently discovered is that the send and receive objects used for passing data around without cables makes that data available in the global scope, which is just asking for trouble. Then there's the naming of the objects in Max. Seriously, who the hell thought zl would be an appropriate name for an object that does list processing? And uzi for sending out a series of events in quick succession (I guess this was Cycling's idea of a joke?) This weird naming scheme (if you can call it that) makes finding the right object for the job incredibly frustrating at times, though the documentation seems to have improved. While these quirks do cause occasional frustration I'm finding that working with Max is getting easier. I've also realized that a key factor in keeping one's sanity while developing and especially for maintaining a patch over time is to keep things as clean as possible. There's nothing worse than trying to untangle a knot of a patch when fixing a bug. That said, I'm giving Max another chance. Let's see how long the relationship lasts this time.

Oh and as my first foray into the world of Max this year was to revisit an old Max for Live patch I started a few years ago. As expected, the patch was a total mess, in fact it didn't even work. So I re-started it and now it works again (for now). The inspiration for the patch came from reading about analogue shift registers, devices which were occasionally found in modular systems. Basically such devices allow you to route identical voltage (or MIDI) values to multiple sources in sequence. The concept is relatively generic so you can achieve all sorts of effects using it. In Live routing is done with velocity since I haven't found a way to take advantage of MIDI channel data. I recently uploaded a demonstration of what it can sound like, but I suggest just downloading it and trying it out for yourself to see what happens. Basically all you need is a Live set that consists of a single MIDI channel with: 1) the effect followed by 2) an instrument rack with chains configured to receive single velocity values between 1 and 8. Play some MIDI into the channel and you should hear the effect immediately. It can be subtle or profound depending on the input so be sure to try different sequences and note lengths.

Experimenting with custom delays in Ableton Live

I always find myself wanting to create new sounds in Live using the instruments and effects included with it. Since I started using it I've found that there are many, many ways of using the routing and effects in ways that one might normally look for a specific plug-in to achieve. Since I find most plug-ins distracting (and usually overpriced) I found that the effects Live comes bundled with are more than capable of creating the kinds of sounds I'm looking for. One effect I use all the time and that has a lot of potential for taking in new directions is a delay based on feedback using Live's auxiliary busses. I thought others might find this interesting so here's my slipshod article on how I like to do it.

The basics: creating an infinitely (boring, but useful) delay

1. Start a new empty Live set and create one audio channel called 'Delay loopback' and a return track called 'Delay'

2. Add a 'Simple delay' to the 'Delay' channel and set Feedback to 0% and Dry/Wet to 100%

3. Set 'Audio To' for the 'Delay' channel to 'Delay loopback' and enable 'Monitor -> In' on the 'Delay loopback' channel

Delay using Live's auxiliary busses

Now you can send audio via the auxiuliary sends on any audio playing channel and you'll get a delayed sound, but with no feedback. In this configuration you can turn up the auxiliary send on 'Delay loopback' to send 'A' in order to create feedback. Setting the send to 0.0dB (100%) will create an infinite delay.

Giving the delay a little more character

Add an 'Auto Filter' in low pass mode right before the delay effect in the Delay channel and set its frequency and Q value to 7kHz and 0.2, respectively. This will make the delay a bit nicer sounding while other sounds are playing over it since it doesn't interfere with the entire spectrum of the incoming sound. Of course the nature of the incoming sound makes a difference so you can try using different filtering modes and frequencies.

Filtering delay to soften the effect

Now if you set the auxiliary sends from your audio source and the delay loopback to maximum the delay effect will eventually clip (in a bad way).

Clipping can be avoided while having maxed out sends in a variety of ways. As long as the energy in the effect chain never grows you'll be safe. The trick is to find something that keeps the level below clipping in a way that doesn't compromise the quality of the sound. Personally I like using the Glue (for those of you with Live 9 beta) but the built-in compressor effect will work, too. Just make sure whatever you use does something to reduce the energy of sound passing through the effect. The settings and effects you use will usually vary depending on the nature of the incoming sound.

Control feedback with a volume-attenuating effect, such as a compressor

Try experimenting with the Q value on the Auto Filter. At some point the echo will go into self-oscillation but, depending on the settings of the device(s) in the effect chain you can keep this from sounding nasty. Again, different sounds and settings will give very different results so you'll just need to experiment. Pay attention in particular to gain and timing settings (e. g. attack and release of a compressor) as these will have pronounced effects on the sound. 

 Also try setting the delay type (by Ctrl-clicking the delay effect's title) to Repitch and to Time instead of Sync. This will allow you to make portamento like sounds from the delay, much like the sound you get on an analogue tape echo when changing the delay time.

Another thing to try is to add a Frequency Shifter to the beginning of the effect chain. Set it to Shift mode, 100% wet, LFO/S&H to random, rate to something on the very slow side, and width to 0%. This will add some detuning to the feedback, which gives it a sort of enhances the tape echo effect sound.

Finally, you probably would be best to group the whole effect into an Effect Rack and assign the various controls to macros with intuitive names. Not only does it make using the effect easier but you can also then re-use the effect in other Live sets.

Grouping/mapping effects in an Effect Rack

F.C. Judd

Discovered a new (old) pioneer of early electronic music: F.C. Judd.
  • Wikipedia
  • Discogs
  • Electronic Music and Musique Concrète—hard to find book written by Judd. No idea about its exact contents.
  • Practical Electronica—2011 documentary made of found footage from Judd's studio.

Polyrhythmic sequencer

I've been spending some more time with my sequencer idea for the Novation Launchpad using only the built-in MIDI functionality included in Live. The latest version makes it possible to play the sequence from step 1 to 8 while at the same time playing the same sequence but from steps 1 to n, where n is <= 8. In other words, it's possible to make a canon out of a sequence.

Besides this, each step's on/off, pitch, octave up/down, octave up every 3rd bar, random velocity, high velocity and short/long note length are programmable. Steps on the grid are arranged horizontally, that is, step 1 is represented by the first column, step 2 by the second, and so on. The sequences to play are determined by the last column of buttons on the Launchpad (normally used to play scenes in Live), where the top button plays a 1 step long sequence, and the last 8 steps. And the buttons on the top of the Launchpad are used to repeat the last step of the active sequence(s), which can be useful for hearing changes to steps.

Here's a short video of me messing around with the sequencer. It includes basic instructions on how the sequencer works:

To use the sequencer, download the Live set and place it in the Templates folder of your Live library. This way you can create new Live sets with the set without overwriting the original. You can also download a Live project that works like the one in the video above to try it for yourself. You'll need a Launchpad and Live's included MIDI plug-ins to use the sequencer.

Please send any comments or feedback to me via Twitter @mattpatey. Enjoy!

Four-operator FM synthesizer in SuperCollider

So a while back I decided to learn SuperCollider for fun. I thought the best way to start would be by creating something I was already familiar with so I could focus on learning SuperCollider and let my experience guide the thing I was building. I like FM synthesis and have some knowledge of how it works, so I thought this would be a good topic to use to explore SuperCollider. The result thus far is a headless (i.e. no graphics), monophonic, four-operator FM synthesizer that can be controlled via MIDI (it even responds to velocity!) Up next I think I'll be working on implementing polyphony or a GUI to control individual operators. In the meantime, feel free to get a copy of the source code.

8-step sequencer for Live + Launchpad

I've just uploaded an 8-step sequencer for Live that uses only Live effects and it doesn't require Max for Live. I owe some credit to Aurex's 8-Step V2 sequencer, which inspired me to make a sequencer using the Launchpad. My implementation is simpler and, in my opinion, easier to use. I also find that in being more limited my take on the sequencer encourages more experimentation with your patches rather than going for a shotgun approach of letting your sequencer do everything for you. Go ahead and try it and tell me what you think.