Un grand moyen d’ajouter de l’intérêt à votre musique est d’utiliser des nombres aléatoires (“random”). Sonic Pi a des fonctions remarquables pour ajouter de l’aléatoire à votre musique, mais avant de commencer, nous devons apprendre une vérité choquante : dans Sonic Pi l’aléatoire n’est pas vraiment aléatoire. Qu’est-ce que cela signifie ? Eh bien, voyons-le.
Une fonction vraiment utile est rrand
qui vous donnera une valeur aléatoire comprise entre deux nombres : un min et un max. (rrand
est l’abréviation de “ranged random”). Essayons de jouer une note aléatoire :
play rrand(50, 95)
Oh, une note aléatoire a été jouée. La note 83.7527
a été jouée. Une note aléatoire sympathique entre 50 et 95. Wow , attendez, est-ce que je viens juste de prédire exactement la note que vous avez obtenue ? Quelque chose de louche se passe ici. Essayez d’exécuter le code une nouvelle fois. Comment ? 83.7527
a encore été choisie ? Ce ne peut être aléatoire !
La réponse est que ce n’est pas vraiment aléatoire, c’est pseudo-aléatoire. Sonic Pi vous donne une suite d’un semblant de nombres aléatoires de manière reproductible. C’est très utile pour s’assurer que la musique que vous avez créée sur votre machine sonnera de façon identique sur n’importe quelle autre machine - même si vous utilisez de l’aléatoire dans votre composition.
Bien sûr, dans un morceau de musique donné, si 83.7527
était choisi ‘aléatoirement’ à chaque fois, ce ne serait pas très intéressant. Ce n’est cependant pas le cas. Essayez ce qui suit :
loop do
play rrand(50, 95)
sleep 0.5
end
Oui ! Ca sonne enfin aléatoire. A l’intérieur d’un run donné, des appels successifs à des fonction aléatoires retournent des valeurs aléatoires. Cependant, une nouvelle exécution produira exactement la même séquence de valeurs aléatoires et sonnera exactement pareil. C’est comme si tout le code de Sonic Pi revenait en arrière exactement au même point de départ chaque fois que le bouton “Run” était pressé. C’est le “Un jour sans fin” de la synthèse musicale !
Une agréable illustration de l’aléatoire en action est l’exemple des cloches hantées qui fait boucler l’échantillon :perc_bell
avec une vitesse et un temps de repos aléatoires entre les sons de cloche :
loop do
sample :perc_bell, rate: (rrand 0.125, 1.5)
sleep rrand(0.2, 2)
end
Un autre exemple sympathique d’aléatoire est de modifier la limite d’un son de synthé aléatoirement. Un synthé super pour essayer cela est l’émulateur du :tb303
:
use_synth :tb303
loop do
play 50, release: 0.1, cutoff: rrand(60, 120)
sleep 0.125
end
Alors que faire si vous n’aimez pas cette particulière séquence de nombres aléatoires que fournit Sonic Pi ? Eh bien, c’est tout à fait possible de choisir un autre point de départ via use_random_seed
. La tête de série par défaut est 0, aussi choisissez une autre tête de série pour une expérience aléatoire différente !
Envisagez ce qui suit :
5.times do
play rrand(50, 100)
sleep 0.5
end
Chaque fois que vous exécuterez ce code, vous entendrez la même séquence de 5 notes. Pour obtenir une séquence différente, changez simplement la tête de série :
use_random_seed 40
5.times do
play rrand(50, 100)
sleep 0.5
end
Ceci va produire une séquence différente de 5 notes. En changeant le tête de série et en écoutant les résultats, vous pouvez trouver quelque chose que vous aimez - et quand vous le partagerez avec d’autres, ils entendront exactement ce que vous avez aussi entendu.
Jetons un œil sur d’autres fonctions aléatoires utiles.
Une chose très commune est de choisir un item aléatoirement dans une liste d’items connus. Par exemple, je peux vouloir jouer une note parmi les suivantes : 60, 65 ou 72. Je peux y arriver avec choose
qui me choisit un item dans une liste. En premier, je dois mettre mes nombres dans une liste, ce qui est réalisé en les encadrant entre crochets et en les séparant avec des virgules : [60, 65, 72]
. Ensuite, j’ai juste besoin de leur passer choose
:
choose([60, 65, 72])
Écoutons comment cela sonne :
loop do
play choose([60, 65, 72])
sleep 1
end
Nous avons déjà vu rrand
, mais examinons-le encore. Il retourne un nombre aléatoire entre deux valeurs exclues. Cela signifie qu’il ne retournera jamais soit la borne basse, soit la borne haute - toujours quelque chose entre les deux. Le nombre sera toujours un nombre flottant - ce qui signifie que ce n’est pas un nombre entier, mais une fraction de nombre. Exemple de flottants retournés par rrand(20, 110)
:
Occasionnellement, vous désirez un nombre entier aléatoire, pas un flottant. C’est là que rrand_i
arrive à la rescousse. Il fonctionne de façon similaire à rrand
sauf qu’il peut retourner potentiellement les valeurs minimales et maximales comme valeurs aléatoires (ce qui signifie que c’est inclusif plutôt qu’exclusif des bornes). Exemple de nombres retournés par rrand_i(20, 110)
:
Cette fonction va retourner un flottant aléatoire entre 0 (inclus) et la valeur maximale que vous spécifiez (exclue). Par défaut, elle retourne une valeur entre 0 et 1. C’est par conséquent utile pour choisir une valeur de amp:
aléatoire :
loop do
play 60, amp: rand
sleep 0.25
end
Similaire à la relation entre rrand_i
et rrand
, rand_i
retournera un nombre entier compris entre 0 et la valeur maximale que vous spécifierez.
Quelquefois, vous souhaitez émuler un jet de dé - c’est un cas particulier de rrand_i
où la valeur minimale est toujours 1. Un appel à dice
nécessite que vous spécifiez le nombre de faces du dé. Un dé standard a 6 faces, donc dice(6)
agira de manière très similaire - retournant l’une des valeurs 1, 2, 3, 4, 5, ou 6. Cependant, juste comme dans des jeux de rôle, vous pourriez trouver des dés à 4 faces, ou à 12 faces, peut-être même à 120 faces !
Finalement, vous pouvez souhaiter simuler la chance que vous avez de tomber sur le nombre le plus élevé d’un dé, soit 6 pour un dé standard. Ainsi one_in
retourne vrai (“true”) avec une probabilité de 1 sur le nombre de faces du dé. Par conséquent one_in(6)
retournera vrai avec une probabilité de 1 sur 6 ou faux (“false”) autrement. Les valeurs true
et false
sont très utiles pour les ordres if
que nous couvrirons dans une section suivante de ce tutoriel.
Maintenant allez et introduisez de l’aléatoire dans votre code !