Atelier Sonic Pi

La semaine dernière, j'ai animé un atelier à l'école d'ingénieurs de l'université d'Iowa, introduisant le langage et environnement Sonic Pi aux étudiants. Ce langage de programmation est conçu pour être utilisé dans des situations musicales de live coding. Il peut aussi être utilisé pour introduire la programmation à des personnes sans expérience.

Les étudiants étaient très curieux et actifs : nous avons eu le temps de couvrir tous les exemples et d'introduire la notion de live coding dans le contexte de musique électronique. Vous trouverez ci-dessous les extraits de code que j'ai utilisés pour cet atelier d'une heure.

Play a note

play 70
Cmd-R to run the code

Chord

play 72
play 75
play 79

Melody

play 72
sleep 1
play 75
sleep 1
play 79

Play with durations & pitch

Duration is in “beats”. Default BPM is 60, i.e. 1 beat is 1 second.
Pitch is the MIDI note number. Try 60.25 if you like eighth tones.

First option: amp
play 50, amp: 0.1
sleep 0.25
play 55, amp: 0.2
sleep 0.25
play 57, amp: 0.4
sleep 0.25
play 62, amp: 1

Using synthesizers

use_synth :saw
play 38
sleep 0.25
play 50
sleep 0.25
use_synth :tb303
play 38
use_synth :dsaw
play 50
use_synth :prophet
play 57

Envelopes

See https://sonic-pi.net/tutorial.html#section-2-1

Samples

sample :ambi_lunar_land
sample :ambi_drone, pan: -1

Choice of samples: see auto-completion on ambi_, guit_, drum_

Playback rate

sample :guit_e_slide, rate: 1
sample :guit_e_slide, rate: 0.5
sample :guit_e_slide, rate: 2

Randomisation

play rrand(60, 72)

Cmd-R several times. See what’s printed as information.
random vs. pseudo-random.

Let’s try a loop now:
loop do
play rrand(60, 72)
sleep 0.5
end

loop do
sample :perc_bell, rate: rrand(0.125, 1.5)
sleep rrand(0.2, 2)
end

Cutoff frequency for a low-pass filter

use_synth :tb303
loop do
play 50, release: 0.1, cutoff: rrand(60, 120)
sleep 0.125
end

Choose a random element in a list

loop do
play choose([60, 65, 72])
sleep 1
end

Random value between 0 and 1

loop do
play 60, amp: rand
sleep 0.25
end

Loops

3.times do
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
end

if then else with a “flip a coin” condition
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end

Intro to Live Coding

live_loop :foo do
play 60
sleep 1
end

live_loop :foo do
play rrand_i(60, 63)
sleep 0.5
end

live_loop :foo do
play choose([60, 65, 72])
sleep 0.5
end

live_loop :foo do
sample :loop_garzul, amp: 0.1
use_synth :prophet
play 2*rrand_i(30, 33)
sleep 0.5
end

Several loops must have different names
live_loop :foo do
sample :loop_garzul, amp: 0.1
sleep 1
end

live_loop :bar do
sample :bd_haus
sleep 0.4
end

Synchronize loops
live_loop :foo do
sample :loop_garzul, amp: 0.1
sleep 0.3
end

live_loop :bar do
sync :foo
sample :bd_haus
sleep 0.3
end

Tick through a ring

Local iteration over a ring in a live_loop
(ring 60, 62, 64) is a ring
[60, 62, 64].ring is a ring
Then, you apply the tick method:
[60, 62, 64].ring.tick

live_loop :foo do
play (ring 60, 62, 64, 65, 67).tick
sleep 0.7
end

Commentaires

Posts les plus consultés de ce blog

Geler un son avec Max/MSP/Jitter - Freeze!

Compositeurs, publiez vos partitions !

60/60 - Join the Creation!