A common thing you’ll likely find yourself wanting to do is to not only play a random note (see the previous section on randomness) but also make a random decision and based on the outcome run some code or some other code. For example, you might want to randomly play a drum or a cymbal. We can achieve this with an if
statement.
So, let’s flip a coin: if it’s heads, play a drum, if it’s tails, play a cymbal. Easy. We can emulate a coin flip with our one_in
function (introduced in the section on randomness) specifying a probability of 1 in 2: one_in(2)
. We can then use the result of this to decide between two pieces of code, the code to play the drum and the code to play the cymbal:
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end
Notice that if
statements have three parts:
Typically in programming languages, the notion of yes is represented by the term true
and the notion of no is represented by the term false
. So we need to find a question that will give us a true
or false
answer which is exactly what one_in
does.
Notice how the first choice is wrapped between the if
and the else
and the second choice is wrapped between the else
and the end
. Just like do/end blocks you can put multiple lines of code in either place. For example:
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
This time we’re sleeping for a different amount of time depending on which choice we make.
Sometimes you want to optionally execute just one line of code. This is possible by placing if
and then the question at the end. For example:
use_synth :dsaw
loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
This will play chords of different numbers with the chance of each note playing having a different probability.