Hi,
i made this little piece of code to explain sync for french people but the code is international !
# the definitive guide about sync in sonic pi
# nlb
# tous les 4 temps un signal, cue in english, nommé "go" est émis
#
#
live_loop :go do
sleep 4
end
# 1er cas : sync en tant que paramètre de live_loop
# une fois le signal reçu, la live_loop devient autonome elle vit sa vie. elle boucle
# pourquoi il faut attendre 4 temps avant que cette live_loop se lance ?
live_loop :foo, sync: :go do
sample :drum_cymbal_soft
sleep 0.5
end
# https://in-thread.sonic-pi.net/t/live-loops-sync-questions/1172/23?u=nlb
# Robin Newman explique très bien la situation
## In other words for a sync to work you should make sure
##| that the cue is sent AFTER the sync is waiting for it.
##| For two live_loops starting at the same time, delay the one you wish to sync to slightly
##| and they will then start together. (The second one waits for the first to send a cue as it starts).
## En d'autres mots, pour que la sync fonctionne assurez-vous que le signal est envoyé après
## que la boucle à synchroniser attend pour le signal
## Pour deux live_loops commençant au même moment, retardez la boucle sur laquelle vous voulez synchroniser
## et elles démarreront ensemble, la seconde attend que la première lui envoie le signal
# Au temps 0, "metronome" et "foo5" se lancent.
# delay: 1 provoque que le signal (cue) est envoyé un temps après le départ.
# regardez le journal !
# remplacer uncomment par comment pour ne pas entendre cette partie
comment do
(
live_loop :metronome, delay: 1 do
# delay start of this by 0.01 to allow other loops to be ready
use_synth :beep
play :a, amp:0.1
sleep 1
end
live_loop :foo5, sync: :metronome do
4.times do
sample :drum_cowbell, amp: 0.25
sleep 1
end
end
live_loop :foo6, sync: :metronome do
# faîtes des changements et [alt + R] tout reste synchronisé sur 4
sample :drum_bass_soft
sleep 0.5
sample :drum_bass_soft
sleep 0.5
sample :drum_snare_soft
sleep 1
end
)
end
# 2ème cas : sync à l'intérieur du bloc live_loop
# une fois le signal reçu, la live_loop devient autonome elle vit sa vie. elle boucle
comment do
(
# la boucle est lancée à chaque fois que le signal "four_beats" est reçu
# MAIS une live_loop peut recevoir ce signal UNIQUEMENT si elle n'est pas en train d'être executée
# sinon elle le loupe (rires...)
# tous les 4 temps on lance un signal "four_beats"
live_loop :four_beats do
sleep 4
end
# on prend un ring de 8 notes.
n = scale("c3", :major)
# on affiche la longueur de ce ring
puts n.length
# foo2 se lancera tous les 4 temps si elle est libre, non occupée
# notez qu'il n'y pas de sleep dans le bloc de la live_loop
# Ici une note est jouée puis on passe à la prochaine note de la gamme avec tick
live_loop :foo2 do
# stop
sync :four_beats
use_synth :prophet
play n.tick, sustain: 4, amp: 0.5
end
# foo3 se lancera tous les 4 temps si elle est libre, non occupée
# Pas de chance 8*0.5 = 4 temps donc elle n'est pas libre lorqu'elle reçoit le signal
# on peut se dire "que le musicien était tellement concentré à jouer qu'il n'a pas repris ses esprits
# pour voir que le chef d'orchestre lui disait "eh joue" donc il a compris que la prochaine fois, il doit jouer
live_loop :foo3 do
#stop
sync :four_beats
use_synth :piano
(n.length).times do
play n.tick
sleep 0.5
end
end
# foo4 est libre lorsqu'arrive le signal "four_beats"
# car elle dure un peu moins de 4 temps
live_loop :foo4 do
##| stop
sync :four_beats
(7).times do
sample :drum_bass_hard
sleep 0.5
end
sample :drum_bass_hard
sleep 0.49999999 # un peu plus court pour avoir le temps de relever la tête
end
)
end
Tout retour ou commentaire est le bienvenu !
Bonne lecture.