Live coding in Ableton Live – Verrassend expressief
Gepubliceerd op woensdag 21 februari 2024
Live coding: programmaregels typen die direct leiden tot muziek. Griezelig. Maar jij, Ableton Live-gebruiker, bent op zoek naar een nieuwe manier om muzikaal creatief te zijn. Je zoekt een unieke tool voor je gereedschapskist om je fans – thuis of op het podium (#algorave) – te pleasen en verbazen. Maak dus vlug de nerd in jezelf wakker en laat Sonic Pi binnenkomen in Ableton. Gastblogger Hens Zimmerman wijst de weg.
Afbeelding 1: Ableton Link. Straks meer daarover.
Sonic Pi: compleet en gratis
Sonic Pi is een van de populairste programma’s voor het live coderen van muziek. Het is bovendien gratis en er wordt continu gewerkt aan de verbetering van het programma. De huidige versie 4.5.0 is beschikbaar voor MacOS (met verschillende versies voor zowel ARM als Intel microprocessors), Windows, Linux en Raspberry Pi OS.
Wie wil er nou typen
Het programmeren van muziek kan in eerste instantie misschien wat weerstand oproepen, want wie wil nou alles typen om muziek te maken? Maar het is een verrassend expressieve manier van muziek maken. Kleine wijzigingen in een stukje code kunnen tot drastische verschillen leiden. Door regels toe te voegen of weg te halen kun je je muziek ook mooi opbouwen. Ook is de documentatie en community van Sonic Pi erg goed. Een tutorial maakt onderdeel uit van het programma Sonic Pi en voor je het weet maak ook jij muziek. Het wordt tijd voor een voorbeeld. Dit kleine stukje code kun je kopiëren en in Sonic Pi plakken. Als je vervolgens op Run klikt, begint Sonic Pi muziek af te spelen:
live_loop :bax do # willekeurige melodie. use_random_seed 101 use_synth :prophet notes = (scale :d2, :phrygian, num_octaves: 3) 16.times do play notes.choose, release: 0.3, cutoff: rrand(70, 120) sleep 0.25 end end
Ruby, ben jij dat?
Uiteraard zullen we in dit artikel niet de gehele syntax van Sonic Pi behandelen, maar we kunnen er wel wat over zeggen. Wie al eens geprogrammeerd heeft, zal misschien denken dat dit op de programmeertaal Ruby lijkt (bekend van onder andere Ruby on Rails). Dat klopt. De programmeertaal van Sonic Pi is inderdaad gebaseerd op Ruby en veel concepten uit Ruby zijn dus ook bruikbaar in Sonic Pi.
Muzikaal experimenteren
Het bovenstaande stukje code genereert een willekeurige melodie. Sonic Pi is een taal die je uitnodigt om te experimenteren met muziek. De regel use_synth :prophet doet vermoeden dat Sonic Pi gebruik maakt van ingebouwde synthesizers. Inderdaad is er een groot aantal virtuele synthesizers beschikbaar binnen Sonic Pi. Maar je kunt ook gebruik maken van samples. Bij Sonic Pi wordt een aantal samples geleverd. De volgende code speelt bijvoorbeeld de beroemde ‘Amen break’ in een loop:
use_bpm 134 live_loop :bax2 do sample :loop_amen, beat_stretch: 4 sleep 4 end
Maar niets staat ons in de weg om eigen samples en loops te gebruiken:
use_bpm 70 live_loop :bax3 do sample "/Users/henszimmerman/Loop_003.wav", beat_stretch: 8 sleep 8 end
Ook voor jou
Sonic Pi is een buitengewoon compleet programma. In afbeelding 2 hieronder zie je hoe Sonic Pi eruitziet als het een stuk code uitvoert. In het hoofdscherm zie je zowel je programmacode als de resultaten van wat je doet. Linksboven in de interface van Sonic Pi typen we onze programmacode. Het is erg handig dat je code kunt aanpassen en pas hoort wat het resultaat is als je op de knop Run drukt (of Command R intoetst). Dit betekent dus ook dat je kunt deejayen met Sonic Pi en je muziek over de tijd kunt laten veranderen. Meerdere loops kunnen dwars door elkaar en volledig sync afspelen. En een loop is daarbij een heel breed concept: het kan zowel een sample zijn dat bijvoorbeeld 1 of 2 maten speelt, maar het kan ook een complexer stuk code zijn dat verschillende synthesizers gebruikt.
Eerst spelen met Sonic Pi voor je verder leest?
Voor wie Live coding een geheel nieuw concept is, is het misschien verstandig nu eerst eens wat uit te proberen met Sonic Pi. In de rest van dit artikel kijken we samen naar manieren om informatie uit te wisselen tussen Ableton Live en Sonic Pi. Zonder basiskennis van beide programma’s is de rest van dit artikel mogelijk wat abstract. Laat je er niet door afschrikken. Zelfs kinderen leren werken met Sonic Pi, dus jij kan het ook. Voordat je leert rennen moet je eerst leren lopen.
De deur openzetten voor Sonic Pi
Hoe laat je de magie van Sonic Pi binnenstromen in je geliefde Live-software? Aan de slag. Kwestie van klikken.
Audio van Sonic Pi naar Ableton Live
Misschien wil je on stage gebruik maken van zowel Sonic Pi als Ableton Live. Of misschien wil je je Sonic Pi algorave opnemen in Ableton Live. Dan is het handig om Sonic Pi binnen te laten komen in Ableton Live als audiobron. Alhoewel Sonic Pi multichannel audio interfaces ondersteunt, is een kleine truc gemakkelijker om je audio output van Sonic Pi terecht te laten komen in Ableton Live. Hiertoe installeer je de MacOS Blackhole driver. Blackhole is als het ware een virtuele kabel tussen verschillende programma’s. Als je Mac-geluid naar Blackhole uitstuurt, kun je alle programma’s die gebruik maken van Blackhole opnemen in Ableton Live. In afbeelding 3 hieronder zie je hoe je rechtsboven in MacOS kunt instellen dat Blackhole vanaf nu de output is van de audio van je Mac.
Afbeelding 3: Blackhole als audio output van je Mac.
Als je nu Sonic Pi start, zal dit programma automatisch gebruik maken van Blackhole. Dit kun je ook zien in de preferences van Sonic Pi (zie afbeelding 4).
Afbeelding 4: Sonic Pi maakt gebruik van Blackhole.
Nu hoeven we alleen nog aan Ableton Live te vertellen dat Blackhole de input van al de audio is. Als alternatief kun je in Audio Midi Setup (Command Shift U) een aggregaat device aanmaken waar zowel Blackhole als je standaard geluidshardware in staan. Dan behoud je de mogelijkheid om naast Blackhole ook de inputs van je geluidshardware te kiezen in Ableton Live. Maar voor deze blog post gebruiken we de botte-bijl-methode en is Blackhole de enige input van Ableton Live.
Afbeelding 5: Blackhole als input in Ableton Live (Live – Settings… – Audio).
Als je nu een audio track aanmaakt in Ableton Live en Ext. In kiest als input, komt Sonic Pi binnen als geluidsbron. Soms is het handig om Monitor op In te zetten in de audio track. En houd er rekening mee dat effecten als Beat Repeat alleen werken in Ableton Live als het transport loopt.
MIDI van Ableton Live naar Sonic Pi
We kunnen Sonic Pi natuurlijk ook zien als een virtueel instrument. Als het typen van noten en akkoorden misschien wat omslachtig lijkt, dan is het goed om te weten dat Sonic Pi ook open staat voor externe MIDI-commando’s. Hoe ziet dat eruit?
Als eerste hebben we een ‘brug’ nodig waar Ableton Live de MIDI naartoe kan sturen en Sonic Pi de MIDI uit kan lezen. Het meest voor de hand liggend is om de IAC Driver van MacOS hiervoor te gebruiken. Open Audio MIDI Setup (te vinden in de Finder onder Applications – Utilities). Onder MIDI Studio zie je waarschijnlijk nog meer MIDI-apparaten die je bij Bax Music hebt gekocht 😊. In afbeelding 6 zie je hoe het er bij mij op dit moment voorstaat.
Afbeelding 6: MIDI Studio in MacOS Audio MIDI Setup.
Als we dubbelklikken op IAC Driver, opent zich een nieuw venster. Hierin klikken we op het vinkje bij Device is online (zie afbeelding 7).
Afbeelding 7: IAC Driver is online.
In Sonic Pi kunnen we onder Preferences – IO zien dat Sonic Pi nu luistert naar onder andere de IAC Driver als MIDI input. Afbeelding 8 laat zien hoe het er op mijn computer uitziet, maar jij ziet misschien een andere configuratie. Als IAC Driver er maar tussen staat.
Afbeelding 8: Sonic Pi ziet de IAC MIDI driver. Yay!
Nu moet Ableton Live nog geconfigureerd worden om MIDI-noten naar Sonic Pi te sturen. Ook dit verloopt uiteraard via de IAC Driver. In de Preferences van Live onder Link Tempo MIDI zetten we een vinkje achter MIDI Ports – Out: IAC Driver in de kolom Track. In afbeelding 9 zie je hoe dat eruitziet.
Afbeelding 9: Ableton Live Preferences en IAC MIDI out geactiveerd.
We maken een MIDI-track aan in Ableton Live en kiezen de IAC Driver als MIDI out. Het MIDI-kanaal laten we gewoon op de default 1 staan. In afbeelding 10 zie je dat ik ook een clip heb gemaakt met wat noten erin die continu staat te loopen.
Afbeelding 10: Ableton Live stuurt MIDI-noten uit naar de IAC Driver.
Hopelijk heb je Sonic Pi nog open staan. We kunnen direct in het Cues-venster rechts in de interface van Sonic Pi zien dat er MIDI-informatie binnenkomt. Zolang Ableton Live blijft lopen, scrollen de MIDI events langs in het Cues-venster. In afbeelding 11 zie je hoe dat eruitziet. De Log- en Cues-vensters van Sonic Pi zijn superhandig om problemen op te lossen en te zien wat er gebeurt. Het gaat een beetje te ver voor deze blog post, maar Sonic Pi ondersteunt ook OSC (Open Sound Control), dus als dat jouw ding is kun je je lol op met Sonic Pi.
Afbeelding 11: Inkomende MIDI events in Sonic Pi in het Cues-venster.
De MIDI events die Sonic Pi ontvangt, hebben ongeveer de volgende vorm:
/midi:iac_driver_bus_1:1/note_on [53, 127]
Tussen de vierkante haken zie je respectievelijk het MIDI note-nummer (53 in dit geval) en de velocity (127 in dit geval). De communicatie tussen de twee programma’s is geregeld. Nu moeten we nog de code schrijven die luistert naar de juiste MIDI input en deze vertaalt naar wonderschone muziek. Dat ziet er bijvoorbeeld zo uit:
live_loop :bax6 do # Minder latency! use_real_time note, velocity = sync "/midi:iac_driver_bus_1:1/note_on" synth :rhodey, note: note, amp: velocity / 127.0 end
Het use_real_time commando maakt het mogelijk dat onze synthesizer in Sonic Pi met een minimum aan latency afspeelt. In de volgende regel lezen we respectievelijk note- en velocity-informatie van de IAC driver:
note, velocity = sync "/midi:iac_driver_bus_1:1/note_on"
Vervolgens kunnen we de variabelen note en velocity gebruiken zoals we willen. In dit geval maken we een Fender Rhodes-achtige synthesizer aan waarin we de note-informatie rechtstreeks kunnen gebruiken als waarde tussen 0 en 127 inclusief. Voor de velocity van de noot moeten we de gelezen waarde nog door 127.0 delen, omdat Sonic Pi een velocity-waarde verwacht in het bereik 0 tot 1. En zoals je misschien wel weet is MIDI velocity (net als MIDI CC) een waarde tussen 0 en 127 inclusief.
synth :rhodey, note: note, amp: velocity / 127.0
Als we op Run klikken speelt Sonic Pi onze MIDI-informatie uit Ableton Live keurig af met de ingebouwde :rhodey-synthesizer. In afbeelding 12 zie je waar de Run-button zit in Sonic Pi. Het is belangrijk dat je de naam van het MIDI event (/midi:iac_driver_bus_1:1/note_on) foutloos in je code hebt staan. Maar gelukkig kun je events uit het Cues-venster kopiëren en plakken in je code editor. 😅
Afbeelding 12: We runnen onze code in Sonic Pi.
MIDI van Sonic Pi naar Ableton Live?
En wat nou als we de zaak eens om willen draaien? Dat betekent dus dat we MIDI-informatie van Sonic Pi naar Ableton Live willen sturen. Ook dat kan! En er is ook nog wel een interessante reden om dit te ondernemen, want Sonic Pi kan heel gecontroleerd ‘willekeurige’ melodieën creëren binnen een heleboel bekende én exotische toonladders. In afbeelding 13 zie je dat Sonic Pi door middel van code completion helpt met het uitzoeken van één van de vele toonladders. Hoe prettig zou het zijn als we die MIDI-noten kunnen opnemen en verder gebruiken in Ableton Live?
Afbeelding 13: Code completion en toonladders in Sonic Pi.
We beginnen met een eenvoudige loop die met alleen Sonic Pi een melodie speelt:
live_loop :bax7 do use_random_seed 1 use_synth :dsaw notes = (scale :d2, :phrygian, num_octaves: 2) 16.times do play notes.choose, release: 0.1 sleep 0.25 end end
Als we na wat tweaken (probeer eens een ander getal achter use_random_seed) tevreden zijn, kunnen we deze melodie als MIDI events versturen naar Ableton Live. Omdat we de noot zowel willen horen in Sonic Pi als verzenden als MIDI event, zullen we deze tussentijds opslaan in een variabele n.
live_loop :bax8 do use_random_seed 1 use_synth :dsaw notes = (scale :d2, :phrygian, num_octaves: 2) 16.times do # Sla de volgende noot op in een variabele. n = notes.choose play n, release: 0.1 midi_note_on n, 100 sleep 0.25 midi_note_off n end end
Ableton Live moet alleen nog luisteren naar de IAC Driver. Wederom halen we de Preferences van Ableton Live erbij. Nu moeten we alleen de IAC Driver als MIDI input aanzetten. In afbeelding 14 zie je hoe dat eruitziet. Overigens kun je ook gerust de IAC driver zowel als MIDI input als als MIDI output aangevinkt laten.
Afbeelding 14: Ableton Live luistert naar MIDI input van de IAC Driver.
Je kunt je terecht afvragen waar in de code hierboven gezegd wordt dat we onze MIDI-noten naar de IAC Driver sturen. Inderdaad, dat doen we niet specifiek. Sonic Pi stuurt onze MIDI-noten naar alle beschikbare MIDI-apparaten. Voor zo’n eenvoudig voorbeeld maakt het niet veel uit, maar in de echte wereld wil je misschien meerdere MIDI-apparaten specifiek bedienen. Gelukkig is ook dat geen probleem. In de code hieronder spelen we een bas af in de eerste loop op MIDI-kanaal 1 (bax9) en een hogere melodie in de tweede loop op MIDI-kanaal 2 (bax10). Omdat beide loops een andere random seed als uitgangspunt nemen, spelen ze wel ieder op zich steeds dezelfde noten, maar verschillend voor beide loops. En omdat we ze allebei vissen uit de toonladder van D phrygian, klinken ze per definitie heel mooi bij elkaar. Ook hebben we in de eerste regel een BPM gedefinieerd. Zo meteen zullen we zien wat we daar nog meer aan hebben. Ook kun je zien dat Sonic Pi nu geen geluid meer maakt. We zenden enkel en alleen de MIDI-noot-informatie naar de IAC Driver.
use_bpm 110 live_loop :bax9 do use_random_seed 1 notes = (scale :d2, :phrygian, num_octaves: 2) 16.times do # Sla de volgende noot op in een variabele. n = notes.choose midi_note_on n, port: "iac_driver_bus_1", channel: 1 sleep 0.25 midi_note_off n, port: "iac_driver_bus_1", channel: 1 sleep 0.25 end end live_loop :bax10 do use_random_seed 42 notes = (scale :d3, :phrygian, num_octaves: 3) 16.times do # Sla de volgende noot op in een variabele. n = notes.choose midi_note_on n, port: "iac_driver_bus_1", channel: 2 sleep 0.25 midi_note_off n, port: "iac_driver_bus_1", channel: 2 sleep 0.25 end end
In Ableton Live maken we nu twee MIDI tracks aan die ieder een instrument bevatten. Voor de bas op MIDI-kanaal 1 kun je bijvoorbeeld een Analog Bass-preset gebruiken en voor de melodie op MIDI-kanaal 2 bijvoorbeeld een Analog Guitar & Plucked-instrument. Maar als jij liever Serum of Massive X gebruikt… laat je niet tegenhouden. In afbeelding 15 zie je dat de linker track luistert naar MIDI From IAC Driver channel 1 en de rechter track naar MIDI From IAC Driver channel 2. Ook zetten we het BPM van Ableton Live eveneens op 110, zodat Ableton Live’s effecten tempo gesynchroniseerd werken.
Afbeelding 15: Twee MIDI tracks met virtuele instrumenten in Ableton Live spelen muzieknoten uit Sonic Pi.
Maar het heeft nog een voordeel als Sonic Pi en Ableton Live het eens zijn over het BPM. Want als je nu een stukje opneemt, komen de MIDI notes in het juiste tempo in je Arrangement View terecht. In afbeelding 16 zie je hoe de MIDI-noot-informatie in Ableton Live terecht is gekomen. De noten zijn wel sync, omdat beide programma’s op 110 BPM lopen. Maar de muzieknoten in onze piano roll staan niet strak op het grid. Dat is natuurlijk gauw verholpen met het Quantize-commando, maar echt chic is het niet…
Afbeelding 16: MIDI-noten opgenomen in arrangement view. Sync, maar niet op het grid.
Geen gehink dankzij Ableton Link
Een oplossing hiervoor is Ableton Link, want ja, ook Sonic Pi ondersteunt Ableton Link. Ableton Link is een open source-technologie die apparaten en programma’s met elkaar in de pas laat lopen. Inmiddels ondersteunen veel fabrikanten van muziekapparatuur en programma’s Ableton Link. Zolang deze programma’s (‘peers’) op hetzelfde netwerk zitten, kunnen ze met elkaar in de pas blijven lopen. Veel Ableton Link-programma’s ondersteunen ook start- en stop-commando’s van andere Ableton Link-peers in het netwerk. Sonic Pi ondersteunt momenteel wél het start-commando, maar niet het stop-commando. Als we de programmaregel link_sync opnemen in ons Sonic Pi-script, wacht Sonic Pi op (bijvoorbeeld) Ableton Live, zodat de programma’s direct gesynchroniseerd starten.
Met Ableton Link kunnen we onze melodie strak laten meelopen met Ableton Live. We moeten nog wel een paar dingen instellen in beide programma’s om Ableton Link-functionaliteit te activeren. Laten we beginnen met Ableton Live. In de Preferences zetten we Show Link Toggle en Start Stop Sync aan. In afbeelding 17 zie je waar die instellingen zitten.
Afbeelding 17: Link-functionaliteit in Ableton Live aanzetten.
Vanaf nu zit er linksboven in het scherm van Ableton Live een Link-knop. We activeren Ableton Link door op de Link-knop te klikken, waardoor deze oplicht. In afbeelding 18 zie je hoe dat eruitziet.
Afbeelding 18: Link geactiveerd in Ableton Live.
In Sonic Pi vinden we een venster met de titel Link Metronome & Global Time Warp. Als je dit niet ziet, kun je het in de Preferences van Sonic Pi aanzetten (in de Editor-tab). In afbeelding 19 zie je dat we Link hebben geactiveerd en dat Sonic Pi ook vrolijk meldt dat Link connected is en dat er één peer is gevonden in het netwerk; dat is Ableton Live. Als je meerdere Ableton Link-apparaten bij de sessie betrekt, zal het aantal peers toenemen.
Afbeelding 19: Link geactiveerd in Sonic Pi.
Ook Ableton Live meldt nu in de blauwe knop die we eerder activeerden dat er ‘1 Link’ is. Hoera! Ableton Live en Sonic Pi kunnen nu synchroniseren via Ableton Link. Als je het onderstaande script nu in Sonic Pi plakt en op Run klikt, blijft Sonic Pi keurig wachten op het start-signaal van Ableton Live.
use_bpm 110 # Sonic Pi wacht tot Ableton Live gaat lopen. link_sync # 4 beats in een maat. quantum = 4 # proefondervindelijk bepaalde waarde # om sync strakker te trekken. phase = -0.034 # Deze loop speelt een melodie in D Phrygian. live_loop :bax11 do # De volgende regel synchroniseert deze loop # met Ableton Live. link quantum, phase use_random_seed 1 notes = (scale :d2, :phrygian, num_octaves: 2) 16.times do # Sla de volgende noot op in een variabele. n = notes.choose midi_note_on n, port: "iac_driver_bus_1", channel: 1 sleep 0.25 midi_note_off n, port: "iac_driver_bus_1", channel: 1 sleep 0.25 end end # Deze loop speelt de Amen break. live_loop :bax12 do # De volgende regel synchroniseert deze loop # met Ableton Live. link quantum, phase sample :loop_amen, beat_stretch: 4 end
Als we Ableton Live in opname zetten, begint Sonic Pi keurig op de eerste tel van een maat te spelen. De MIDI-noten lopen binnen en staan strak op het grid van Live. In afbeelding 20 zie je hoe het er bij mij uitziet. Als het goed is hoor je de Amen break ook gesynchroniseerd meelopen. Niet Ableton Live maar Sonic Pi speelt die loop af, dus het is wel zaak dat Sonic Pi gebruik maakt van je geluidskaart en niet nog naar Blackhole geroute staat. Uiteraard kun je Blackhole wel gebruiken in een situatie als deze en Blackhole gebruiken als input van een audio track in Ableton Live.
Afbeelding 20: Ableton Live loopt in de pas met Sonic Pi.
Wat kan Ableton Link nog meer?
Ook in bepaalde programmeertalen, zoals C++, Max, Lua en Python, bestaan modules of github repositories die om kunnen gaan met Ableton Link. Als je enthousiast bent geworden van Ableton Link, kun je kijken of je al apps of programma’s hebt die Ableton Link ondersteunen. Het fantastische Patterning 2 op de iPad ondersteunt bijvoorbeeld Link. Voor de modulaire synthesizer kun je gebruik maken van de maar 2 HP brede eurorack module ML:2. Ook Avid Pro Tools, Bitwig en Logic Pro ondersteunen Ableton Link. En ook als je deejay bent kun je Link gebruiken. De Denon SC6000 Prime kan bijvoorbeeld synchroniseren via Ableton Link. Ableton houdt overigens een lijst bij van producten die Ableton Link ondersteunen.
Happy live coding!
Zie ook
» Ableton Note – Leer werken met dit muzikale kladblok
» Arrangement templates in Ableton Live: kopiëren = inspireren
» Live editen in Ableton Live in 7 stappen
» Akkoorden ontdekken in Ableton Live – Gebruik deze tools!
» Menselijkheid en variatie in Ableton Live
» Zo gebruik je MIDI Polyphonic Expression (MPE) in Ableton Live
Nog geen reacties...