# Ringen

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.

## Ringen maken

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

## Ringen Indexeren

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

## Ringen Gebruiken

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.

## Toonladders en Akkoorden zijn ringen

Handig om weten is dat de lijsten door `scale` en de `chord` opgeroepen, ook ringen zijn en jou toelaten willekeurige indexen te openen.

## Ring Bouwers

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.