Linguaggi di programmazione per la musica e il sound design¶
Altezze e tempo ¶
- Selezioniamo Buffer 0 (di default)
In [ ]:
play
- Clicchiamo sull'icona play
- Compare un messaggio di errore
In [ ]:
play(60)
- Clicchiamo sull'icona play
- Udiamo un Do per 1 secondo
In [ ]:
play 60
play 64
play 67
- Clicchiamo sull'icona play
- Udiamo un accordo di Do maggiore per 1 secondo
- Accordo = arpeggio velocissimo (scheduling)
In [ ]:
play 60
sleep 0.5
play 64
sleep 0.5
play 67
- Clicchiamo sull'icona play
- Udiamo una melodia con le note separate da 0.5 secondi (tempi delta)
- Se vogliamo settare il BPM
In [ ]:
use_bpm 50
play 60
sleep 0.5
play 64
sleep 0.5
play 67
- Schema di sequenza informatico (sequencing)
Argomenti¶
- Rappresentazione altezze in MIDI Note e Hertz
- Suoni periodici, non periodici e altezza
- Oscilloscopio (rappresentazione e GUI in Sonic Pi)
- Durata e Tempo delta
- Tempo assoluto (secondi) e tempo relativo (beat)
- Schema di sequenza
- Settare il BPM
Esercizio¶
- Scrivere una breve melodia
- Scrivere una breve sequenza di accordi
Loop ¶
In [ ]:
3.times do
play 60
sleep 0.5
play 62
sleep 0.5
play 64
sleep 0.5
play 60
sleep 0.5
end
- Attenzione all'indentazione
- Clicchiamo sull'icona play
- Come un ritornello musicale
- In informatica si definisce ciclo ed è una struttura di controllo come lo schema di sequenza
- Se vogliamo un loop infinito (pattern musicale)
In [ ]:
loop do
play 60
sleep 0.5
play 64
sleep 0.25
end
- Clicchiamo sull'icona play
- Clicchiamo sull'icona stop
- Possiamo specificare le altezze anche con la notazione alfabetica anglosassone
In [ ]:
play :c4
sleep 0.25
play :ds4
sleep 0.25
play :e4
sleep 0.25
play :f4
sleep 0.25
play :gf4
sleep 0.25
play :g4
sleep 0.25
play :a4
sleep 0.25
play :b4
sleep 0.25
play :c4
play :e4
play :g4
play :c5
Strumenti e timbro ¶
- Il suono che abbiamo sentito è stato generato dallo strumento di default che si chiama beep
- Possiamo modificarlo con la seguente sintassi: use_synth :nome_del_synth
In [ ]:
use_synth :fm
loop do
play 60
sleep 0.5
play 67
sleep 0.5
end
- Clicchiamo sull'icona play
- Clicchiamo sull'icona stop
- Esplorariamo il timbro dei diversi synth che abbiamo a disposizione cliccando sull’icona help in alto e poi su Synth in basso a sinistra
Argomenti¶
- Il timbro restituisce informazioni sulla sorgente sonora
- Cenni sul teorema di Fourier e alla DFT
- Dimensione del tempo $\rightarrow$ rappresentazione come forma d'onda
- Dimensione dello spettro $\rightarrow$ rappresentazione come spettrogramma
Esercizio¶
- Realizzare uno o più brevi sound design con strumenti cercati tra quelli a disposizione cercando di sfruttarne le caratteristiche sonore
Soundfiles ¶
- Eseguiamo dei soundfiles in playback
In [ ]:
sample :loop_amen
- Clicchiamo sull'icona play
- I soundfile hanno una loro durata assoluta
- Se vogliamo metterli in loop possiamo recuperarla automaticamente e settarla come beat (1.0)
In [ ]:
use_sample_bpm :loop_amen # 1 = lunghezza del sound file
2.times do
sample :loop_amen
sleep 1
end
- Se settiamo un valore in bpm senza recuperarlo dal sound file questo vale solo per i valori di sleep (tempi delta)
- La durata del sound file non viene modificata (stretching) come in Audacity o altre DAW
In [ ]:
use_bpm 50
loop do
sample :loop_amen # Durata non modificata
sleep 1 # 1 beat a 50 bpm
end
- Troviamo una collezione di soundfiles disponibili nel menù Campioni in basso a sinistra
- Se invece vogliamo caricare dei nostri soundfiles dobbiamo specificare il percorso assoluto (path)
In [ ]:
sample "/Users/andreavigani/Desktop/musicaecodice/anew/didattica/media/bach.wav"
Argomenti¶
- Playback
- Monofonia e polifonia realizzate con il rapporto tra durate e tempi delta
- Allocazione dinamica delle voci (come un pianoforte)
- Loop musicali come struttura formale
- Path percorso informatico
Esercizio¶
- Realizzare dei loop (monofonici e polifonici) attraverso la riproduzione (playback) di soundfiles propri o della collezione nativa di Sonic Pi
Polifonia e forkling (Multithread)¶
- Se vogliamo sovrapporre più voci (allocazione statica delle voci) possiamo sincronizzarle allo stesso beat
In [ ]:
use_sample_bpm :loop_amen # 1 = lunghezza del sound file
in_thread do # Voce 1
loop do
sample :loop_amen
sleep 1
end
end
in_thread do # Voce 2
16.times do
play 75
sleep 0.5
play 74
sleep 0.5
end
end
- Clicchiamo sull'icona play
- Clicchiamo sull'icona stop
Argomenti¶
- Thread o processo
- Sincronizzazione (monoritmia)
- Suddivisioni del beat
- Polifonia e Poliritmia
Esercizio¶
- Realizzare un breve brano a più voci indipendenti
- Ogni voce può essere eseguita da uno strumento diverso oppure contenere il playback di un soundfile in loop o meno.
Live coding¶
- Computer come strumento musicale
- Nuova forma musicale e nuova forma di rappresentazione
- Improvvisazione musicale scrivendo il codice al volo (on the fly coding)
In [ ]:
use_bpm 50
define :play_my_synth do # Definisce una funzione
use_synth :prophet
play 55
sleep 0.25
end
loop do
play_my_synth # La richiama
end
- Clicchiamo sull'icona play
- Commentiamo il blocco di codice che definisce il loop inserendo # all'inizio di ogni linea
- Modifichiamo uno o più parametri
- Clicchiamo nuovamente sull'icona playy
Argomenti¶
- Live coding
- Funzione
- Commenti
Esercizio¶
- Predisporre un ambiente per l'improvvisazione definendo diversi pattern musicali sotto forma di funzioni
- Ogni funzione può contenere un synth che esegue un pattern musicale oppure un soundfile
- Ogni funzione può essere richiamata all'interno dello stesso loop oppure possiamo predisporre dei forkling come illustrato nel paragrafo dedicato
- Realizzare con questo ambiente una piccola improvvisazione modificando i parametri dei loop o dei synth
Aggiungere FX (Effetti)¶
- Modificano un suono in ingresso
- Riverberi, equalizzatori, delay, distorsori
- Includiamo i generatori di suono in un blocco FX
- Player $\rightarrow$ Riverbero $\rightarrow$ Dac
In [ ]:
with_fx :reverb do
sample :guit_e_fifths
end
- Possiamo indentarli
- Il blocco che li racchiude è l'ultimo
- Player $\rightarrow$ Distorsore $\rightarrow$ Riverbero $\rightarrow$ Dac
In [ ]:
with_fx :reverb do
with_fx :distortion do
sample :guit_e_fifths
end
end
- Troviamo gli effetti disponibili nel menù Effetti in basso a sinistra
Argomenti¶
- Catene audio
- Generatori e modificatori
- Funzioni d'onda e funzioni di trasferimento
- Effetti a cascata o in parallelo (side chain)
Esercizio¶
- Prototipare alcuni strumenti virtuali costruendo l'algoritmo di sintesi attraverso una catena audio
- Impiegare configurazioni a cascata e/o in parallelo
- Applicare un Riverbero a tutti gli strumenti
Controllare i parametri¶
- Possiamo modificare dinamicamente i parametri di Synth, sampler e FX
- Troviamo una lista dei parametri modificabili di ognuno nel suo help file
- Per ogni parametro sono specificati i valori di default
- Alcuni parametri sono propri dello strumento impiegato, altri degli oggetti del linguaggio (come play)
Linguaggio¶
- Troviamo tutti gli oggetti da utilizzare nella sintassi del codice nel menù Linguaggio in basso a sinistra
- Gli help file ne illustrano le caratteristiche e propongono degli esempi
- A titolo esemplificativo apriamo play
In [ ]:
use_bpm 92
loop do
use_synth :dpulse
play 55, env_curve: 7, cutoff: 130, pan: -0.5
sleep 0.5
end
Random¶
- Funzioni non deterministiche per modificare i parametri
In [ ]:
use_bpm 92
use_synth :dpulse
loop do
play chord( :a3, :minor).choose,
attack: 0.01,
decay: rrand(0.01,0.2),
cutoff: rrand(40,131),
pan: rrand(-1,1),
amp: rand(0.3)
sleep 0.2
end
- Esercizio - scegliere un Synth o un FX e programmare un sound design che impieghi controlli dei parametri non deterministici (esplorare quello a disposizione)
Sequencing¶
- Sequenze deterministiche per modificare i programmi
- Partiture informatiche
In [ ]:
bpm = 120
use_synth :pluck
live_loop :ciccio do
use_bpm bpm
play_pattern [:D4,:D4,:A4,:A4,:B4,:B4] # tempo = 1
play :A4
sleep 2
play_pattern [67,67,66,66,64,64]
play chord(:D5, :M)
sleep 2
end
sleep 2 # aspetta 2 beat a 120
bpm = 82 # risetta il tempo metronomico
# Siccome il live_loop ha lo stesso nome sostituisce il precedente
live_loop :ciccio do # altezze suddivisioni
use_bpm bpm
play_pattern_timed [:D4,:D4,:A4,:A4,:B4,:B4,:A4], [1,1,1,1,1,1,2]
play_pattern_timed [67,67,66,66,64,64,62], [1,1,1,1,1,1,2]
end