Effetti in pratica

Anche se dall’esterno possono sembrare semplici, gli effetti sono, in realtà, molto complessi al loro interno. Data la loro semplicità di utilizzo, spesso le persone ne abusano. Questo potrebbe non essere un problema se hai una macchina potente ma se, come me, usi un Rasberry Pi, devi fare attenzione a quante risorse chiedi alla macchina se vuoi essere sicuro che non ci siano interruzioni.

Guarda questo esempio:

loop do
  with_fx :reverb do
    play 60, release: 0.1
    sleep 0.125
  end
end

Con questo codice suoniamo la nota 60 con un tempo di rilascio molto breve. Siccome vogliamo del riverbero, abbiamo aggiunto un blocco di codice. Fin qui tutto bene, anche se…

Proviamo a vedere cosa fa esattamente il codice. Per prima cosa abbiamo un loop che significa che tutto quello che c’è al suo interno viene ripetuto all’infinito. Poi abbiamo un blocco with_fx. Questo significa che verrà creato un nuovo riverbero ogni ripetizione del loop. È come, sulla chitarra, avere un pedale del riverbero diverso per ogni corda. È figo poterlo fare ma non sempre è quello che vogliamo. Per esempio questo codice fa fatica a girare su un Raspberry Pi. La creazione del riverbero, l’utilizzo e il suo spegnimento sono gestiti da with_fx e questo potrebbe consumare preziosa potenza di calcolo.

Come possiamo fare per rendere il setup simile a quello dei chitarristi che hanno un pedale di riverbero dentro cui passa tutto il segnale? Molto semplice:

with_fx :reverb do
  loop do
    play 60, release: 0.1
    sleep 0.125
  end
end

Dobbiamo spostare il loop dentro il blocco with_fx. In questo modo creiamo un solo riverbero per tutte le note suonate nel nostro loop. Questo codice è molto più efficiente e funziona a meraviglia su un Rasberry Pi.

Un compromesso potrebbe essere usare with_fx in un’iterazione dentro a un loop:

loop do
  with_fx :reverb do
    16.times do
      play 60, release: 0.1
      sleep 0.125
    end
  end
end

In questo modo abbiamo tolto with_fx dalla parte interna del loop e creiamo un riverbero ogni 16 note.

Questo è un modo di fare talmente comune che with_fx lo supporta come opzione senza la necessità di scrivere un blocco di ripetizione 16.times:

loop do
  with_fx :reverb, reps: 16 do
    play 60, release: 0.1
    sleep 0.125
  end
end

I blocchi di codice con reps: 16 e 16.times do funzionano allo stesso modo. Quello con reps: 16 in pratica ripete il codice nel blocco do/end 16 volte per cui puoi usare entrambi i sistemi in modo intercambiabile scegliendo quello che preferisci.

Ricorda: non ci sono errori, solo possibilità. Tuttavia alcuni di questi approcci genereranno suoni e performance differenti. Fai un po’ di prove e trova l’approccio che, secondo te, suona meglio tenendo sempre in considerazione la questione delle performance della tua piattaforma.