Un’altra opzione interessante sulle liste standard sono gli anelli (ring). Se conosci un po’ di programmazione, potresti aver incontrato anelli buffer o anelli array. Qui, per comodità e semplicità, utilizzeremo solo anelli.
Nella sezione precedente abbiamo visto come accedere agli elementi di una lista utilizzando il sistema dell’indice:
puts [52, 55, 59][1]
Ora, cosa succede se vogliamo l’indice 100
? Beh, ovviamente non c’è nessun elemento all’indice 100 perché la lista contiene solo 3 elementi. Sonic Pi restituirà nil
che significa nulla.
Tuttavia, consideriamo di avere un contatore come, ad esempio, la pulsazione corrente che viene incrementata di continuo. Creiamo il nostro contatore e la nostra lista:
counter = 0
notes = [52, 55, 59]
Possiamo usare il nostro contatore per accedere alle note nella lista:
puts notes[counter]
Bene, abbiamo 52
. Ora, incrementiamo il nostro contatore per ottenere un’altra nota:
counter = (inc counter)
puts notes[counter]
Fantastico, ora abbiamo 55
e se lo facciamo di nuovo otteniamo 59
. Se, però, lo facciamo ancora, non avremo più numeri nella nostra lista e otterremo nil
. E se volessimo tornare all’inizio della lista e ricominciare da capo? A questo servono gli anelli.
Abbiamo due modi per creare un anello. Possiamo usare ring
come funzione dell’elemento o ring come parametro:
(ring 52, 55, 59)
Oppure possiamo prendere una normale lista e convertirla in un anello inviando il messaggio .ring
:
[52, 55, 59].ring
Quando abbiamo un anello, possiamo usarlo esattamente come abbiamo fatto con le normali liste con l’eccezione che possiamo usare indici che sono negativi oppure di grandezza maggiore rispetto all’anello perché ripartiranno da capo e punteranno sempre a un elemento dell’anello:
(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
Diciamo che vogliamo utilizzare una variabile per rappresentare il battito corrente. Possiamo usarla come indice nel nostro anello per scegliere le note da suonare o i tempi di rilascio oppure qualsiasi altra cosa che abbiamo salvato nel nostro anello, indipendentemente dal numero di battiti in cui siamo.
Una cosa interessante da sapere è che liste restituite da scale
e chord
sono anche anelli e ci possiamo accedere con indici arbitrari.
Oltre a ring
ci sono una serie di altre funzioni che costruiranno un anello per noi.
range
ci invita a specificare un punto di partenza, uno di fine e la grandezza dei passi.bools
ci permette di usare 1
e 0
per rappresentare variabili booleane.knit
ci consente di unire una sequenza di valori ripetuti.spread
crea un anello di booleani con una distribuzione euclidea.Dai un’occhiata alla relativa documentazione per maggiori informazioni a riguardo.