Synchronisation avancée / échange d’informations

Get et Set

Observez le mécanisme suivant. Il introduit deux nouveaux éléments de langage, à savoir get et set. Comme leur nom l’indique, l’un sert à stocker une information sous un nom, et l’autre à la récupérer. Leur particularité réside dans le fait que le stockage et la récupération de l’information sont sensibles au système de scheduling du temps utilisé par Sonic-Pi pour gérer les différents évènements tout en respectant le temps :


live_loop :set do set :bob, [60, 65, 69].choose set :hop, [0.1, 0.2, 0.3].choose sleep 0.5 end live_loop :get do use_synth :fm play get[:bob], attack: get[:hop], release: get[:hop] sleep 0.5 end live_loop :another, sync: :get do use_synth :fm play get[:bob] + 12, attack: get[:hop], release: get[:hop] sleep 1 end

Pour être précis, get récupère l’information stockée dans le temps juste avant le temps actuel (l’instant t). Il faut donc veiller à ce que l’information requise par get soit émise strictement avant la récupération. Ces deux opérateurs stockent de l’information à un niveau assez bas de l’architecture de Sonic-Pi. Vous pouvez donc transférer des données entre différents threads ou live_loops sans craindre quoi que ce soit. Cela peut être extrêmement pratique si vous stocker l’aide de set le mouvement d’un bouton physique d’interface par exemple, ou si vous créez une fonction pour jouer avec un clavier MIDI, etc..

Cue et Sync

Nous avons jusqu’à présent utilisé une version simple — et souvent amplement suffisante — de sync. Il existe pourtant plus d’options, qui peuvent être pratiques dès lors que vous commencez à avoir un code assez complexe et dense.

Cue permet d’émettre un message de synchronisation, et sync de s’y référer. Le système est assez proche de celui que nous avons vu auparavant à une différence près. Tant que le message sync n’est pas reçue, l’exécution du code est bloquée ! Voici un exemple simple qui récapitule ce que nous avons vu depuis le début de l’article :


live_loop :raph do cue [:one, :two, :three].choose set :wait, [0.5, 0.3, 0.2].choose sleep 1 end live_loop :one do sync :one sample :ambi_choir, finish: get[:wait] end live_loop :two do sync :two sample :ambi_drone, finish: get[:wait] end live_loop :three do sync :three sample :ambi_dark_woosh, finish: get[:wait] end
Vous aurez remarqué que nous n’utilisons pas le type de synchronisation habituel. En utilisant sync au début de mes différents live_loops, j’ai tout bonnement stoppé l’exécution du code situé en aval. Si vous ne souhaitez pas entendre l’un des live_loops, ôtez tout simplement son nom de la liste. Même si votre boucle aura été jouée une première fois, elle ne sera plus jamais rejouée tant que vous ne déclencherez pas le message de synchronisation.

Tout comme le mécanisme vu précédemment, il faut donc donner un nom au message de cue en suivant la convention habituelle : cue :quelque_chose.

Encore plus

Il est possible d’aller encore plus loin en utilisant, comme pour OSC, des messages composés séparés par des barres obliques /. Vous n’éprouverez que très rarement le besoin de l’utiliser. Si vous souhaitez en savoir plus, je me sens ici chargé de vous renvoyer à la documentation officielle de Sonic-Pi sur la question. La traduction en français du guide consacré à cette fonction avancée a déjà été réalisée par l’équipe de traducteurs bénévoles du logiciel. Vous trouverez toutes les informations dont vous avez besoin dans la section “Correspondance de Motif” du guide officiel : Ctrl + I .