Surfer sur des flux aléatoires

Dans le quatrième épisode de cette série de tutoriels, nous avons brièvement jeté un œil à l’aléation en codant des riffs grésillants de synthé. Vu comme l’aléation est une partie très importante de mes performances de DJ codeur en live, j’ai pensé qu’il serait utile d’en couvrir les bases plus en détail. Mettez votre casquette et surfons sur des flux aléatoires !

Il n’y a pas d’aléation

La première chose à savoir et qui pourrait vraiment vous surprendre en jouant avec les fonctions aléatoires de Sonic Pi, c’est qu’elles ne sont en fait pas vraiment aléatoires. Qu’est-ce que cela signifie ? Eh bien, faisons quelques essais. Commencez par imaginer un nombre dans votre tête entre 0 et 1. Gardez-le en tête et ne me le dîtes pas. Maintenant, laissez-moi deviner… est-ce que c’était 0.321567 ? Non ? Bah, je ne suis clairement pas bon à ce jeu. Essayons encore une fois, mais demandons à Sonic Pi de choisir un nombre cette fois. Lancez Sonic Pi version 2.7 ou plus et demandez lui un nombre aléatoire mais de nouveau ne me dites pas le résultat :

print rand

Et maintenant pour le truc… est-ce que c’était 0.75006103515625 ? Oui ! Ha, je vois que vous êtes un peu sceptique. C’était peut-être juste de la chance. Essayons encore. Cliquez sur ‘Run’ à nouveau et regardons ce qu’on obtient… Quoi ? Encore 0.75006103515625 ? Ca ne peut clairement pas être aléatoire ! Vous avez raison, ça ne l’est pas.

Qu’est-ce qui se passe ? En informatique, on appelle cela le déterminisme. Cela veut juste dire que rien n’a lieu par hasard et que tout a sa destinée. Votre version de Sonic Pi a le destin de toujours retourner 0.75006103515625 dans le programme ci-dessus. Cela peut sembler plutôt inutile, mais laissez-moi vous assurer, c’est une des parties les plus puissantes de Sonic Pi. Si vous persévérez, vous apprendrez comment compter sur la nature déterministe de Sonic Pi en ce qui concerne l’aléatoire et vous vous en servirez comme fondation dans vos compositions et performances de live coding.

Une mélodie aléatoire

Quand Sonic Pi démarre, il charge en fait en mémoire une séquence de 441 000 valeurs aléatoires pré-générées. Quand vous appelez une fonction aléatoire comme rand ou rrand, ce flux aléatoire est utilisé pour générer votre résultat. Chaque appel à une fonction aléatoire consomme une valeur de ce flux. Ainsi le dixième appel à une fonction aléatoire utilisera la dixième valeur du flux. Aussi, chaque fois que vous cliquez sur le bouton ‘Run’, le flux est réinitialisé pour cette exécution. C’est pour cela que j’ai pu prédire le résultat de rand et pourquoi la mélodie ‘aléatoire’ était la même à chaque fois. La version de Sonic Pi de chacun utilise exactement le même flux aléatoire ce qui est très important quand on commence à partager nos morceaux.

Utilisons cette connaissance pour générer une mélodie aléatoire répétable :

8.times do
 play rrand_i(50, 95)
 sleep 0.125
end

Tapez ceci dans un tampon étant libre et cliquez sur ‘Run’. Vous entendrez une mélodie de notes ‘aléatoires’ entre 50 et 95. Quand elle aura fini, cliquez sur ‘Run’ à nouveau pour entendre exactement la même mélodie à nouveau.

Des fonctions d’aléation pratiques

Sonic Pi contient un certain nombre de fonctions utiles pour travailler avec le flux aléatoire. Voici une liste de certaines des plus utiles :

Regardez leur documentation dans le système d’aide pour des informations détaillées et des exemples.

Réinitialiser le flux

Même si la capacité de répéter une séquence de notes choisies est essentielle pour vous permettre de rejouer une mélodie sur la piste de danse, ça pourrait ne pas être exactement la mélodie que vous souhaitez. Ne serait-ce pas génial si on pouvait essayez différentes mélodies et choisir celle qu’on préfère ? C’est ici que la vraie magie commence.

On peut régler le flux manuellement avec la fonction use_random_seed. En informatique, une graine aléatoire est le point de départ à partir duquel un nouveau flux de valeurs aléatoires peut fleurir. Essayons-le :

use_random_seed 0
3.times do
  play rrand_i(50, 95)
  sleep 0.125
end

Super, on récupère les trois premières notes de notre mélodie aléatoire ci-dessus : 84, 83 et 71. Cependant on peut maintenant changer la graine. Par exemple :

use_random_seed 1
3.times do
  play rrand_i(50, 95)
  sleep 0.125
end

Intéressant, on obtient 83, 71 et 61. Vous avez peut-être remarqué que les deux premiers nombres ici sont les mêmes que les deux derniers nombres d’avant : ce n’est pas une coïncidence.

Rappelez-vous que le flux aléatoire est juste une liste géante de valeurs pré-choisies. Choisir une graine aléatoire nous déplace juste en un point de la liste. Une autre manière de voir ça est d’imaginer un énorme jeu de cartes pré-mélangées. Utiliser une graine aléatoire, c’est couper le jeu en un point particulier. Ce qui est fabuleux avec ça c’est qu’on peut se déplacer dans le flux aléatoire, ce qui nous donne un énorme pouvoir quand on fait de la musique.

Revisitons notre mélodie aléatoire de huit notes avec cette nouvelle capacité de réinitialiser le flux, et mettons là dans une boucle interactive pour pouvoir expérimenter pendant qu’elle joue :

live_loop :random_riff do    
  use_random_seed 0
  8.times do
    play rrand_i(50, 95), release: 0.1
    sleep 0.125
  end
end

Maintenant, pendant qu’elle est en train de jouer, changez la valeur de la graine de 0 en quelque chose d’autre. Essayez 100, ou pourquoi pas 999. Essayez vos propres valeurs, expérimentez et amusez-vous : voyez quelle graine génère la mélodie que vous préférez.

Rassemblons tout

Le tutoriel de ce mois a été un plongeon bien technique dans les entrailles de la fonctionnalité aléatoire de Sonic Pi. J’espère que cela vous a montré un peu comment elle marche et comment vous pouvez commencer à utiliser de l’aléatoire de manière fiable pour créer des motifs reproductibles dans votre musique. Il est important de souligner qu’on peut utiliser de l’aléatoire reproductible on veut. Par exemple, on peut rendre aléatoire l’amplitude des notes, le mix d’un effet, etc. Dans l’avenir nous regarderons de plus près certaines de ces applications, mais pour le moment je vais vous laisser avec un exemple court.

Tapez le code suivant dans un buffer disponible, cliquez sur ‘Run’ et commencez à modifier les graines, cliquez sur ‘Run’ de nouveau (pendant que le code tourne) et explorez les différents sons, rythmes et mélodies que vous pouvez créer. Quand vous en trouvez une qui sonne bien, notez la graine pour pouvoir y revenir plus tard. Enfin, quand vous aurez trouvé quelques graines qui vous plaisent, donnez un concert de live coding à vos amis en changeant simplement entre vos graines préférées pour créer un morceau entier.

live_loop :random_riff do
  use_random_seed 10300
  use_synth :prophet
  s = [0.125, 0.25, 0.5].choose
  8.times do
    r = [0.125, 0.25, 1, 2].choose
    n = (scale :e3, :minor).choose
    co = rrand(30, 100)
    play n, release: r, cutoff: co
    sleep s
  end
end
live_loop :drums do
  use_random_seed 2001
  16.times do
    r = rrand(0.5, 10)
    sample :drum_bass_hard, rate: r, amp: rand
    sleep 0.125
  end
end