Maintenant que nous avons toutes les parties du morceau, on va voir
comment mettre tout ça ensemble. On a déjà vu comment fonctionnait
les live_loop
, pour rappel :
live_loop :hej do
play :C3
sleep 4
end
Définie une boucle live nommée hej
, qui tout les 4 temps va jouer la
note C3
. Si l’ont édite en live la boucle et que l’on change par
exemple la note, pour ensuite ré-évaluer (via le bouton Run), au
prochain tour la note prendra la nouvelle valeur. On peut de cette
manière contrôler chaque boucle de manière indépendante, et petit à
petit faire évoluer un morceau.
On peut avoir autant de boucles lives que souhaitées, par exemple :
live_loop :hej do
play :C3
sleep 4
end
live_loop :san do
play :E5
sleep 1
end
On a ici 2 boucles :
Si ces dernières sont créées en même temps, elles seront automatiquement synchronisées, car elles vont démarrer en même temps. Par contre, si on créé la seconde boucle un peu après la premère, elles ne seront pas synchronisées et joueront en décalé :
live_loop :hej do
play :C3
sleep 4
end
sleep 0.3
live_loop :san do
play :E5
sleep 1
end
Ce genre de décalage peut arriver aussi si l’on se trompe dans la valeur de sleep en voulant faire évoluer une boucle (ce qui arrive souvent) : par exemple, si au lieu d’attendre 1 temps, on attend 1/3 de temps, on va se retrouver également désynchronisé pour tout le reste du morceau.
Pour éviter ce genre de décalages, on peut demander à Sonic Pi de synchroniser des boucles, c’est à dire, de demander à une boucle de ne commencer qu’au début d’un temps :
live_loop :main do
sleep 1
end
sleep 0.4
live_loop :hej do
sync :main
play :C3
sleep 4
end
sleep 0.3
live_loop :san do
sync :main
play :E5
sleep 1
end
On a introduit une 3ème boucle nommée main
qui est déclenchée tous
les temps et ne fait rien.
Le mot clef sync
permet de synchroniser une boucle sur une autre,
ici, on force les boucles hej et san à ne démarrer que lorsque la
boucle main commence : peu importe les décalages, elles ne démarreront
qu’exactement sur un temps.
Un autre mot clef utile est stop
, il permet de stopper une boucle :
en ajoutant stop dans la boucle hej et en ré-évaluant, on arrête
de jouer la note C3 tout les 4 temps ; en enlevant à nouveau le
stop et en ré-évaluant, on joue à nouveau la note tout en restant
synchronisé. C’est très utile : on peut activer / désactiver des
boucles de cette manière.
On a enfin tout les éléments pour jouer Aerodynamic, voici le code
complet avec toutes les boucles nécessaires, en bonus, j’ai ajouté une
loop additionelle nommée extra_beat
qui peut s’avérer utile. Have
fun!
use_bpm 123
maquillage = "~/il-macquillage-lady.wav"
aerodynamic = "~/funk.wav"
load_sample maquillage
load_sample aerodynamic
define :sample_chunk do |what, beat, dur, delay|
beat = beat / 16.0
dur = dur / 16.0
sample what, beat_stretch: 16, start: beat, finish: beat + dur
sleep delay
end
define :funk do
# sample_chunk(aerodynamic, 0.0, 4.0, 4.0)
sample_chunk(maquillage, 0.0, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 0.25)
sample_chunk(maquillage, 3.5, 0.5, 0.75)
sample_chunk(maquillage, 0.0, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 1.0)
sample_chunk(maquillage, 7.5, 0.5, 0.5)
# sample_chunk(aerodynamic, 4.0, 4.0, 4.0)
sample_chunk(maquillage, 3.5, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 1.0)
sample_chunk(maquillage, 7.5, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 1.0)
sample_chunk(maquillage, 7.5, 0.5, 0.5)
# sample_chunk(aerodynamic, 8.0, 4.0, 4.0)
sample_chunk(maquillage, 0.0, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 0.25)
sample_chunk(maquillage, 3.5, 0.5, 0.75)
sample_chunk(maquillage, 0.0, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 1.0)
sample_chunk(maquillage, 7.5, 0.5, 0.5)
# sample_chunk(aerodynamic, 12.0, 4.0, 4.0)
sample_chunk(maquillage, 3.5, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.25, 0.0)
sample_chunk(maquillage, 2.5, 1.0, 0.25)
sample_chunk(maquillage, 3.5, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.25, 0.25)
sample_chunk(maquillage, 3.5, 0.5, 0.5)
sample_chunk(maquillage, 8.5, 0.5, 0.5)
sample_chunk(maquillage, 2.5, 1.0, 1.0)
sample_chunk(maquillage, 7.5, 0.5, 0.5)
end
# Live loops
live_loop :main do
sleep 4
end
live_loop :funk do
sync :main
with_fx :ixi_techno, mix: 0.1, phase: 8, cutoff_min: 90, cutoff_max: 120, res: 0.9, amp: 1 do
with_fx :bpf, mix: 0, res: 0.00001, centre: :B8, amp: 2 do
funk
end
end
end
live_loop :solo do
sync :main
use_synth :zawa
use_synth_defaults attack: 0.05, sustain: 0.15, release: 0.125
phases = [
[:D4, :Fs3, :B3, :Fs3],
[:D4, :Gs3, :B3, :Gs3],
[:G4, :B3, :E4, :B3],
[:E4, :A3, :Cs4, :A3],
[:D4, :Fs4, :B3, :Fs4],
[:D4, :Gs4, :B3, :Gs4],
[:G4, :B3, :E4, :B3],
[:E4, :A3, :Cs4, :A3],
]
phases.each do |notes|
4.times do
notes.each do |n|
play n
sleep 0.25
end
end
end
end
live_loop :extra_beat do
sync :main
32.times do
tick
sample :bd_fat, amp: 2 if spread(1, 16).look
sample :bd_fat, amp: 1.5 if spread(1, 32).rotate(4).look
synth :cnoise, release: 0.6, cutoff: 130, env_curve: 7, amp: 1 if spread(1, 16).rotate(8).look
synth :cnoise, release: 0.1, cutoff: 130, env_curve: 7, amp: 0.25 if spread(1, 2).look
sleep 0.125
end
end
live_loop :intro do
stop # remove me if you want bells
sync :main
use_synth :pretty_bell
use_synth_defaults release: 9
with_fx :level, amp: 0.5 do
4.times do
with_fx :gverb, room: 20 do
play :A1, amp: 0.25
play :A2, amp: 0.5
play :A3, amp: 1.5
play :A4, amp: 0.75
play :A5, amp: 0.5
sleep 8
end
end
end
end