We leren efficiënter om te springen met onze code door stukjes te herhalen of hergebruiken.
- Iteraties
- Functies
Zie Stap 1
-
Wat zijn iteraties?
Sonic Pi is gebaseerd op Ruby en de constructie om de computer te vertellen dat bepaalde code meerdere keren uitgevoerd moet worden is dus als volgt:
2.times do play 60 sleep 0.5 end
Dit betekent dat alle code tussen
doenendtwee maal uitgevoerd moet worden. Programmeurs noemen dit ook wel iteraties of "loops". Op deze manier kunnen we verder met Broeder Jakob! -
Breid je code uit met de bovenstaande iteratie.
Nota: je kan hieronder zien dat we sommige lijnen laten inspringen. Dit is om de code leesbaarder te maken. Op die manier is het makkelijker fouten terug te vinden als er iets mis gaat wanneer je op de play knop drukt. Je kan tweemaal op de spatiebalk drukken om een lijn te laten inspringen.
2.times do play 60 sleep 0.5 play 62 sleep 0.5 play 64 sleep 0.5 play 60 sleep 0.5 end
-
Wat zijn functies?
Als we vaker dezelfde stukjes code nodig hebben, kan het handig zijn om de betreffende commando's samen te voegen in een lijstje en dit lijstje een naam te geven. Als we daarna dan die naam gebruiken, begrijpt de computer dat dat lijstje van comando's uitgevoerd moet worden. In Sonic Pi gebeurt dat met een
definestatement (van "definitie") en dat ziet er als volgt uit:define :speel_noot do play 60 sleep 0.5 end
Dit maakt dus een functie met de naam "speel_noot" en als we die functie later aanroepen door deze naam te gebruiken, zullen de commando's:
play 60 sleep 0.5
uitgevoerd worden.
-
Stop het eerste stukje Broeder Jakob in een functie:
define :broeder do play 60 sleep 0.5 play 62 sleep 0.5 play 64 sleep 0.5 play 60 sleep 0.5 end
Als je nu op play drukt gebeurt er niets (al wordt de functie wel gemaakt en onthouden, daar merk je niets van omdat ze niet wordt aangeroepen). Door op het einde
broedertoe te voegen en het geheel af te spelen, maak je de functie en roep je ze ook aan. -
Maak nu het volledige lied Broeder Jakob op basis van de volgende noten:
C D E C C D E C
E F G E F G
G A G F E C G A G F E C
C G C C G C
En de volgende omzettingstabel:
C D E F G A B 60 62 64 65 67 69 71 -
We kunnen echter nog meer doen met functies! We kunnen het gedrag en/of de uitkomst van een functieaanroep veranderen door functies met parameters te maken waarvan we de waarde kunnen wijzigen. Zo'n parameter kunnen we namelijk in de functie definitie gebruiken en wanneer iemand de functie dan aanroept, krijgt de parameter een waarde mee.
Voor onze Broeder Jakob gaat dat als volgt in zijn werk:
define :broeder do |n| play n sleep 0.5 play n + 2 sleep 0.5 play n + 4 sleep 0.5 play n end
n is hier de parameter en deze nieuwe functie kan aangeroepen worden met bijvoorbeeld het commando:
broeder 50
of
broeder 70
In het eerste geval zal dan het muziekje spelen met de noten 50, 52, 54 en 50; in het tweede geval 70, 72, 74 en 70.
-
Pas je functies zo aan dat je Broeder Jakob op verschillende toonhoogtes kan spelen
-
Extra: pas je code zo aan dat je Broeder Jakob aan verschillende snelheden kan afspelen door één parameter te veranderen.