5.2 Herhaling en Loops

# Herhaling en Loops

Tot nu toe hebben we al een heleboel tijd besteed aan de verschillende klanken die we kunnen maken met de `play` en `sample` lijnen. We hebben ook geleerd deze met een zekere regelmaat te triggeren met behulp van `sleep`.

Zoals je waarschijnlijk hebt ontdekt, je kan *veel* plezier beleven met deze basis bouwstenen. Er zal echter een nieuwe wereld voor je opengaan wanneer je de kracht van code gaat gebruiken om structuur te geven aan jouw muziek en composities. In de volgende secties gaan we enkele van deze krachtige hulpmiddelen verkennen. Vooraleerst zijn herhaling en loop aan de beurt.

## Repetitieve herhaling

Heb je wat code geschreven dat je graag een paar keer wil herhalen? Bijvoorbeeld, zoiets als deze::

```
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
```

Wat als wij deze 3 keer willen herhalen? Nou simpel, we kunnen deze drie keer kopiëren en plakken:

```
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
```

Dat is wel een heleboel code! Wat als je nu de sample `:elec_plip` wil veranderen? Dan moet je de code helemaal afgaan en overal waar deze voorkomt vervangen door de nieuwe sample. En, nog belangrijker, wat als ik de code 50 of 1000 keer wil herhalen? Dat zou een heleboel code zijn, en heel wat regels wijzigen om een verandering te maken.

## Iteratie

In feite zou het herhalen van code zo eenvoudig moeten zijn als zeggen *doe dit drie keer*. Zo is het ook wel een beetje. Herinner je je onze oude vriend de code block nog? We kunnen hem gebruiken om het start- en eindpunt, van de code die we willen herhalen, aan te duiden. We gebruiken dan onze speciale code `3.times`. In plaats van *doe dit drie keer*, schrijven we `3.times do`, eenvoudig niet? Vergeet ook niet `end`op het einde van het te herhalen block te schrijven:

```
3.times do
  play 50
  sleep 0.5
  sample :elec_blup
  sleep 0.5
  play 62
  sleep 0.25
end
```

Nu is dat niet veel netter dan knippen en plakken! We kunnen dit gebruiken om allerlei leuke herhalende structuren te maken:

```
4.times do
  play 50
  sleep 0.5
end
8.times do
  play 55, release: 0.2
  sleep 0.25
end
4.times do
  play 50
  sleep 0.5
end
```

## Geneste Iteraties

We kunnen iteraties binnen andere iteraties plaatsen om interessante patronen te creëren. Bijvoorbeeld:

```
4.times do
  sample :drum_heavy_kick
  2.times do
    sample :elec_blip2, rate: 2
    sleep 0.25
  end
  sample :elec_snare
  4.times do
    sample :drum_tom_mid_soft
    sleep 0.125
  end
end
```

## Loop-en

Als je iets lang wil laten herhalen, ga je je misschien op betrappen van grote getallen te gebruiken zoals bv. `1000.times do`. In dat geval kan je Sonic Pi misschien beter opdragen van deze oneindig veel keer te herhalen ( als je tenminste niet op de stop-knop drukt,natuurlijk!) Laat ons de Amen Break eindeloos herhalen:

```
loop do
  sample :loop_amen
  sleep sample_duration :loop_amen
end
```

Belangrijk om weten is dat loops zich kunnen gedragen als zwarte gaten in je code. Eens de code in loop gaat, geraakt hij er niet meer uit tenzij je op stop drukt - de code blijft in deze loop doordraaien. Dit betekent dan, als je code hebt geschreven na de loop, je deze code *nooit* zal horen. In dit voorbeeld, zal de cymbaal na de loop nooit spelen:

```
loop do
  play 50
  sleep 1
end
sample :drum_cymbal_open
```

Nu gaan we de code structureren met iteratie en loops!
