Een interessante draai aan standaard lijsten zijn ringen. Als u wat programmeren weet, ben je misschien al ring buffers of ring array’s tegengekomen. Hier gaan we gewoon voor ring - het is kort en simpel.
In de vorige sectie over lijsten zagen we al hoe we elementen door het indexeer mechanisme uit hen konden halen:
puts [52, 55, 59][1]
War gebeurd er nu als je 100
wil indexeren? Wel er is duidelijk geen element bij index 100 daar de lijst enkel drie elementen bevat. Dus Sonic Pi zal nil
weergeven, wat niets betekent.
Stel nu even dat je een teller hebt en dat deze jouw huidige beat is die in snelheid toeneemt. Lat ons deze teller en lijst aanmaken:
counter = 0
notes = [52, 55, 59]
We kunnen nu onze teller gebruiken om toegang te krijgen tot een noot in onze lijst:
puts notes[counter]
Geweldig, we hebben 52
. Nu, laten we onze teller verhogen en krijg een andere noot:
counter = (inc counter)
puts notes[counter]
Super, we krijgen nu 55
en als wij het opnieuw doen krijgen we 59
. Als wij het nogmaals doen, raken onze cijfer op in onze lijst en krijgen we nil
. Wat als we bij het begin van de lijst weer willen beginnen? Dit is wat waar ringen voor zijn.
We kunnen ringen op twee manieren maken. We kunnen de ring
functie gebruiken met de elementen van de ring als parameters:
(ring 52, 55, 59)
Of we kunnen een normale lijst nemen en deze naar een ring omzetten door naar deze een .ring
bericht te zenden :
[52, 55, 59].ring
Eens we een ring hebben, kan je deze op exact de zelfde manier als gewone lijsten gebruiken met uitzondering dat je indexen kunt gebruiken die negatief zijn of groter dan de grootte van de ring, en altijd naar één van de elementen van de ring zullen omslaan:
(ring 52, 55, 59)[0] #=> 52
(ring 52, 55, 59)[1] #=> 55
(ring 52, 55, 59)[2] #=> 59
(ring 52, 55, 59)[3] #=> 52
(ring 52, 55, 59)[-1] #=> 59
Laten we zeggen dat we een variabele gebruiken om het nummer van de huidige beat te vertegenwoordigen. We kunnen dit als een index in onze ring gebruiken om noten te halen om te spelen of release tijden of alles wat nuttig zou kunnen zijn en we hebben opgeslagen in onze ring ongeacht het beat nummer dat we momenteel hebben.
Handig om weten is dat de lijsten door scale
en de chord
opgeroepen, ook ringen zijn en jou toelaten willekeurige indexen te openen.
Naast de ring
zijn er een aantal andere functies die een ring voor ons zullen bouwen.
range
nodigt je uit om een start en een eindpositie op te geven en de grootte van de stappen.bools
laten het gebruik van 1
s en 0
s om beknopte booleaans te vertegenwoordigen.knit
laat jou een sequentie met repeterende waarden breien.spread
creëert een ring van een boleaanse met een Euclidische distributie.Neem een kijkje naar hun respectievelijke documentatie voor meer informatie hierover.