Anelli

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.

Creare 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

Indicizzare gli anelli

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

Utilizzare gli anelli

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.

Scale e accordi sono anelli

Una cosa interessante da sapere è che liste restituite da scale e chord sono anche anelli e ci possiamo accedere con indici arbitrari.

Costruzione di anelli

Oltre a ring ci sono una serie di altre funzioni che costruiranno un anello per noi.

Dai un’occhiata alla relativa documentazione per maggiori informazioni a riguardo.