Sei sulla pagina 1di 316

Teoria e Tecnica della Musica Elettronica

(DRAFT: 30 Dicembre, 2006)

Miller Puckette

Traduzione: Cristiano Bocci


Versione Traduzione: 20 Ottobre 2017
M. Puckette, The theory and technique of electronic music:
Copyright 2007 by World Scientific Publishing Co. Pte. Ltd. Tutti i diritti
riservati.

Questa traduzione è rilasciata sotto licenza Creative Commons 2.5 di tipo


Attribuzione-Non commerciale.
Indice

Prefazione alla traduzione vii

Prefazione ix

Introduzione xi

1 Sinusoidi, ampiezza e frequenza 1


1.1 Misure di ampiezza . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Unità di ampiezza . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Controllare l’ampiezza . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Frequenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Sintetizzare una sinusoide . . . . . . . . . . . . . . . . . . . . . . 7
1.6 Segnali sovrapposti . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.7 Segnali periodici . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.8 Informazioni sugli esempi software . . . . . . . . . . . . . . . . . 14
Introduzione rapida a Pd . . . . . . . . . . . . . . . . . . . . . . 14
Come trovare ed eseguire gli esempi . . . . . . . . . . . . . . . . 16
1.9 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Riscalatore costante di ampiezza . . . . . . . . . . . . . . . . . . 16
Controllo di ampiezza in decibel . . . . . . . . . . . . . . . . . . 18
Controllo di ampiezza, senza irregolarità, tramite un generatore
di inviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Triade maggiore . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Conversione tra frequenza e tono . . . . . . . . . . . . . . . . . . 21
Ancora sulla sintesi additiva . . . . . . . . . . . . . . . . . . . . . 22
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2 Wavetables e campionatori 25
2.1 L’oscillatore wavetable . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2 Campionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3 Enveloping samplers . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4 Stretching del timbro . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.5 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.6 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Oscillatore wavetable . . . . . . . . . . . . . . . . . . . . . . . . . 44
Ricerca su wavetable in generale . . . . . . . . . . . . . . . . . . 45
Utilizzo di una wavetable come campionatore . . . . . . . . . . . 47
Campionatori a loop . . . . . . . . . . . . . . . . . . . . . . . . . 49

i
ii Indice

Campionatore a loop con sovrapposizione . . . . . . . . . . . . . 51


Precessione automatica del punto di lettura . . . . . . . . . . . . 53
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

3 Calcoli audio e di controllo 55


3.1 Il teorema di campionamento . . . . . . . . . . . . . . . . . . . . 55
3.2 Controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.3 Flussi di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4 Conversione da segnali audio a flussi numerici di controllo . . . . 63
3.5 Flussi di controllo nei diagrammi a blocchi . . . . . . . . . . . . . 64
3.6 Individuazione degli eventi . . . . . . . . . . . . . . . . . . . . . . 65
3.7 Segnali audio come controllo . . . . . . . . . . . . . . . . . . . . . 67
3.8 Operazioni sui flussi di controllo . . . . . . . . . . . . . . . . . . 69
3.9 Operazioni sui flussi di controllo in Pd . . . . . . . . . . . . . . . 70
3.10 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Campionamento e foldover . . . . . . . . . . . . . . . . . . . . . . 74
Convertire controlli in segnali . . . . . . . . . . . . . . . . . . . . 74
Lettore di wavetable non-looping . . . . . . . . . . . . . . . . . . 76
Da segnali a controlli . . . . . . . . . . . . . . . . . . . . . . . . . 78
Sequencer in stile analogico . . . . . . . . . . . . . . . . . . . . . 79
Sequencer in stile MIDI . . . . . . . . . . . . . . . . . . . . . . . 79
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

4 Automazione e gestione della voce 85


4.1 Generatori di inviluppo . . . . . . . . . . . . . . . . . . . . . . . 85
4.2 Forme di ampiezza lineari e curvilinee . . . . . . . . . . . . . . . 88
4.3 Cambiamenti di controllo continui e discontinui . . . . . . . . . . 90
4.3.1 Muting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.3.2 Switch-and-ramp . . . . . . . . . . . . . . . . . . . . . . . 92
4.4 Polifonia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
4.5 Allocazione vocale . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.6 Tags vocali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.7 Incapsulamento in Pd . . . . . . . . . . . . . . . . . . . . . . . . 97
4.8 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Generatore di inviluppo ADSR . . . . . . . . . . . . . . . . . . . 99
Funzioni di trasferimento per il controllo di ampiezza . . . . . . . 100
Sintesi additiva: campana di Risset . . . . . . . . . . . . . . . . . 102
Sintesi additiva: controllo dell’inviluppo spettrale . . . . . . . . . 105
Sintesi polifonica: campionatore . . . . . . . . . . . . . . . . . . . 106
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

5 Modulazione 113
5.1 Tassonomia degli spettri . . . . . . . . . . . . . . . . . . . . . . . 113
5.2 Moltiplicazione di segnali audio . . . . . . . . . . . . . . . . . . . 116
5.3 Waveshaping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.4 Modulazione di frequenza e di fase . . . . . . . . . . . . . . . . . 126
5.5 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Modulazione ad anello e spettri . . . . . . . . . . . . . . . . . . . 129
Octave divider e formant adder . . . . . . . . . . . . . . . . . . . 129
Waveshaping e differenza di toni . . . . . . . . . . . . . . . . . . 131

ii
Indice iii

Waveshaping utilizzando i polinomi di Chebychev . . . . . . . . . 134


Waveshaping usando una funzione esponenziale . . . . . . . . . . 134
Waveshaping sinusoidale: parità e disparità . . . . . . . . . . . . 135
Modulazione di fase e FM . . . . . . . . . . . . . . . . . . . . . . 137
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

6 Progettare spettri 141


6.1 Modello carrier/modulator . . . . . . . . . . . . . . . . . . . . . . 142
6.2 Treni di impulsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
6.2.1 Treni di impulsi tramite waveshaping . . . . . . . . . . . . 145
6.2.2 Treni di impulsi tramite wavetable stretching . . . . . . . 146
6.2.3 Spettri risultanti . . . . . . . . . . . . . . . . . . . . . . . 146
6.3 Modulazione ad anello mobile . . . . . . . . . . . . . . . . . . . . 150
6.4 Phase-aligned formant generator (PAF) . . . . . . . . . . . . . . 152
6.5 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Treno di impulsi wavetable . . . . . . . . . . . . . . . . . . . . . 156
Generatore semplice di formante . . . . . . . . . . . . . . . . . . 159
Segnale portante a due coseni . . . . . . . . . . . . . . . . . . . . 159
Il generatore PAF . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Stretched wavetables . . . . . . . . . . . . . . . . . . . . . . . . . 164
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

7 Spostamenti temporali e ritardi 165


7.1 Numeri complessi . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.1.1 Sinusoidi complesse . . . . . . . . . . . . . . . . . . . . . . 168
7.2 Spostamenti temporali e cambiamenti di fase . . . . . . . . . . . 169
7.3 Reti di ritardo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.4 Reti di ritardo ricircolanti . . . . . . . . . . . . . . . . . . . . . . 175
7.5 Conservazione della potenza e reti di ritardo complesse . . . . . . 179
7.6 Riverberazione artificiale . . . . . . . . . . . . . . . . . . . . . . . 182
7.6.1 Controllo dei riverberatori . . . . . . . . . . . . . . . . . . 185
7.7 Spostamenti variabili e frazionari . . . . . . . . . . . . . . . . . . 187
7.8 Fedeltà delle linee di ritardo interpolanti . . . . . . . . . . . . . . 189
7.9 Spostamento di tono (pitch shifting) . . . . . . . . . . . . . . . . 191
7.10 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Linea di ritardo fissa, non-interpolata . . . . . . . . . . . . . . . 196
Filtro a pettine ricircolante . . . . . . . . . . . . . . . . . . . . . 197
Linea di ritardo variabile . . . . . . . . . . . . . . . . . . . . . . . 197
Ordine di esecuzione e limiti inferiori sui tempi di ritardo . . . . 199
Ordine di esecuzione in linee di ritardo non-ricircolanti . . . . . . 202
Filtro a pettine non-ricircolante come octave doubler . . . . . . . 203
Filtro a pettine complesso variabile: shakers . . . . . . . . . . . . 203
Riverberatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Pitch shifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

iii
iv Indice

8 Filtri 209
8.1 Tassonomia dei filtri . . . . . . . . . . . . . . . . . . . . . . . . . 210
8.1.1 Filtri passa-basso e passa-alto . . . . . . . . . . . . . . . . 210
8.1.2 Filtri passa-banda ed elimina-banda . . . . . . . . . . . . 211
8.1.3 Filtri di equalizzazione . . . . . . . . . . . . . . . . . . . . 213
8.2 Filtri elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.2.1 Filtro elementare non-ricircolante . . . . . . . . . . . . . . 214
8.2.2 Filtro non-ricircolante, seconda forma . . . . . . . . . . . 216
8.2.3 Filtro elementare ricircolante . . . . . . . . . . . . . . . . 217
8.2.4 Filtri composti . . . . . . . . . . . . . . . . . . . . . . . . 217
8.2.5 Outputs reali da filtri complessi . . . . . . . . . . . . . . . 218
8.2.6 Due filtri ricircolanti al prezzo di uno . . . . . . . . . . . 219
8.3 Progettazione dei filtri . . . . . . . . . . . . . . . . . . . . . . . . 220
8.3.1 Filtro passa-basso ad un polo . . . . . . . . . . . . . . . . 220
8.3.2 Filtro passa-alto ad un polo ed uno zero . . . . . . . . . . 221
8.3.3 Filtro shelving . . . . . . . . . . . . . . . . . . . . . . . . 222
8.3.4 Filtro passa-banda . . . . . . . . . . . . . . . . . . . . . . 223
8.3.5 Filtri peaking ed elimina-banda . . . . . . . . . . . . . . . 224
8.3.6 Filtri di Butterworth . . . . . . . . . . . . . . . . . . . . . 225
8.3.7 Ridimensionando il cerchio unitario con funzioni razionali 226
8.3.8 Filtro passa-banda di Butterworth . . . . . . . . . . . . . 229
8.3.9 Coefficienti temporalmente variabili . . . . . . . . . . . . 230
8.3.10 Risposte agli impulsi dei filtri ricircolanti . . . . . . . . . 231
8.3.11 Filtri all-pass . . . . . . . . . . . . . . . . . . . . . . . . . 233
8.4 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
8.4.1 Sintesi sottrattiva . . . . . . . . . . . . . . . . . . . . . . 234
8.4.2 Envelope following . . . . . . . . . . . . . . . . . . . . . . 235
8.4.3 Modulazione a banda laterale singola . . . . . . . . . . . . 238
8.5 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Filtri prefabbricati passa-basso, -alto, -banda . . . . . . . . . . . 240
Filtro prefabbricato passa-banda variabile nel tempo . . . . . . . 241
Envelope followers . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Modulazione a banda laterale singola . . . . . . . . . . . . . . . . 243
Utilizzare filtri elementari direttamente: shelving e peaking . . . 243
Realizzazione e utilizzo di filtri all-pass . . . . . . . . . . . . . . . 246
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

9 Analisi e risintesi di Fourier 247


9.1 Analisi di Fourier di segnali periodici . . . . . . . . . . . . . . . . 247
9.1.1 Periodicità della trasformata di Fourier . . . . . . . . . . 248
9.1.2 Trasformata di Fourier come sintesi additiva . . . . . . . . 249
9.2 Proprietà delle trasformate di Fourier . . . . . . . . . . . . . . . 249
9.2.1 Trasformata di Fourier di DC . . . . . . . . . . . . . . . . 249
9.2.2 Spostamenti e cambiamenti di fase . . . . . . . . . . . . . 252
9.2.3 Trasformata di Fourier di una sinusoide . . . . . . . . . . 253
9.3 Analisi di Fourier di segnali non periodici . . . . . . . . . . . . . 254
9.4 Analisi di Fourier e ricostruzione di segnali audio . . . . . . . . . 257
9.4.1 Narrow-band companding . . . . . . . . . . . . . . . . . . 259
9.4.2 Timbre stamping (vocoder classico) . . . . . . . . . . . . 261
9.5 Fase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

iv
Indice v

9.5.1 Rapporti di fase tra i canali . . . . . . . . . . . . . . . . . 266


9.6 Phase bashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
9.7 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Analisi e risintesi di Fourier in Pd . . . . . . . . . . . . . . . . . 269
Companding a banda stretta: soppressione del rumore . . . . . . 271
Timbre stamp (“vocoder”) . . . . . . . . . . . . . . . . . . . . . . 272
Phase vocoder time bender . . . . . . . . . . . . . . . . . . . . . 274
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

10 Forme d’onda classiche 277


10.1 Simmetrie e serie di Fourier . . . . . . . . . . . . . . . . . . . . . 278
10.1.1 Onde a dente di sega e simmetria . . . . . . . . . . . . . . 280
10.2 Dissezione di forme d’onda classiche . . . . . . . . . . . . . . . . 281
10.3 Serie di Fourier delle forme d’onda elementari . . . . . . . . . . . 283
10.3.1 Onda a dente di sega . . . . . . . . . . . . . . . . . . . . . 284
10.3.2 Onda parabolica . . . . . . . . . . . . . . . . . . . . . . . 285
10.3.3 Onde triangolari e quadre simmetriche . . . . . . . . . . . 285
10.3.4 Onda triangolare generale (non-simmetrica) . . . . . . . . 286
10.4 Prevedere e controllare il foldover . . . . . . . . . . . . . . . . . . 287
10.4.1 Sovra-campionamento (Over-sampling) . . . . . . . . . . . 288
10.4.2 Onde triangolari subdole . . . . . . . . . . . . . . . . . . . 289
10.4.3 Transition splicing . . . . . . . . . . . . . . . . . . . . . . 289
10.5 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Combinando onde a dente di sega . . . . . . . . . . . . . . . . . . 292
Strategie per limitare in banda le onde a dente di sega . . . . . . 295
Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

Indice Analitico 297

Bibliografia 301

v
vi Indice

vi
Prefazione alla traduzione

Nel 2006 mi trovavo a Minneapolis per un semestre all’IMA (Institute for Mathe-
matics and its Applications). Dividevo l’alloggio con altri matematici ed alcuni
musicisti (uno splendido connubio) e questi ultimi mi introdussero al mondo
di Pure Data, consigliandomi, tra l’altro, il libro The Theory and Technique of
Electronic Music di Miller Puckette.
Questo libro è stato il mio primo serio passo nel mondo della computer music,
a cui sono poi seguiti libri di altri autori come Road, Kreidler, Bianchi, Cipriani
e Giri; tutti libri fondamentali da cui ho appreso concetti, tecniche e algoritmi.
Tuttavia, secondo me, il libro di Puckette resta IL libro (come dice Max Mathews
nella sua prefazione), quello non può mancare nella libreria di ogni musicista
elettronico (e superato, forse, solo dai libri di Bianchi-Cipriani-Giri).
E sono convinto che non ci sia cosa migliore che studiarne la versione originale
in modo, soprattutto, da fare propri tutti quei termini inglesi che poi si ritrovano
frequentemente (per non dire sempre) nei vari softwares, nei vari plugins AU e
VST o ancora nella letteratura, sia scritta che online. Tuttavia, confrontandomi
spesso sia con studenti dei corsi di musica elettronica al conservatorio sia con
musicisti, che si avvicinavano alla computer music, appariva chiaro come il libro
di Puckette potesse risultare ostico, non tanto a chi non fosse di madrelingua
inglese, ma soprattutto a chi non avesse, comunque, un’adeguata conoscenza
dell’inglese scritto (anche se di certo potrebbe rappresentare una motivazione in
più per migliorarla). The Theory and Technique of Electronic Music è un libro
denso di informazioni e, ovviamente, la non perfetta conoscenza dell’inglese ne
rende la comprensione ancora più difficile.
Questo è il motivo principale per cui ho voluto fare questa traduzione: un
aiuto extra per i musicisti italiani, studenti e non, che si avvicinano alla musica
elettronica. Convinto però dell’importanza della conoscenza dei termini tecnici
in inglese ho deciso o di lasciare la nomenclatura inglese accanto a quella italiana
oppure di preferire quella inglese relegando quella italiana tra parentesi.
Il mio consiglio spassionato resta quello di studiare la versione originale del
libro di Puckette e usare questa traduzione come una scialuppa di salvatag-
gio, quando la comprensione del testo scritto, in inglese, metta a rischio la
comprensione della teoria o della tecnica della musica elettronica.
Desidero ringraziare Giorgio Sancristoforo e Dario Ferrante per alcuni pre-
ziosi consigli durante la stesura di questa traduzione.
Per segnalare errori o imprecisioni, cosı̀ come per inviarmi commenti e os-
servazioni potete scrivermi a info@cristianobocci.com

Buona lettura, ma soprattutto buono studio


Cristiano Bocci

vii
viii Prefazione alla traduzione

viii
Prefazione

Teoria e Tecnica della Musica Elettronica è una fonte d’informazione completa


per la sintesi di timbri musicali ricchi e interessanti. La teoria è presentata, in
modo chiaro, in una forma completamente generale. Ma in aggiunta, esempi di
come sintetizzare ciascun aspetto teorico vengono mostrati nel linguaggio Pd in
modo che il lettore del libro possa utilizzare immediatamente la teoria per i suoi
scopi musicali. Non conosco nessun altro libro che combina teoria e tecnica in
maniera cosı̀ utile.
Al momento i più popolari programmi di sintesi di musica e suono in uso
oggi sono compilatori di diagrammi a blocchi con interfacce grafiche. Questi
consentono al compositore di progettare strumenti visualizzando gli “oggetti”
del suo strumento sul monitor del computer e tracciando i percorsi di collega-
mento tra gli oggetti. Il display grafico risultante è molto congeniale ai musicisti.
Un utente novizio può progettare un semplice strumento istantaneamente. Ed
egli può imparare rapidamente a progettare strumenti complessi. Può capire
come funzionano strumenti complessi guardando le loro immagini grafiche.
Il primo programma di compilazione grafica, Max, è stato scritto da Miller
Puckette nel 1988. Max gestiva solo segnali di controllo per la sintesi sonora
perché i computer disponibili all’epoca non erano abbastanza veloci per gestire
eventi sonori. Non appena sono stati disponibili computer più veloci, in grado
di calcolare campioni di onde sonore in tempo reale, Puckette e David Zicarelli
hanno aggiunto MSP a Max (Max/MSP), rendendo cosı̀ il computer, di solito
un computer portatile, uno strumento musicale completo per le performances
dal vivo.
Max/MSP è stato sviluppato da Puckette e Zicarelli presso l’IRCAM nel
periodo 1993-1994. Entrambi si sono trasferiti in California. Zicarelli commer-
cializza i prodotti Max, MSP e JITTER (un’estensione per la sintesi video).
Puckette, ora professore all’UCSD, ha scritto Pd (Pure Data). Si tratta di un
programma open source che è molto simile a Max/MSP.
Max e Pd permettono a quasi chiunque di sintetizzare, quasi immediata-
mente, timbriche poco interessanti. Fare timbri interessanti è molto più difficile
e richiede molte conoscenze aggiuntive. Il libro Teoria e Tecnica della Musica
Elettronica rappresenta quel corpo di conoscenza. La teoria è importante per
qualsiasi programma di sintesi. Teoria e Tecnica della Musica Elettronica forni-
sce numerosi esempi di come applicare la teoria utilizzando Pd. La trattazione
combinata di teoria e di esempi in Pd rende questo libro unicamente utile. Es-
so contiene anche esercizi per ogni capitolo, che lo rendono un libro di testo

ix
x Prefazione

eccellente.
Credo che il libro di Puckette diventerà IL libro essenziale nella biblioteca
di qualsiasi musicista elettronico.
Max Mathews

x
Introduzione

Questo è un libro sull’utilizzo di tecniche elettroniche per registrare, sintetizzare,


elaborare e analizzare i suoni, una pratica che è entrata nella sua forma moderna
negli anni 1948-1952, ma i cui mezzi tecnologici e gli usi artistici hanno subito
diverse rivoluzioni da allora. Oggi la maggior parte della musica elettronica
viene fatta usando i computers, e questo libro si concentrerà esclusivamente su
quello che un tempo si chiamava “computer music’, ma che oggi dovrebbe essere
chiamata “musica elettronica usando un computer”.
La maggior parte degli strumenti musicali per computer disponibili oggi
hanno antecedenti nelle generazioni precedenti di apparecchiature. Il computer,
peró, è relativamente economico ed i risultati ottenuti sono facili da documentare
e ricreare. Per questi aspetti, almeno, il computer è lo strumento ideale per la
musica elettronica: è difficile immaginare verso quale tecnologia futura ci si
possa spostare.
Le tecniche e la pratiche della musica elettronica possono essere studiate
(almeno in teoria) senza fare esplicito riferimento allo stato attuale della tec-
nologia. Tuttavia, è importante fornire esempi di lavoro. Quindi ogni capitolo
inizia con la teoria (evitando qualsiasi riferimento all’implementazione) e ter-
mina con una serie di esempi realizzati in un pacchetto software attualmente
disponibile.
Il lettore ideale di questo libro è chiunque conosca e ami la musica elettronica
di qualsiasi genere, abbia un sacco di dimestichezza con i computer in genera-
le e voglia imparare a fare musica elettronica dalla base, partendo dall’umile
oscillatore e continuando tramite campionamenti, FM, filtraggio, waveshaping,
delays e cosı̀ via. Questo richiede molto tempo.
Questo libro non percorre la strada facile di raccomandare il software pre-
confezionato per provare queste tecniche; invece, l’enfasi viene posta sull’ap-
prendere l’utilizzo di un ambiente musicale informatico generale per realizzarle.
Tra i vari pacchetti disponibili, useremo Pd, ma questo non dovrebbe impedirvi
di utilizzare le stesse tecniche in altri ambienti come Csound o Max/MSP.
Per leggere questo libro bisogna capire la matematica dell’algebra e della
trigonometria; partendo dal Capitolo 7, anche i numeri complessi fanno la loro
comparsa, ma non l’analisi complessa (ad esempio, i numeri complessi vengono
sommati, moltiplicati e coniugati, ma non ci sono esponenziali complessi.) Un
saggio di F. Richard Moore, di matematica per la computer music, si può trovare
in [Str85, pp. 1-68].
Anche se il “livello” della matematica non è elevato, la matematica stessa è
a volte molto impegnativa. Tutti i tipi di matematica utile sono a portata di
mano di qualsiasi studente di algebra o geometria. Per la computer music, ad

xi
xii Introduzione

esempio, ci occuperemo delle funzioni di Bessel, dei polinomi di Chebychev, del


teorema di limite centrale e, naturalmente, di analisi di Fourier.
Non sono necessari molti fondamenti di musica, cosı̀ come viene insegna-
ta in Occidente; in particolare, la notazione musicale occidentale scritta non è
necessaria. Verranno usate alcune nozioni elementari della teoria della musica
occidentale, come la scala temperata, il sistema dei nomi delle note, e termi-
ni come “nota” e “accordo”. Inoltre, dovreste avere familiarità con i termini
dell’acustica musicale quali sinusoide, ampiezza, frequenza e serie di armonici.
Ogni capitolo inizia con una discussione teorica di qualche insieme di tecniche
o di problematiche teoriche, seguite da una serie di esempi realizzati in Pd per
illustrarle. Gli esempi sono inclusi nella distribuzione Pd, in modo da poterli
eseguire e/o modificarli per i propri progetti. Inoltre, tutte le figure sono state
create utilizzando patches in Pd, che appaiono come supplemento elettronico.
Queste non sono documentate con cura ma in linea di principio potrebbero
essere utilizzate come un esempio di capacità di progettazione di Pd a chiunque
ne sia interessato.
Vorrei ringraziare alcune persone che hanno reso possibile scrivere questo li-
bro. Barry Vercoe è quasi interamente responsabile della mia educazione musica-
le. Mentre ho appreso la matematica da Wayne Holman, Samuel Greitzer, Mur-
ray Klamkin, Gian-Carlo Rota, Frank Morgan, Michael Artin, Andrew Gleason
e molti altri. Phil White mi ha insegnato linglese e Rosie Paschall composizione
visiva. Infine, i miei genitori (uno deceduto) sono stati notevolmente pazienti;
adesso ho 47 anni. Grazie.

xii
Capitolo 1

Sinusoidi, ampiezza e
frequenza

La musica elettronica è realizzata, di solito, usando un computer, sintetizzando o


elaborando segnali audio digitali. Questi non sono altro che sequenze di numeri,
. . . , x[n − 1], x[n], x[n + 1], . . .
dove l’indice n, denominato sample number, può variare su alcuni o tutti i numeri
interi. Un singolo numero della sequenza è chiamato sample o campione. Un
esempio di un segnale audio digitale è la Sinusoide:
x[n] = a cos(ωn + φ)
dove a è l’ampiezza, ω è la frequenza angolare e φ è la fase iniziale. La fase varia
in funzione del sample number n, ed è pari a a ωn + φ. La fase iniziale è la fase
al campione zero (n = 0).
La Figura 1.1 (parte a) mostra graficamente una sinusoide. L’asse orizzonta-
le mostra i valori successivi di n mentre l’asse verticale mostra i corrispondenti
valori di x[n]. Il grafico viene disegnato in modo da sottolineare la natura “cam-
pionata” del segnale. In alternativa, potremmo disegnarlo più semplicemente
come una curva continua (parte b). Il disegno superiore è la rappresentazione
più fedele della sinusoide (come segnale audio digitale), mentre quella inferiore
può essere considerata come una sua idealizzazione.
Le sinusoidi svolgono un ruolo chiave nell’elaborazione audio perché, tra-
slandone una a sinistra o a destra di un numero qualsiasi di campioni, si ottiene
un’altra sinusoide. Questo rende facile calcolare l’effetto di tutti i tipi di opera-
zioni sulle sinusoidi. Le nostre orecchie utilizzano questa stessa particolare pro-
prietà per aiutarci a analizzare i suoni in arrivo, per cui sinusoidi, e combinazioni
di sinusoidi, possono essere utilizzate per ottenere molti effetti musicali.
I segnali audio digitali non hanno alcuna relazione intrinseca con il tempo,
ma per ascoltarli dobbiamo scegliere una frequenza di campionamento (o sample
rate), a cui normalmente viene associata la variabile R, che è il numero di
campioni in un secondo. Il tempo t è correlato al sample number n tramite
Rt = n, o t = n/R. Un segnale sinusoidale con frequenza angolare ω ha una
frequenza, nel dominio dei reali, pari a
ωR
f=

1
2 Capitolo 1. Sinusoidi, ampiezza e frequenza

x[n]
(a)
1

49 n
-1 0

x(n)
(b)
1

50
-1

Figure 1.1:
Figura 1.1: Un A digital
segnaleaudio
audiosignal, showing
digitale, its discrete-time
che mostra la sua naturanature (parttem-
discreta a),
and idealized as a continuous function (part b). This signal is a
porale (parte a), e idealizzato come una funzione continua (parte b). Questo (real-valued)
sinusoid,è fifty
segnale una points long,
sinusoide (a with
valoriamplitude 1, angular
reali), lungo frequency
cinquanta 0.24,ampiezza
punti, con and initial
1,
phase zero.
frequenza angolare 0.24 e fase iniziale pari a zero.

dove f è misurata in Hertz (cioè, cicli al secondo) perché un ciclo è 2π radianti


e un secondo è R campioni.
L’ampiezza di un segnale audio, nel mondo reale, potrebbe essere espressa
come una variazione nel tempo di un voltaggio o della pressione dell’aria, ma
i campioni di un segnale audio digitale sono numeri privi di unità di misura.
Ovviamente supporremo che esista un’accuratezza numerica sufficiente affinché
si possano ignorare gli errori di arrotondamento e che il formato numerico sia
illimitato come range, in modo che i campioni possano prendere qualsiasi valore
si voglia. Tuttavia, la maggior parte degli hardware audio digitali funziona solo
su un range fisso di valori in ingresso e in uscita, spesso tra −1 e 1. I soft-
wares più moderni per l’elaborazione dell’audio digitale utilizzano solitamente
una rappresentazione in virgola mobile (floating-point representation) per i se-
gnali. Ciò consente di utilizzare una qualsiasi unità sia più conveniente per i
nostri obiettivi, a patto che l’output finale dell’ audio sia nel range prestabilito
dell’hardware [Mat69, pp. 4-10].

1.1 Misure di ampiezza


La proprietà fondamentale di un segnale audio digitale è la sua ampiezza. Sfor-
tunatamente, l’ampiezza di un segnale non ha una definizione canonica. In modo
rigoroso, tutti i campioni in un segnale audio digitale sono loro stessi ampiezze,
e abbiamo anche parlato dell’ampiezza a della sinusoide interpretata nella sua
totalità. È quindi utile avere delle misure di ampiezza per i segnali audio digitali
41.1. Misure di ampiezza 1. SINUSOIDS, AMPLITUDE AND FREQUENCY3
CHAPTER

(a)
peak
RMS

(b) peak

RMS

Figure
Figura 1.2:
1.2: Root mean RMS
Ampiezza squaree (RMS)
di piccoand peak amplitudes
di segnali of signals
a confronto. Per unacompared.
sinusoide

For
(parte a), l’ampiezza di picco è maggiore della RMS di un fattore parifactor
√ a sinusoid (part a), the peak amplitude is higher than RMS by a a 2.of
2.

in generale. È meglio parlare di ampiezza riferendosi ad una finestra, cioè un


range
when we fisso di campioni
consider del segnale.
complex-valued Ad esempio,
signals.) Neitherla the
finestra
peakdinor
unthe
segnale
RMSaudio
am-
x[n] di lunghezza N e che inizia al campione M è costituita dai campioni,
plitude of any signal can be negative, and either one can be exactly zero only if
the signal itself is zero for all n in the window.
x[M ], x[M + 1], . . . , x[M + N − 1].
The RMS amplitude of a signal may √ equal the peak amplitude but never
exceeds it; and it may be as little as 1/ N times the peak amplitude, but never
less Le duethat.
than misure più frequenti di ampiezza sono l’ampiezza di picco, che è sem-
plicemente il più grande
Under reasonable campione (in
conditions—if the valore
window assoluto)
containsall’interno della periods
at least several finestra:
and if the angular frequency is well under one radian per sample—the peak
A {x[n]} = max |x[n]|, n = M, . . . , M + N − 1
amplitude√of thepeak sinusoid of Page 1 is approximately a and its RMS amplitude
about a/ 2. RMS
e l’ampiezza Figure 1.2mean
(root showssquare):
the peak and RMS amplitudes of two digital
audio signals. p
ARMS {x[n]} = P {x[n]}
dove P {x[n]} è la potenza media, definita come:
1.2 Units of Amplitude 
1
P {x[n]} = |x[M ]|2 + · · · + |x[M + N − 1]|2
N
Two amplitudes are often better compared using their ratio than their difference.
Saying
(in questathatultima
one signal’s amplitude
formula, i segni diis valore
greaterassoluto
than another’s
non sonobynecessari
a factor dal
of two
mo-
might
mento be chemore informative
stiamo lavorando than saying
su segnali it is greater
a valori reali, mabydiventeranno
30 millivolts. This is
importanti
true for any
in seguito measure
quando of amplitudesegnali
considereremo (RMSaor peak,neiforcomplessi).
valori instance). Né Tol’ampiezza
facilitate
comparisons, we often express
di picco né l’ampiezza RMS diamplitudes
un qualsiasi in segnale
logarithmic
possonounits callednegative,
essere decibels.e
Ifpossono
a is theessere
amplitude of a signal
esattamente zero (either
solo se peak or RMS),
il segnale stessothen weper
è zero canogni
define the
n nella
finestra.
L’ampiezza RMS di un segnale può essere uguale all’ampiezza di picco, ma
non può mai essere superiore; e può essere al minimo √1N volte l’ampiezza di
picco, ma mai di meno.
4
1.2. UNITS OF AMPLITUDE Capitolo 1. Sinusoidi, ampiezza e frequenza
5

ampli-
tude

0.1
0
-20 -10 0
decibels

Figure 1.3: The relationship between decibel and linear scales of amplitude.
Figura
The 1.3:amplitude
linear La relazione tra decibel
1 is assigned to 0e dB.
scala di ampiezza lineare. Il valore di
ampiezza lineare pari a 1 è assegnato al valore di 0 dB.

decibel (dB) level d as:


In condizioni ragionevoli –d = se 20
la ·finestra
log10 (a/acontiene
0)
almeno diversi periodi e
se la frequenza angolare è ben sotto al valore di un radiante per campione –
where a0 is adireference
l’ampiezza amplitude.
picco della sinusoideThis definition
di pagina is setaup
1 è circa so sua
e la that,ampiezza
if we increase
RMS
the √ signal
è circa √a power by a factor of ten (so that the amplitude increases by a factor
. La Figura 1.2 mostra le ampiezze di picco e RMS di due segnali
2
of
audio 10), the
digitali. logarithm will increase by 1/2, and so the value in decibels goes
up (additively) by ten. An increase in amplitude by a factor of two corresponds
to an increase of about 6.02 decibels; doubling power is an increase of 3.01 dB.
The relationship between linear amplitude and amplitude in decibels is graphed
1.2 Unità di ampiezza
in Figure 1.3.
Still using a0 to denote the reference amplitude, a signal with linear ampli-
Spesso, due ampiezze sono meglio confrontate se si utilizza il loro rapporto
tude smaller
anziché thandifferenza.
la loro a0 will haveDire
a negative amplitude
che l’ampiezza diinundecibels:
segnale aè0 /10 gives -20
maggiore di
dB, a 0 /100 gives -40, and so on. A linear amplitude of zero
un altro per un fattore di due potrebbe essere più informativo che dire che is smaller than thatè
of any value
maggiore in dB,
di 30 so we give
millivolts. it avale
Questo dB level of −∞. misura di ampiezza (RMS o
per qualsiasi
In digital audio a convenient choice of reference,
di picco, ad esempio). Per facilitare i confronti, spesso assuming the hardware
esprimiamo has
le ampiezze
ainmaximum amplitude of one, is
unità logaritmiche denominate decibel. Se a è l’ampiezza (di picco o RMS)
di un segnale, allora possiamo
a0definire
= 10−5 il=livello d in decibel (dB) come:
0.00001

so that the maximum amplitude 20 · log10is


d = possible (a/a1000 ) dB, and 0 dB is likely to be
inaudibly quiet at any reasonable listening level. Conveniently enough, the
dove a0 èrange
dynamic un’ampiezza
of human dihearing—the
riferimento. Questa definizione
ratio between è posta inloud
a damagingly modo che,
sound
se aumentiamo
and an inaudiblylaquiet
potenza
one—is delabout
segnale
√100perdB.un fattore di dieci (in modo che
l’ampiezza
Amplitudeaumenti con un
is related fattore
in an di way
inexact 10), to
il logaritmo aumenterà
the perceived di of
loudness 1/2, quindi
a sound.
il valore
In in two
general, decibel salirà
signals with(additivamente)
the same peakdior10. RMS Unamplitude
aumento di ampiezza
won’t di un
necessarily
fattore di due corrisponde ad un aumento di circa 6.02 decibel;
have the same loudness at all. But amplifying a signal by 3 dB, say, will fairly raddoppiare
la potenza corrisponde ad un aumento di 3.01 dB. La relazione tra ampiezza
lineare e ampiezza in decibel è rappresentata in Figura 1.3.
Sempre usando a0 per indicare l’ampiezza di riferimento, un segnale con
ampiezza lineare minore di a0 avrà un’ampiezza negativa in decibel: a0 /10 dà
1.4. Frequenza 5

−20 dB, a0 /100 dà −40 e cosı̀ via. Un’ampiezza lineare pari a zero è minore di
quella di qualsiasi valore in dB, per cui vi si associa un livello in dB pari a −∞.
Nell’ambito dell’audio digitale, una scelta conveniente di riferimento, suppo-
nendo che l’hardware abbia un’ampiezza massima di uno, è
a0 = 10−5 = 0.00001
in modo che l’ampiezza massima possibile sia di 100 dB e che 0 dB sia un’am-
piezza probabilmente silenziosa a qualsiasi livello di ascolto ragionevole. Ab-
bastanza convenientemente, la gamma dinamica dell’udito umano – il rapporto
tra un suono dannoso e un rumore inaudibilmente silenzioso – è di circa 100 dB.
L’ampiezza è legata in modo inesatto alla percezione della rumorosità di
un suono. In generale, due segnali con la stessa ampiezza di picco o RMS non
hanno necessariamente la stessa intensità. Ma amplificando un segnale, diciamo
di 3 dB, sarà ragionevolmente affidabile farlo suonare ad uno “step” più forte.
Molto è stato fatto sulla presunta natura logaritmica dell’udito umano (e di altri
sensi) che può spiegare in parte il motivo per cui i decibels sono una scala utile
di ampiezza [RMW02, p. 99].
L’ampiezza è anche correlata, in modo inesatto, alla dinamica musicale. La
dinamica è meglio pensata come una misura di sforzo che di forza o potenza. Il
suo range si estende su nove valori: riposo, ppp, pp, p, mp, mf, f, ff, fff. Questi
sono correlati in modo meno appropriato con l’ampiezza di un segnale rispetto
a come lo è l’intensità [RMW02, p. 110-111].

1.3 Controllare l’ampiezza


Molto probabilmente l’operazione più frequentemente utilizzata sui suoni elet-
tronici è quella di cambiare le loro ampiezze. Ad esempio, una semplice strategia
per sintetizzare i suoni è combinare sinusoidi, che possono essere generate uti-
lizzando la formula a pagina 1, campione per campione. Ma la sinusoide ha
un’ampiezza nominale costante a, e vorremmo essere in grado di variarla nel
tempo.
In generale, per moltiplicare l’ampiezza di un segnale x[n] per un fattore
y ≥ 0, è sufficiente moltiplicare ciascun campione per y, ottenendo un nuovo
segnale y · x[n]. Qualsiasi misura dell’ampiezza RMS o dell’ampiezza di picco di
x[n] sarà maggiore o minore a seconda del fattore y. Più in generale, è possibile
modificare l’ampiezza tramite un valore y[n] che varia campione per campione.
Se y[n] è non-negativo e se varia sufficientemente lentamente, l’ampiezza del
prodotto y[n] · x[n] (in una finestra fissata da M a M + N − 1) sarà quella di
x[n], moltiplicata per il valore di y[n] in quella finestra (che supponiamo non
cambi molto sugli N campioni nella finestra).
Nel caso più generale in cui entrambi x[n] e y[n] possano assumere valori
negativi e positivi e/o cambiare rapidamente, l’effetto di moltiplicarli non può
essere descritto semplicemente come il cambiamento di ampiezza di uno di essi;
questo aspetto sarà considerato più avanti nel Capitolo 5.

1.4 Frequenza
Le frequenze, come le ampiezze, sono spesso misurate su una scala logaritmica,
per sottolineare le proporzioni tra di loro, che di solito forniscono una migliore
66 CapitoloAMPLITUDE
CHAPTER 1. SINUSOIDS, 1. Sinusoidi, ampiezza e frequenza
AND FREQUENCY

440

330

220

110

0
45 57 69

frequency pitch

Figure 1.4:
Figura 1.4: The relationship
La relazione between
tra nota MIDI“MIDI” pitch in
e frequenza and frequency
cicli in cycles
per secondo per
(Hertz).
second
Il range(Hertz). TheMIDI
di 24 valori span nell’asse
of 24 MIDI values on
orizzontale the horizontal
rappresenta axis represents
due ottave, rispetto
two quali
alle octaves, over whichaumenta
la frequenza the frequency increases
di un fattore by a factor pari
moltiplicativo of four.
a 4.

reliably make
descrizione it sound
delle about
relazioni onefrequenze
tra le “step” louder.
rispettoMuch has been
a quanto made
fornito dalleof loro
the
supposedlyIllogarithmic
differenze. rapporto dellenature of human
frequenze hearing
tra due toni (and other
musicali senses), which
determina may
l’intervallo
partially explain
musicale why decibels are such a useful scale of amplitude [RMW02, p.
tra di essi.
99].La scala musicale occidentale suddivide l’ottava (l’intervallo musicale as-
Amplitude
sociato ad un is also related
rapporto in an
di 2:1) ininexact
dodici way to musical
intervalli dynamic.
uguali, ciascunoDynamic
dei quali is
better thought of as a measure
corrisponde quindi ad un rapporto di 2 of effort than
1/12 of loudness or power. It ranges over
. Per ragioni storiche questo sotto-
nine values:
intervallo rest, ppp,semitono.
è chiamato pp, p, mp,Una mf, f, ff, fff.
scala These correlate
logaritmica in an even
conveniente per illooser
tono
(pitch) consiste semplicemente nel contare il numero semitoni da una110-111].
way with the amplitude of a signal than does loudness [RMW02, pp. nota di
riferimento – utilizzando le frazioni possiamo specificare note che non appaiono
nella scala occidentale. La scala logaritmica di tono più comunemente utiliz-
1.3 è laControlling
zata “MIDI” pitch, in cui Amplitude
il tono 69 viene assegnato ad una frequenza di
440 cicli al secondo – il La sopra il Do centrale. Per convertire una nota MIDI
Perhaps the most frequently used operation on electronic sounds is to change
in una frequenza in cicli al secondo f , applichiamo la formula di conversione
their amplitudes. For example, a simple strategy for synthesizing sounds is by
nota/frequenza:
combining sinusoids, which can be generated by evaluating the formula on Page
1, sample by sample. But the m =sinusoid · loga2 constant
69 + 12has (f /440), nominal amplitude a, and
we would like to be able to vary that in time.
In general, to multiply the f =amplitude of a signal
440 · 2(m−69)/12 . x[n] by a factor y ≥ 0,
you can just multiply each sample by y, giving a new signal y · x[n]. Any
Il Do centrale,ofcorrispondente
measurement the RMS or peak alla nota MIDI m
amplitude of =x[n]
60, will
è pari
beagreater
f = 261.626
or lesscicli
by
al
thesecondo.
factor y. More generally, you can change the amplitude by an amount y[n]
Il MIDI
which variesstesso è unby
sample vecchio protocollo
sample. If y[n] hardware che, purtroppo,
is nonnegative and if it si è insinuato
varies slowly
in una grande
enough, quantitàofdithe
the amplitude software.
productNell’hardware,
y[n] · x[n] (in ail fixed
MIDIwindow
consentefromsoloMtoni
to
interi
M + Ncompresi
− 1) willtrabe 0that
e 127. Tuttavia,
of x[n], la scala
multiplied soggiacente
by the è ben
value of y[n] in definita
the window per
qualsiasi numero “MIDI”, anche negativo; ad esempio una “nota MIDI” di −4 è
una frequenza decente di vibrato. La scala del tono non può tuttavia descrivere
frequenze inferiori o uguali a zero cicli al secondo (per una chiara descrizione
del MIDI, delle sue capacità e delle sue limitazioni, vedere [Bal03, ch.6-8]).
81.5. Sintetizzare una sinusoide
CHAPTER 7
1. SINUSOIDS, AMPLITUDE AND FREQUENCY

FREQUENCY FREQUENCY

OUT y[n]

OUT

(a) (b)

Figure 1.5: Diagramma


Figura 1.5: Block diagrams for (a)
a blocchi pera(a)
sinusoidal oscillator;
un oscillatore (b) controlling
sinusoidale; the
(b) controllo
amplitude
di ampiezzausing a multiplier
utilizzando and an amplitude
un moltiplicatore signal y[n].
e un segnale di ampiezza y[n].

1.5Un semitono
Synthesizing a sinusoid
può essere espresso con un rapporto di circa 1.059 a 1, o circa un
aumento del 6% della frequenza. I semitono sono ulteriormente divisi in cents,
In most
ogni widely
cent è unused audio synthesis
centesimo and processing
di un semitono. Come packages (Csound,potrebbero
regola generale, Max/MSP,
and Pd, for instance), the audio operations are specified
essere necessari circa tre cents per fare un cambiamento rilevabile nel tono as networks of unit
di
generators[Mat69] which pass audio signals among themselves.
una nota musicale. Sul Do centrale si tratta di una differenza di circa 1/2 ciclo The user of the
al
software
secondo. package
Un grafico specifies the network,
della frequenza sometimes
in funzione called pitch,
del MIDI a patch, which
su un essen-
intervallo
tially
di duecorresponds to the synthesis
ottave, è mostrato in Figuraalgorithm
1.4. to be used, and then worries about
how to control the various unit generators in time. In this section, we’ll use ab-
stract block diagrams to describe patches, but in the “examples” section (Page
1.5we’llSintetizzare
17), una sinusoide
choose a specific implementation environment and show some of the
software-dependent details.
NeiTo show how
software più to produceper
utilizzati a sinusoid with
la sintesi time-varying amplitude
e l’elaborazione audio (perwe’ll need
esempio
to introduce two unit generators. First we need a pure
Csound, Max/MSP e Pd), le operazioni audio sono specificate come reti di sinusoid which is made
with an oscillator.
generatori Figureche
unitari [Mat69] 1.5passano
(part a)i segnali
shows aaudiopictorial
tra direpresentation
loro. L’utenteofdela
sinusoidal
pacchetto software specifica la rete, talvolta chiamata patch, che per
oscillator as an icon. The input is a frequency (in cycles second),
corrisponde
and the output is a sinusoid of peak amplitude one.
sostanzialmente all’algoritmo di sintesi da utilizzare, e quindi si preoccupa di
comeFigure 1.5 (parttemporalmente,
controllare, b) shows how toi varimultiply the output
generatori. of a sinusoidal
In questo paragrafo oscillator
usiamo
by an appropriate
diagrammi a blocchi scale factorper
astratti y[n] to controlleits
descrivere amplitude.
patches, ma nellaSince the oscillator’s
sezione “esempi”
peak
(paginaamplitude is 1, the un
16), sceglieremo peak amplitude
ambiente of the product isspecifico
di implementazione about y[n], assuming
e mostreremo
alcuni
y[n] dei dettagli
changes slowlydipendenti
enough and daldoesn’t
software.become negative in value.
Figure 1.6 shows
Per mostrare comehow the sinusoid
produrre of Figure
una sinusoide 1.1 is affected
con ampiezza by nel
variabile amplitude
tempo,
change
dovremobyintrodurre
two different due controlling
generatori signals
unitari.y[n]. The controlling
Innanzitutto abbiamo signal shown
bisogno di
unapart
in sinusoide
(a) haspura che viene ottenuta
a discontinuity, tramite un
and so therefore doesoscillatore.
the resulting La amplitude-
Figura 1.5
(parte a) mostra
controlled sinusoid una rappresentazione
shown in (b). Partsgrafica
(c) anddi(d)un show
oscillatore
a more sinusoidale come
gently-varying
icona. L’input
possibility è una
for y[n] andfrequenza
the result.(inIntuition
cicli al secondo),
suggests thate l’output è una
the result sinusoide
shown in (b)
di ampiezza di picco pari a 1.
La Figura 1.5 (parte b) mostra come moltiplicare l’uscita di un oscillato-
re sinusoidale, mediante un appropriato fattore di scala y[n], per controllarne
l’ampiezza. Poiché l’ampiezza di picco dell’oscillatore è 1, l’ampiezza di picco
1.5. SYNTHESIZING A SINUSOID 9

8 Capitolo 1. Sinusoidi, ampiezza e frequenza

1 y[n]

(a)
n
0 50

-1

1 x[n]y[n]

(b)

-1

1
y[n]

(c)

-1

1
x[n]y[n]
(d)

-1

Figura 1.6:
Figure 1.6: Two
Dueamplitude
funzioni difunctions
ampiezza(parts
(partia, a,c) e il (parts
c), and risultato di moltiplicarle
b, d), the result of
per la sinusoide
multiplying thempura di Figura
by the 1.1 (parti
pure sinusoid b,d). 1.1.
of Figure

del prodotto è di circa y[n], assumendo che y[n] cambi lentamente e non diventi
negativo in valore.
La Figura 1.6 mostra come la sinusoide di Figura 1.1 è influenzata dalla
variazione di ampiezza da due diversi segnali di controllo y[n]. Il segnale di
controllo mostrato nella parte (a) presenta una discontinuità, che si ripresenta,
pertanto, nella sinusoide risultante, illustrata in (b). Le parti (c) e (d) mostrano
una possibilità di variazione, senza discontinuità, per y[n] ed il relativo risultato.
L’intuizione suggerisce che il risultato riportato in (b) non suona come una
sinusoide variabile in ampiezza, ma come, invece, una sinusoide interrotta da
un “pop” udibile, dopo di che continua a volume inferiore. In generale, per
motivi che non possono essere spiegati in questo capitolo, i segnali di controllo
di ampiezza y[n] che si muovono in maniera continua da un valore all’altro sono
meno soggetti a dare origine a risultati parassitari (come ad esempio il “pop”)
rispetto a quelli che cambiano bruscamente.
1.6. SUPERPOSING SIGNALS 11
1.5. Sintetizzare una sinusoide 9

FREQUENCY

OUT

Figure 1.7: Using an envelope generator to control amplitude.


Figura 1.7: Utilizzo di un generatore di inviluppo per controllare l’ampiezza.

ARMS {x[n]} + ARMS {y[n]} ≥ ARMS {x[n] + y[n]}


Per ora possiamo stabilire due regole generali senza però giustificarle. In-
If we fix ananzitutto,
window from M to Npure
le sinusoidi − 1i as
+ Msono usual,più
segnali wesensibili
can write agliout the parassitari
effetti mean
power of ditheunsum of two signals:
rapido cambiamento di ampiezza. Quindi, quando si desidera testare una
transizione di ampiezza,
P {x[n] + y[n]} se funziona
= P {x[n]} per +
+ P {y[n]} le 2sinusoidi
· COV{x[n],probabilmente
y[n]} funzionerà
anche per altri segnali. In secondo luogo, a seconda del segnale di cui si sta
where wecambiando
have introduced the covariance
l’ampiezza, il controllo of two signals:avrà bisogno di un tempo di
dell’ampiezza
“rampa” tra 0 e 30 millisecondi – 0 per i segnali più tolleranti (come il rumore
x[M ]y[M ] + · · · + x[M + N − 1]y[M + N − 1]
bianco) ey[n]}
COV{x[n], 30 per=i meno (come una sinusoide). Tutto questo dipende anche, in
modo complicato, dai livelli di ascolto e dal N contesto acustico.
The covariance may be positive, zero, or negative.
Opportune funzioni y[n] di controllo dell’ampiezza Over apossono
sufficiently esserelarge
ottenute
window, the covariance
usando of twodisinusoids
un generatore inviluppowith different
(envelope frequencies
generator). is negligible
La Figura 1.7 mostra
compareduna to the
rete mean
in cui power. Two signals
viene utilizzato which have
un generatore no covariance
di inviluppo are calledl’am-
per controllare
piezza
uncorrelated (thedi correlation
un oscillatore.
is theI covariance
generatori di inviluppo to
normalized variano ampiamente
lie between -1 andnella
costruzione
1). In general, for twodell’inviluppo
uncorrelated stesso, ma qui
signals, thecipower
concentreremo
of the sum sulistipo
thepiù
sumsemplice,
of
the powers:cioè quello che genera segmenti di retta, come mostrato nella Figura 1.6 (parte
c). Se viene specificato un segmento di retta che collega due valori di uscita a e
P {x[n] +N
b, su y[n]} = P {x[n]}
campioni a partire {y[n]},
+ P dal numerowhenever
di campione COV{x[n],
M , alloray[n]} = 0 è:
l’output
n−M
Put in terms of amplitude, this becomes:
y[n] = a + (b − a) , M ≤ n ≤ M + N − 1.
2 N 2 2
(ARMS {x[n] + y[n]}) = (ARMS {x[n]}) + (ARMS {y[n]}) .
L’output può avere un certo numero di segmenti come il precedente, coprendo,
This is thealla
familiar Pythagorean
fine, l’intera gammarelation. So numbers
dei sample uncorrelated signals can
n; i segmenti be thought
orizzontali, piatti,
of as vectors at right
possono essereangles to each
realizzati other; positively
impostando a = b. correlated ones as having
an acute angle Oltre a modificare
between them, leand
ampiezze dei suoni,
negatively il controllo
correlated dell’ampiezza
as having an obtusespesso
viene them.
angle between utilizzato, in particolar modo nelle applicazioni in tempo reale, sempli-
cemente if
For example, pertwo
attivare o disattivare
uncorrelated i suoni:
signals bothper disattivare
have basta semplicemente
RMS amplitude a, the

considerare una rampa verso lo zero. La maggior parte
sum will have RMS amplitude 2a. On the other hand if the two signals happen dei softwares di sintesi
forniscono anche modi per evitare che i moduli calcolino
to be equal—the most correlated possible—the sum will have amplitude 2a, i campioni, ma qui
invece noi utilizzeremo il controllo dell’ampiezza.
which is the maximum allowed by the triangle inequality.
Il generatore di inviluppo risale all’era analogica [Str95, p.64] [Cha80, p.
90]. Gli oscillatori con frequenza controllabile sono stati chiamati voltage-
10 Capitolo 1. Sinusoidi, ampiezza e frequenza

controlled oscillators o VCO, e l’operazione di moltiplicazione veniva fatta usan-


do un voltage-controlled amplifier o VCA [Str95, pp.34-35] [Cha80, pp.84-89]. I
generatori di inviluppo sono descritti più in dettaglio nel paragrafo 4.1.

1.6 Segnali sovrapposti


Se un segnale x[n] ha un’ampiezza, di picco o RMS, pari ad A (in qualche finestra
fissata), allora il segnale scalato k·x[n] (dove k ≥ 0) ha ampiezza kA. La potenza
media del segnale scalato cambia per un fattore di k 2 . La situazione diventa
più complicata quando due diversi segnali vengono sommati insieme; conoscere
solo le ampiezze dei due segnali non basta per conoscere l’ampiezza della somma.
Sicuramente le due misure di ampiezza soddisfano la disuguaglianza triangolare:
dati due segnali x[n] e y[n],

Apeak {x[n]} + Apeak {y[n]} ≥ Apeak {x[n] + y[n]},

ARMS {x[n]} + ARMS {y[n]} ≥ ARMS {x[n] + y[n]}.

Se, come al solito, si sceglie una finestra da M a M + N − 1, possiamo scrivere


la potenza media della somma di due segnali:

P {x[n] + y[n]} = P {x[n]]} + P {y[n]} + 2 · COV{x[n], y[n]}

dove abbiamo introdotto la covarianza dei due segnali:

x[M ]y[M ] + · · · + x[M + N − 1]y[M + N − 1]


COV{x[n], y[n]} = .
N
La covarianza può essere positiva, zero o negativa. Su una finestra sufficiente-
mente grande, la covarianza di due sinusoidi, con frequenze diverse, è trascu-
rabile rispetto alla potenza media. Due segnali che non hanno covarianza sono
chiamati non-correlati (la correlazione è la covarianza normalizzata affinché sia
un valore tra −1 e 1). In generale, per due segnali non-correlati, la potenza
della somma è la somma delle potenze:

P {x[n] + y[n]} = P {x[n]]} + P {y[n]}, se COV{x[n], y[n]} = 0.

In termini di ampiezze, questo diventa:


2 2 2
ARMS {x[n] + y[n]} = ARMS {x[n]} + ARMS {y[n]} .

Questa è la nota relazione pitagorica. Quindi i segnali non-correlati possono


essere pensati come vettori posti ad angolo retto tra loro; i segnali positivamente
correlati possono essere pensati come vettori che formano un angolo acuto, e
quelli negativamente correlati come vettori che formano un angolo ottuso.
Ad esempio, se due segnali non-correlati hanno
√ entrambi ampiezza RMS pari
ad a, la somma avrà ampiezza RMS pari a 2a. D’altra parte, se i due segnali
sono uguali – il caso di maggiore correlazione – la somma avrà ampiezza pari a
2a, che è il massimo consentito dalla disuguaglianza triangolare.
1.8. Informazioni sugli esempi software 11

1.7 Segnali periodici


Si dice che un segnale x[n] si ripete con periodo τ se
x[n + τ ] = x[n]
per ogni n. Un simile segnale si ripeterebbe anche nei periodi 2τ e cosı̀ via; il
più piccolo τ , se esiste, per cui il segnale viene ripetuto è detto il periodo del
segnale. Nella trattazione sui periodi di segnali audio digitali, ci imbattiamo
subito nella difficoltà di descrivere i segnali il cui “periodo” non sia un intero,
nel qual caso l’equazione di cui sopra non ha senso. Per ora ignoriamo questa
difficoltà supponendo che il segnale x[n] possa in qualche modo essere interpolato
tra i campioni in modo che sia ben definito se n è un intero o no.
Una sinusoide ha un periodo (in campioni) di 2π/ω dove ω è la frequenza
angolare. Più in generale, ogni somma di sinusoidi con frequenze kω, al variare
dell’intero k, si ripeterà dopo 2π/ω campioni. Tale somma è chiamata serie di
Fourier:
x[n] = a0 + a1 cos(ωn + φ1 ) + a2 cos(2ωn + φ2 ) + · · · + ap cos(pωn + φp ).
Inoltre, se facciamo alcune ipotesi tecniche (cioè che i segnali contengano solo un
numero finito di frequenze), possiamo rappresentare qualsiasi segnale periodico
come tale somma. Questa è la variante temporalmente discreta dell’analisi di
Fourier di cui parleremo nel Capitolo 9.
Le frequenze angolari delle sinusoidi, nella formula precedente, sono tutte
multipli interi di ω. Esse prendono il nome di armonici di ω, che a sua volta
viene chiamata fondamentale. In termini di toni, le armoniche ω, 2ω, . . . sono
ad intervalli di 0, 1200, 1902, 2400, 2786, 3102, 3369, 3600, . . . cents al di sopra
della fondamentale; questa sequenza di toni è talvolta chiamata serie armonica.
I primi sei di questi sono tutti molto vicini a multipli di 100; in altre parole,
i prime sei armonici di una nota nella scala occidentale si avvicinano (ma non
sempre esattamente eguali) ad altre note della stessa scala; il terzo e il sesto
difettano solo di 2 centesimi e il quinto di 14.
In altri termini, il rapporto di frequenze 3:2 (una quinta perfetta nella ter-
minologia occidentale) è quasi esattamente sette semitoni, 4: 3 (una quarta per-
fetta) è circa cinque semitoni, e i rapporti 5:4 e 6:5 (terza maggiore e minore)
sono abbastanza vicini agli intervalli di quattro e tre semitoni rispettivamente.
Una serie di Fourier (con solo tre termini) è mostrata in Figura 1.8. I primi
tre grafici sono sinusoidi, le cui frequenze sono in rapporto 1:2:3. Il periodo
comune è contrassegnato sull’asse orizzontale. Ogni sinusoide ha una diversa
ampiezza e una diversa fase iniziale. La somma delle tre sinusoidi, rappresentata
in fondo alla figura, non è una sinusoide, ma mantiene ancora la periodicità
condivisa dalle tre componenti sinusoidali.
Tralasciando le domande riguardanti la fase, possiamo usare un banco di
oscillatori sinusoidali per sintetizzare toni periodici, o addirittura variarli con
continuità attraverso una successione di toni periodici, specificando la frequenza
fondamentale e le (eventualmente variabili) ampiezze delle parziali (armoniche).
La Figura 1.9 mostra uno schema a blocchi per ottenere ciò.
Questo è un esempio di sintesi additiva; il termine, più in generale, può essere
applicato a reti in cui le frequenze degli oscillatori sono controllabili in maniera
indipendentemente. Ai suoi albori, la computer music componeva utilizzando i
suoni della sintesi additiva.
12 Capitolo 1. Sinusoidi, ampiezza e frequenza

1.7. PERIODIC SIGNALS 13

Figure
Figura 1.8:
1.8: AUna
Fourier
serie series, showing
di Fourier che three
mostra sinusoids and their
tre sinusoidi e la sum. The three
loro somma. Le
component sinusoids
tre componenti have frequencies
sinusoidali in the in
hanno frequenze ratio 1:2:3. 1:2:3.
rapporto
1.8. Informazioni sugli esempi software 13

14 CHAPTER 1. SINUSOIDS, AMPLITUDE AND FREQUENCY

FREQUENCY
(more)
3
2

OUT

Figure
Figura 1.9:
1.9: Using many
Possiamo oscillators
usare to synthesize
molti oscillatori a waveformuna
per sintetizzare withforma
desired har-
d’onda
monic amplitudes.
con ampiezze desiderate per gli armonici.
14 Capitolo 1. Sinusoidi, ampiezza e frequenza

1.8 Informazioni sugli esempi software


Gli esempi di questo libro sono fatti utilizzando il software Pure Data (Pd),
e per capirli è necessario imparare almeno qualcosa su tale software. Pd è
un ambiente per realizzare rapidamente applicazioni per la computer music,
destinate principalmente alle performance live musicali. Pd può essere utilizzato
anche per altri media, ma che qui non affronteremo.
Oltre a Pd esistono diversi altri ambienti DSP audio di tipo patchable. Il
più diffuso è certamente Csound [Bou00] di Barry Vercoe, che differisce da Pd
essendo di tipo text-based (e non GUI-based). Questo è un vantaggio in alcuni
aspetti e uno svantaggio in altri. Csound è più adatto di Pd per l’elaborazione in
batch e gestisce la polifonia molto meglio di Pd. D’altra parte, Pd ha una strut-
tura di controllo in tempo reale che risulta meglio sviluppata rispetto a Csound.
Genealogicamente, Csound appartiene ai cosiddetti Music N Languages [Mat69,
pp.115-172].
Un’altra alternativa open-source, ampiamente utilizzata, è SuperCollider di
James McCartney, che è anche maggiormente text-based di Pd, ma come Pd è
esplicitamente progettata per l’utilizzo in tempo reale. SuperCollider ha potenti
costruzioni linguistiche che lo rendono uno strumento più appropriato di Csound
per compiti quali scrivere loop o mantenere strutture di dati complesse.
Infine, Pd ha un fratello ampiamente usato, il programma commerciale
Max/MSP della Cycling74 (gli altri softwares qui citati sono tutti open source).
Sia i principianti che i gestori di sistemi in laboratori informatici multiutente e
multifunzionali troveranno Max/MSP meglio supportato e documentato di Pd.
È possibile apprendere Pd e applicare tale conoscenza in Max/MSP e viceversa,
e addirittura importare patches da uno all’altro, ma i due softwares non sono
compatibili al 100%.

Introduzione rapida a Pd
I documenti in Pd sono chiamati patches. Essi corrispondono approssimati-
vamente alle caselle negli schemi a blocchi astratti mostrati in precedenza in
questo capitolo, ma in dettaglio sono piuttosto diversi, perché Pd è un ambiente
di implementazione, non un linguaggio di specificazione.
Una patch in Pd, come quella mostrata in Figura 1.10, è costituita da un
insieme di caselle (boxes) collegate in una rete. Il bordo di una casella indica il
modo in cui viene interpretato il testo e come funziona la casella. Nella parte
(a) della figura vediamo tre tipi di caselle. Dall’alto verso il basso sono:
• una message box (casella di messaggio). Le message boxes, con un bordo
a forma di bandiera, interpretano il testo come un messaggio da inviare
ogni volta che la casella è attivata (da un messaggio in ingresso o con
un dispositivo di puntamento). Il messaggio in questo caso è costituito
semplicemente dal numero “21”.
• una object box (casella di oggetto). Le object boxes hanno un bordo rettan-
golare; interpretano il testo per creare oggetti quando si carica una patch.
Le object boxes possono contenere centinaia di classi diverse di oggetti –
compresi oscillatori, generatori di inviluppo e altri moduli di elaborazione
del segnale che introdurremo in seguito – a seconda del testo contenuto al
loro interno. In questo esempio, la casella contiene un sommatore. Nella
1.8. Informazioni
16 sugli esempi
CHAPTER software
1. SINUSOIDS, 15
AMPLITUDE AND FREQUENCY

440 frequency
21 message box
osc~ sinusoidal oscillator
+ 13 object box
amplitude
0.1 0 (on/off)
34 number
(GUI) box *~ multiplier

dac~ output
(a) (b)

Figure 1.10: (a) three types of boxes in Pd (message, object, and GUI); (b) a
Figurapatch
simple 1.10: to
(a)output
tre tipi di caselle in Pd (messaggio, oggetto e GUI); (b) una
a sinusoid.
semplice patch che produce una sinusoide.

message or with a pointing device). The message in this case consists


simply
maggior of parte
the number “21”. in Pd, la maggioranza delle caselle sono di ti-
delle patches
po “oggetto”. La prima parola digitata in una object box specifica la sua
• an object
classe, chebox. Objectcaso
in questo boxes have“+”.
è solo a rectangular border;
Le ulteriore parolethey interpret
aggiuntive the
(sepa-
text
rate toda create objects
spazi) che when nella
appaiono you load a patch.
casella Object
si chiamano boxes arguments,
creation may hold
hundreds
e specificano of different classes dell’oggetto
lo stato iniziale of objects—including
quando viene oscillators,
creato. envelope
generators, and other signal processing modules to be introduced later—
depending on the text inside. In this example, the box holds an adder.
• una number box (casella numerica). Le number boxes sono un tipo par-
In most Pd patches, the majority of boxes are of type “object”. The first
ticolare di casella GUI. Altri includono pulsanti e commutatori; questi
word typed into an object box specifies its class, which in this case is just
verranno mostrati in seguito negli esempi. La number box ha un bordo
“+”. Any additional (blank-space-separated) words appearing in the box
a forma di carta punzonata, con un taglio nell’angolo superiore destro.
are called creation arguments, which specify the initial state of the object
Mentre l’aspetto di un oggetto o di un messaggio è fisso quando una patch
when it is created.
è in esecuzione, il contenuto di una number box (il testo) cambia in modo
da riflettere
• a number box.il valore
Number corrente
boxes contenuto nella casella.
are a particular type of È GUIinoltre
box. possibile
Others
utilizzare una casella numerica come controller
include push buttons and toggle switches; these will come up laterfacendo clic e trascinando
in the
su e giù oppure
examples. digitandobox
The number i valori
has ainpunched-card-shaped
essa. border, with a
nick out of its top right corner. Whereas the appearance of an object or
Nella
messageFigura box1.10 (parte
is fixed whena) laa casella
patch isdirunning,
messaggio, quando box’s
a number viene contents
cliccata,
invia (the
il messaggio “21” a una casella di oggetto che aggiunge
text) changes to reflect the current value held by the box. You can 13. I cavi che
collegano le caselle trasportano i dati da una casella all’altra;
also use a number box as a control by clicking and dragging up and down, le uscite delle
caselle
orsono sul fondo
by typing valuese gliin ingressi
it. in cima.
La Figura 1.10 (parte b) mostra una patch Pd che produce una sinusoide con
In Figure 1.10
frequenza (part a)controllabili.
e ampiezza the message Qui, box, iwhen clicked,
cavi di sends the
collegamento message
sono di due“21”
tipi;
to an object
i cavi sottili box
sonowhich
per iladds 13 to it.
trasporto di The lines sporadici
messaggi connectinge the boxes
quelli più carry
spessidata
(che
from one box
collegano to the next;
l’oscillatore, outputs of boxes
il moltiplicatore are ondithe
e l’oggetto bottom
uscita dac∼) andtrasportano
inputs on
top.
i segnali audio digitali. Poiché Pd è un programma in tempo reale, i segnali
Figure
audio 1.10 (part
scorrono in un b) shows
flusso a Pd patch
continuo. whichi messaggi
Di contro, makes a sinusoid
sporadiciwith con-
appaiono
trollable
in momenti frequency
specifici,andma amplitude. The connecting
forse imprevedibili, patch lines are of two types
nel tempo.
Se una connessione porta messaggi o segnali dipende dalla scatola da cui
parte la connessione; cosı̀, per esempio, l’oggetto + produce un messaggio, ma
l’oggetto ∗ ∼ emette un segnale. Gli ingressi di un determinato oggetto possono
o meno accettare segnali (ma accettano sempre messaggi, anche solo per con-
16 Capitolo 1. Sinusoidi, ampiezza e frequenza

vertirli in segnali). Per convenzione, object boxes con segnale in input o output
contengono nel nome una tilde (“∼”) come in “∗ ∼” e “osc∼”.

Come trovare ed eseguire gli esempi


Per eseguire le patches, è necessario scaricare, installare ed eseguire Pd. Le
istruzioni per farlo appaiono nella documentazione HTML online di Pd, che è
disponibile all’indirizzo http://crca.ucsd.edu/∼msp/software.htm.
Questo libro dovrebbe apparire all’indirizzo
http:/crca/ucsd/edu/∼msp/techniques.htm
possibilmente in più revisioni. Scegliere la revisione che corrisponde al testo
che si sta leggendo (o forse proprio l’ultima) e scaricare l’archivio contenente la
revisione associata degli esempi (si può anche scaricare un archivio della versione
HTML di questo libro per un accesso più facile sul proprio computer). Gli
esempi devono essere contenuti in una singola directory, in quanto alcuni di essi
dipendono da altri file della directory e potrebbero non caricarsi correttamente
se le cose sono state spostate.
Se si vuole copiare uno degli esempi in un’altra directory in modo da poterci
costruire sopra (che è il caso di fare), bisogna includere la directory degli esempi
nel percorso di ricerca di Pd (vedere la documentazione di Pd) o capire quali altri
files sono necessari e copiare anche loro. Un buon modo per scoprire questo sta
nell’eseguire Pd sul file trasferito e vedere di cosa Pd si lamenta che non riesce
a trovare.
Dovrebbero esserci dozzine di file nella cartella “esempi”, inclusi gli esempi
stessi e i file di supporto. I nomi dei files degli esempi iniziano tutti con una let-
tera (A per il capitolo 1, B per 2, ecc.) e un numero, come in “A01.sinewave.pd”.
Le patches di esempio sono anche distribuite con Pd, ma attenzione che
ci potrebbe essere una versione diversa degli esempi e che potrebbero non
corrispondere al testo che si sta leggendo.

1.9 Esempi
Riscalatore costante di ampiezza
L’esempio A01.sinewave.pd, mostrato in Figura 1.11, contiene essenzialmente la
patch più semplice possibile per produrre un suono, con solo tre caselle di oggetti
(ci sono anche commenti e due caselle di messaggio per accendere e spegnere il
motore “DSP” (audio) di Pd). I tre oggetti sono:
osc∼ : oscillatore sinusoidale. L’ingresso sul lato sinistro e l’uscita sono segnali
audio digitali. L’input è una frequenza (eventualmente variabile nel tempo) in
Hertz. L’output è la sinusoide alla frequenza specificata. Se nulla è collegato
all’ingresso della frequenza, il creation argument (440 in questo esempio) viene
utilizzato come frequenza. L’output ha ampiezza di picco pari a 1. È possibile
impostare una fase iniziale inviando messaggi (non segnali audio) all’ingresso
destro. All’ingresso sinistro (frequenza) possono anche essere inviati messaggi
per impostare la frequenza, poiché qualsiasi ingresso che riceve un segnale audio
può ricevere anche messaggi che vengono automaticamente convertiti nel segnale
audio desiderato.
1.9. Esempi 17

1.9. EXAMPLES 19

MAKING A SINE WAVE


Audio computation in Pd is done using "tilde objects" such
as the three below. They use continuous audio streams to
intercommunicate, and also communicate with other
("control") Pd objects using messages.

osc~ 440 440 Hz. sine wave at full blast

*~ 0.05 reduce amplitude to 0.05

dac~ send to the audio output device

Audio computation can be turned on and off by sending


messages to the global "pd" object as follows:

; ;
pd dsp 1 pd dsp 0 <-- click these

ON OFF

You should see the Pd ("main") window change to reflect


whether audio is on or off. You can also turn audio on and
off using the "audio" menu, but the buttons are provided as
a shortcut.
When DSP is on, you should hear a tone whose pitch is A 440
and whose amplitude is 0.05. If instead you are greeted
with silence, you might want to read the HTML documentation
on setting up audio.
In general when you start a work session with Pd, you will
want to choose "test audio and MIDI" from the help window,
which opens a more comprehensive test patch than this one.

Figura1.11:
Figure 1.11:The
Il contenuto delthe
contents of primo esempio
first Pd di patch
example patch:inA01.sinewave.pd.
Pd: A01.sinewave.pd.
18 Capitolo 1. Sinusoidi, ampiezza e frequenza

∗ ∼ : moltiplicatore. Esiste in due forme. Se viene specificato un creation


argument (come in questo esempio, che è 0.05), questa casella moltiplica un
segnale audio digitale (nell’ingresso sinistro) per quel numero; questo può essere
aggiornato inviando messaggi all’ingresso destro. Se non viene fornito alcun
argomento, questa casella moltiplica due segnali audio digitali in arrivo insieme.
dac∼ : dispositivo di uscita audio. A seconda dell’hardware, questo potreb-
be non essere effettivamente un convertitore digitale/analogico (DAC = Digi-
tal/Analog Converter) come suggerisce il nome; ma in genere permette di inviare
qualsiasi segnale audio alle uscite audio del computer. Se non ci sono creation
arguments, il comportamento predefinito è quello di inviare ai canali uno e due
dell’hardware audio; è possibile specificare numeri di canali alternativi (uno o
molti) utilizzando i creation arguments. Pd stesso può essere configurato per
utilizzare due o più canali di uscita, oppure potrebbe non avere affatto aperto
il dispositivo di uscita audio; consultare la documentazione di Pd per i dettagli.
Le due message boxes mostrano una peculiarità nel modo in cui i messaggi
vengono analizzati nelle caselle di messaggio. In precedenza, nella Figura 1.10
(parte a), il messaggio consisteva solo del numero 21. Una volta cliccatovi
sopra, quella casella ha inviato il messaggio “21” alla sua uscita e quindi a tutti
gli oggetti connessi ad esso. In questo esempio corrente, il testo delle caselle
di messaggio inizia con un punto e virgola. Questo è un terminatore tra i
messaggi (quindi il primo messaggio è vuoto), dopo di che la parola successiva
viene considerata come il nome del destinatario del messaggio che segue. Cosı̀
il messaggio, in questo esempio, è “dsp 1” (o “dsp 0”) e il messaggio deve
essere inviato, non ad alcun oggetto connesso – che comunque non ci sono –
ma piuttosto all’oggetto denominato “pd”. Questo particolare oggetto viene
fornito invisibilmente dal programma Pd e è possibile inviargli diversi messaggi
per controllare lo stato globale di Pd, in questo caso attivando il motore audio
(“1”) e disattivandolo (“0”).
Molti altri dettagli sugli aspetti di controllo di Pd, come sopra, sono spiegati
in una diversa serie di patches di esempio (gli “esempi di controllo”) nella release
di Pd, ma saranno solo accennati qui quando necessari per mostrare le tecniche
di elaborazione del segnale che sono oggetto di questo libro.

Controllo di ampiezza in decibel


L’esempio A02.amplitude.pd mostra come effettuare un controllo di ampiezza
abbastanza grezzo; gli elementi attivi sono mostrati in Figura 1.12 (parte a).
C’è una nuova classe di oggetti:
dbtorms : conversione da Decibel ad ampiezza lineare. Il termine “RMS” è
improprio; doveva essere chiamato “dbtoamp”, in quanto converte veramente da
decibel a qualsiasi unità di ampiezza lineare, sia esso RMS, di picco o altro. Un
input di 100 dB è normalizzato ad un output di 1. Valori superiori a 100 sono
accettati (120 darà 10), ma valori inferiori o uguali a zero forniranno sempre zero
(un input pari a zero fornirebbe altrimenti un numero positivo piccolo). Questo
è un oggetto di controllo, cioè i numeri in entrata e in uscita sono messaggi, non
segnali. (Un oggetto corrispondente, dbtorms∼ , è quello relativo al segnale.
Tuttavia, come oggetto di segnale, questo è costoso in termini di CPU e spesso
troveremo modi alternativi per evitare di usarlo).
1.9. Esempi 19

osc~ 440 osc~ 440 osc~ 440

0 0.1 2000 <-- slow on osc~ 550


dbtorms 0.1 50 <-- fast on
+~
0.1 <-- instant on
0 osc~ 660
0 2000 <-- slow off
*~ 0 +~
0 50 <-- fast off
output~
dac~ 0 <-- instant off dB 0
line~ <--- ramp generator
mute
*~ <-- multiplier: this time
taking a signal in
dac~ on both sides.
(a) (b) (c)

Figure 1.12: The active ingredients to three patches: (a) A02.amplitude.pd; (b)
Figura 1.12: (c)
A03.line.pd; GliA05.output.subpatch.pd.
ingredienti attivi di tre patches: (a) A02.amplitude.pd; (b)
A03.line.pd; (c) A05.output.subpatch.pd.

Le due number boxes sono collegate all’ingresso e all’uscita dell’oggetto


dbtorms. L’ingresso funziona come un controllo; usare il mouse su di esso
(fare clic e trascinare verso l’alto o verso il basso) per modificare l’ampiezza. La
number box è stata impostata per un range da 0 a 80; questa è una protezione
per i diffusori e le orecchie, ed è saggio costruire tali limiti nelle proprie patches.
L’altra number box mostra l’output dell’oggetto dbtorms. È inutile modi-
ficare questa casella numerica, poiché la sua uscita non è collegata da nessuna
parte; è qui solo per visualizzare il suo ingresso. Le number boxes possono es-
sere utili come controllers, per visualizzare output numerici o per entrambe le
funzioni, anche se, se si utilizzano per entrambe, ci può essere qualche lavoro
aggiuntivo da fare.

Controllo di ampiezza, senza irregolarità, tramite un gene-


ratore di inviluppo
Come mostrato in Figura 1.6, un modo per apportare modifiche senza salti
all’ampiezza di un segnale, cioè senza clic, è quello di moltiplicarla per l’uscita
di un generatore di inviluppo come mostrato nel diagramma a blocchi in Figura
1.7. Questo può essere implementato in Pd utilizzando l’oggetto line∼:
line∼ : generatore di inviluppo. L’uscita è un segnale che fa una rampa
lineare da un valore all’altro in un determinato tempo, come determinato dai
messaggi ricevuti. Gli ingressi ricevono messaggi per specificare i valori di de-
stinazione (ingresso sinistro) e i ritardi di tempo (ingresso destro). A causa di
una regola generale dei messaggi in Pd, è sufficiente una coppia di numeri, in-
viata all’ingresso sinistro, per specificare insieme un valore di destinazione e un
20 Capitolo 1. Sinusoidi, ampiezza e frequenza

tempo della rampa. Il tempo è in millisecondi (tenendo conto della frequenza


di campionamento) e il valore di destinazione è privo di unità, o in altre parole,
la sua gamma di output deve essere conforme a qualsiasi ingresso con cui possa
essere collegata.
L’esempio A03.line.pd mostra l’uso di un oggetto line∼ per controllare l’am-
piezza di una sinusoide. La parte attiva è mostrata in Figura 1.12 (parte b).
Le sei message boxes sono tutte connesse all’oggetto line∼ e vengono attivate
facendo clic su di esse; quella in alto, per esempio, specifica che line∼ fa una
rampa (a partire da qualunque sia il suo output prima della ricezione del mes-
saggio) al valore 0.1 in due secondi. Dopo che i due secondi sono trascorsi, a
meno che non siano arrivati altri messaggi nel frattempo, l’output rimane co-
stante a 0.1. I messaggi possono arrivare prima che i due secondi siano passati,
nel qual caso l’oggetto line∼ abbandona la sua vecchia traiettoria e ne prende
una nuova.
Due messaggi potrebbero arrivare a line∼ allo stesso tempo o cosı̀ vicino
nel tempo che nessun calcolo DSP avvenga tra i due; in questo caso, il messag-
gio precedente non ha alcun effetto, poiché line∼ non avrà ancora modificato
l’output per seguire il primo messaggio ed il suo output corrente, invariato, viene
quindi utilizzato come punto di partenza per il secondo segmento. Un’eccezione
a questa regola è che, se line∼ ottiene un valore temporale pari a zero, il valore
di output viene immediatamente impostato sul nuovo valore e gli altri segmen-
ti partiranno dal nuovo valore; quindi, inviando due coppie, il primo con un
valore temporale di zero e il secondo con un valore temporale diverso da zero,
si può specificare in modo indipendente i valori iniziali e finali di un segmento
nell’output di line∼.
Il trattamento dell’ingresso destro di line∼ è inusuale tra gli oggetti Pd
in quanto dimentica i vecchi valori; un messaggio con un singolo numero come
“0.1” è sempre equivalente alla coppia “0.1 0”. Quasi qualsiasi altro oggetto
conserverà il valore precedente per l’ingresso destro, anziché ripristinarlo a zero.
L’esempio A04.line2.pd mostra graficamente l’output dell’oggetto line∼.
Utilizzando le varie caselle di messaggio, è possibile ricreare gli effetti mostrati
nella Figura 1.6.

Triade maggiore
L’esempio A05.output.subpatch.pd, i cui ingredienti attivi sono mostrati in Fi-
gura 1.12 (parte c), presenta tre sinusoidi con frequenze nel rapporto 4:5:6, in
modo che le prime due siano separate da una terza maggiore, le ultime due da
una terza minore, e la prima e la terza da una quinta. La frequenza più bassa è
440, pari al La sopra al Do centrale, o MIDI 69. Gli altri sono rispettivamente
pari a circa quattro e sette semitoni più alti. Le tre sinusoidi hanno ampiezze
uguali.
Il controllo di ampiezza, in questo esempio, viene curato da un nuovo oggetto
chiamato output∼. Questo non è un oggetto incorporato di Pd, ma è una patch
di Pd contenuta nel file, “output.pd” (è possibile vedere l’interno di output∼
aprendo il menu delle proprietà della casella e selezionando “open”). Ci sono
due controlli, uno per l’ampiezza in dB (100 equivale al “guadagno unitario”)
e un pulsante “mute”. Il motore audio di Pd viene attivato automaticamente
quando si imposta il livello di output – questo potrebbe non essere il compor-
tamento migliore in generale, ma è appropriato per queste patches di esempio.
1.9. EXAMPLES
1.9. Esempi 23 21

r frequency r pitch

set $1 set $1
0 <−− set frequency 0 <−− set MIDI pitch

s frequency s pitch
ftom <−− convert frequency mtof <−− convert "MIDI" pitch
to "MIDI" pitch to frequency
s pitch s frequency

Figure 1.13: Conversion between pitch and frequency in A06.frequency.pd.


Figura 1.13: Conversione tra nota MIDI e frequenza in A06.frequency.pd.

be abbreviated as “r”, waits for non-local messages to be sent by a send ob-


Il meccanismo
ject per l’incorporazione
(described below) or by a messagediboxunausing
patch di Pd come
redirection (the casella di oggetti
“;” feature
all’interno
discussed di un
in the altroexample,
earlier sarà discusso nel paragrafo
A01.sinewave.pd). The4.7.
argument (such as “fre-
quency” and “pitch” in this example) is the name to which messages are sent.
Multiple receive objects
Conversione may share the esame
tra frequenza tononame, in which case any message
sent to that name will go to all of them.
L’esempio
send , s :A06.frequency.pd
The send object, (Figura 1.13)
which may be mostra l’oggetto
abbreviated di directs
as “s”, Pd permes-
convertire
note MIDI in unità di
sages to receive objects. frequenza (mtof, significa “MIDI a frequenza”) e il suo
inverso ftom. Introduciamo anche altre due classi di oggetti, send e
Two new properties of number boxes are used here. Earlier we’ve used themreceive.
asmtof
controls or as: displays;
, ftom converte here,
la notathe MIDI
two number boxes each
nella relativa functioninasbase
frequenza both.
alle for-
Ifmule
a number box gets a number in its inlet, it not only displays the
di conversione (pagina 6). Gli ingressi e le uscite sono messaggi (esistono number
but also repeats the number to its output. However, a number box may also
anche gli equivalenti con il “tilde”, sebbene, come dbtorms∼, sono costosi co-
be sent a “set” message, such as “set 55” for example. This would set the
me tempo macchina). L’output dell’oggetto ftom è −1500 se l’input è zero o
value of the number box to 55 (and display it) but not cause the output that
negativo;
would resultaltrettanto, se si “55”
from the simple mtof −1500,
dà amessage. In thiso case,
un valore
numbers piùcoming
basso, from
fornisce in
output zero.
the two receive objects are formatted (using message boxes) to read “set 55”
instead
receiveof just
, r “55”, andi so
: riceve on. (The
messaggi nonspecial word “$1”
localmente. is replaced
L’oggetto by the
receive, che può
incoming number.) con
essere abbreviato This“r”,
is done because
attende otherwise
messaggi we would
non-locali have anda
da inviare infinite
un oggetto
loop:
send frequency
(descrittowould changeo pitch
di seguito) da una which wouldbox
message change frequency
utilizzando and so on
il reindirizzamento
forever, or at least until something broke.
(il “;” discusso nell’esempio precedente, A01.sinewave.pd ). L’argomento (come
“frequency” e “pitch” in questo esempio) è il nome a cui vengono inviati i
More additive
messaggi. synthesis
Più oggetti receive possono condividere lo stesso nome, nel qual
caso tutti i messaggi inviati a tale nome verranno inviati a tutti i receive con
The major triad (Example A06.frequency.pd, Page 22) shows one way to com-
quel nome.
bine several sinusoids together by summing. There are many other possible
sendto, organize
ways s : l’oggetto
collections che puòofessere
of sinusoids,
send, whichabbreviato con “s”,
we’ll show two. indirizza i
Example
A07.fusion.pd
messaggi agli(Figure
oggetti1.14) shows four oscillators, whose frequencies are tuned
receive.
in theAdesso
ratio 1:2:3:4, with relative
sono state amplitudes
utilizzate 1, 0.1,
due nuove 0.2, and 0.5.
proprietà delleThe amplitudes
number boxes. In
are set by multiplying the outputs of the oscillators (the *~
precedenza le abbiamo usate come controllers o come display; qui, objects below thecaselle
le due
oscillators).
funzionano in entrambi i modi. Se una number box riceve un numero nella
sua entrata, non solo visualizza il numero, ma rinvia anche il numero alla sua
uscita. Tuttavia, una message box può anche essere inviata ad un messaggio
“set”, come, per esempio, “set 55”. Questo imposta il valore del number box
a 55 (e lo visualizza) ma non provoca l’uscita che invece avremmo avuto con il
semplice messaggio “55”. In questo caso, i numeri provenienti dai due oggetti
receive vengono formattati (utilizzando le message boxes) per leggere “set
55” anziché “55” e cosı̀ via (la parola speciale $1 è sostituita dal numero in
2422 CHAPTER 1. SINUSOIDS,
Capitolo AMPLITUDE AND FREQUENCY
1. Sinusoidi, ampiezza e frequenza

0 <-- choose a pitch


mtof

* 2 * 3 * 4 frequencies of harmonics

osc~ osc~ osc~ osc~ four oscillators

*~ 0.1 *~ 0.2 *~ 0.5 adjust amplitudes

+~

+~ add the three overtones together

+~ *~ <-- overtones ON/OFF

(OUT)

Figura 1.14: Sintesi additiva usando oscillatori armonicamente intonati.


Figure 1.14: Additive synthesis using harmonically tuned oscillators.

entrata). Ciò è stato fatto perché altrimenti avremmo avuto un ciclo infinito:
laThe second,cambierebbe
frequenza third, and lafourth
nota oscillator are turned
che cambierebbe on and off
la frequenza using
e cosı̀ via aper
toggle
switch.
sempre,This is a graphical
o almeno control,
fino a quando like the
qualcosa number
non andassebox introduced earlier. The
in crash.
toggle switch puts out 1 and 0 alternately when clicked on with the mouse.
This value is multiplied by the sum of the second, third, and fourth oscillators,
Ancoraturning
effectively sulla sintesi
them on additiva
and off.
Even when all four oscillators are combined (with the toggle switch in the “1”
La triade maggiore (esempio A06.frequency.pd, pagina 20) mostra un modo per
position),
combinare the resultpiù
insieme fuses into atramite
sinusoidi single la tone,
loro heard
somma.atCi the pitch
sono moltiof altri
the modi
leftmost
oscillator.
possibili per organizzare insiemi di sinusoidi, di cui ne mostreremo due. L’esem- a
In effect this patch sums a four-term Fourier series to generate
complex, periodic waveform.
pio A07.fusion.pd (Figura 1.14) mostra quattro oscillatori, le cui frequenze sono
Examplenel
impostate A08.beating.pd
rapporto 1:2:3:4, (Figure 1.15) ampiezze
con relative shows another
1, 0.1, possibility,
0.2 e 0.5. Leinam- which
sixpiezze
oscillators are tuned moltiplicando
sono impostate into three pairs of neighbors,
le uscite for instance
degli oscillatori 330 and
(gli oggetti ∗∼ 330.2
Hertz.
sotto gliThese pairs slip into and out of phase with each other, so that the
oscillatori).
amplitude of the
Il secondo, sum
terzo changes
e quarto over time.
oscillatore Callede spenti
sono accesi beating, this phenomenon
utilizzando un inter- is
ruttore a pulsante (toggle).
frequently used for musical effects. Questo è un controller grafico, come le number boxes
introdotte in precedenza. Il toogle fornisce 1 e 0 alternativamente
Oscillators may be combined in other ways besides simply summing quando si fatheir
clic con il mouse. Questo valore viene moltiplicato per la somma
output, and a wide range of resulting sounds is available. Example A09.frequency.mod.pd del secondo,
terzo
(not e quarto
shown here) oscillatore, quindi frequency
demonstrates effettivamente accendendoli
modulation e spegnendoli.
synthesis, in which one
Anche quando tutti e quattro gli oscillatori vengono
oscillator controls another’s frequency. This will be more fully described combinati (con il toggle in
in posizione “1”), il risultato si fonde in un singolo tono, alla frequenza dell’o-
Chapter 5.
scillatore sinistro. In effetti questa patch somma una serie Fourier a quattro
termini per generare una forma d’onda complessa e periodica.
L’esempio A08.beating.pd (Figura 1.15) mostra un’altra possibilità, in cui
Exercises
sei oscillatori sono sintonizzati in tre coppie di frequenze vicine, ad esempio
330 e 330.2 Hertz. Queste coppie vanno alternativamente in fase e fuori fase, in
1. A sinusoid (Page 1) has initial phase φ = 0 and angular frequency ω =
modo che l’ampiezza della somma cambi nel tempo. Questo fenomeno, chiamato
π/10. What is its period in samples? What is the phase at sample number
battimento (beating) è spesso utilizzato per effetti musicali.
1.9.
1.9. Esempi
EXAMPLES 23
25

osc~ 330 osc~ 440 osc~ 587


osc~ 330.2 osc~ 440.33 osc~ 587.25

+~ +~ +~

+~
+~

(OUT)

Figure 1.15:
Figura 1.15: Additive synthesis:
Sintesi additiva: seisix oscillators
oscillatori arrangeda into
impostati three
coppie perbeating pairs.
produrre tre
battimenti.
n = 10?
Gli oscillatori possono essere combinati in altri modi oltre a sommare sem-
2. Two sinusoids have periods of 20 and 30 samples, respectively. What is
plicemente i loro outputs e una vasta gamma di suoni risultanti è possibile.
the period of the sum of the two?
L’esempio A09.frequency.mod.pd (non presentato qui) mostra la sintesi di mo-
dulazione
3. If 0 di
dBfrequenza,
correspondsin cui
to anunamplitude
oscillatoreofcontrolla la frequenza
1, how many di un altro.
dB corresponds to
Questoamplitudes
sarà approfondito
of 1.5, 2,nel Capitolo
3, and 5? 5.

4. Two uncorrelated signals of RMS amplitude 3 and 4 are added; what’s


Esercizi
the RMS amplitude of the sum?

5. Una
1. How sinusoide
many uncorrelated
(pagina 1)signals,
ha fasealliniziale
of equal
φ=amplitude, wouldangolare
0 e frequenza you haveω to
=
add to Qual
π/10. get a signal
è il suothat is 9 dBingreater
periodo in amplitude?
campioni? Qual è la fase al campione
n = 10?
6. What is the angular frequency of middle C at 44100 samples per second?
2. Due sinusoidi hanno periodi di 20 e 30 campioni, rispettivamente. Quale
7. èTwo sinusoids
il periodo play
della at middle
somma C (MIDI 60) and the neighboring C sharp
dei due?
(MIDI 61). What is the difference, in Hertz, between their frequencies?
3. Se 0 dB corrispondono ad un’ampiezza di 1, quanti dB corrispondono alle
8. ampiezze
How manydicents 1.5, 2,is 3the interval between the seventh and the eighth har-
e 5?
monic of a periodic signal?
4. Due segnali non-correlati di ampiezza RMS 3 e 4 vengono sommati; qual
9. èIf l’ampiezza
an audio signal
RMS x[n], = 0, ..., N − 1 has peak amplitude 1, what is the
dellansomma?
minimum possible RMS amplitude? What is the maximum possible?
5. Quanti segnali non-correlati, tutti di uguale ampiezza, bisogna aggiungere
per ottenere un segnale che è 9 dB maggiore in ampiezza?
6. Qual è la frequenza angolare del Do centrale alla frequenza di campiona-
mento di 44100 campioni al secondo?
7. Due sinusoidi producono un Do centrale (MIDI 60) ed il suo vicino Do
Diesis (MIDI 61). Qual è la differenza, in Hertz, tra le loro frequenze?
8. Quanto misura, in cents, l’intervallo tra il settimo e l’ottavo armonico di
un segnale periodico?
9. Se un segnale audio x[n], n = 0, . . . , N − 1 ha ampiezza di picco 1, qual è
l’ampiezza RMS minima possibile? Qual è la massima possibile?
24 Capitolo 1. Sinusoidi, ampiezza e frequenza
Capitolo 2

Wavetables e campionatori

Nel Capitolo 1 abbiamo trattato i segnali audio come se scorressero sempre,


in un flusso continuo, a qualche frequenza di campionamento. La frequenza di
campionamento non è realmente una qualità del segnale audio, ma piuttosto
specifica quanto velocemente i singoli campioni scorrono in entrata o in uscita
dal computer. Ma i segnali audio sono, in fin dei conti, delle sequenze di numeri,
e in pratica non esiste alcun obbligo di “eseguirli” in sequenza. Inoltre i segnali
audio digitali possono essere salvati in memoria e, più tardi, possono essere letti
in qualsiasi ordine – avanti, indietro, avanti e indietro o totalmente a caso. Si
apre una gamma inesauribile di nuove possibilità.
Per molti anni (circa dal 1950 al 1990), il nastro magnetico serviva come
principale mezzo di memorizzazione per i suoni. I nastri venivano passati avanti
e indietro attraverso le testine magnetiche per riprodurre i segnali in tempo
reale. Dal 1995 o giù di lı̀, il modo predominante di memorizzare i suoni è
quello di considerarli come segnali audio digitali, che possono essere riprodotti
con maggiore libertà e facilità rispetto ai nastri magnetici. Molte tecniche di
utilizzo risalenti all’era del nastro magnetico sono ancora attuali, tra i quali il
taglio, la duplicazione, la modifica della velocità e l’inversione. Altre tecniche,
come il waveshaping, sono proprie solo nell’era digitale.
Supponiamo di avere un segnale audio digitale memorizzato, che è solo una
sequenza di campioni (cioè numeri) x[n] per n = 0, . . . , N − 1, dove N è la
lunghezza della sequenza. Quindi, se abbiamo un segnale di input y[n] (che
possiamo immaginare scorra in tempo reale), possiamo usare i suoi valori come
indici per cercare i valori del segnale memorizzato x[n]. Questa operazione,
chiamata wavetable lookup (ricerca su wavetable), ci dà un nuovo segnale, z[n],
calcolato come:
z[n] = x[y[n]].

Schematicamente rappresentiamo questa operazione come mostrato in Figura


2.1.
Ci sono due complicazioni. Innanzitutto, i valori di input, y[n], potrebbero
trovarsi al di fuori dell’intervallo 0, . . . , N − 1, nel qual caso x[n] non ha alcun
valore e l’espressione z[n] non è definita. In questa situazione potremmo sce-
gliere di ritagliare l’input (to clip), vale a dire sostituire 0 per qualsiasi valore
negativo e N − 1 per valor uguali o maggiori a N . In alternativa, possiamo
preferire riavvolgere (to wrap) l’input ai suoi estremi (punti di wraparounds).

25
28
26 CHAPTER 2. WAVETABLES
Capitolo ANDe SAMPLERS
2. Wavetables campionatori

IN

OUT

Figure
Figura 2.1:
2.1: Diagram
Diagrammafor per
wavetable lookup.lookup.
la wavetable The input is inè samples,
L’input ranging
in campioni, che
approximately from 0 to the wavetable’s
vanno approssimativamente size N , depending
da 0 alla lunghezza on the interpolation
N della wavetable, a seconda
scheme.
dello schema di interpolazione.

are
Quialways clipped;
adotteremo when we need
la convenzione chewraparound, we’ll introduce
i campioni fuori campo sono another
sempre signal
rita-
processing operation to do it for us.
gliati; quando avremo bisogno di riavvolgere, introdurremo un’altra operazione
The second complication
di elaborazione del segnale che is lo
that the
farà perinput
noi. values need not be integers; in
other words they might fall between the points of the wavetable. In general,
La seconda complicazione è che i valori di ingresso, y[n], potrebbero non es-
this is addressed by choosing some scheme for interpolating between the points
sere interi; in altre parole potrebbero stare tra i punti n della wavetable x[n]. In
of the wavetable. For the moment, though, we’ll just round down to the nearest
generale, questo viene affrontato scegliendo un certo schema di interpolazione tra
integer below the input. This is called non-interpolating wavetable lookup, and
i punti della wavetable. Per il momento, però, arrotondiamo al più grande intero
its full definition is:
inferiore al valore di ingresso. Si parlerà quindi di wavetable non-interpolante e

la sua definizione completa ⎨ è:
x[⌊y[n]⌋] if 0 ≤ y[n] < N − 1
z[n] =  x[0] if y[n] < 0
⎩x[by[n]c] se 0 ≤ y[n] < N + 1
 x[N − 1] if y[n] ≥ N − 1
z[n] = x[0] se y[n] < 0
(where ⌊y[n]⌋ means, “the  greatest integer
x[N − 1] se y[n] not exceeding
≥ N + 1 y[n]”).
Pictorally, we use y[0] (a number) as a location on the horizontal axis of the
wavetable shown in Figure 2.1, and the output, z[0], is whatever we get on the
(dove by[n]c significa “l’intero più grande non superiore a y[n]”).
vertical axis; and the same for y[1] and z[1] and so on. The “natural” range
Graficamente parlando, usiamo y[0] (un numero) come posizione sull’asse
for the input y[n] is 0 ≤ y[n] < N . This is different from the usual range of an
orizzontale della wavetable mostrata in Figura 2.1 e l’output, z[0], è ciò che
audio signal suitable for output from the computer, which ranges from -1 to 1
otteniamo sull’asse verticale; e lo stesso per y[1] e z[1] e cosı̀ via. Il range
in our units. We’ll see later that the usable range of input values, from 0 to N
“naturale” per l’input y[n] è 0 ≤ y[n] < N . Questo range è diverso dall’intervallo
for non-interpolating lookup, shrinks slightly if interpolating lookup is used.
abituale di un segnale audio adatto per l’uscita dal computer, che varia, nella
Figure 2.2 (part a) shows a wavetable and the result of using two different
nostre unità di misura, da −1 a 1. Vedremo più tardi che il range utilizzabile
input signals as lookup indices into it. The wavetable contains 40 points, which
dei valori di input, da 0 a N per la ricerca non-interpolata, si riduce leggermente
are numbered from 0 to 39. In part (b), a sawtooth wave is used as the input
se si utilizza la ricerca interpolata.
signal y[n]. A sawtooth wave is nothing but a ramp function repeated end to
end.LaInFigura 2.2 (parte
this example thea)sawtooth’s
mostra unarange wavetable
is frome il0risultato di utilizzare
to 40 (this is shown due in
diversi segnali di input come indici di ricerca in essa.
the vertical axis). The sawtooth wave thus scans the wavetable from La wavetable contiene
left to40
punti, che sono numerati da 0 a 39. In (b), viene utilizzata
right—from the beginning point 0 to the endpoint 39—and does so every time un’onda a dente
direpeats.
it sega come Oversegnale di points
the fifty input y[n].
shownUn’onda
in Figurea2.2 dente
(partdib)sega
the non è altro
sawtooth che
wave
una funzione a rampa ripetuta dall’inizio alla fine. In questo esempio il range
dell’onda a dente di sega è da 0 a 40 (che è mostrato nell’asse verticale). L’onda
a dente di sega esegue quindi la scansione della wavetable da sinistra a destra
– dal punto iniziale 0 al punto finale 39 – e lo fa ogni volta che si ripete. Sui
cinquanta punti mostrati nella Figura 2.2 (parte b) l’onda a dente di sega fa
27

30 CHAPTER 2. WAVETABLES AND SAMPLERS

1 x[n]

(a)
0 40 n
−1

40 y[n]
0 (b)
50

1 z[n]

(c)

−1

40 y2[n]
0 (d)

1 z2[n]

(e)

−1

Figura 2.2: Wavetable lookup: (a) una wavetable; (b) e (d) segnali di input per
la ricerca; (c) ed (e) i corrispondenti outputs.
Figure 2.2: Wavetable lookup: (a) a wavetable; (b) and (d) signal inputs for
lookup; (c) and (e) the corresponding outputs.
28 Capitolo 2. Wavetables e campionatori
2.1. THE WAVETABLE OSCILLATOR 31

frequency
frequency
N
N

0
1
1

-1
-1

OUT
OUT
(a)
(b)

Figure
Figura2.3:
2.3: Block diagrams:
Diagrammi (a) for a(a)
a blocchi: wavetable
per un lookup oscillator;
oscillatore (b) with
di ricerca wavetable;
amplitude control by an envelope generator.
(b) con controllo di ampiezza tramite un generatore di inviluppo.

by y[n] and z[n], we compute the signal


due cicli mezzo. Il suo periodo è di venti campioni, cioè, in altri termini, la
frequenza (in cicli al secondo) è R/20.+ x[n]z[n]
(1 − x[n])y[n]
La parte (c) della Figura 2.2 mostra il risultato dell’applicazione della wa-
or, equivalently
vetable lookup,and usually
sulla tabellamore efficient
x[n], to calculate,
tramite il segnale y[n]. Poiché l’onda a dente
di sega in ingresso legge semplicemente il contenuto della wavetable da sinistra
x[n](z[n] − y[n])
a destra, ripetutamente, ay[n] una+ velocità di precessione costante, il risultato sarà
This computation is diagrammed in Figure d’onda
un nuovo segnale periodico la cui forma 2.4. deriva da x[n] e la cui frequenza
è determinata dall’onda a dente di sega y[n].
When using this technique to cross-fade between wavetable oscillators, it
might Lebeparti (d) e to
desirable (e)keep
mostrano un esempio
the phases in cui lapartials
of corresponding wavetable vieneacross
the same letta in mo-
do non uniforme; poiché il segnale di ingresso sale da 0
the wavetables, so that their amplitudes combine additively when they are a N e successivamente
ritorna On
mixed. a 0,the
vediamo che laifwavetable
other hand, apparirà prima
arbitrary wavetables are usedin avanti, poi congelata
(borrowed, for
al suo punto
instance, from afinale,
recordedquindi
sound)tornerà indietro.
there will La tabella
be a phasing effect viene
as the scansionata
different da
waveforms
sinistra a are mixed.
destra e poi, più rapidamente, da destra a sinistra. Come nell’esem-
pioThis scheme can
precedente be extended
il segnale in acontrolla
in input daisy chain to move along
la velocità a continuous
di precessione mentre le
path between
ampiezze a succession
dell’output z[n]ofsono
timbres.
quelleAlternatively,
della wavetableor inx[n].
combination with
daisy-chaining, cross-fading may be used to interpolate between two different
timbres, for example as a function of musical dynamic. To do this you would
prepare two or even several waveforms of a single synthetic voice played at
2.1 L’oscillatore wavetable
different dynamics, and interpolate between successive ones as a function of the
output dynamic you want.
La Figura 2.2 suggerisce un modo semplice per sintetizzare qualsiasi forma d’on-
da fissata a qualsiasi frequenza desiderata, utilizzando il diagramma a blocchi
mostrato in Figura 2.3. Nel blocco superiore c’è un oscillatore – non l’oscilla-
tore sinusoidale che abbiamo visto in precedenza, ma quello che produce invece
un’onda a dente di sega. I suoi valori di uscita, come indicato a sinistra del bloc-
co, dovrebbero essere compresi tra 0 e la lunghezza N della wavetable. Questo
valori vengono utilizzati come indice nel blocco di ricerca (introdotto in Figura
2.1), fornendo come risultato una forma d’onda periodica. La Figura 2.3 (par-
2.1.
32 L’oscillatore wavetable
CHAPTER 2. WAVETABLES AND SAMPLERS 29

frequency

-1

OUT

Figure 2.4: Block diagram for cross-fading between two wavetables.


Figura 2.4: Diagramma a blocchi per la dissolvenza incrociata tra due
wavetables.
2.2 Sampling
te b) aggiunge
“Sampling” un generatore
is nothing more thandirecording
inviluppo e un
a live moltiplicatore
signal per controllare
into a wavetable, and
l’ampiezza
then later playing it out again. (In commercial samplers the entire wavetable sinu-
di uscita nello stesso modo di quello mostrato per l’oscillatore
soidale in Figura
is usually called a1.7 (paginabut
“sample” 9). toSpesso
avoid siconfusion
utilizza we’ll
una wavetable
only use the conword
ampiezza
(RMS
“sample”o dihere
picco) pariaasingle
to mean 1, in number
modo che in an l’ampiezza finale sia solo determinata
audio signal.)
At its simplest,
dall’ampiezza a sampler isdisimply
del generatore a wavetable oscillator, as was shown in
inviluppo.
Figure
Gli 2.3. However,
oscillatori in the earlier
wavetable sonodiscussion we imagined
spesso utilizzati perplaying the oscillator
sintetizzare i suoni con
back atstatici
spettri a frequency high enough
specificati. A tal to be si
fine, perceived
calcolano as inizialmente
a pitch, at least
N 30 Hertz ordi una
campioni
so. In theforma
qualsiasi case ofd’onda
sampling, the frequency
di periodo is usuallyangolare
N (frequenza lower than
2π/N30 )Hertz, and
semplicemente
so the period, at least 1/30 second and perhaps much more, is long enough that
sommando gli elementi della serie di Fourier (pagina 11). Il costo di calcolo per la
you can hear the individual cycles as separate events.
realizzazione della wavetable in un primo momento potrebbe essere significativo,
Going back to Figure 2.2, suppose that instead of 40 points the wavetable
ma
x[n]questo può essere
is a one-second fatto in at
recording, anticipo
an originalrispetto
sampleal processo di sintesi
rate of 44100, so that cheitinvece
potrebbe avvenire in tempo reale.
has 44100 points; and let y[n] in part (b) of the figure have a period of 22050
Mentre
samples. la sintesi
This additiva
corresponds to adiretta
frequencydi forme d’onda
of 2 Hertz. Butcomplesse,
what we hearcome mostrato
is not
nel Capitolo
a pitched sound1, at
è in linea di
2 cycles permassima infinitamente
second (that’s too slow toflessibile
hear as come
a pitch) tecnica
but per
produrre
rather, wetimbri variabili
hear the originalnelrecording
tempo, la x[n] sintesi
playedwavetable è moltoatmeno
back repeatedly doublecostosa
speed.
in We’ve
termini di just reinvented
calcolo, the sampler.
ma richiede un cambio di wavetables per poter cambiare
In general,
il timbro. Unaif we assume
tecnica the sample più
intermedia, rate flessibile
R of the recording is the same
e più costosa di una as the
semplice
output wavetable,
sintesi sample rate,ma if the wavetable
meno has eN meno
flessibile samples, and ifdella
costosa we index it with
sintesi a
additiva, è
sawtooth
quella wave ofmiscele,
di creare period Mche , thevariano
sample nel
is sped up ortra
tempo, slowed down bynumero
un ridotto a factordi of wave-
tables fisse. Se il numero di wavetables è solo due, si tratta, in effetti, di una
dissolvenza incrociata (cross-fade) tra le due forme d’onda, come illustrato nella
Figura 2.4. Supponiamo di usare un segnale 0 ≤ x[n] ≤ 1 per controllare le
relative intensità delle due forme d’onda, in modo che, se x[n] = 0, otteniamo
la prima e se x[n] = 1 otteniamo la seconda. Denotando con y[n] and z[n] i due
segnali da incrociare, calcoliamo il segnale

(1 − x[n])y[n] + x[n]z[n]
30 Capitolo 2. Wavetables e campionatori

o, equivalente e di solito più efficiente da calcolare,


y[n] + x[n](z[n] − y[n]).
Questo calcolo è illustrato nella Figura 2.4.
Quando si utilizza questa tecnica per mixare due oscillatori wavetable, po-
trebbe essere auspicabile mantenere uguali le fasi delle parziali corrispondenti
tra le wavetables, in modo che le loro ampiezze si combinino additivamente
quando si mescolano. D’altra parte, se vengono utilizzate wavetables arbitra-
rie (prese in prestito, ad esempio, da un suono registrato) ci sarà un effetto di
phasing in quanto le diverse forme d’onda sono mescolate.
Questo schema può essere esteso in una catena circolare dove ci si muove,
lungo un percorso continuo, tra una successione di timbri. In alternativa o in
combinazione con la catena, è possibile utilizzare un cross-fading per interpolare
tra due diversi timbri, ad esempio in funzione della dinamica musicale. Per
fare questo si preparano due o addirittura diverse forme d’onda di una singola
voce sintetica, eseguita a diverse dinamiche, e si interpola tra due successive in
funzione della dinamica di uscita desiderata.

2.2 Campionamento
Il “Campionamento” (o sampling) altro non è che la registrazione di un segnale
dal vivo in una wavetable e poi riprodurlo di nuovo (nei campionatori commer-
ciali l’intera wavetable è solitamente chiamata “campione”, anziché sample, ma
per evitare confusione qui usiamo la parola campione solo per significare un
singolo numero in un segnale audio).
In termini spiccioli, un campionatore è semplicemente un oscillatore waveta-
ble, come è stato mostrato in Figura 2.3. Tuttavia, nella discussione precedente
abbiamo immaginato che l’oscillatore avesse una frequenza abbastanza alta, al-
meno 30 Hertz, per essere percepito come un tono. Nel caso del campionamento,
la frequenza è di solito inferiore a 30 Hertz, quindi il periodo, almeno 1/30 di se-
condo e forse molto di più, è abbastanza lungo da poterci fare ascoltare i singoli
cicli come eventi separati.
Tornando alla Figura 2.2, supponiamo che invece di 40 punti la wavetable
x[n] sia una registrazione di un secondo, ad una frequenza di campionamento
originale di 44100, in modo da avere 44100 punti; e supponiamo che y[n], nella
parte (b) della figura, abbia un periodo di 22050 campioni. Questo corrispon-
de ad una frequenza di 2 Hertz. Ma quello che sentiamo non è un suono, con
intonazione fissata, a 2 cicli al secondo (che è troppo lento per percepirlo co-
me un tono) ma piuttosto sentiamo la registrazione originale x[n] riprodotta
ripetutamente a velocità doppia. Abbiamo appena reinventato il campionatore.
In generale, se si assume che la frequenza di campionamento R della registra-
zione sia uguale alla velocità di campionamento di uscita, se la wavetable ha N
campioni e se la indicizziamo tramite un’onda a dente di sega di periodo M cam-
pioni, il sample viene accelerato o rallentato da un fattore pari a N/M , uguale
a N f /R se f è la frequenza in Hertz dell’onda a dente di sega. Se indichiamo
con t il fattore di trasposizione (in modo che, per esempio, t = 3/2 significa
trasporre di una quinta perfetta ascendente) e se si indica con h la trasposizione
in semitoni, otteniamo le formule di trasposizione (per looping wavetables):
t = N/M = N f /R,
2.2. Campionamento 31

   
N Nf
H = 12 log2 = 12 log2 .
M R
Di solito la trasposizione desiderata in semitoni (h) è nota e la formula deve
essere risolta per f o N :
2h/12 R
f= ,
N
2h/12 R
N= .
f
Finora abbiamo utilizzato un’onda a dente di sega come onda di input y[n],
ma, come suggerito nelle parti (d) e (e) della Figura 2.2, potremmo utilizzare,
come segnale di input, qualsiasi cosa ci piaccia. In generale, la trasposizione può
essere dipendente dal tempo e viene controllata dalla velocità di cambiamento
del segnale di input.
Il fattore di trasposizione t e la trasposizione in semitoni h sono quindi
determinati dalle formule di trasposizione momentanea (per le wavetables):

t[n] = |y[n] − y[n − 1]|,

h[n] = 12 log2 |y[n] − y[n − 1]|,


dove | | indica il valore assoluto. Per esempio, se y[n] = n, allora z[n] = x[n]
in modo che sentiamo la wavetable al suo tono originale e questo è ciò che la
formula ci dice, poiché
y[n] − y[n − 1] = 1.
D’altra parte, se y[n] = 2n, allora la wavetable è trasposta all’ottava superiore,
fatto consistente con

y[n] − y[n − 1] = 2n − 2(n − 1) = 2.

Se i valori di y[n] stanno diminuendo all’aumentare di n, il sample viene eseguito


all’indietro, ma la formula di trasposizione fornisce ancora un moltiplicatore
positivo. Tutto questo concorda con la precedente formula di trasposizione
per looping wavetables; se un’onda a dente di sega varia tra 0 e N , f volte
al secondo, la differenza tra i campioni successivi è proprio N f /R, eccetto al
campione all’inizio di ogni nuovo ciclo.
È ben noto che la trasposizione di una registrazione modifica anche il timbro:
questo è noto come effetto “chipmunk”. Non solo sono state trasposte eventuali
periodicità (che potrebbe dare origine alla percezione di un tono), ma anche
le frequenze degli ipertoni. Alcuni timbri, in particolare quelli di suoni vocali,
presentano dei range caratteristici di frequenze in cui gli ipertoni sono più forti
rispetto ad altre vicine. Anche tali intervalli di frequenza vengono trasposti, e
questo è percepito come un cambiamento nel timbro. Nel linguaggio che verrà
reso più preciso nel paragrafo 5.1, diciamo che l’inviluppo spettrale è trasposto
insieme al tono o ai toni.
Sia in questo che nel paragrafo precedente abbiamo considerato la possibi-
lità di riprodurre wavetables periodicamente. Nel paragrafo 2.1 la riproduzione
viene ripetuta abbastanza rapidamente in modo che la ripetizione dia origine
ad un tono, ad esempio tra 30 e 4000 volte al secondo, approssimativamente il
range di un pianoforte. In questo paragrafo abbiamo considerato una wavetable
32 Capitolo 2. Wavetables e campionatori

della durata di un secondo, e, in questo caso, fattori “ragionevoli” di trasposi-


zione (meno di quattro ottave ascendenti) darebbero origine ad una frequenza di
ripetizione inferiore a 30, e di solito molto più basso, e che può scendere ancora
di quanto vogliamo.
Il numero 30 è significativo per un altro motivo: è approssimativamente il
numero massimo di eventi separati che l’orecchio può distinguere al secondo;
per esempio, 30 fonemi vocali, o note melodiche, o attacchi di rulli di tamburo
sono circa il massimo numero che possiamo sperare di inserire in un secondo
prima che la nostra capacità di distinguerli venga meno.
Esiste un continuum tra i campionatori e gli oscillatori wavetable, in quanto
la patch della Figura 2.3 può essere considerata come un campionatore (se la
frequenza di ripetizione è inferiore a circa 20 Hertz) o come un oscillatore wa-
vetable (se la frequenza è maggiore di circa 40 Hertz). È possibile muoversi in
maniera continua tra i due regimi. Inoltre, non è necessario eseguire un’intera
wavetable in un ciclo; con un po’ più di aritmetica possiamo scegliere dei sotto-
segmenti della wavetable, e questi possono cambiare continuamente in lunghezza
e posizione durante la lettura della wavetable.
La pratica di suonare molti piccoli segmenti di una wavetable in rapida
successione è spesso chiamata sintesi granulare. Per maggiori informazioni sulle
sue possibilità si veda [Roa01].
La Figura 2.5 mostra come costruire un campionatore ciclico (looping sam-
pler) molto semplice. Nella figura, se la frequenza è f e la lunghezza del segmento
di campioni è s, il fattore di trasposizione di uscita è dato da t = f s/R, dove
R è la frequenza di campionamento a cui è stata registrata la wavetable (che
non deve essere necessariamente pari alla frequenza di campionamento a cui il
diagramma a blocchi sta lavorando). In pratica, questa equazione deve essere
solitamente risolta per f o s per ottenere la trasposizione desiderata.
Nella figura, un oscillatore a dente di sega controlla l’ubicazione per la ricerca
sul wavetable, ma i valori inferiori e superiori dell’onda a dente di sega non sono
staticamente specificati come nella Figura 2.3; piuttosto, l’oscillatore a dente di
sega varia tra 0 a 1 e l’intervallo è poi modificato per selezionare un desiderato
segmento di campioni nella wavetable.
Può essere preferibile specificare la posizione l del segmento sia come bordo
sinistro (il suo limite inferiore) sia come punto medio del segmento; in entrambi
i casi specifichiamo la lunghezza s come parametro distinto. Nel primo caso,
cominciamo moltiplicando l’output della dente di sega per s, in modo che quin-
di vari tra 0 a s; quindi aggiungiamo l in modo che ora vari tra l e l + s. Per
specificare la posizione utilizzando il punto medio del segmento, prima sottra-
iamo 1/2 dall’oscillatore (in modo da variare tra −1/2 e 1/2), e poi come prima
moltiplichiamo per s (in modo che ora vari tra −s/2 e s/2) e infine aggiungiamo
l per ottenere un intervallo tra l − s/2 e l + s/2.
Nel campionatore ciclico, dovremo preoccuparci di mantenere continuità tra
l’inizio e la fine dei segmenti del wavetable; di questo ci occuperemo nel paragrafo
successivo.
Un ulteriore dettaglio è che, se la lunghezza e la posizione del segmento
cambiano nel tempo (essi stessi potrebbero essere, ad esempio, segnali audio
digitali), influenzeranno il fattore di trasposizione e il tono o il timbro del segnale
di uscita che potrebbero quindi salire e scendere di conseguenza. Il modo più
semplice per evitare questo problema è quello di sincronizzare le variazioni dei
valori di s e l con la regolare discontinuità dell’onda a dente di sega; poiché tale
2.2. Campionamento 33

2.2. SAMPLING 35

frequency

0
optional - for
1/2
centered segments

segment size

segment location

-1

OUT

Figure
Figura 2.5:
2.5: AUnsimple looping
semplice sampler, asciclico,
campionatore yet with no amplitude
senza controllo dicontrol. There
ampiezza. Ci
are
sono ingressi per controllare la frequenza, la lunghezza e la posizione delThe
inputs to control the frequency and the segment size and location. seg-
“-” operation
mento. is included
L’operazione “−”ifèwe wish se
inclusa thesisegment
desideralocation to be specified
che la posizione as the
del segmento
segment’s midpoint; otherwise we specify the location of the left end
sia specificata tramite il suo punto medio; altrimenti è sufficiente definire of thela
segment.
posizione dell’estremità sinistra del segmento.
34 Capitolo 2. Wavetables e campionatori

segnale salta discontinuamente, la trasposizione non è realmente definita e, se si


sta usando un inviluppo per nascondere la discontinuità, anche gli effetti delle
modifiche in s e l risulteranno nascosti.

2.3 Enveloping samplers


Nel paragrafo precedente abbiamo letto una wavetable sia sporadicamente che
ciclicamente per ottenere un campionatore. Nella maggior parte delle applica-
zioni reali, dobbiamo affrontare la necessità di far partire e fermare i samples
in modo che il segnale di uscita non salti in modo discontinuo all’inizio e alla
fine dei samples. Questa discontinuità può suonare come un click o un botto a
seconda della wavetable.
Il modo più semplice per fare questa operazione, supponendo che continuere-
mo sempre ad eseguire completamente la wavetable dall’inizio alla fine, consiste
semplicemente nel prepararci in anticipo in modo che il volume cresca in ma-
niera regolare all’inizio e decresca in maniera regolare alla fine. Ciò può essere
fatto anche quando la wavetable viene campionata in tempo reale, moltiplican-
do il segnale di ingresso per un inviluppo a segmenti lineari e temporizzato per
corrispondere alla lunghezza della registrazione.
In molte situazioni, però, è sconveniente o impossibile creare in anticipo
l’inviluppo per la wavetable – ad esempio, potremmo voler riprodurre solo una
parte di esso oppure potremmo voler cambiare dinamicamente l’intensità dell’in-
viluppo. Nel paragrafo 1.5 abbiamo già visto come controllare l’ampiezza degli
oscillatori sinusoidali utilizzando la moltiplicazione per una funzione a rampa
(nota anche come generatore di inviluppo) e abbiamo riportato questa nozione
negli oscillatori wavetable delle Figure 2.3 e 2.4. Questa procedura funziona
bene anche per accendere e spegnere i campionatori in modo da evitare di-
scontinuità, presentando tuttavia una notevole differenza: mentre nella sintesi
wavetable siamo liberi di supporre che le forme d’onda si allineino in modo da
poter scegliere qualsiasi tempo che vogliamo per l’inviluppo, nel caso del cam-
pionamento usando forme d’onda non preparate, siamo obbligati a far si che
l’output del generatore di inviluppo sia a zero quando arriviamo alla fine del
wavetable per la prima volta. Questa situazione è rappresentata in Figura 2.6.
In situazioni in cui sia necessario ripetere un wavetable arbitrario, il modo più
semplice per eseguire continuamente il ciclo è quello di disporre che la modifica
dell’ampiezza sia sincronizzata con il ciclo, utilizzando una wavetable separata
(l’inviluppo). Questo può essere implementato come mostrato in Figura 2.7.
Un singolo oscillatore a dente di sega viene utilizzato per calcolare gli indici
di ricerca per due wavetables, una che contiene il suono registrato e l’altra
che contiene un inviluppo. L’aspetto principale di cui preoccuparsi è quello di
ottenere gli inputs delle due wavetables ciascuno nel proprio range appropriato.
In molte situazioni è desiderabile combinare due o più copie del campionatore
ciclico alla stessa frequenza e ad una relazione di fase specificata. Ciò può essere
fatto in modo che quando uno è alla fine del suo segmento, uno o più si trovano
al centro dello stesso segmento, in modo che l’aggregato produca continuamente
suono. Per ottenere ciò, abbiamo bisogno di un modo per generare due o più
onde a dente di sega con la desiderata relazione di fase e che possiamo usare al
posto dell’oscillatore nella parte superiore della Figura 2.7. Possiamo iniziare
con un’unica onda a dente di sega e poi produrne altre a rapporti fissati di
2.4. TIMBRE STRETCHING
2.4. Stretching del timbro 3735

(a)

new periods

(b)

Figure
Figura 2.6:
2.6: Differing
Differentienvelope
requisitirequirements
di inviluppofor
peroscillators
oscillatoriand samplers: (a) in
e campionatori: (a)
an oscillator,
in un the envelope
oscillatore, l’inviluppo canpuò
be essere
chosenscelto
to conform to any desired
per conformarsi timescale;
a qualsiasi scala
(b) when the
temporale wavetable(b)
desiderata; is aquando
recorded sound, it’sèup
la wavetable untosuono
you to get the envelope
registrato, sta a noi
to
farzero before
si che you hitsia
l’inviluppo thezero
endprima
of thedi
wavetable for the
raggiungere firstdella
la fine time.wavetable per la
prima volta.
wavetable sampler at the same frequency and at a specified phase relationship.
This maylabeprima.
fase con done soSe that when any
vogliamo particular
un’onda a denteone di
is at theche
sega endè,ofad
itsesempio,
segment, a
one or more others is in the middle of the same segment, so that
cicli davanti alla prima, aggiungiamo semplicemente il parametro a e prendiamo the aggregate
is continuously making sound. To accomplish this, we need a way to generate
quindi la parte frazionaria, che è la nuova onda a dente di sega desiderata, come
two or more sawtooth waves at the desired phase relationship that we can use
mostrato in Figura 2.8.
in place of the oscillator at the top of Figure 2.7. We can start with a single
sawtooth wave and then produce others at fixed phase relationships with the
first one. If we wish a sawtooth which is, say, a cycles ahead of the first one,
2.4simplyStretching
we add the parameter dela andtimbro
then take the fractional part, which is the
desired new sawtooth wave, as shown in Figure 2.8.
L’oscillatore wavetable del paragrafo 2.1, che abbiamo esteso nel paragrafo 2.2
per includere le forme d’onda da wavetables arbitrarie come i suoni registrati,
2.4 Timbre
può essere ulteriormentestretching
esteso in un modo complementare, a cui ci riferiremo
come timbre stretching per le ragioni che andremo a spiegare in questo paragrafo.
The wavetable
Ci sono oscillator
anche molti altriofmodi
Section 2.1, which
possibili we extended
per estendere in Section
la sintesi 2.2 tousan-
wavetable, en-
compass grabbinglawaveforms
do, ad esempio, modulazione fromdiarbitrary
frequenzawavetables such as recorded
e il waveshaping, sounds,
ma ne parleremo
may additionally
nei capitoli be extended in a complementary way, that we’ll refer to as
successivi.
timbre
L’idea centralefordel
stretching, reasons
timbrewe’ll develop èinquella
stretching this section. There are l’idea
di riconsiderare also many
di un
other
oscillatore wavetable con un meccanismo per la riproduzione di unafrequency
possible ways to extend wavetable synthesis, using for instance wavetable
modulation
memorizzatoand waveshaping,
(o una sua parte)but we’ll leave
dall’inizio alla them to later
fine. Non chapters.
c’è motivo per cui la fine
The central idea of timbre stretching is to reconsider the
di un ciclo debba coincidere con l’inizio di un altro. Invece, potremmo idea of the wavetable
richiedere
che le copie della forma d’onda vengano distanziate da segmenti di silenzio; o,
andando nella direzione opposta, le copie della forma d’onda potrebbero essere
distanziate più strettamente in modo che si sovrappongano. L’unico parametro
disponibile nel paragrafo 2.1 – la frequenza – è stato usato finora per controllare
due aspetti distinti dell’output: il periodo in cui iniziano le nuove copie della
36 Capitolo 2. Wavetables e campionatori

38 CHAPTER 2. WAVETABLES AND SAMPLERS

frequency

size
N

location

1 1

-1
0 N

OUT

Figure 2.7: A sampler as in Figure 2.5, but with an additional wavetable lookup
Figura 2.7: Un campionatore come in Figura 2.5, ma con l’aggiunta di una
for enveloping.
wavetable per l’inviluppo.
2.4. TIMBRE STRETCHING 39

2.4. Stretching del timbro 37

frequency

1
1

1.3
a

0.3
WRAP

OUT
1
0.3

Figure 2.8: A technique for generating two or more sawtooth waves with fixed
phase relationships
Figura between per
2.8: Una tecnica them.la The relative phase
generazione is controlled
di due by the
o più onde pa-
a dente di sega
rameter a (which takes the value 0.3 in the graphed signals). The “wrap”
con relazioni fisse tra le loro fasi. La fase relativa è controllata dal parametro
operation computes the fractional part of its input.
a (che assume il valore 0.3 nei segnali rappresentati nei grafici). L’operazione
“wrap” calcola la parte frazionaria del suo input.
40 CHAPTER 2. WAVETABLES AND SAMPLERS

(a)
20 40 50

10 30

(b)

15 25

(c)
20 40 60

Figure 2.9: A waveform is played at a period of 20 samples: (a) at 100 percent


Figura 2.9:(b)Una
duty cycle; forma
at 50 d’onda
percent; (c) atviene riprodotta con un periodo di 20 campioni:
200 percent
(a) con duty cycle del 100%; (b) al 50%; (c) al 200%.

oscillator as a mechanism for playing a stored wavetable (or part of one) end to
end. There is no reason the end of one cycle has to coincide with the beginning
of another. Instead, we could ask for copies of the waveform to be spaced with
alternating segments of silence; or, going in the opposite direction, the waveform
copies could be spaced more closely together so that they overlap. The single
parameter available in Section 2.1—the frequency—has been heretofore used to
control two separate aspects of the output: the period at which we start new
copies of the waveform, and also the length of each individual copy. The idea
of timbre stretching is to control the two independently.
Figure 2.9 shows the result of playing a wavetable in three ways. In each
case the output waveform has period 20; in other words, the output frequency
is R/20 if R is the output sample rate. In part (a) of the figure, each copy of the
38 Capitolo 2. Wavetables e campionatori

forma d’onda e anche la durata di ogni singola copia. L’idea del timbre stretching
è quella di controllare i due in modo indipendente.
La Figura 2.9 mostra il risultato della riproduzione di un wavetable in tre
modi. In ogni caso la forma d’onda di uscita ha un periodo pari a 20; in altre
parole, la frequenza di uscita è R/20 se R è la frequenza di campionamento
in uscita. Nella parte (a) della figura, ogni copia della forma d’onda viene
riprodotta su 20 campioni, in modo che la forma d’onda si inserisca esattamente
nel ciclo, senza spazi e senza sovrapposizioni. Nella parte (b), anche se il periodo
è ancora di 20, la forma d’onda è compressa in metà, centrata, del periodo (10
campioni); o in altre parole, il duty cycle – la quantità relativa di tempo in cui
la forma d’onda riempie il ciclo – equivale al 50 per cento. Per il restante 50 per
cento del tempo, l’output è zero.
Nella parte (c), la forma d’onda viene allungata a 40 campioni e, dal mo-
mento che viene ripetuta ogni 20 campioni, le forme d’onda si sovrappongono.
Il duty cycle è quindi del 200 per cento.
Supponiamo ora che la forma d’onda, con duty cycle del 100% abbia serie
di Fourier (paragrafo 1.7) pari a

x100 [n] = a0 + a1 cos(ωn + φ1 ) + a2 cos(2ωn + φ2 ) + · · ·

dove ω è la frequenza angolare (pari a π/10 nell’esempio in quanto il periodo


è di 20). Per semplificare questo esempio non ci preoccupiamo dove la serie
finisca.
A questo punto cerchiamo di mettere in relazione questa serie di Fourier con
quelle delle altre due forme d’onda dell’esempio, per mostrare come, cambiando
il duty cycle, cambia il timbro dell’onda risultante. Per il caso del duty cycle
al 50 percento (chiamiamo il segnale x50 [n]), osserviamo che se duplichiamo la
forma d’onda fuori fase di metà periodo e sommiamo le due onde, otteniamo
esattamente la forma d’onda originale a frequenza doppia:
π
x100 [2n] = x50 [n] + x50 [n + ]
ω
dove ω è la frequenza angolare (e quindi π/ω è la metà del periodo) di entrambi
i segnali. Se esprimiamo la serie di Fourier di x50 [n] come:

x50 [n] = b0 + b1 cos(ωn + θ1 ) + b2 cos(2ωn + θ2 ) + · · ·

utilizzando le tre formule precedenti, si ha:

a0 + a1 cos(2ωn + φ1 ) + a2 cos(4ωn + φ2 ) + · · ·

= b0 + b1 cos(ωn + θ1 ) + b2 cos(2ωn + θ2 ) + · · ·

+b0 + b1 cos(ωn + π + θ1 ) + b2 cos(2ωn + π + θ2 ) + · · ·

= 2b0 + 2b2 cos(2ωnθ2 ) + 2b4 cos(4ωn + π + θ4 ) + · · ·

e quindi
a0 = 2b0 , a1 = 2b2 , a2 = 2b4
e cosı̀ via: le parziali pari di x50 , in conclusione, vengono ottenute raddoppiando
le parziali di x100 (ancora non sappiamo niente al riguardo delle parziali dispari
42
2.4. Stretching del timbro CHAPTER 2. WAVETABLES AND SAMPLERS
39

200%

ampli-
tude 100%

50%

1 2 3 4 5
partial number

Figura 2.10:
Figure 2.10: The
I coefficienti delle serie
Fourier series Fourier per
magnitudes le forme
for the d’ondashown
waveforms illustrate in Fi-
in Figure
guraThe
2.9. 2.9.horizontal
Nell’asse orizzontale sono presenti
axis is the harmonic i numeri
number. armonici.
We only “hear”“sentiamo” solo
the coefficients
i coefficienti
for per numeri
integer harmonic armonici
numbers; the interi; le curve
continuous continue
curves sono
are the “interpolazioni
“ideal” contours.
ideali.

We see that squeezing the waveform by a factor of 2 has the effect of stretch-
di x50 e queste potrebbero essere in linea con quelle pari oppure no, a seconda di
ing the Fourier series out by two, and on the other hand stretching the waveform
fattori che non possiamo ancora controllare. È sufficiente dire, per il momento,
by a factor of two squeezes the Fourier series by two. By the same sort of ar-
che se la forma d’onda si collega con continuità con l’asse orizzontale a entrambe
gument, in general it turns out that stretching the waveform by a factor of
le estremità, le parziali dispari agiscono globalmente come quelle pari. Per ren-
any positive number f squeezes the overtones, in frequency, by the reciprocal
dere questo fatto più rigoroso abbiamo bisogno dell’analisi Fourier, sviluppata
1/f —at least approximately, and the approximation is at least fairly good if
nel Capitolo 9).
the waveform “behaves well” at its ends. (As we’ll see later, the waveform can
Analogamente, x100 e x200 sono legati nello stesso modo:
always be forced to behave at least reasonably well by enveloping it as in Figure
2.7.) π
x200 [2n] = x100 [n] + x100 [n + ]
Figure 2.10 shows the spectra of the three waveforms—or ω in other words the
one waveform at three duty cycles—of Figure 2.9.
in modo che, se le ampiezze della serie di Fourier di x200 sono The figure emphasizes the
indicate con
relationship between
c0 , c1 , . . . , si ha: the three spectra by drawing curves through each, which,
on inspection, turn out toc0be=the 2a0same
, c1 =curve,
2a2 , c2only
= 2a stretched
4 differently; as the
duty cycle goes up, the curve is both compressed to the left (the frequencies all
in modo che le parziali di x200 siano quelle pari di x100 .
drop) and amplified (stretched upward).
Vediamo che restringere la forma d’onda di un fattore di due ha l’effetto di
The continuous curves have a very simple interpretation. Imagine squeezing
allungare la serie di Fourier per due, mentre estendere la forma d’onda per un
the waveform into some tiny duty cycle, say 1 percent. The contour will be
fattore di due restringe la serie di Fourier di due. Con lo stesso principio, in ge-
stretched by a factor of 100. Working backward, this would allow us to inter-
nerale si scopre che l’allungamento della forma d’onda per un qualsiasi numero
polate between each pair of consecutive points of the 100 percent duty cycle
positivo f diminuisce gli ipertoni, in frequenza, del reciproco 1/f – almeno ap-
contour (the original one) with 99 new ones. Already in the figure the 50 per-
prossimativamente, e l’approssimazione è abbastanza buona se la forma d’onda
cent duty cycle trace defines the curve with twice the resolution of the original
“si comporta bene” alle sue estremità (come vedremo più avanti, la forma d’onda
può sempre essere impostata in modo da comportarsi almeno ragionevolmente
bene utilizzando un inviluppo come in Figura 2.7).
La Figura 2.10 mostra lo spettro delle tre forme d’onda di Figura 2.9 – o
in altre parole una forma d’onda a tre diversi duty cycle. Tracciando curve
40 Capitolo 2. Wavetables e campionatori

attraverso lo spettro di ciascuna onda, la figura sottolinea la relazione tra i tre


spettri, che, all’ispezione, risultano essere la stessa curva, solo allungata in modo
diverso; se il duty cycle sale, la curva è compressa a sinistra (le frequenze calano)
e amplificata (allungata verso l’alto).
Le curve continue hanno un’interpretazione molto semplice. Immaginiamo
di spremere la forma d’onda tramite un duty cycle molto piccolo, ad esempio 1
per cento. Il profilo sarà allungato per un fattore di 100. Lavorando all’indietro,
ciò ci permetterebbe di interpolare ogni coppia di punti consecutivi della curva
con duty cycle del 100% (quello originale) con 99 nuovi punti. Come si vede già
in figura, il tracciato della curva con duty cycle al 50% definisce la curva con due
volte la risoluzione della curva originale Al limite, quando il duty cycle viene
preso arbitrariamente piccolo, lo spettro si riempie sempre più densamente; ed
il limite è lo spettro “reale” della forma d’onda.
Questo “vero” spettro è udibile solo con duty cycles adeguatamente bassi.
All’esempio con duty cycle al 200% manca effettivamente il picco nello spettro
ideale (continuo) perché il picco si trova al di sotto del primo armonico. In
generale, i duty cycles più alti mostrano la curva ideale alle risoluzioni più
basse.
Il timbre stretching è una tecnica estremamente potente per la generazione di
suoni con spettri sistematicamente variabili. In combinazione con le possibilità
di missaggio di forme d’onda (paragrafo 2.1) e di selezionare forme d’onda, va-
riabili infinitamente, dai campioni registrati (paragrafo 2.2), è possibile generare
ogni tipo di suoni. Ad esempio, il diagramma a blocchi di Figura 2.7 ci offre un
modo per ottenere ed allungare i timbri da una wavetable registrata. Quando il
parametro della “frequenza” f è abbastanza elevato da essere udibile come un
tono, il parametro “lunghezza” s può essere considerato un controllo sul timbro,
tramite la formula t = f s/R del paragrafo 2.2, dove ora reinterpretiamo t come
il fattore con cui il timbro deve essere allungato.

2.5 Interpolazione
Come detto in precedenza, i metodi di interpolazione vengono spesso utilizzati
per aumentare la precisione della ricerca sulle tabelle. Qui forniremo un calcolo
piuttosto semplificato degli effetti delle dimensioni della tabella e dei metodi di
interpolazione sul risultato della ricerca tabella.
Per parlare di errori nella ricerca su wavetable, dobbiamo vedere la wavetable
come una versione campionata di una funzione sottostante. Quando cerchiamo
un valore della funzione sottostante che si trova tra due punti della wavetable,
l’errore è la differenza tra il risultato della ricerca sulla wavetable e il valore
“ideale” della funzione in quel punto. Lo studio più importante dell’errore di
ricerca su wavetable suppone che la funzione sottostante sia sinusoidale (pagina
1). Successivamente possiamo quindi capire cosa succede ad altre wavetables
considerandole come somme di sinusoidi.
La precisione di ricerca su una wavetable contenente una sinusoide dipende
da due fattori: la qualità dello schema di interpolazione e il periodo della sinu-
soide. In generale, più lungo è il periodo della sinusoide, più il risultato sarà
accurato.
Nel caso di una wavetable sintetica, possiamo conoscere i suoi componenti
sinusoidali dal fatto di averli specificati – nel qual caso la questione diventa
2.5. Interpolazione 41

quella di scegliere una dimensione appropria della wavetable, quando si calcola


la wavetable, in modo da adattarsi all’algoritmo di interpolazione e soddisfa-
re lo standard desiderato di precisione. Nel caso di suoni registrati, l’analisi
di precisione potrebbe indurci a regolare la frequenza di campionamento della
registrazione, sia inizialmente, sia per un successivo ri-esame.
L’errore di interpolazione per una wavetable sinusoidale può avere due com-
ponenti: in primo luogo, il segnale continuo (il risultato teorico della lettura
continua della wavetable nel tempo, come se il sample rate di output fosse in-
finito) potrebbe non essere una sinusoide pura; e, in secondo luogo, l’ampiezza
potrebbe essere sbagliata (è anche possibile ottenere errori di fase, ma solo per
mancanza di attenzione).
In questo trattamento considereremo solo metodi di interpolazione polino-
miali come arrotondamento, interpolazione lineare e interpolazione cubica. Que-
sti metodi riguardano la valutazione di polinomi (di grado zero, uno e tre, ri-
spettivamente) nei valori compresi tra due punti del wavetable. L’idea è che,
per qualsiasi indice x, possiamo scegliere un punto di riferimento vicino x0 e
considerare il valore in output calcolato dal polinomio:

yINT (x) = a0 + a1 (x − x0 ) + a2 (x − x0 )2 + · · · + an (x − x0 )n .

Di solito si sceglie il polinomio che passa attraverso gli n + 1 punti più vicini
della wavetable. Per l’interpolazione ad un punto (un polinomio di grado zero)
vuol dire prendere a0 uguale al più vicino della wavetable. Per l’interpolazione
lineare (a due punti), tracciamo un segmento di retta tra i due punti della
wavetable che si trovano ai lati del punto desiderato x. Possiamo lasciare che
x0 sia l’intero più vicino a sinistra di x (che scriviamo come bxc) e quindi la
formula per l’interpolazione lineare è:

yINT (x) = y[x0 ] + (y[x0 + 1] − y[x0 ]) · (x − x0 )

che è un polinomio, come nella formula precedente, con

a0 = y[x0 ],

a1 = y[x0 + 1] − y[x0].

In generale, è possibile valutare esattamente un polinomio di grado n−1 tramite


una scelta di n punti qualsiasi purché i loro valori x siano tutti diversi.
La figura 2.11 mostra l’effetto di utilizzare l’interpolazione lineare (a due
punti) per riempire una sinusoide di periodo 6. Nella parte superiore vi sono tre
curve: la sinusoide originale, il risultato interpolando linearmente 6 punti per
periodo per rappresentare la sinusoide, e, infine, un’altra sinusoide, di ampiezza
leggermente minore, che meglio corrisponde alla forma d’onda formata da sei
segmenti. L’errore introdotto sostituendo la sinusoide originale con la versione
interpolata linearmente presenta due aspetti: in primo luogo, un cambiamento
(appena percettibile) di ampiezza e, in secondo luogo, una distorsione (molto
percettibile) della forma d’onda.
Il grafico inferiore in figura mostra la differenza tra la forma d’onda interpo-
lata e la sinusoide più adatta. Questo è un segnale residuo di cui tutte le energie
si trovano negli ipertoni della sinusoide originale. Quando aumenta il numero
di punti, l’errore diminuisce in grandezza. Poiché l’errore è la differenza tra una
2.5. INTERPOLATION 45

42 Capitolo 2. Wavetables e campionatori

original best fit


interpolated

error

Figure 2.11: Linear interpolation of a sinusoid: (upper graph) the original sinu-
Figura 2.11: Interpolazione lineare di una sinusoide: (grafico superiore) la sinu-
soid, the interpolated sinusoid, and the best sinusoidal fit back to the interpo-
soide originale, la sinusoide interpolata e la sinusoide che meglio combacia con
lated version; (lower graph) the error, rescaled vertically.
la versione interpolata; (grafico inferiore) l’errore, riscalato verticalmente.

sinusoide ed una sequenza segmenti utilizzati per approssimare, la grandezza


dell’errore è approssimativamente proporzionale al quadrato della differenza di
fase tra ciascuna coppia di punti, ovvero inversamente proporzionale al quadrato
del numero di punti nella wavetable. Detto diversamente, l’errore sulla waveta-
ble diminuisce di 12 dB ogni volta che le dimensioni della tabella raddoppiano
(questa regola è utile solo per tabelle con 4 o più punti).
L’interpolazione a quattro punti (cubica) funziona in modo simile. La for-
mula di interpolazione è:
yINT (x) =

−f (f − 1)(f − 2)/6 · y[x0 − 1] + (f + 1)(f − 1)(f − 2)/2 · y[x0 ]

−(f + 1)(f − 2)/2 · y[x0 + 1] + (f + 1)f (f − 1)/6 · y[x0 + 2]


dove f = x−x0 è la parte frazionaria dell’indice. Per le tabelle con 4 o più punti,
2.5. Interpolazione 43
46 CHAPTER 2. WAVETABLES AND SAMPLERS

period interpolation points


1 2 4
2 -1.2 -17.1 -20.2
3 -2.0 -11.9 -15.5
4 -4.2 -17.1 -24.8
8 -10.0 -29.6 -48.4
16 -15.9 -41.8 -72.5
32 -21.9 -53.8 -96.5
64 -27.9 -65.9 -120.6
128 -34.0 -77.9 -144.7

Table 2.1: RMS error for table lookup using 1, 2, and 4 point interpolation at
Tabella 2.1: Errore RMS per la ricerca di tabelle utilizzando interpolazioni a 1,
various table sizes.
2 e 4 punti a varie dimensioni della tabella.

Four-point
raddoppiando (cubic)diinterpolation
il numero punti sulla tabellaworks similarly.
si tende The interpolation
a migliorare l’errore RMS formula
is:
di 24 dB. La Tabella 2.1 mostra l’errore RMS calcolato per sinusoidi con vari
periodi e per interpolazione a 1, 2 e 4 punti yINT(una
(x) quantità
= leggermente diversa è
misurata in [Moo90, p. 164], dove vengono aggiunti anche gli errori di ampiezza
−f (f − 1)(f − 2)/6 · y[x − 1] + (f + 1)(f − 1)(f − 2)/2 · y[x ]
e fase, fornendo risultati leggermente 0più pessimisti (si veda anche [Har87]). 0
Il dominio−(fin+input
1)f (f − 2)/2 per
consentito · y[xla0 ricerca
+ 1] +su(ftabelle (f − 1)/6
+ 1)fdipende dal·numero
y[x0 + di 2]
punti di interpolazione. In generale, quando si utilizza l’interpolazione a k punti
inwhere f = xcon
una tabella −N x0 punti,
is thel’input
fractional part of
può variare theintervallo
su un index. di ForN tables
+ 1 − kwith 4 or
more points, doubling the number of points on the
punti. Se k = 1 (cioè non c’è alcuna interpolazione), il dominio è compreso table tends to improve the
RMS error by 24 dB. Table 2.1 shows the calculated
tra 0 e N (compreso l’estremo a 0 ma escludendo quello a N ) assumendo che RMS error for sinusoids at
i various
valori diperiods for 1,
input siano 2, and(come
troncati 4 pointvieneinterpolation.
effettuato in Pd (A per
slightly different
la ricerca non- quantity
interpolata).
is measuredIlin dominio
[Moo90, −1/2 a There,
è dap.164]. N − 1/2the se, invece,
errors arrotondiamo
in amplitudel’inputand phase are
alalso
numero
added intero più vicinoslightly
in, yielding anziché more
interpolare. In entrambi
pessimistic i casi
results. See il dominio si
also [Har87].)
estende su una lunghezza di N punti.
The allowable input domain for table lookup depends on the number of
Per l’interpolazione a due punti, l’input deve trovarsi tra il primo e l’ultimo
points of interpolation. In general, when using k-point interpolation into a
punto, ovvero tra 0 e N − 1. Quindi N punti sono sufficienti a definire la
table with
funzione su unNdominio
points,dithe input may
lunghezza N − range over an interval
1. Per interpolazione of N +
a quattro 1 − k points.
punti,
If k = 1 (i.e., no interpolation at all), the domain is
non possiamo ottenere valori per gli inputs tra 0 e 1 (non avendo i due punti from 0 to N (including the
endpoint at 0 but excluding the one at N ) assuming input
richiesti a sinistra di tali inputs) e nemmeno possiamo per lo spazio tra gli ultimi values are truncated
(as punti
due is done
(N − for2 enon-interpolated
N − 1). Quindi intable questolookup in Pd). varia
caso il dominio The da domain
1aN− is2from -1/2
etohaN la −
lunghezza
1/2 if, N − 3.
instead, we round the input to the nearest integer instead of
Le forme d’onda
interpolating. periodiche
In either case, memorizzate
the domain nelle wavetables
stretches over a richiedono
length of un N points.
trattamento speciale alle estremità della tabella. Ad esempio,
For two-point interpolation, the input must lie between the first and last supponiamo
che vogliamo memorizzare una sinusoide pura di lunghezza N . Per la ricerca
points, that is, between 0 and N − 1. So the N points suffice to define the
non-interpolata, basta impostare, ad esempio,
function over a domain of length N − 1. For four-point interpolation, we cannot
get values for inputsx[n]between 0 and
= cos(2πn/N ), 1n (not
= 0, .having
. . , N − the
1. required two points to the
left of the input) and neither can we for the space between the last two points
Per l’interpolazione a due punti, abbiamo bisogno di N + 1 punti:
(N − 2 and N − 1). So in this case the domain reaches from 1 to N − 2 and has
length N − 3. x[n] = cos(2πn/N ), n = 0, . . . , N.
Periodic waveforms stored in wavetables require special treatment at the
In altreofparole,
ends dobbiamo
the table. Forripetere
example,il primo puntowe
suppose (n = 0) alla
wish to fine della
store tabella,
a pure sinusoid of
in modo che l’ultimo segmento da N − 1 a N ritorni al valore iniziale.
length N . For non-interpolating table lookup, it suffices to set, for example,

x[n] = cos(2πn/N ), n = 0, . . . , N − 1
44 EXAMPLES
2.6. Capitolo 2. Wavetables e campionatori
47

table10
0

mtof

tabosc4~ table10
|
(OUT)

Figura2.12:
Figure 2.12:AUn oscillatore
wavetable wavetable:
oscillator: B01.wavetables.pd.
B01.wavetables.pd.

For two-point interpolation,


Per l’interpolazione we needpunti,
a quattro N + 1ilpoints:
ciclo deve essere regolato per iniziare
al punto n = 1, poiché non è possibile ottenere correttamente valori interpolati
per inputs inferiori a x[n]
uno.=Secos(2πn/N
quindi un), ciclo
n = 0, . . . ,wavetable
della N è organizzato tra 1
a N , dobbiamo fornire punti aggiuntivi per 0 (copiati
In other words, we must repeat the first (n = 0) point at the end, da N ) e anche perthe
so that N +1
e N + 2, copiati da 1 e 2, per creare una tabella di
last segment from N − 1 to N reaches back to the beginning value. lunghezza N + 3. Per la
stessa sinusoide come sopra, la tabella dovrebbe contenere:
For four-point interpolation, the cycle must be adjusted to start at the point
n = 1, since we can’t get properly interpolated values out for inputs less than
x[n] =ofcos(2π(n
one. If, then, one cycle − 1)/Nis),arranged
the wavetable n = 0, . .from
.,N +1 2.
to N , we must
supply extra points for 0 (copied from N ), and also N + 1 and N + 2, copied
from 1 and 2, to make a table of length N + 3. For the same sinusoid as above,
2.6
the Esempi
table should contain:

x[n] = cos(2π(n − 1)/N ), n = 0, . . . , N + 2


Oscillatore wavetable
L’esempio B01.wavetables.pd, mostrato in Figura 2.12, implementa un oscillato-
2.6 Examples
re wavetable, che riproduce da una wavetable chiamata “table10”. Qui vengono
mostrate due nuovi oggetti primitivi di Pd. Il primo è il wavetable stesso, che
Wavetable
appare a destra oscillator
nella figura. Si può utilizzare il mouse sulla wavetable per cam-
biare la sua forma
Example B01.wavetables.pd,e sentire, conseguentemente,
shown il cambiamento
in Figure 2.12, implements di suono.
a wavetable os- Non
mostrata nella figura, ma utilizzata nella patch, è la funzione
cillator, which plays back from a wavetable named “table10”. Two new Pd di Pd per calcola-
re automaticamente
primitives are shown here.le wavetables
First is thecon specifiche
wavetable ampiezze
itself, which per le parziali,
appears at rightche è
inspesso preferibile
the figure. You cana disegnare
“mouse” on manualmente
the wavetablele forme
to change d’onda. È anche
its shape possibile
and hear
leggere
the sounde change
scrivereastabelle da Not
a result. file (testo
shown oinsuono) per but
the figure scambiare dati con
demonstrated in altri
programmi.
the L’altra
patch is Pd’s novità
facility è una classe calculating
for automatically di oggetti: wavetables with specified
partial amplitudes, which is often preferable to drawing waveforms by hand.
tabosc4∼ : un oscillatore wavetable. Il “4” indica che questa classe utilizza
You can also read and write tables to (text or sound) files for interchanging
l’interpolazione a 4 puntiThe
data with other programs. (cubica). Nell’esempio,
other novelty is an object il nome
class: della tabella, “ta-
ble10”, è specificato come creation argument per l’oggetto tabosc4∼ (è anche
tabosc4 ∼passare
possibile : a wavetable oscillator.daThe
dinamicamente una“4” indicatesall’altra
wavetable that thisinviando
class uses 4-
messaggi
point (cubic) interpolation.
appropriati all’oggetto). In the example, the table’s name, “table10”, is
Le wavetables utilizzate da tabosc4∼ devono sempre avere un periodo pari
ad una potenza di due; ma come mostrato sopra, la wavetable deve avere tre
punti supplementari alle sue estremità. Le lunghezze consentite della tabella
sono quindi della forma 2m + 3, come ad esempio 131, 259, 515, ecc.
Gli oscillatori wavetable non sono limitati solo all’uso come oscillatori au-
dio. La patch B02.wavetable.FM.pd (non mostrata qui) utilizza una coppia di
2.6. Esempi 45

oscillatori wavetable in serie. L’output del primo viene utilizzato come ingresso
del secondo, e controlla quindi la sua frequenza che cambia periodicamente nel
tempo.

Ricerca su wavetable in generale


La classe tabosc4∼, seppur utile e efficiente, risulta un po’ troppo specifica e per
molte delle applicazioni descritte in questo capitolo abbiamo bisogno di qualcosa
di più generale. L’esempio B03.tabread4.pd (Figura 2.13) mostra la tecnica di
timbre stretching discussa nel paragrafo 2.4. Questo è un semplice esempio di
una situazione in cui il tabosc4∼ non sarebbe stato sufficiente. Nell’esempio
vengono introdotte nuove classi:
tabread4∼ : ricerca su wavetable. Come in tabosc4∼ la tabella viene letta
utilizzando l’interpolazione a 4 punti. Ma mentre tabosc4∼ riceve una fre-
quenza come input e legge automaticamente la forma d’onda ripetutamente,
tabread4∼, oggetto più semplice, aspetta l’indice di ricerca come input. Per
utilizzarlo per fare qualcosa di ripetitivo, come in questo esempio, l’input stesso
deve essere una forma d’onda ripetuta. Come tabosc4∼ (e tutte gli altri oggetti
che leggono e scrivono su tabelle), è possibile inviargli messaggi per selezionare
la tabella da utilizzare.
tabwrite4∼ : registrare un segnale audio in una wavetable. In questo esempio,
tabwrite4∼ viene utilizzato per visualizzare l’output (anche se in seguito verrà
utilizzato per molte altre cose). Ogni volta che riceve un messaggio “bang”
dall’oggetto a pulsante sopra, tabwrite4∼ inizia a scrivere i campioni successivi,
che riceve in input, nella tabella richiamata dal creation arguments.
L’esempio B03.tabread4.pd mostra come combinare un phasor∼ e un og-
getto tabread4∼ per creare un oscillatore wavetable. L’output del phasor∼
varia, in valore, tra 0 e 1. In questo caso la wavetable da leggere, denominata
“waveform12”, è lunga 131 elementi. Il dominio per l’oggetto tabread4∼ varia
quindi da 1 a 129. Per regolare l’intervallo del phasor∼ , lo moltiplichiamo per
la lunghezza del dominio (128) in modo che vari tra 0 e 128 e quindi aggiungia-
mo 1, spostando in effetti l’intervallo a destra di un punto. Questo riscalamento
è compiuto dagli oggetti ∗ ∼ e + ∼ tra il phasor∼ e il tabread4∼ .
Con solo questi quattro oggetti avremmo essenzialmente reinventato la classe
tabosc4∼. In questo esempio, però, la moltiplicazione non è per una costante
128, ma per una quantità variabile controllata dal parametro “squeeze”. La
funzione dei quattro oggetti a destra della patch è quella di fornire all’oggetto
∗ ∼ i valori per scalare il phasor∼ by. Per far questo abbiamo utilizzato una
nuova classe di oggetti:
pack : creare un elenco di due o più elementi. I creation arguments stabili-
scono il numero di argomenti in entrata, i loro tipi (di solito numeri) e i loro
valori iniziali. Gli ingressi (ce ne saranno tanti quanti i creations arguments spe-
cificati) aggiornano i valori degli argomenti dei messaggi e, se l’ingresso più a
sinistra viene modificato (o semplicemente innescato con un messaggio “bang”),
il messaggio viene mandato in output.
In questa patch gli argomenti sono inizialmente 0 e 50, ma il number box
aggiorna il valore del primo argomento, in modo che, come mostrato in figura,
il messaggio più recente che lascia l’oggetto pack è “206 50”. L’effetto di ciò
46 Capitolo 2. Wavetables e campionatori

2.6. EXAMPLES 49

frequency squeeze
162 206
phase
generation --> phasor~ pack 0 50
range
adjustment --> *~ line~

+~ 1 +~ 128

tabread4~ waveform12

<--click to graph

tabwrite~ wave-out12

waveform12

wave-out12

Figure
Figura 2.13:
2.13: A
Unwavetable
oscillatoreoscillator
wavetablewith
con variable duty
duty cycle cycle: B03.tabread4.pd.
variabile: B03.tabread4.pd.
2.6. Esempi 47

sull’oggetto line∼ sotto è quello di fare una rampa a 206 in 50 millisecondi; in


generale l’output dell’oggetto line∼ è un segnale audio che segue con regola-
rità i valori che cambiano sporadicamente nella number box contrassegnata con
“squeeze”.
Infine, 128 viene aggiunto al valore “squeeze”; se squeeze assume valori non
negativi (come impone la number box in questa patch), il moltiplicatore di
impostazione del range varia il phasor di 128 o più. Se il valore è maggiore di
128, l’effetto è che il phasor riscalato trascorre una parte del suo ciclo bloccato
alla fine della wavetable (che blocca il suo ingresso a 129). Il risultato è che
la forma d’onda viene scansionata su una parte del ciclo. Come mostrato, la
forma d’onda viene compressa in 128/(128 + 206) del ciclo, quindi lo spettro è
allungato per un fattore di circa 1/2.
Per semplicità, questa patch è leggermente diversa da quella dell’esempio del
paragrafo 2.4 in quanto le forme d’onda sono compresse verso l’inizio di ogni
ciclo e non verso il centro. Questo ha l’effetto di cambiare leggermente la fase
delle varie parziali della forma d’onda che si allunga e si scorcia; se il fattore di
compressione cambia rapidamente, il corrispondente spostamento di fase suona
come una leggera oscillazione del tono. Ciò può essere evitato usando un metodo
leggermente più complicato: sottrarre 1/2 dal phasor∼, moltiplicarlo per 128 o
più, quindi aggiungere 65 anziché uno.

Utilizzo di una wavetable come campionatore

L’esempio B04.sampler.pd (Figura 2.14) mostra come utilizzare una wavetable


come campionatore. In questo esempio l’indice nel sample (la wavetable) è
controllato muovendo il mouse in una number box. Una riscalatura conveniente
per la number box è in centesimi di secondo; per convertire in campioni (come
l’input di tabread4∼ richiede) si moltiplica per 44100 campioni/sec per 0.01
sec in modo da ottenere 441 campioni per unità; questo prima di applicare
pack e line∼ in modo molto simile a quello usato nell’esempio precedente. La
trasposizione che si sente dipende da quanto velocemente si sposta su e giù il
mouse. Questo esempio ha introdotto una nuova classe di oggetti:

hip∼ : filtro high-pass (low-cut) semplice. Il creation argument fornisce la


frequenza di taglio in cicli al secondo. Lo usiamo qui per eliminare l’uscita
costante (zero-frequenza) quando l’input è fisso in un singolo campione (quando
non si cambia attivamente la posizione di lettura della wavetable con il mouse).
I filtri saranno descritti nel Capitolo 8.
Gli oggetti pack e line∼, in questo esempio, non sono inclusi solo per rende-
re il suono più continuo, ma risultano essenziali per rendere il suono intelligibile.
Se l’indice nella ricerca viene cambiato semplicemente ogni volta che il mouse
si è spostato di un pixel (ad esempio, da venti a cinquanta volte al secondo)
la stragrande maggioranza dei campioni avrebbe lo stesso indice del campione
precedente (gli altri 44000+campioni, senza contare quelli in cui il mouse si
muove). Quindi la velocità di precessione sarebbe quasi sempre zero. Invece
di cambiare le trasposizioni, si sarebbero sentiti dei grani da 20 a 50 cicli al
secondo (provate a scoprire che cosa si sente suonare!).
48 Capitolo 2. Wavetables e campionatori
2.6. EXAMPLES 51

0 <-- read point, 0-100


* 441 convert to SAMPLES

pack 0 100

line~

tabread4~ sample-table

hip~ 5 high pass filter to cut DC


|
(OUT)

sample-table

--- 44103 samples ---

Figure
Figura 2.14:Un
2.14: A sampler with mouse-controlled
campionatore index:
con controllo degli B04.sampler.pd.
indici tramite mouse:
B04.sampler.pd.
2.6. Esempi 49

Campionatori a loop
Nella maggior parte delle situazioni, si ha necessità di un modo più automatiz-
zato di spostare il mouse per specificare le posizioni di lettura della wavetable;
per esempio, vorreste voler riuscire a suonare un sample con una trasposizione
stabile; potreste avere più samples in esecuzione contemporaneamente (o altre
cose che richiedono attenzione), oppure potreste voler passare rapidamente tra
i samples o andare in posizioni prestabilite. Nei prossimi esempi, sviluppere-
mo un lettore automatico di samples, che, anche se solo uno dei molti possibili
approcci, è un potente lettore che viene spesso utilizzato.
Le patches B05.sampler.loop.pd e B06.sampler.loop.smooth.pd mostrano co-
me fare ciò: la prima nel modo più semplice possibile ed la seconda (rappre-
sentata in Figura 2.15, parte a) che incorpora una seconda curva per creare un
inviluppo sul suono, descritto nel paragrafo 2.3. Introduciamo una nuova classe
di oggetti:
cos∼ : calcola il coseno di 2π volte il segnale in ingresso (in modo che da 0
a 1 fa un ciclo completo). A differenza degli oggetti di lettura delle tabelle in
Pd, cos∼ lavora in modo periodico, in modo che non vi sia alcuna limitazione
di intervallo sul suo input.
In Figura 2.15 (parte a), un oggetto phasor∼ fornisce gli indici sia alla
wavetable (a destra) che alle fasi tramite una funzione con forma a metà coseno
(a sinistra). Questi due vengono moltiplicati e il prodotto è filtrato da un passa-
alto prima di uscire in output. La lettura della wavetable è semplice; il phasor
viene moltiplicato per un parametro “chunk size”, quindi sommato ad 1 e infine
usato come indice per tabread4∼. Il parametro per la chunk size è moltiplicato
per 441 per convertirlo da centesimi di secondo a campioni. Questo corrisponde
esattamente al diagramma a blocchi mostrato in Figura 2.5, con un segmento
di posizione pari a 1 (che non può essere 0 poiché 1 è l’indice minimo per cui
tabread4∼ funziona).
Il percorso del segnale a sinistra, nell’esempio, corrisponde alla tecnica di
inviluppo per wavetable lookup mostrata in Figura 2.7. Qui l’onda a dente
di sega è impostata sull’intervallo (−1/4, 1/4) (sottraendo e moltiplicando per
0.5), quindi inviato a cos∼. Questo legge la funzione coseno nell’intervallo
(−π/2, π/2), fornendo cosı̀ solo la metà positiva della forma d’onda.
La parte (b) della Figura 2.15 introduce un terzo parametro, “read point”,
che specifica dove, nel sample, il loop deve essere avviato (nella parte (a) siamo
sempre partiti dall’inizio). La modifica necessaria è abbastanza semplice: ag-
giungiamo il valore del “punto di lettura”, in campioni, all’indice della wavetable
e procediamo come prima. Per evitare le discontinuità nell’indice, “ammorbi-
diamo” il valore del punto di lettura usando gli oggetti pack e line∼, come
abbiamo fatto nel primo esempio di campionatore (Figura 2.14). Ciò solleva un
problema importante, anche se sottile. La formula di trasposizione momentanea
(pagina 33) prevede che, fintanto che la chunk size e il punto di lettura non va-
riano nel tempo, la trasposizione è pari alla frequenza moltiplicata per la chunck
size (come sempre, utilizzando appropriate unità di misura, Hertz per secondi,
per esempio, in modo che il prodotto sia adimensionale). Tuttavia, variare,
nel tempo, chunk size e punto di lettura influenzerà la trasposizione momenta-
nea, spesso in modi chiaramente percepibili, come si può ascoltare nell’esempio
B07.sampler.scratch.pd. L’esempio B08.sampler.nodoppler.pd (quello mostrato
50 Capitolo 2. Wavetables e campionatori

2.6. EXAMPLES 53

frequency (Hz.) frequency


0 0
chunk size
phasor~ (hundredths of a phasor~ 0
second) -~ 0.5
0 chunk size
*~ 0.5
* 441 0
cos~
-~ 0.5 *~ * 441

*~ 0.5 +~ 1 samphold~
*~ read point
cos~ tabread4~ table18 0
+~ 1
*~ * 441
hip~ 5
pack 0 100
|
(OUT) line~

samphold~

+~
(a)
tabread4~ table20

*~

hip~ 5
|
(OUT)
(b)

Figure 2.15: (a) a looping sampler with a synchronized envelope


Figura 2.15: (a) un campionatore
(B06.sampler.loop.smooth.pd); a loopbutcon
(b) the same, withuna inviluppo
control for sincronizza-
read lo-
to (B06.sampler.loop.smooth.pd);
cation (B08.sampler.nodoppler.pd). (b) lo stesso, ma con un controllo per la
posizione di lettura (B08.sampler.nodoppler.pd).
2.6. Esempi 51

in figura) mostra un possibile modo per controllare questo effetto, introducendo


una nuova classe di oggetti:
samphold∼ : un’unità di sample-and-hold (questo nome risulterà familiare a
chi usa i sintetizzatori analogici, ma qui con un aspetto digitale; per maggiori
dettagli, vedere il paragrafo 3.7). Questo oggetto memorizza un unico campione
proveniente dall’ingresso sinistro e lo emette ripetutamente, fino a quando l’in-
gresso del lato destro (anche esso un segnale audio digitale, chiamato trigger)
causa il cambiamento del campione memorizzato con un nuovo, sempre prove-
niente dall’ingresso sinistro. L’unità acquisisce un nuovo campione ogni volta
che il valore numerico del trigger scende da un campione all’altro. Questo è
stato progettato per essere facilmente abbinabile con gli oggetti phasor∼, per
facilitare l’attivazione (triggering) sui wraparounds di fase.
L’esempio B08.sampler.nodoppler.pd utilizza due oggetti samphold∼ per ag-
giornare i valori della chunk size e del punto di lettura, esattamente quando il
phasor riparte, in quello stesso momento l’inviluppo cosinosoidale è a zero in
modo che l’effetto delle modifiche istantanee non si senta. In questa situazione
possiamo applicare la formula di trasposizione più semplice per le Looping Wa-
vetables per mettere in relazione, la frequenza, la chunk size e la trasposizione.
Ciò è viene fatto nell’esempio B09.sampler.transpose.pd (non mostrato).

Campionatore a loop con sovrapposizione


Come descritto nel paragrafo 2.3, a volte è auspicabile utilizzare due o più cam-
pionatori a loop sovrapposti per produrre un suono ragionevolmente continuo
senza dover utilizzare inviluppi troppo rapidi alle estremità del loop. Ciò è par-
ticolarmente probabile in situazioni in cui il segmento in loop è breve, un decimo
di secondo o meno. L’esempio B10.sampler.overlap.pd, mostrato in Figura 2.16
(parte a), realizza due campionatori a loop un mezzo ciclo fuori fase tra loro.
Le nuove classi di oggetti sono:
loadbang : emette un messaggio “bang” quando la patch viene caricata. Que-
sto è usato in questa patch per assicurarsi che la divisione della trasposizione per
la chunk size abbia un fattore di trasposizione valido nel caso in cui la chunck
size venga inizialmente modificata con il mouse.
expr : valuta le espressioni matematiche. Le variabili appaiono come $f1,
$f2 e cosı̀ via, e corrispondono alle entrate dell’oggetto. Le varie operazioni
aritmetiche sono consentite, con parentesi per il raggruppamento, e vengono
fornite molte librerie di funzioni, come l’esponenziazione, che si può vedere in
questo esempio con “pow” (la funzione di elevamento a potenza).
wrap∼ : limita all’intervallo da 0 a 1. Cosı̀, ad esempio, 1.2 diventa 0.2; 0.5
rimane invariato; e −0.6 passa a 0.4.
send∼ , s∼ , receive∼ , r∼ : versione segnale di send e receive. Un
segnale audio inviato a un oggetto send∼ viene visualizzato alle uscite di tutti
gli oggetti receive∼ con lo stesso nome. A differenza di send e receive, non
si può avere più di un oggetto send∼ con lo stesso nome (si consiglia di vedere
anche gli oggetti throw∼ e catch∼).
Nell’esempio, una parte del macchinario per la lettura wavetable viene dupli-
cato, utilizzando calcoli identici di “chunck-size-samples” (un flusso di messaggi)
52 Capitolo 2. Wavetables e campionatori

2.6. EXAMPLES 55

loadbang 0 <-- transposition

0 <-- transposition, r chunk-size r precession


(tenths of a halftone)
t b f t b f
expr pow(2, $f1/120)
r chunk-size expr (pow(2, $f1/120)-$f3)/$f2

t b f +~ 0.5
phasor~ wrap~
/
s~ phase s~ phase2
phasor~

+~ 0.5 s~ phase 0 <-- precession loadbang


(percent)
wrap~ * 0.01 chunk
10
size
s~ phase2 / 0.9 s precession
10 <-(msec)
(chunk size and read point phasor~ * 0.001
controls not shown) *~ 0.9 s chunk-size
r chunk-size-samples s~ read-pt
samphold~ r~ phase
r chunk-size
r~ phase
samphold~ r~ phase
*~ r~ read-pt r~ phase *~ r~ phase
+~ 1 r~ phase r~ phase
-~ 0.5 +~ r~ read-pt
+~ samphold~
*~ 0.5 *~ 44100 -~ 0.5
tabread4~ table22 +~ 1 *~ 0.5
cos~
*~ tabread4~ table23
cos~
+~ <- (second reader
*~
not shown)
hip~ 5 <- (second reader
+~
| not shown)
(OUT) hip~ 5
|
(OUT)
(a) (b)

Figura2.16:
Figure 2.16: (a) overlapped
(a) two due looping samplers
looping sovrapposti
samplers (B10.sampler.overlap.pd);
(B10.sampler.overlap.pd); (b)
the
(b)same, but with
lo stesso, maa phasor-controlled
con il punto diread point controllato
lettura (B11.sampler.rockafella.pd).
da un phasor (esempio
B11.sampler.rockafella.pd).
2.6. Esempi 53

e di “read-pt” (un segnale audio smussato come prima). Tuttavia, il segna-


le audio “phase”, nella seconda copia, viene sostituito da “phase2”. La parte
superiore della figura mostra il calcolo dei due segnali di fase: il primo riceve
l’uscita di un oggetto phasor∼, e il secondo con l’aggiunta di 0.5 e limitandolo,
con wrap∼, a valori tra 0 e 1, aggiungendo cosı̀ 0.5 cicli (π radianti) alla fase.
I due segnali di fase sono utilizzati ciascuno, con le stesse regolazioni del range
come prima, per calcolare gli indici nella wavetable e nell’oggetto cos∼ e per
controllare i due oggetti samphold∼. Infine, i risultati delle due copie vengono
sommati per ottenere l’output.

Precessione automatica del punto di lettura


L’esempio B11.sampler.rockafella.pd, illustrato nella parte (b) di Figura 2.16,
adatta i concetti mostrati in precedenza in una situazione in cui il punto di lettu-
ra viene calcolato automaticamente. Qui modifichiamo il punto di lettura lungo
il sample in un loop, permettendoci di accelerare o rallentare la riproduzione
indipendentemente dalla trasposizione.
Questo esempio affronta una debolezza del precedente, cioè che se la velocità
della precessione è ovunque vicina ad uno (cioè la velocità naturale di ascolto
della wavetable registrata), e se non c’è molta trasposizione, diventa preferibile
utilizzare i grani più grandi e abbassare di conseguenza la frequenza di ripeti-
zione (mantenendo costante il prodotto per avere la trasposizione desiderata).
Tuttavia, se è consentito ottenere grani di grandi dimensioni, non è più con-
veniente quantizzare i cambi di controllo sui punti di wraparounds della fase,
poiché potrebbero essere troppo distanti per consentire un tempo di risposta
ragionevole per controllare i cambiamenti.
In questa patch rimuoviamo l’oggetto samphold∼ che aveva controllato il
punto di lettura (ma lasciamo quello per la chunk size, che è molto più difficile
da cambiare a metà ciclo). Invece, utilizziamo la velocità (conosciuta) di pre-
cessione del punto di lettura per correggere la frequenza dell’onda a dente di
sega, in modo da mantenere la trasposizione desiderata. Risulta che, quando il
fattore di trasposizione e la precessione sono vicini tra loro (in modo che stiamo
quasi facendo la stessa cosa di una semplice modifica della velocità), la frequen-
za scenderà ad un valore vicino a zero, per cui avremo aumentato, allo stesso
tempo, la naturalezza del risultato.
In questa patch ci spostiamo dalla gestione di punti di lettura, chunk size,
ecc., a quella dei campioni e usiamo invece i secondi, convertendo in campioni
(e spostando di uno solo) appena prima dell’oggetto tabread4∼ . La wavetable
contiene un secondo di suono e supponiamo qui che la chunk size non superi
gli 0.1 secondi, in modo da poter lasciare variare, in tutta sicurezza, il punto
di lettura tra 0 e 0.9; la chunk size “reale” varia e può diventare abbastanza
grande, a causa del movimento del puntatore di lettura.
Il controllo della precessione imposta la frequenza di un phasor di ampiezza
0.9 e quindi la precessione deve essere moltiplicata per 0.9 per impostare la
frequenza del phasor (in modo che, per una precessione di uno per esempio,
l’ampiezza e la frequenza del punto di lettura siano entrambi 0.9, in modo che
rapporto tra ampiezza e frequenza sia uno). L’output di questa procedura viene
chiamato “read-pt” come prima, ed è utilizzato per entrambe le copie del lettore
wavetable.
54 Capitolo 2. Wavetables e campionatori

La precessione p e la chunk size c sono noti e se indichiamo la frequenza del


phasor∼ superiore (originale) con f , il fattore di trasposizione è dato da:

t = p + cf

e risolvendo per f si ha
t−p 2h/12 − p
f= =
c c
dove h è la trasposizione desiderata in semitoni. Questa è la formula usata
nell’oggetto expr.

Esercizi
1. Se un wavetable con 1000 campioni viene riprodotto alla trasposizione uni-
taria, ad una frequenza di campionamento di 44100 Hertz, quanto tempo
dura il suono risultante?

2. Una wavetable di un secondo viene riprodotta in 0.5 secondi. Di quale


intervallo è trasposto il suono?
3. Sempre assumendo una wavetable di un secondo, se la riproduciamo pe-
riodicamente (in un loop), a quanti Hertz dovremmo eseguire in loop la
wavetable per trasporre il suono originale verso l’alto di un semitono?

4. Vogliamo suonare una wavetable (registrata a R = 44100), in loop dieci


volte al secondo, in modo che il suono originale memorizzato nella wave-
table sia trasposto di una quinta perfetta ascendente (si veda pagina 11).
Quanto grande deve essere il segmento della wavetable, in campioni, da
riprodurre?

5. Supponiamo che si desideri utilizzare uno stretching su una wavetable che


contiene una forma d’onda periodica di periodo 100. Desiderate ascoltare
lo spettro non trasposto in un periodo di 200 campioni. Rispetto a quale
fattore la forma deve essere allargata?

6. La prima metà di una wavetable contiene un ciclo di sinusoide di ampiezza


di picco uno. La seconda metà contiene zeri. Qual è la potenza della
seconda parziale della wavetable?
7. Una sinusoide viene memorizzato in una wavetable con periodo 4 in modo
che i primi quattro elementi siano 0, 1, 0 e −1, corrispondenti agli indici
0, 1, 2 e 3. Quale valore otteniamo per un input di 1.5: (a) e utilizzando
un interpolazione a 2 punti ? (b) a 4 punti ? (c) quale è il valore della
sinusoide originale in questo punto?
8. Se i contenuti di una wavetable cadono tra −1 e 1, quali sono i possibili
outputs della ricerca su wavetable utilizzando l’interpolazione a 4 punti?
Capitolo 3

Calcoli audio e di controllo

3.1 Il teorema di campionamento


Finora abbiamo discusso i segnali audio digitali come se fossero capaci di descri-
vere qualsiasi funzione variabile nel tempo, nel senso che conoscere i valori che la
funzione assume sui valori interi dovrebbe in qualche modo determinare i valori
che assume tra essi. Questo non è del tutto vero. Per esempio, supponiamo
che una funzione f (definita sui numeri reali) abbia sempre valore 1 su tutti gli
interi:
f (n) = 1, n = . . . , −1, 0, 1, . . .

Potremmo allora immaginare che f (t) = 1 anche per t reale. Ma forse f potrebbe
essere 1 sugli interi e 0 ovunque altrove – questa sarebbe comunque una funzione
perfettamente accettabile, e la conoscenza del valore della funzione sugli interi
non la distingue dalla funzione costante f (t) = 1. Ma l’intuizione ci dice che la
funzione costante è quella buona nell’ambito dei segnali audio digitali, mentre
quella che nasconde un “segreto” tra i campioni non lo è. Una funzione che è
“possibile campionare” dovrebbe essere quella per cui possiamo usare un certo
schema di interpolazione ragionevole per dedurre i propri valori sui valori non
interi a partire dai valori sugli interi.
È consuetudine, a questo punto, in qualsiasi discussione di computer music,
introdurre il famoso Teorema di Nyquist. Ciò afferma (detto in maniera infor-
male) che se una funzione è una combinazione finita o addirittura infinita di
sinusoidi, nessuna delle cui frequenze angolari supera π, allora, almeno teorica-
mente, può essere completamente determinata dai valori che la funzione assume
sugli interi. Un possibile modo di ricostruire la funzione sarebbe come il limite
di interpolazioni polinomiali di ordini superiori.
La frequenza angolare π, chiamata frequenza di Nyquist, corrisponde a R/2
cicli al secondo se R è la frequenza di campionamento. Il periodo corrispondente
è due campioni. La frequenza di Nyquist è la migliore che possiamo ottenere
nel senso che qualsiasi sinusoide reale di frequenza superiore è uguale, sugli
interi, a una la cui frequenza è inferiore a quella di Nyquist, ed è proprio questa
seconda frequenza quella che otterremo tramite il processo di interpolazione
sopra proposto. Ad esempio, una sinusoide con frequenza angolare tra π e 2π,

55
56
60 CHAPTER 3. AUDIOCapitolo 3. Calcoli COMPUTATIONS
AND CONTROL audio e di controllo

7
0

Figure 3.1: Two real sinusoids, with angular frequencies π/2 and 3π/2, showing
Figura
that 3.1:
they Due sinusoidi
coincide reali,Acon
at integers. frequenze
digital audioangolari π/2 edistinguish
signal can’t 3π/2, che mostrano
between
che coincidono
the two. sui numeri interi. Un segnale audio digitale non può distinguere
tra le due.

reconstructed by the ideal interpolation process. For instance, a sinusoid with


ad esempio π + ω, può essere scritta come
angular frequency between π and 2π, say π + ω, can be written as
cos((π + ω)n + φ) = cos((π + ω)n + φ − 2πn) =
cos((π + ω)n + φ) = cos((π + ω)n + φ − 2πn)
= cos((w − π)n + φ)
= cos((ω − π)n + φ)
= cos((w−−ω)n
=cos((π π)n−−φ)
φ)
for
perallogni
integers n. (If(se
n intero n weren’t
n non an integer
fosse the firstlastep
un intero, would
prima fail.) So a potrebbe
uguaglianza sinusoid
with frequency between π and 2π is equal, on the integers
essere falsa). Quindi una sinusoide con frequenza tra π e 2π è uguale, almeno at least, to one with
frequency between 0 and π; you simply can’t tell the
sugli interi, ad una con frequenza tra 0 e π; in parole povere non è possibiletwo apart. And since
any conversion
distinguere hardware
le due sinusoidi.should do thequalsiasi
E poiché “right” hardware
thing anddireconstruct
conversionethe lower-
dovrebbe
frequency
fare la cosa “giusta” e ricostruire la sinusoide a bassa frequenza, qualsiasicome
sinusoid, any higher-frequency one you try to synthesize will altra
out your speakers
sinusoide ad alta at the wrong
frequenza chefrequency—specifically,
si tenta di sintetizzare you willdagli
uscirà hear altoparlanti
the unique
frequency betweenerrata
a una frequenza 0 and– π in that the higher
particolare, frequency
si sentirà lands on
quell’unica when reduced
frequenza tra 0 e
in the above way. This phenomenon is called foldover,
π a cui la frequenza più alta si riduce tramite le precedenti formule. because the half-line
Questo
of frequencies
fenomeno fromil 0nome
prende to ∞diisfoldover,
folded back
perchéandla forth, in lengths
semiretta of π, onto
delle frequenze dathe
0a
interval from 0 to π. The word aliasing means the same
∞ viene ripiegata, avanti e indietro in segmenti di lunghezza π, sull’intervallo thing. Figure 3.1
shows
da 0 athat sinusoids
π. La parola of angular
aliasing frequencies
indica lo stessoπ/2 and 3π/2,
effetto. for instance,
La Figura can’t per
3.1 mostra, be
distinguished as digital audio signals.
esempio, che sinusoidi con frequenze angolari π/2 e 3π/2 non producono segnali
We digitali
audio conclude that when, for instance, we’re computing values of a Fourier
distinguibili.
seriesConcludiamo either
(Page 12), as a wavetable
che quando, ad esempio, or as a real-time
stiamo calcolandosignal, we had
i valori better
di una se-
leave out any sinusoid in the sum whose frequency exceeds
rie di Fourier (pagina 11), sia come wavetable che come segnale in tempo reale, π. But the picture in
general
sarebbeismeglio
not this simple, since
tralasciare, nella most
somma, techniques
qualsiasiother than laadditive
sinusoide synthesis
cui frequenza su-
don’t lead to neat, band-limited signals (ones whose components
peri π. Ma tuttociò, in generale, non è cosı̀ semplice, poiché la maggior stop at some
parte
limited frequency).
delle tecniche, tranne Forlaexample, a sawtooth
sintesi additiva, wave of frequency
non producono ω, of the
segnali chiari form
e limitati
put out by Pd’s phasor~ object but considered as a continuous
in banda (quelli le cui componenti si fermano ad una certa frequenza limitata). function f (t),
expands to:
Ad esempio, un’onda a dente di sega di frequenza ω, della forma prodotta dal-
l’oggetto phasor∼ in ! "
1 Pd,1 ma considerata come una
sin(2ωt) funzione continua
sin(3ωt) f (t), si
esprime come f (t) = − sin(ωt) + + + · · ·
2 π 2 3
 
1 1 sin(2ωt) sin(3ωt)
(t) = − highsin(ωt)
which enjoys farbitrarily +
frequencies; +
and moreover ···
the+hundredth partial
2 π 2 3
is only 40 dB weaker than the first one. At any but very low values of ω,
che contiene frequenze arbitrariamente elevate; e inoltre la centesima parziale
è solo 40 dB più debole della prima. Ad eccezione dei valori molto bassi di ω,
le parziali sopra π saranno presenti da un punto di vista sonoro e, a causa del
foldover, verranno udite a frequenze non corrette (questo non significa che non
3.2. Controllo 57

si debbano usare le onde a dente di sega come generatori di fase – la wavetable


lookup corregge magicamente il foldover dell’onda a dente di sega – ma bisogna
pensarci due volte prima di utilizzare un’onda a dente di sega come fonte sonora
digitale).
Molte tecniche di sintesi, anche se non strettamente limitate in banda, forni-
scono parziali che possono diminuire in ampiezza più rapidamente di 1/n, come
nell’esempio dell’onda a dente di sega, e sono quindi più accettabili per lavorare
in digitale. In ogni caso, è sempre una buona idea tenere a mente la possibilità
di foldover, e addestrare le orecchie per riconoscerlo.
La prima linea di difesa contro il foldover è semplicemente quella di utilizzare
frequenze di campionamento elevate; è una buona pratica quella di utilizzare
sistematicamente la frequenza di campionamento più alta che sia facilmente
gestibile dal computer. La frequenza pratica più elevata varia a seconda se si sta
lavorando in tempo reale o meno, dai tempi di CPU e dai limiti di memoria, e/o
dall’hardware di input e output e talvolta anche dai limiti imposti dal software.
Un trattamento, molto non tecnico, della teoria di campionamento è fornito
in [Bal03]. Maggiori dettagli possono essere trovati in [Mat69, pp. 1-30].

3.2 Controllo
Finora abbiamo affrontato segnali audio, che sono solo sequenze x[n] definite per
n che assume valori interi, che corrispondono a punti regolarmente distanziati
nel tempo. Questo è spesso un contesto adeguato per descrivere le tecniche di
sintesi, ma le applicazioni reali di musica elettronica comportano solitamente
anche altri calcoli che devono essere effettuati a punti irregolari nel tempo. In
questa sezione svilupperemo una struttura per descrivere ciò che chiameremo
calcoli di controllo. Richiederemo sempre che ogni calcolo corrisponda a un
tempo logico specifico. Il tempo logico controlla quale campione di un output
audio sarà il primo a riflettere il risultato del calcolo.
In un sistema non in tempo reale (come Csound nella sua forma classica),
ciò significa che il tempo logico procede da zero fino alla lunghezza del file audio
di output. Ogni “scheda di partitura” ha un tempo logico associato (il tempo
nella partitura) e agisce una volta che il calcolo audio ha raggiunto quel tempo.
Cosı̀ i calcoli audio e di controllo (elaborazione dei campioni e gestione delle
schede di partitura) vengono gestiti a turno, tutti in ordine crescente di tempo
logico.
In un sistema in tempo reale, il tempo logico, che corrisponde ancora al tem-
po del successivo campione in output (audio) interessato, è sempre leggermente
in anticipo rispetto al tempo reale, misurato dal campione che sta effettivamente
uscendo dal computer. I calcoli di controllo e audio sono ancora effettuati in
alternanza, ordinati per tempo logico.
Il motivo per cui nei calcoli in computer music si utilizza il tempo logico
e non il tempo reale è quello di mantenere i calcoli indipendenti dal tempo
effettivo di esecuzione del computer, che può variare per una serie di ragioni,
anche per due calcoli apparentemente identici. Quando calcoliamo un nuovo
valore di un segnale audio o elaboriamo qualche controllo in input, il tempo
reale può scorrere, ma noi richiediamo che il tempo logico rimanga lo stesso
per tutto il calcolo, come se tale avvenga istantaneamente. Di conseguenza, i
calcoli in musica elettronica, se eseguiti correttamente, sono deterministici: due
58
62 CHAPTER 3. AUDIOCapitolo 3. Calcoli COMPUTATIONS
AND CONTROL audio e di controllo

audio output
(a) 0 1 2

. . . control
0 1 1 2 2 3 audio
logical time

(b) 0 1 2 3 4 5 6 7

. . .
0 4 4 8 8

Figure 3.2: Timeline for digital audio and control computation: (a) with a block
Figura
size 3.2:sample;
of one Timeline(b) per
withilacalcolo audio
block size digitale
of four e di controllo: (a) con un
samples.
blocco di lunghezza pari un campione; (b) con un blocco di lunghezza pari a
quattro campioni.
or processing some control input, real time may pass but we require that the
logical time stay the same through the whole calculation, as if it took place
esecuzioni dello stesso
instantaneously. calcoloofaudio
As a result this, in tempo reale
electronic musico meno, ognuna con
computations, gli stessi
if done cor-
inputs, dovrebbero avere risultati identici.
rectly, are deterministic: two runs of the same real-time or non-real-time audio
La Figura each
computation, 3.2 (parte
havinga)themostra schematicamente
same inputs, should havecome il tempo
identical logico e i
results.
calcoli sui campioni siano allineati. I campioni audio vengono calcolati a in-
Figure 3.2 (part a) shows schematically how logical time and sample com-
tervalli regolari (contrassegnati come linee ondulate), ma prima del calcolo di
putation are lined up. Audio samples are computed at regular periods (marked
ciascun campione facciamo tutti i calcoli di controllo che potrebbero influenzarlo
as wavy lines), but before the calculation of each sample we do all the control
(contrassegnati come segmenti di linea retta). In primo luogo facciamo i calco-
calculations that might affect it (marked as straight line segments). First we do
li di controllo associati a tempi logici a partire da zero, senza includere quelli
the control computations associated with logical times starting at zero, up to
associati al tempo logico 1; quindi calcoleremo il primo campione audio (con
but not including one; then we compute the first audio sample (of index zero),
indice zero), al tempo logico 1. Facciamo quindi tutti i calcoli di controllo fino
at logical time one. We then do all control calculations up to but not including
a non includere quelli associati al tempo logico 2, quindi il campione dell’indice
logical time 2, then the sample of index one, and so on. (Here we are adopt-
uno certain
ing e cosı̀ via (qui si stanno
conventions about adottando alcune
labeling that couldconvenzioni
be chosen sull’etichettatura
differently. For
che potrebbero essere scelte in modo diverso. Ad esempio,
instance, there is no fundamental reason control should be pictured non c’è una ragione
as coming
fondamentale per cui i calcoli di controllo devono essere
“before” audio computation but it is easier to think that way.) rappresentati come se
arrivassero “prima” dei calcoli audio, ma è tuttavia più facile pensare in questo
Part (b) of the figure shows the situation if we wish to compute the audio
modo).
output in blocks of more than one sample at a time. Using the variable B to
La parte (b) della figura mostra la situazione quando si desidera calcolare
denote the number of elements in a block (so B = 4 in the figure), the first audio
l’output audio in blocchi di più di un campione alla volta. Utilizzando la varia-
computation will output samples 0, 1, ...B − 1 all at once in a block computed
bile B per indicare il numero di elementi in un blocco (quindi B = 4 in figura), il
at logical time B. We have to do the relevant control computations for all B
primo calcolo audio emette i campioni 0, 1, ...B −1 tutti contemporaneamente in
periods of time in advance. There is a delay of B samples between logical time
un blocco calcolato al tempo logico B. Dobbiamo eseguire in anticipo i relativi
and the appearance of audio output.
calcoli di controllo per tutti i periodi di tempo B. C’è un ritardo di B campioni
Most computer music software computes audio in blocks. This is done to
tra il tempo logico e la comparsa dell’output audio.
increase the efficiency of individual audio operations (such as Csound’s unit
La maggior parte dei softwares per la computer music calcola l’audio in
blocchi. Ciò è fatto per aumentare l’efficienza delle singole operazioni audio
(ad esempio i generatori unitari di Csound e gli oggetti con ∼ in Max/MSP e
Pd). Ogni generatore unitario o oggetto con ∼ incorre in un costo di calcolo
(overhead) ogni volta che viene richiamato, uguale a forse venti volte il costo
3.3. CONTROL
3.3. Flussi STREAMS
di controllo 63
59

time

Figure 3.3: Graphical representation of a control stream as a sequence of points


Figura
in time.3.3: Rappresentazione grafica di un flusso di controllo come sequenza di
punti nel tempo.

generators and Max/MSP and Pd’s tilde objects). Each unit generator or tilde
di calcolo
object medio
incurs di uneach
overhead campione.
time it isSecalled,
la dimensione del blocco
equal to perhaps è uno,
twenty questo
times the
significa
cost un overhead
of computing one del
sample2,000%; se è di Ifsessantaquattro
on average. (come
the block size is in Pd,
one, this per
means
default),
an overheadl’overhead è solo
of 2,000%; if itdiiscirca il 30%.(as in Pd by default), the overhead is
sixty-four
only some 30%.

3.3 Flussi di controllo


3.3 Control streams
I calcoli di controllo possono derivare da fonti diverse, sia interne che ester-
ne al calcolo
Control complessivo.
computations may Esempi
come from di calcoli di controllo
a variety generati
of sources, both internamente
internal and
includonotoil the
external sequencing (in cui i calcoli Examples
overall computation. di controlloofdevono avvenire
internally a tempi con-
engendered pre-
determinati)
trol computationso il rilevamento di caratteristiche
include sequencing (in whichdell’output in uscita (admust
control computations esempio,
take
per l’osservazione
place at pre-determined dei passaggi
times)sullo zero indetection
or feature un segnale). Quelli
of the generati
audio outputester-
(for
namente watching
instance, possono provenire da dispositivi
for zero crossings di inputExternally
in a signal). come i controllers
engendered MIDI,onesil
mouse
may e lafrom
come tastiera,
inputi devices
pacchettisuch di as
rete
MIDI e cosı̀ via. In ogni
controllers, caso, i and
the mouse calcoli di con-
keyboard,
trollo possono
network packets, verificarsi
and so on.a intervalli
In any irregolari,
case, control a differenza dei campioni
computations may occur audio
at
che corrispondono
irregular al ticchettio
intervals, unlike audio costante
samples which di un orologio
correspond di campionamento.
to a steadily ticking
sampleAvremmo
clock. bisogno di un modo per descrivere il flusso di informazioni tra i
calcoli
We di controllo
will need ae wayquelliofaudio, che baseremo
describing sulla nozione
how information flowsdi flusso
betweendi controllo
control
(control
and audiostream). Questo altro
computations, whichnon we èwill
chebasesemplicemente
on the notion unaofraccolta
a control di stream.
numeri
– eventualmente vuota – che si presentano come risultato
This is simply a collection of numbers—possibly empty—that appear as a re- di calcoli di controllo,
regolarmente
sult of controlocomputations,
irregolarmentewhetherdistanziati nel tempo
regularly logico. Il flusso
or irregularly spaced di in
controllo
logical
più semplice possibile non ha alcuna informazione
time. The simplest possible control stream has no information other than diversa rispetto a quello di
a time
una sequenza
sequence: temporale
......,,t[0],
t[0], t[1],
t[1], t[2],
t[2], .. .. ..
Anche se the
Although i valori
timedivalues
tempoare
sono preferibilmente
best given in units assegnati in their
of samples, unità values
di campioni,
aren’t
iquantized;
loro valorithey
nonmay
vengono quantizzati; essi possono essere numeri reali
be arbitrary real numbers. We do require them to be arbitrari.
sorted
Richiediamo,
in nondecreasingperò, che siano ordinati in ordine non decrescente:
order:

······ ≤
≤ t[0] ≤ t[1]
t[0] ≤ ≤ t[2]
t[1] ≤ ≤ ·. ·. ·.
t[2] ≤

Ciascun
Each itemelemento della sequenza
in the sequence prende
is called il nome di evento.
an event.
Control streams may be shown graphically asgraficamente
I flussi di controllo possono essere visualizzati come
in Figure 3.3. nella Figura
A number line
3.3. Una retta numerata mostra sia il tempo che una sequenza di frecce nei
shows time and a sequence of arrows points to the times associated with each
tempi associati a ciascun evento. Il flusso di controllo visualizzato non ha dati
event. The control stream shown has no data (it is a time sequence). If we want
(è una sequenza temporale). Se vogliamo mostrare i dati nel flusso di controllo,
to show data in the control stream we will write it at the base of each arrow.
li scriveremo alla base di ciascuna freccia.
Un flusso numerico di controllo è quello che contiene un numero per punto
temporale, in modo da apparire come una sequenza di coppie ordinate:

. . . , (t[0], x[0]), (t[1], x[1]), . . . .


60 Capitolo 3. Calcoli audio e di controllo

dove gli t[n] sono i punti temporali e gli x[n] sono i valori del segnale in quei
tempi.
Un flusso numerico di controllo è approssimativamente analogo a un “con-
troller MIDI”, i cui valori cambiano irregolarmente, ad esempio quando un con-
troller fisico viene spostato da un esecutore. Altre sorgenti di flusso di controllo
possono avere maggiori velocità di cambiamento e/o più precisione. D’altra par-
te, una sequenza temporale potrebbe essere una sequenza di colpi di pedale, che
(nonostante l’implementazione MIDI) non dovrebbero essere considerati come
avere valori, ma solo tempi.
I flussi numerici di controllo sono come i segnali audio in quanto entrambi
sono solo valori numerici che cambiano nel tempo. Ma mentre il segnale audio
avviene ad un tasso costante (e quindi i valori temporali non devono essere spe-
cificati per ogni campione), il flusso di controllo avviene in modo imprevedibile
– forse uniforme, forse irregolare, forse mai.
Vediamo ora cosa succede quando cerchiamo di convertire un flusso numerico
di controllo in un segnale audio. Come prima, scegliamo una dimensione del
blocco pari a B = 4. Consideriamo un’onda quadra con periodo 5.5 come un
flusso di controllo:

(2, 1), (4.75, 0), (7.5, 1), (10.25, 0), (13, 1), . . .

e mostriamo tre modi per poterla convertire in un segnale audio. La Figura 3.4
(parte a) mostra la conversione più semplice e veloce possibile. Ogni campione
audio di uscita rispecchia semplicemente il valore più recente del segnale di
controllo. Quindi i campioni da 0 a 3 (calcolati al tempo logico di 4 a causa
della dimensione del blocco) sono di valore 1 a causa del punto (2, 1). I quattro
campioni successivi valgono ancora 1, perché dei due punti (4.75, 0) e (7.5, 1),
il più recente ha ancora valore 1.
La conversione più veloce possibile è più appropriata per i flussi di controllo
che non cambiano frequentemente rispetto alla dimensione del blocco. I suoi
vantaggi principali sono la semplicità di calcolo e la risposta più veloce possibile
ai cambiamenti. Come mostra la figura, quando gli aggiornamenti del flusso di
controllo sono troppo veloci (nell’ordine della dimensione del blocco), il segnale
audio potrebbe non essere una buona rappresentazione di quello sporadico (se,
come in questo caso, il flusso di controllo avviene ad intervalli regolari, possiamo
usare il teorema di campionamento per analizzare il risultato. Qui la frequenza
di Nyquist associata alla frequenza del blocco R/B è inferiore alla frequenza
dell’onda quadra in input, quindi l’output subisce un aliasing ad una nuova
frequenza inferiore alla frequenza di Nyquist).
La parte (b) mostra il risultato della conversione al campione più vicino.
Ogni nuovo valore del flusso di controllo al tempo t influenza i campioni di uscita
partendo dall’indice btc (il più grande intero che non supera t). Ciò equivale
ad utilizzare la conversione più veloce possibile con una dimensione di blocco
pari a 1; in altre parole, la conversione al campione più vicino nasconde l’effetto
della maggiore dimensione del blocco. Ciò è migliore rispetto alla conversione
più veloce possibile nei casi in cui il flusso di controllo cambi rapidamente.
La parte (c) mostra un tipo di conversione sporadic-to-audio, simile a quella
al campione più vicino, ma ora utilizzando anche l’interpolazione a due punti per
aumentare ulteriormente l’accuratezza del tempo. Concettualmente possiamo
descriverla come segue. Supponiamo che l’ultimo valore del flusso di controllo
3.3. Flussi di controllo 61

3.3. CONTROL STREAMS 65

a
0 1 2 3 4 8 12 16

. . .
0 4 8 12 16

(2, 1) (7.5, 1) (13, 1) (18.5, 1)

(4.75, 0) (10.25, 0) (15.75, 0)

b
0 1 2 3 4 8 12 16

. . .
0 4 8 12 16

c
0 1 2 3 4 8 12 16

. . .
0 4 8 12 16

Figure 3.4: Three ways to change a control stream into an audio signal: (a) as
Figura
fast 3.4: Tre(b)
as possible; modi per to
delayed convertire un sample;
the nearest flusso di(c)controllo in un segnale
with two-point interpo- audio:
lation
(a) il for
piùhigher delay accuracy.
velocemente possibile; (b) ritardato al campione più vicino; (c) con
interpolazione a due punti per una maggiore precisione di ritardo.
62 Capitolo 3. Calcoli audio e di controllo

sia stato uguale a x e che il punto successivo sia (n + f, y), dove n è un intero
e f è la parte frazionaria del valore temporale (quindi 0 ≤ f < 1). Il primo
punto interessato, all’output audio, sarà il campione all’indice n. Ma invece di
impostare l’output su y come prima, lo impostiamo a

f x + (1 − f )y,

cioè ad una media ponderata tra il precedente ed il nuovo valore, i cui pesi
favoriscono maggiormente il nuovo valore se il tempo del valore sporadico è
precedentemente più vicino a n. Nell’esempio mostrato, la transizione da 0 a 1
al tempo 2 dà
0 · x + 1 · y = 1,

mentre la transizione da 1 a 0 al tempo 4.75 dà:

0.75 · x + 0.25 · y = 0.75.

Questa tecnica fornisce una rappresentazione ancora più vicina del segnale di
controllo (almeno la parte di esso che si trova al di sotto della frequenza di
Nyquist) a scapito di più calcolo e un ritardo leggermente maggiore.
I flussi numerici di controllo possono anche essere convertiti in segnali au-
dio utilizzando funzioni di rampa per smussarne le discontinuità. Questo vie-
ne spesso applicato quando un flusso di controllo è utilizzato per controllare
un’ampiezza, come descritto nel paragrafo 1.5. In generale abbiamo bisogno di
specificare tre valori per impostare una funzione di rampa in movimento: un
tempo di inizio, un valore di destinazione (specificato dal flusso di controllo) e
un tempo di destinazione spesso espresso come ritardo successivo al tempo di
inizio.
In tali situazioni è quasi sempre abbastanza preciso regolare il tempo di
inizio e di fine per abbinare il primo campione audio calcolato ad un tempo
logico successivo, una scelta che corrisponde allo scenario descritto sopra, al
riguardo della conversione più veloce possibile. La Figura 3.5 (parte a) mostra
l’effetto della rampa da 0 al tempo 3, ad un valore di 1 al tempo 9, tornando
immediatamente indietro verso 0 al tempo 15, con dimensione del blocco B = 4.
I tempi 3, 9, e 15 sono troncati rispettivamente a 0, 8 e 12.
In molte situazioni reali la dimensione del blocco potrebbe essere dell’ordi-
ne di un millisecondo e la regolazione degli estremi della rampa agli estremi
del blocco funziona bene per controllare le ampiezze; raggiungere un obiettivo
una frazione di millisecondo in anticipo o in ritardo raramente produce una
differenza sonora. Tuttavia, altri usi delle rampe risentono maggiormente della
quantizzazione del tempo agli estremi. Ad esempio, se vogliamo fare qualcosa ri-
petutamente ogni pochi millisecondi, la variazione delle lunghezze del segmento
provocherà una aperiodicità udibile.
Per situazioni come queste, possiamo migliorare l’algoritmo di generazio-
ne di rampa per avviarsi e arrestarsi a campioni arbitrari, come illustrato, ad
esempio, nella Figura 3.5 (parte b). Qui gli estremi dei segmenti si allineano
esattamente con i campioni richiesti 3, 9 e 15. Possiamo andare ulteriormente
avanti e ottenere una regolazione per i campioni frazionati, facendo in modo che
i segmenti tocchino i valori 0 e 1 a punti esattamente specificabili sulla retta
numerata.
3.4. Conversione da segnali audio a flussi numerici di controllo 63
3.4. CONVERTING FROM AUDIO SIGNALS TO NUMERIC CONTROL STREAMS67

a
0 4 8 12

b
3 9 15

. . .

3 9 15

Figure
Figura 3.5:
3.5: Line segmentdel
Smussatura smoothing
flussi di ofcontrollo
numericnumerico
control streams:
tramite (a) aligned (a)
segmenti: to
block boundaries; (b) aligned to nearest sample.
allineato agli estremi del blocco; (b) allineato al campione più vicino.

For
Ad example, suppose we want
esempio, supponiamo to repeat aripetere
che vogliamo recordedunsound
suonoout of a wavetable
registrato su una
100 times per second, every 441 samples at the usual sample rate.
wavetable 100 volte al secondo, ogni 441 campioni alla frequenza di campiona- Rounding
errors
mento due to blocking
usuale. Gli erroriatdi64-sample boundaries
arrotondamento dovuticould detune the
alla creazione di playback
blocchi diby64
as much as a whole tone in pitch; and even rounding to one-sample
campioni potrebbero modificare l’intonazione di riproduzione anche di boundaries
un intero
could
tono; eintroduce variations up
anche arrotondando to about
a estremi di 0.2%,
un soloorcampione
three cents. This introdurre
potrebbe situation
would call for sub-sample accuracy in sporadic-to-audio conversion.
variazioni fino a circa lo 0.2%, o tre cents. Questa situazione richiederebbe un
accuratezza sul sub-campione nella conversione sporadic-to-audio.

3.4 Converting from audio signals to numeric


3.4 Conversione
control da segnali audio a flussi nume-
streams
rici di controllo
We sometimes need to convert in the other direction, from an audio signal to
aA sporadic
volte abbiamo
one. To bisogno di convertire
go in this direction,nell’altra
we somehow direzione:
provide daaun segnale
series audio
of logical
a uno (a
times sporadico. Per andare
time sequence), as wellinasquesta
an audio direzione, dobbiamo,
signal. For output we in qualche modo,
want a control
fornire una
stream serie dithe
combining tempi
timelogici (una with
sequence sequenza
valuestemporale)
taken from e un
thesegnale audio.
audio signal.
We
Comedo output
this when we want
vogliamo untoflusso
incorporate
di controllothe signal’s value as
che combina la part of a control
sequenza tempo-
computation.
rale con i valori presi dal segnale audio. Questo viene fatto quando vogliamo
incorporare
For example,il valore del segnale
we might come parte
be controlling di un calcolo
the amplitude of adisignal
controllo.
using a line~
Ad as
object esempio,
in Examplepossiamo controllare
A03.line.pd (Page l’ampiezza
21). Suppose di unwe segnale
wish to utilizzando
turn off the un
oggettoatline∼
sound a fixedcome
rate ofnell’esempio
speed instead A03.line.pd (pagina
of in a fixed amount19).ofSupponiamo di voler
time. For instance,
spegnere
we might ilwant
suono ad unathe
to re-use fissata frequenza
network di velocità
for another soundanziché
and wish rispetto
to mute adituna
as
quantitàasfissa
quickly di tempo.
possible Ad esempio,
without potremmo
audible artifacts; wevoler riutilizzare
probably la rete
can ramp it per
off un
in
altrotime
less suono e desideriamo
if the disattivarlo
current amplitude il più
is low velocemente
than possibile
if it is high. To dosenza
this weartefatti
must
udibili; aprobabilmente
confect message to thepossiamo
line~ objectspegnerlo conituna
to send rampa
to zero in anin amount
meno tempo of time se
l’ampiezza
we’ll calculateattuale
on the è bassa
basis ofpiuttosto
its current cheoutput
se è alta.
value.A This
questowillscopo dobbiamo
require, first of
confezionare
all, un messaggio
that we “sample” per object’s
the line~ l’oggettooutputline∼(an per mandarlo
audio signal) aintozero in una
a control
quantità di tempo che calcoleremo sulla base del suo valore corrente di output.
stream.
CiòThe
richiederà,
same issuesinnanzitutto,
of time delaydi “campionare”
and accuracyl’outputappear as dell’oggetto
for sporadic line∼
to audio(un
segnale audio)
conversion. e renderlo
Again un flusso
there will be a di controllo.
tradeoff between immediacy and accuracy.
Le stesse problematiche di ritardo temporale e di precisione appaiono come
per la conversione sporadic-to-audio. Ancora una volta ci sarà un compromesso
tra immediatezza e precisione. Supponiamo che, come prima, stiamo calcolando
l’audio in blocchi di 4 campioni e supponiamo che al tempo logico 6 vogliamo
68 CHAPTER 3. AUDIO AND CONTROL COMPUTATIONS
64 Capitolo 3. Calcoli audio e di controllo

trigger

signal snapshot

(a) (b)

Figure 3.6: Conversion between control and audio: (a) control to signal; (b)
Figura 3.6: Conversione tra controllo e audio: (a) da controllo a segnale; (b) da
signal to control by snapshots.
segnale da controllo tramite snapshots (“istantanee”).

Suppose as before that we are calculating audio in blocks of 4 samples, and


prendere il valore di un segnale audio e usarlo per modificare il valore di un
suppose that at logical time 6 we want to look at the value of an audio signal,
altro. Come mostrato nella Figura 3.2 (parte b), il valore più recentemente
and use it to change the value of another one. As shown in Figure 3.2 (part
calcolato del segnale sarà per l’indice 3 e il primo indice in cui il nostro calcolo
b), the most recently calculated value of the signal will be for index 3 and the
può influenzare un segnale è 4. Possiamo quindi eseguire l’operazione che ci
earliest index at which our calculation can affect a signal is 4. We can therefore
interessa con un ritardo di solo un campione. Tuttavia, non possiamo scegliere
carry out the whole affair with a delay of only one sample. However, we can’t
esattamente quale campione: l’aggiornamento può verificarsi solo agli estremi
choose exactly which sample—the update can occur only at a block boundary.
di un blocco.
As before, we can trade immediacy for increased time accuracy. If it matters
Come prima, possiamo diminuire l’immediatezza per aumentare la precisio-
exactly at which sample we carry out the audio-to-control-to-audio computation,
ne temporale. Se siamo interessati a esattamente su quale campione eseguiamo
we read the sample of index 2 and update the one at index 6. Then if we want
il calcolo audio-to control-to audio, leggiamo il campione dell’indice 2 e aggior-
to do the same thing again at logical time 7, we read from index 3 and update
niamo quello all’indice 6. Quindi, se vogliamo ripetere la stessa cosa a tempo
at index 7, and so on. In general, if the block size is B, and for any index n,
logico 7, leggiamo dall’indice 3 e aggiorniamo all’indice 7 e cosı̀ via. In generale,
we can always read the sample at index n − B and affect the one at index n.
se la dimensione del blocco è B, per qualsiasi indice n, possiamo sempre leggere
There is thus a round-trip delay of B samples in going from audio to control to
il campione all’indice n − B e modificare quello nell’indice n. C’è quindi un
audio computation, which is the price incurred for being able to name the index
ritardo di B campioni passando dall’audio al controllo e nuovamente al calcolo
n exactly.
audio, che è il prezzo da pagare per essere in grado di scegliere esattamente
If we wish to go further, to being able to specify a fraction of a sample,
l’indice n.
then (as before) we can use interpolation—at a slight further increase in delay.
Se vogliamo andare oltre, per essere in grado di specificare una frazione di un
In general, as in the case of sporadic-to-audio conversion, in most cases the
campione, allora (come prima) possiamo usare l’interpolazione – con un leggero
simplest solution is the best, but occasionally we have to do extra work.
aumento di ritardo. In generale, come nel caso della conversione sporadic-to-
audio, nella maggior parte dei casi la soluzione più semplice è la migliore, ma
occasionalmente dovremo fare un lavoro extra.
3.5 Control streams in block diagrams
Figure 3.6 shows how control streams are expressed in block diagrams, using
3.5 Flussianddisignal-to-control
control-to-signal controllo conversion
nei diagrammi a blocchi
as examples. Control streams
are represented using dots (as opposed to audio signals which appear as solid
La Figura 3.6 mostra come i flussi di controllo siano espressi in diagrammi
arrows).
a blocchi, utilizzando,
The signal come from
block converts esempi, la conversione
a numeric da controllo
control stream a segnale
to an audio signal.e
da segnale a controllo. I flussi di controllo sono rappresentati con puntini
The exact type of conversion isn’t specified at this level of detail; in the Pd (in
contrasto con i segnali audio che appaiono come frecce continue).
Il blocco signal converte un flusso numerico di controllo in un segnale au-
dio. Il tipo esatto di conversione non è ancora stato specificato a questo livel-
lo della trattazione; negli esempi in Pd la scelta dell’operatore di conversione
determinerà proprio questo.
3.6. Individuazione degli eventi 65

Il blocco snapshot (istantanea) converte i segnali audio in flussi numerici di


controllo. Oltre al segnale audio, è necessario un ingresso di controllo separato
per specificare la sequenza temporale in cui viene campionato il segnale audio.

3.6 Individuazione degli eventi


Oltre a scattare snapshots, una seconda modalità di trasmissione di informazioni
dai segnali audio ai calcoli di controllo è la event detection (individuazione degli
eventi). In questa modalità le informazioni sul tempo vengono fornite dal segnale
audio. Ne è un esempio la threshold detection (individuazione della soglia), in
cui l’input è un segnale audio e l’output è una sequenza temporale. Esaminiamo
in dettaglio la threshold detection.
Una ragione tipica per utilizzare la threshold detection è quella di individuare
quando un qualche tipo di attività inizia e si arresta, come un esecutore che
suona uno strumento. Supponiamo di avere già una misura continua dell’attività
sotto forma di segnale audio (questo può essere fatto, ad esempio, utilizzando
un envelope follower). Quello che vogliamo è un coppia di sequenze temporali,
una che segna i tempi in cui l’attività inizia e l’altra che segna quando si arresta.
La Figura 3.7 (parte a) mostra una semplice realizzazione di questo princi-
pio. Supponiamo che l’input del segnale sia rappresentato in un grafico continuo.
Una linea orizzontale mostra il valore costante della soglia. La sequenza tempo-
rale contrassegnata da “onsets” contiene un evento per ogni volta che il segnale
attraversa la soglia da sotto a sopra; quella contrassegnata da “turnoff” segna
invece i passaggi nell’altra direzione.
In molte situazioni otterremo onsets e turnoffs indesiderati causati da piccole
increspature nel segnale vicino alla soglia. Ciò può essere evitato sopprimendo
i rimbalzi (debouncing), che può essere fatto in almeno due semplici modi. In-
nanzitutto, come mostrato nella parte (b) della figura, possiamo impostare due
soglie: una più alta per la scelta degli onsets e una inferiore per i turnoffs. In
questo schema la regola è che segniamo solo il primo onset dopo ogni turnoff e,
viceversa, segniamo solo un turnoff dopo ogni onset. Cosı̀, la terza volta che il
segnale attraversa la soglia più alta in figura, non viene segnato nessun onset
perché non c’è stato nessun turnoff dopo il precedente onset (all’inizio, agiamo
come se l’output più recente fosse un turnoff, in modo che il primo inizio venga
segnato).
Un secondo approccio per filtrare più onsets e turnoffs, mostrato nella parte
(c) della figura, è associare un periodo morto a ciascun onset. Questo altro non è
che un intervallo costante di tempo dopo ogni onset, durante il quale rifiutiamo
di segnalare ulteriori onsets o turnoffs. Una volta terminato il periodo, se nel
frattempo il segnale è sceso sotto la soglia, segnaleremo a ritroso un turnoff. I
periodi morti possono anche essere associati ai turnoffs e i due periodi possono
avere valori temporali diversi.
Le due strategie di filtraggio possono essere utilizzate separatamente o simul-
taneamente. Di solito è necessario adeguare manualmente i valori di soglia e/o
i tempi morti ad ogni situazione specifica in cui viene utilizzata il thresholding.
Il thresholding è spesso utilizzato come primo passo nella progettazione di
strategie di livello superiore per organizzare le risposte del computer a richiami
(cues) udibili dagli esecutori. Un semplice esempio potrebbe essere quello di
mettere in atto una sequenza di processi pre-pianificati, in modo che ciascuno
66 Capitolo 3. Calcoli audio e di controllo

70 CHAPTER 3. AUDIO AND CONTROL COMPUTATIONS

onsets

threshold
(a)

turnoffs
time

(b) high threshold


low threshold

(c)

dead periods

Figure 3.7: Threshold detection: (a) with no debouncing; (b) debounced using
Figura
two 3.7: Rilevamento
threshold di soglia: (a)
levels; (c) debounced senza
using soppressione
dead periods. dei rimbalzi; (b) sop-
primendo i rimbalzi utilizzando due livelli di soglia; (c) sopprimendo i rimbalzi
usando periodi morti.
3.7. Segnali audio come controllo 67

di essi sia avviato dall’onset di un suono dopo un determinato periodo di silenzio


relativo, come se volessimo vedere un musicista che suona una sequenza di frasi
separate da pause.
Rivelatori più sofisticati (costruiti sul concetto del rilevamento della soglia)
potrebbero rivelare un suono continuo o un silenzio entro un range atteso di
durate, o sequenze di rapida alternanza tra riproduzione e non riproduzione,
oppure periodi di tempo in cui la percentuale di tempo di riproduzione rispetto
ai silenzi è sopra o sotto una determinata soglia, o molte altre possibilità. Queste
potrebbero avviare reazioni o figure predeterminate in un’improvvisazione.

3.7 Segnali audio come controllo


Dalla tradizione della sintesi analogica abbiamo ereditato un approccio elegante
e old-fashioned al problema del controllo che può essere utilizzato come alter-
nativa ai flussi di controllo che abbiamo già affrontato finora in questo capitolo.
Questo approccio ci dice che possiamo usare, eventualmente insieme ai flussi
di controllo, i segnali audio stessi per controllare la produzione di altri segnali
audio. Due tecniche specifiche di sintesi analogica si prestano bene a questo
trattamento: sequencing analogico e sample-and-hold.
Il sequencer analogico [Str95, pp. 70-79] [Cha80, pp. 93,304-308] è sta-
to spesso utilizzato per avviare una sequenza di suoni ripetuti regolarmente o
semi-regolarmente. Il sequencer stesso emette in genere una sequenza ripetuta
di voltaggi, insieme ad un segnale di trigger che pulsa ad ogni transizione tra i
voltaggi. Si utilizzavano questi voltaggi per produrre note o variare parametri
timbrici e il trigger per controllare uno o più generatori di inviluppo. Nella pra-
tica audio digitale, ottenere sequenze cicliche di valori predeterminati è sempli-
cemente l’invio di un oggetto phasor∼ in una ricerca di tabella non-interpolata.
Se vogliamo, per esempio, quattro valori nella sequenza, basta riscalare l’output
del phasor∼ in modo che assuma i valori da 0 a 3.999., in modo che il primo
quarto del ciclo legga il punto 0 della tabella e cosı̀ via.
Per ottenere il ripetuto innesco del trigger, il primo passo è quello di sin-
tetizzare un’altra onda a dente di sega che procede in sincronia con l’output
del phasor∼, ma quattro volte più veloce. Questo può essere fatto usando una
variante della tecnica della Figura 2.8, in cui abbiamo usato un sommatore e un
operatore wrap per ottenere uno spostamento di fase desiderato. La Figura 3.8
mostra l’effetto di moltiplicare un’onda a dente di sega per un numero intero,
quindi frazionata, tramite wrap, per ottenere un’onda a dente di sega ad un
multiplo della frequenza originale.
A questo punto è facile ottenere una forma di inviluppo ripetuta, per esem-
pio tramite wavetable lookup (utilizzando questa volta una ricerca di tabella
interpolante, a differenza della sequenza di voltaggi). Anche tutte le tecniche di
generazione e alterazione delle forme d’onda utilizzate per la creazione di suoni
possono essere utilizzate qui.
L’altra tecnica di controllo standard, presa dal controllo analogico del sinte-
tizzatore, è quella del sample-and-hold (campionamento e mantenimento [Str95,
pp. 80-83] [Cha80, p. 92]). Questa tecnica parte da un segnale in ingresso, ne
prende alcuni valori istantanei e “blocca” questi valori per usarli in output. I
valori particolari da scegliere sono selezionati da un ingresso secondario che agi-
sce da “trigger”. Nei punti, nel tempo, specificati dal trigger viene prelevato un
68 Capitolo 3. Calcoli audio e di controllo

72 CHAPTER 3. AUDIO AND CONTROL COMPUTATIONS

frequency 4

* 4

WRAP

OUT 1

Figure 3.8: Multiplying and wrapping a sawtooth wave to generate a higher


Figura 3.8: Moltiplicazione e wrap di un’onda a dente di sega per generarne una
frequency.
a frequenza più alta.
3.8. Operazioni sui flussi di controllo 69

IN

trigger

S/H

OUT

Figure 3.9: Sample and hold (“S/H”), using falling edges of the trigger signal.
Figura 3.9: Sample-and-hold (“S/H”), usando i punti di caduta del segnale di
trigger.

nuovo singolo valore dal segnale all’ingresso primario e viene emesso continua-
mente quel valore fino al punto successivo quando viene sostituito da un nuovo
valore, sempre ottenuto dal segnale all’ingresso primario.
Nell’audio digitale è spesso utile campionare un nuovo valore sui punti di
caduta del segnale di trigger, ovvero quando il valore corrente del segnale di
trigger è minore del suo valore precedente, come mostrato in Figura 3.9. Ciò
è particolarmente conveniente per l’uso con un’onda a dente di sega, quando
vogliamo campionare i segnali in sincronia con un processo controllato da un
oscillatore. L’oggetto di sample-and-hold di Pd è stato precedentemente in-
trodotto nel contesto del campionamento (esempio B08.sampler.nodoppler.pd,
pagina 50).

3.8 Operazioni sui flussi di controllo


Finora abbiamo parlato di come convertire tra flussi di controllo e flussi audio.
Oltre a questa possibilità, ci sono quattro tipi di operazioni che possono essere
eseguite sui flussi di controllo per ottenere altri flussi di controllo. Queste ope-
razioni sui flusso di controllo non hanno operazioni corrispondenti sui segnali
audio. La loro esistenza spiega in gran parte perché è utile introdurre una intera
struttura di controllo in parallelo a quella dei segnali audio.
70 Capitolo 3. Calcoli audio e di controllo

Il primo tipo di operazione è costituito da operazioni di ritardo (delay) che


compensano i valori di tempo associati a un flusso di controllo. Nei sistemi in
tempo reale i ritardi non possono avere valori negativi. Un flusso di controllo
può essere ritardato di una quantità costante, oppure in alternativa, è possibile
ritardare ogni evento separatamente tramite quantità diverse.
Due tipi diversi di delay sono utilizzati nella pratica: semplice e composto.
Esempi di ciascun tipo sono mostrati in Figura 3.10. Un delay semplice, che
agisce su un flusso di controllo, pianifica ogni evento, non appena viene raggiunto
da esso, per un tempo in futuro. Tuttavia, se un altro evento arriva all’ingresso
prima che venga emesso il primo evento, il primo evento viene dimenticato a
favore del secondo. In un delay composto, ogni evento all’ingresso produce un
output, anche se altri eventi arrivano prima che venga prodotto il suo output.
Una seconda operazione su flussi di controllo è il merging (unione): si pren-
dono due flussi di controllo e se ne combinano tutti gli eventi in un nuovo
flusso di controllo. La Figura 3.11 (parte a) mostra come questa e le successive
operazioni sono rappresentate nei diagrammi a blocchi.
La parte (b) della figura mostra l’effetto del merging di due flussi. I flussi
possono contenere più eventi contemporaneamente. Se i due flussi da unire
contengono eventi nello stesso momento, il flusso risultante li contiene entrambi,
in un ordine ben definito.
Un terzo tipo di operazione sui flussi di controllo è il pruning (potatura).
Fare il pruning di un flusso di controllo significa guardare ai dati associati e
prendere solo alcuni elementi. La parte (c) mostra un esempio in cui gli eventi
(ciascuno dei quali ha un numero associato) vengono passati solo se il numero
è positivo.
Infine, esiste il concetto di risincronizzazione (resynchronizing) di un flusso
di controllo ad un altro, come mostrato nella parte (d). Qui un flusso di con-
trollo (la sorgente) contribuisce con dei valori che vengono messi sulla sequenza
temporale del secondo (il sync). Il valore assegnato all’output è sempre quello
più recente dal flusso sorgente. Si noti che qualsiasi evento proveniente dalla
sorgente può apparire più di una volta (come suggerito nella figura), oppure,
eventualmente, potrebbe non apparire affatto.
Ancora una volta, dobbiamo considerare cosa succede quando i due flussi
contengono contemporaneamente un evento. Dobbiamo supporre che il sync
avvenga prima della sorgente (in modo che l’output ha il valore dell’evento
sorgente precedente)? O l’evento sorgente dovrebbe essere considerato prima in
modo che il suo valore passa all’output allo stesso tempo? Come questo possa es-
sere disambiguo è una domanda di progettazione, a cui diversi ambienti software
forniscono approcci diversi (in Pd è controllata esplicitamente dall’utente).

3.9 Operazioni sui flussi di controllo in Pd


Finora abbiamo utilizzato Pd principalmente per elaborare i segnali audio, anche
se, già nella Figura 1.10 abbiamo dovuto distinguere tra la nozione, in Pd, di
segnali audio e di controllo: i collegamenti che portano i flussi di controllo
sono sottili e quelli portano l’audio sono spessi. I flussi di controllo in Pd
appaiono come sequenze di messaggi. I messaggi possono contenere dati (spesso,
uno o più numeri) oppure no. Un flusso numerico di controllo (paragrafo 3.3)
3.9. Operazioni sui flussi di controllo in Pd 71
3.8. OPERATIONS ON CONTROL STREAMS 75

in delay time

delay (a)

out

time

(input)

(b)

(c)

Figure 3.10: Delay as an operation on a control stream: (a) block diagram; (b)
Figura
effect of 3.10: Operazione
a simple delay on adicontrol
delay su un flusso
stream; di controllo:
(c) effect (a) diagramma
of a compound delay. a
blocchi; (b) effetto di un delay semplice su un flusso di controllo; (c) effetto di
un delay composto.
72 Capitolo 3. Calcoli audio e di controllo

76 CHAPTER 3. AUDIO AND CONTROL COMPUTATIONS

sync data

merge prune resync

(a)

(b)

1 -2 3 -4 (c)

1 3

1 3
(d)

1 1 3

Figure 3.11: Operations on control streams (besides delay): (a) block diagrams;
Figura 3.11: Operazioni sui flussi di controllo (oltre al ritardo): (a) diagrammi
(b) merging; (c) pruning; (d) resynchronizing.
a blocchi; (b) merging; (c) pruning; (d) risincronizzazione.
3.9. CONTROLsui
3.9. Operazioni OPERATIONS IN PD
flussi di controllo in Pd 77
73

0 0
0
delay (a)
0 (b)

0 0 0 0

moses select (c) float (d)

0 0

Figure
Figura 3.12:
3.12: The four control
Le quattro operations
operazioni in di
sui flussi Pd:controllo
(a) delay; (b) (a)
in Pd: merging; (c)
delay; (b)
pruning; (d) resynchronizing.
merging; (c) pruning; (d) risincronizzazione.

Or should the source event be considered as being first so that its value goes
viene visualizzato come una connessione (sottile) che trasporta i numeri come
to the output at the same time? How this should be disambiguated is a design
messaggi.
question, to which various software environments take various approaches. (In
Pd itI messaggi
is controlledche explicitly
non contengono dati compongono sequenze temporali. Per
by the user.)
visualizzare i messaggi senza dati, in Pd, viene usato il simbolo (arbitrario)
“bang”.
3.9I quattro
Control operations
tipi di operazioni sui flussi in Pd descritti nel paragrafo pre-
di controllo
cedente possono essere espressi in Pd come mostrato in Figura 3.12. I delays
So far we eseguiti
vengono have used Pd mostly
usando for processing
due oggetti di ritardo audio signals, although as early as
espliciti:
Figure 1.10 we have had to make the distinction between Pd’s notion of audio
del , and
signals delay : delaystreams:
of control semplice. thinè possibile
connections specificare il tempo
carry control di ritardo
streams tra-
and thick
mite creation argument o attraverso l’ingresso destro. Un
ones carry audio. Control streams in Pd appear as sequences of messages. The “bang” nell’ingresso
sinistro “aziona”
messages may contain il delay,
datache(most
poi emette
often,il one
“bang” dopo ilnumbers),
or more ritardo specificato
or not. in A
millisecondi. Il delay è semplice nel senso che l’invio
numeric control stream (Section 3.3) appears as a (thin) connection thatdi un bang in un delay già
carries
avviato resetta
numbers a un nuovo tempo di uscita, annullando il precedente.
as messages.
Messages not containing data make up time sequences. So that you can see
pipe : delay composto. I messaggi che arrivano nell’ingresso sinistro appaiono
messages with no data, in Pd they are given the (arbitrary) symbol “bang”.
in uscita dopo il ritardo specificato, impostato dal primo creation argument.
The four types of control operations described in the previous section can
Se ci sono più creation arguments, essi specificano una o più entrate per i dati
be expressed in Pd as shown in Figure 3.12. Delays are accomplished using two
numerici o simbolici che i messaggi contengono. Un qualsiasi numero di messag-
explicit delay objects:
gi può essere memorizzato contemporaneamente in pipe e i messaggi possono
del , riordinati
essere delay : insimpleuscitadelay. You can
in funzione specify
dei vari tempithedidelay
ritardo time in aassegnati.
a loro creation
L’unione
argument di flussi
or via di controllo
the right inlet. A in Pd non
“bang” viene
in the lefteseguita
inlet setsda the
oggetti
delay,espliciti
which
ma da un meccanismo di connessione di Pd stesso.
then outputs “bang” after the specified delay in milliseconds. The delay Questo è mostrato nella
is
parte (b) della figura con number boxes come esempio.
simple in the sense that sending a bang to an already set delay resets it to aIn generale, ogni volta
che output
new viene fatto
time,più di una the
canceling connessione
previously adscheduled
un ingresso one.di controllo, i flussi di
controllo vengono uniti.
pipe : compound delay. Messages coming in the left inlet appear on the
Pd offre diversi oggetti per il pruning su flussi di controllo, due dei quali
sono mostrati nella parte (c) della figura:
moses : selezione su intervallo numerico. I messaggi numerici che arrivano
nell’ingresso sinistro appaiono sull’uscita sinistra se sono più piccoli di un valore
74 Capitolo 3. Calcoli audio e di controllo

di soglia (impostato da un creation argument o dall’ingresso destro) e sull’uscita


destra altrimenti.
select , sel : selezione su numeri specifici. I messaggi numerici che arriva-
no nell’ingresso sinistro producono un “bang” sull’uscita solo se corrispondono
esattamente ad un “valore di test”. Tale valore di test viene impostato sia con
un creation argument, sia dall’entrata destra.
Infine, Pd si occupa di risincronizzare i flussi di controllo implicitamente
nel suo meccanismo di connessione, come illustrato dalla parte (d) della figura.
La maggior parte degli oggetti con più di una entrata sincronizza tutti gli altri
ingressi a quello più a sinistra. Quindi l’oggetto float, mostrato nella figura,
risincronizza il suo ingresso a destra (che accetta numeri) con quello sinistro.
L’invio di un “bang” all’ingresso sinistro produce, in uscita, il numero più recente
ricevuto precedentemente da float (nell’ingresso destro).

3.10 Esempi
Campionamento e foldover
L’esempio C01.nyquist.pd (Figura 3.13, parte a) mostra un oscillatore che ripro-
duce una wavetable passando attraverso le frequenze da 500 a 1423. Il wavetable
è costituito solo dalla 46-esima parziale, che quindi varia da 23000 a 65458 Hertz.
A una frequenza di campionamento pari a 44100 queste due frequenze suonano
teoricamente come 21100 e 21358 Hertz, ma il passaggio da l’una all’altra è
discendente per poi divenire ascendente.
Altre due forme d’onda sono invece fornite per mostrare gli interessanti effetti
di battimento tra le parziali che, sebbene dovrebbero essere distanti, si trovano
vicine a causa del foldover. Per esempio, a 1423 Hertz, il seconda armonico è
2846 Hertz, mentre il 33-esimo armonico suona a 1423 · 33 − 44100 = 2859 Hertz
– una discreta dissonanza.
Altri esempi meno estremi possono comunque produrre un foldover udibile
in forme meno drastiche. Di solito si tratta di una forma ancora scoraggiante
e vale la pena imparare a sentirla. L’esempio C02.sawtooth-foldover.pd (non
illustrato qui) mostra ciò per un’onda a dente a sega (l’oggetto phasor∼). Per
le wavetables che contengono registrazioni audio, l’errore di interpolazione può
creare un foldover supplementare. I suoi effetti possono variare notevolmente;
il suono è a volte descritto come “croccante” o “splattering”, a seconda del tipo
di registrazione, di trasposizione e di algoritmo di interpolazione.

Convertire controlli in segnali


L’esempio C03.zipper.noise.pd (Figura 3.13, parte b) mostra l’effetto di con-
vertire un flusso di controllo, che si aggiorna lentamente, in un segnale audio.
Questo introduce un nuovo oggetto:
line : un generatore di rampa con uscita un controllo. Come line∼, line
accetta coppie di numeri (obiettivo, tempo) e crea una rampa all’obiettivo nel
tempo specificato; tuttavia, a differenza di line∼, l’output è un flusso numerico
di controllo, che viene visualizzato, per impostazione predefinita, a intervalli di
tempo di 20 msec.
3.9. Esempi 75

3.10. EXAMPLES 79

500, 1423 4000

line~

tabosc4~ table24
(OUT)

table24

(a)

pd metro

1 300 0 300
pd metro

line line~ 1 2 0 2

osc~ 880
line~ vline~
*~ *~

output~ output~ output~ output~


dB 0 dB 0 dB 0 dB 0
mute mute mute mute

(b) (c)

Figure 3.13: (a) sending an oscillator over the Nyquist frequency; (b) zipper
Figurafrom
noise 3.13:
the(a) invio
line della frequenza
(control) object; (c)dithe
unline~
oscillatore oltre laobjects
and vline~ frequenza
com-di
Nyquist;
pared. (b) zipper noise dell’oggetto line∼ (c) confronto tra gli oggetti line∼
e vline∼.
76 Capitolo 3. Calcoli audio e di controllo

Nell’esempio è possibile confrontare il suono dell’ampiezza, che sale e scende,


controllata dall’uscita di line con quella controllata dal segnale audio generato
da line∼.
L’output di line viene convertito in un segnale audio all’ingresso dell’oggetto
∗ ∼. Qui la conversione è implicita collegando un flusso numerico di controllo
ad un ingresso di segnale. In Pd, le conversioni implicite di flussi numerici di
controllo a flussi audio vengono eseguite in modalità più veloce possibile come
mostrato nella Figura 3.4 (parte a). L’uscita di line diventa un segnale a
gradini con 50 passi al secondo. Il risultato è comunemente chiamato “zipper
noise”.
Mentre le limitazioni dell’oggetto line per la generazione di segnali audio
sono chiaramente udibili anche su tali periodi di lunghezza 300 msec, la versione
di segnale, line∼, non produce problemi udibili fino a quando i periodi in
questione non diventano molto più brevi. L’esempio C04.control.to.signal.pd
(Figura 3.13, parte c) mostra l’effetto dell’uso di line∼ per generare un’onda
triangolare a 250 Hertz. Qui entrano in gioco gli effetti mostrati nella Figura 3.5.
Poiché line∼ allinea sempre i segmenti di retta agli estremi dei segmenti del
blocco, le durate esatte dei segmenti variano, e in questo esempio la variazione
(in ordine di un millisecondo) è una frazione significativa della loro lunghezza.
Per queste situazioni è previsto un oggetto più preciso (e più costoso in
termini di tempo di calcolo):

vline∼ : generatore esatto di segmenti di retta. Questo terzo oggetto della


famiglia “line” emette un segnale audio (come line∼), ma allinea gli estremi del
segnale ai punti temporali desiderati, accurati ad una frazione di un campione
(l’esattezza è limitata solo dal formato numerico a virgola mobile utilizzato
da Pd). Inoltre, possono essere specificati molti segmenti con un singolo blocco
audio; vline∼ può generare forme d’onda con periodi fino a due campioni (oltre
i quali si otterrà solo foldover).
L’oggetto vline∼ può essere utilizzato anche per la conversione dei flussi
numerici di controllo in flussi audio nelle modalità di “campione più vicino” e
“interpolazione a due punti”, come mostrato nella Figura 3.4 (parti b e c). Per
ottenere la conversione al campione più vicino, basta dare a vline∼ un tempo
di rampa pari a zero. Per l’interpolazione lineare, basta invece dare un tempo
di rampa di un campione (0.0227 msec se la frequenza di campionamento è di
44100 Hertz).

Lettore di wavetable non-looping


Un’area di applicazione che richiede un’attenzione particolare al confine tra
flussi di controllo e segnali audio è quella del campionamento. Fino ad ora i
nostri campionatori hanno evitato la questione utilizzando loop infiniti. Ciò
consente una ricca varietà di suoni accessibili effettuando cambiamenti continui
in parametri quali la lunghezza del loop e la forma dell’inviluppo. Tuttavia,
molti utilizzi del campionamento richiedono che le caratteristiche interne di
una wavetable emergano a momenti prevedibili e sincronizzabili nel tempo. Ad
esempio, i suoni registrati di percussione vengono solitamente riprodotti dal
punto d’inizio, spesso non sono in loop, e di solito vengono riprodotti in un
determinato rapporto di tempo con il resto della musica.
3.9. Esempi 77

3.10. EXAMPLES 81

bang <-- play the sample

; cut the
cutoff 0 5 sound off

Wait for the


delay 5 cutoff to finish

; set the upper line~ to start


phase 1, 4.41e+08 1e+07; at the first sample and play
cutoff 1 forever (or until next trigger)
start new playback

<-- record
r phase

vline~ adc~ 1 del 3990


tabread4~ tab28 hip~ 5 0 10
0, 1 5
r cutoff line~
*~
*~ vline~
|
tabwrite~ tab28
(OUT)

Figure 3.14: Non-looping sampler.


Figura 3.14: Campionatore non-looping.

Non-looping wavetable player


One application area requiring careful attention to the control stream/audio
signal boundary is sampling. Until now our samplers have skirted the issue
by looping perpetually. This allows for a rich variety of sound that can be
accessed by making continuous changes in parameters such as loop size and
envelope shape. However, many uses of sampling require the internal features
of a wavetable to emerge at predictable, synchronizable moments in time. For
example, recorded percussion sounds are usually played from the beginning, are
not often looped, and are usually played in a determined time relationship with
the rest of the music.
In this situation, control streams are better adapted than audio signals as
triggers. Example C05.sampler.oneshot.pd (Figure 3.14) shows one possible
way to accomplish this. The four tilde objects at bottom left form the signal
processing network for playback. One vline~ object generates a phase signal
(actually just a table lookup index) to the tabread4~ object; this replaces the
phasor~ of Example B03.tabread4.pd (Page 49) and its derivatives.
The amplitude of the output of tabread4~ is controlled by a second vline~
78 Capitolo 3. Calcoli audio e di controllo

In questa situazione, i flussi di controllo sono più adatti come trigger rispet-
to ai segnali audio. L’esempio C05.sampler.oneshot.pd (Figura 3.14) mostra
un possibile modo per realizzare ciò. I quattro oggetti con la tilde in basso a
sinistra costituiscono la rete di elaborazione del segnale per la riproduzione. Un
oggetto vline∼ genera un segnale di fase (in realtà si tratta solo un indice di ri-
cerca sulla tabella) diretto all’oggetto tabread4∼; questo sostituisce il phasor∼
dell’esempio B03.tabread4.pd (pagina 46) ed i suoi derivati.
L’ampiezza dell’output di tabread4∼ è controllata da un secondo vline∼,
per evitare le discontinuità nell’output nel caso in cui un nuovo evento venga
avviato mentre il precedente evento è ancora in riproduzione. L’oggetto vline∼
“cutoff” crea una rampa che manda l’output verso zero (indipendentemente dal
fatto che sia in riproduzione) in modo che, una volta che l’output sia zero,
l’indice della wavetable può essere cambiato in modo discontinuo.
Per avviare una nuova “nota”, in primo luogo, l’oggetto vline∼ “cutoff” va a
zero; quindi, dopo un ritardo di 5 msec (nel tempo in cui vline∼ ha raggiunto lo
zero) la fase viene resettata. Questo viene fatto con due messaggi: innanzitutto,
la fase è impostata su 1 (senza valore temporale in modo da saltare a 1 senza
nessuna rampa). Il valore “1” specifica il primo punto leggibile della wavetable,
poiché stiamo utilizzando l’interpolazione a 4 punti. In secondo luogo, nella
stessa message box, la fase è portata a 441,000,000 in un periodo di tempo di
10,000,000 msec (in Pd, i numeri molto grandi sono mostrati usando la notazione
esponenziale; questi due appaiono come 4.41e+08 e 1e+07.) Il quoziente è 44.1
(in unità per millisecondo) che fornisce una trasposizione di uno. L’oggetto
vline∼ superiore (che genera la fase) riceve questi messaggi tramite l’oggetto
“r phase” sopra di esso.
L’esempio presuppone che la wavetable scenda senza discontinuità a zero
nelle due estremità e la parte inferiore destra della patch mostra come registrare
un tale tipo di wavetable (in questo caso quattro secondi). Qui è sufficiente (e
computazionalmente più economico) un oggetto line∼. Anche se la wavetable
deve essere almeno di 4 secondi affinché tutto funzioni, è possibile registrare
wavetables più brevi semplicemente attivando prima l’oggetto line∼. L’unica
cautela è che, se si sta leggendo e scrivendo contemporaneamente dalla stessa
wavetable, si dovrebbe evitare situazioni in cui le operazioni di lettura e scrittura
si riferiscano contemporaneamente alla stessa parte della wavetable.
Gli oggetti vline∼ intorno al tabread4∼ sono stati scelti al posto di line∼
perché l’arrotondamento dei punti di arresto di quest’ultimo al confine del blocco
più vicino (tipicamente 1,45 msec) può rendere aperiodicità udibili nel suono se
la wavetable viene ripetuto più di 10 o 20 volte al secondo, e impedirebbe di
ottenere un suono piacevole e periodico a livelli più elevati di ripetizione.
Ritorneremo sul campionamento basato su vline∼ nel prossimo capitolo,
per aggiungere trasposizione, inviluppi e polifonia.

Da segnali a controlli

L’esempio C06.signal.to.control.pd (non illustrato) mostra la conversione da se-


gnali audio a flussi numerici di controllo tramite un nuovo oggetto tilde qui
introdotto.
3.9. Esempi 79

snapshot∼ : converte il segnale audio in messaggi di controllo. Ciò fornisce


sempre il più recente campione audio calcolato (conversione più veloce possibile),
in modo che il tempo esatto di campionamento varia di un blocco audio.
È spesso auspicabile percepire l’ampiezza del segnale audio piuttosto che
“sbirciare” in un singolo campione; l’esempio C07.envelope.follower.pd (anch’es-
so non illustrato) introduce un altro oggetto che fa questo:
env∼ : segue inviluppo RMS. Fornisce in uscita messaggi di controllo che
forniscono l’ampiezza RMS a breve termine (in decibel) del segnale audio in
entrata. Un creation argument consente di selezionare il numero di campioni
utilizzati nel calcolo dell’ampiezza RMS; numeri più piccoli danno un output
più veloce (e forse meno stabile).

Sequencer in stile analogico


L’esempio C08.analog.sequencer.pd (Figura 3.15) realizza il sequencer analogico
e la generazione di inviluppi descritti nel paragrafo 3.7. La tabella “sequence”,
con nove elementi, contiene una sequenza di frequenze. L’oggetto phasor∼, in
cima, legge ciclicamente, a 0.6 Hertz, la tabella con la sequenza. La ricerca non-
interpolante su tabella (tabread∼ invece di tabread4∼) viene utilizzata per
leggere le frequenze in passi discreti (le situazioni, in cui preferiamo la ricerca
non-interpolante su tabelle, sono rare).
L’oggetto wrap∼ converte l’onda a dente di sega di ampiezza 9 ad una ad
ampiezza unitaria come descritto in precedenza in Figura 3.8, che viene quindi
utilizzata per ottenere una funzione di inviluppo a partire da una seconda wa-
vetable. Questa viene utilizzata per controllare la dimensione dei grani in un
campionatore a loop (dal paragrafo 2.6). Qui la wavetable è costituito da sei
periodi di sinusoide. I grani vengono smussati moltiplicandoli per una funzione
coseno trasposta (cos∼ e + 1).
L’esempio C09.sample.hold.pd (non illustrato qui) mostra un’unità sample-
and-hold, un altro dispositivo utile per eseguire attività di controllo nel dominio
del segnale audio.

Sequencer in stile MIDI


L’esempio C10.monophonic.synth.pd (Figura 3.16) implementa un sintetizzato-
re monofonico ma in questo caso basato sulla controllabilità via MIDI. Qui i
compiti di generazione di inviluppo e di sequenze di note vengono gestiti utiliz-
zando flussi di controllo anziché segnali audio. Per questo esempio sono necessari
nuovi oggetti di controllo:
notein : input di nota MIDI. Tre uscite forniscono la nota, la velocity e il
canale degli eventi MIDI di note-on e note-off in entrata (dove gli eventi di
note-off appaiono come eventi di note-on a velocity zero). Gli outputs appaiono
nell’ordine standard da destra a sinistra di Pd.
stripnote : filtra i messaggi di note-off. Questo oggetto lascia passare coppie
di valori (nota, velocity) solo quando la velocity è diversa da zero. A diffe-
renza di notein, stripnote non utilizza direttamente l’input e l’output MIDI
dell’hardware.
84 CHAPTER 3. AUDIO AND CONTROL COMPUTATIONS
80 Capitolo 3. Calcoli audio e di controllo

phasor~ 0.6

*~ 9 main loop: sawtooth of amplitude 9

tabread~ sequence read frequency sequence

phasor~ wrap~ 9x original frequency sawtooth

-~ 0.5 *~ 100 adjust for reading


envelope sample
+~ 1

tabread4~ envelope

*~ multiply by audio-frequency sawtooth

*~ 128 adjust amplitude


cos~ and center for wavetable
+~ 129
+~ 1
tabread4~ sample
*~ multiply by raised-cosine smoothing function
|
envelope
(OUT)

sequence sample

Figura 3.15:
Figure Un sequencer
3.15: in stile sintetizzatore analogico.
An analog-synthesizer-style sequencer.
3.9. Esempi 81
3.10. EXAMPLES 85

notein

f - store pitch below


pit vel t b f
b - bang to recall velocity

float velocity stored here


note-on
filter sel 0 test for note on or off
stripnote off on
float recall pitch
pitch
mtof
/ 127 select test against latest
phasor~ note-on pitch
$1 100 0 1000
-~ 0.5
line~ envelope generator now controls
amplitude as well as grain size
cos~ +~ 0.5
+~ 1 *~
*~ *~ 2

*~ cos~ This replaces the tabread4~


| in the previous patch.
(OUT)

Figure 3.16: A MIDI-style monophonic synthesizer.


Figura 3.16: Un sintetizzatore monofonico in stile MIDI.
82 Capitolo 3. Calcoli audio e di controllo

trigger , t : copia un messaggio alle uscite in ordine da destra a sinistra,


con conversione sul tipo. I creation arguments (“b” e “f” in questo esempio)
specificano due uscite, una che fornisce messaggi “bang”, l’altra valori “float”
(cioè numeri). Viene creata un’uscita per ogni creation argument. Le uscite
vengono visualizzate nell’ordine standard da destra a sinistra.
Gli oggetti di controllo della patch inviano le frequenze all’oggetto phasor∼
ogni volta che viene ricevuto un messaggio MIDI di note-on. Controllare l’am-
piezza (tramite l’oggetto line∼) è più difficile. Quando viene ricevuto un mes-
saggio di note-on, l’oggetto sel 0 emette la velocity dall’uscita destra (perché
l’input non corrisponde a 0); questa viene divisa per la velocity massima MIDI
127 e inserita in un messaggio per line∼, con un tempo di 100 msec.
Tuttavia, quando viene ricevuto un note-off, è sufficiente interrompere il
suono se il valore di nota del note-off corrisponde effettivamente al valore di
nota che sta suonando lo strumento. Ad esempio, supponiamo che i messaggi
ricevuti siano “60 127”, “72 127”, “60 0” e “72 0”. Quando il note-on con nota
72 arriva, la nota eseguita dovrebbe cambiare a 72 e quindi il messaggio “60 0”
dovrebbe essere ignorato, con la nota che suona fino al messaggio “72 0”.
Per raggiungere questo obiettivo, innanzitutto memorizziamo la velocity nel-
l’oggetto float superiore. In secondo luogo, quando la nota arriva, viene anche
memorizzata (l’oggetto float inferiore) e poi la velocity viene testata rispetto
al valore zero (l’uscita “bang” di t b f richiama la velocity che viene poi inviata
a sel 0). Se questa è zero, il secondo passo è quello di richiamare la nota e
testarla (l’oggetto select) rispetto al valore di nota del note-in più recentemen-
te ricevuto. Solo se questi sono uguali (in modo che “bang” compaia all’uscita
sinistra di select), il messaggio “0 1000” va all’oggetto line∼.

Esercizi
1. Quante parziali di un tono La a 440 possono essere rappresentate digital-
mente ad una frequenza di campionamento di 44100 Hertz?

2. Quale frequenza si sente se si sintetizza una sinusoide a 88000 Hertz ad


una frequenza di campionamento di 44100?

3. Supponiamo di sintetizzare un suono a 44100 Hertz e che stiamo calco-


lando blocchi audio di 64 campioni. Un evento di controllo è previsto
che avvenga trascorso il tempo di esattamente un secondo, utilizzando lo
schema di aggiornamento più veloce possibile. A quale campione avviene
l’aggiornamento?

4. Campionando a 44100 Hz, desideriamo approssimativamente riprodurre


un Do centrale ripetendo una forma d’onda fissa ogni N campioni. Quale
valore di N dovremmo scegliere e di quanti cents (pagina 7) ci discostiamo
dal “vero” Do centrale?

5. Due onde a dente di sega, di ampiezza unitaria, hanno frequenze rispet-


tivamente di 200 e 300 Hertz. Qual è il periodo della loro somma? Cosa
succede se poi si fa il wrap della somma per restringerla al range tra 0 e
1? Questo risultato cambia a seconda della fase relativa delle due onde?
3.9. Esempi 83

6. Due onde a dente di sega, di uguale frequenza e ampiezza e mezzo ciclo


fuori fase, vengono sommate. Qual è la forma d’onda risultante dalla
somma e quali sono la sua ampiezza e la sua frequenza?

7. Qual è il livello relativo, in decibel, del terzo armonico (tre volte la fonda-
mentale) dell’onda a dente di sega rispetto a quella della fondamentale?
8. Supponiamo di sintetizzare un’onda a dente di sega a 44000 Hertz ad
una frequenza di campionamento di 44100 Hertz. Qual è la forma d’onda
risultante?
9. Utilizzando le tecniche del paragrafo 3.7, disegnare un diagramma a bloc-
chi per la generazione di due sinusoidi, con fase bloccata, a 500 e 700
Hertz.
10. Disegnare un diagramma a blocchi che illustri come utilizzare il threshol-
ding per rilevare quando un segnale audio ne supera un altro in valore
(questo potrebbe essere utile quando si vuole rilevare e filtrare il feedback
dagli altoparlanti ai microfoni).
84 Capitolo 3. Calcoli audio e di controllo
Capitolo 4

Automazione e gestione
della voce

Spesso è auspicabile controllare gli oggetti musicali o gli eventi come “aggregati”
piuttosto che singolarmente. Gli aggregati possono assumere la forma di una
serie di eventi distanziati nel tempo, in cui i dettagli degli eventi seguono dal-
l’architettura superiore (ad esempio, note in una melodia). Oppure gli oggetti
singoli potrebbero essere eseguiti contemporaneamente, come con le voci di un
accordo o le parziali in un tono complesso. Spesso alcune o tutte le proprietà
degli elementi singoli sono meglio dedotte da quelle del tutto.
Una ricca collezione di strumenti e di idee è sorta nel repertorio della musica
elettronica per distinguere i comportamenti individuali da quelli aggregati. In
questo capitolo ci occupiamo di due classi generali di tali strumenti: generatori
di inviluppo e banchi di voci. Il generatore di inviluppo automatizza il compor-
tamento nel tempo e il banco di voci su aggregati di processi simultanei (come
i generatori di segnali).

4.1 Generatori di inviluppo


Un generatore di inviluppo (a volte, più giustamente, chiamato generatore di
transiente) fa si che un segnale audio cresca e decresca con regolarità, come per
controllare l’intensità di una nota musicale. I generatori di inviluppo sono stati
trattati in precedenza nel paragrafo 1.5. Il controllo dell’ampiezza tramite la
moltiplicazione (Figura 1.4) è il modo più diretto e comune di utilizzarne uno,
ma ci sono molti altri usi possibili.
I generatori di inviluppo sono apparsi in molte forme nel corso degli anni, ma
il preferito, più semplice e perenne, è il generatore di inviluppo ADSR. “ADSR”
è un acronimo di “Attack, Decay, Sustain, Release” (Attacco, Decadimento,
Sostegno, Rilascio), i quattro segmenti di output del generatore ADSR. Il ge-
neratore ADSR viene attivato e disattivato da un flusso di controllo chiamato
“trigger”. Avviare il generatore ADSR vuol dire far avviare i suoi segmenti di
attacco, decadimento e sostegno. Il trigger di disattivazione fa invece avviare il
segmento di rilascio. La Figura 4.1 mostra la rappresentazione di un diagramma
a blocchi di un generatore di inviluppo ADSR.

85
90
86 CHAPTER 4. AUTOMATION AND VOICEe gestione
Capitolo 4. Automazione MANAGEMENT
della voce

trigger

Figure 4.1:
Figura 4.1: ADSR envelope
Diagramma as a block
a blocchi di undiagram, showing
inviluppo ADSR the trigger
, che input
mostra (a
l’input
control stream) and the audio output.
trigger (un flusso di controllo) e l’output audio.

parameter sets the output value at the end of the attack segment (normally the
Ci sono
highest value cinque
outputparametri
by the ADSRche controllano
generator). il generatore
Second and ADSR.third,Intheprimo luo-
attack
go, un parametro di livello imposta il valore di uscita
and decay parameters give the time duration of the attack and decay segments. alla fine del segmento
di attacco
Fourth, (normalmente
a sustain parameter l’output
gives thepiùlevel
altoofprodotto
the sustain dalsegment,
generatore as aADSR).
fractionIl
secondo e il terzo, i parametri di attacco e decadimento,
of the level parameter. Finally, the release parameter gives the duration of the danno la durata dei
segmenti di attacco
release segment. e decadimento.
These Il quartowith
five values, together parametro
the timing è quello
of thedi“on”sustain
and e
fornisce il livello
“off” triggers, deldetermines
fully segmento the di sustain,
output ofespresso
the ADSR come una frazione
generator. del para-
For example,
metro di livello.
the duration Infine,
of the sustainil parametro di rilascio
portion is equal to the fornisce la durata
time between “on”delandsegmento
“off”
di rilascio.
triggers, minus Questi cinque valori,
the durations of theinsieme
attack andalla decay
temporizzazione
segments. dei triggers di
“on” e “off”, determinano completamente l’output del generatore ADSR. Ad
esempio,
Figurela4.2 durata
graphs della
some porzione
possibledioutputs
sostegno è uguale
of an ADSRalenvelope
tempo compreso
generator.tra In i
part (a) “on”
triggers we assume that
e “off”, the “on”
meno and “off”
le durate triggers are
dei segmenti widely enough
di attacco separated
e di decadimento.
that the sustain segment is reached before the “off” trigger is received. Parts
(b) La
andFigura
(c) of 4.2 riporta
Figure 4.2 alcuni
show the possibili
resultoutputs
of following di unangeneratore
“on” trigger di inviluppo
quickly
ADSR. Nellaone:
by an “off” parte
(b)(a) supponiamo
during the decay che i triggers
segment, and“on”(c) eeven
“off” siano during
earlier, abbastanzathe
separati
attack. Thein modo ADSR chegenerator
il segmento di sostegno
reacts to thesevenga raggiunto
situations prima che
by canceling il trigger
whatever
remains
“off” sia of the attack
ricevuto. Le andpartidecay
(b) esegments
(c) dellaand continuing
figura straight
4.2 mostrano to the release
il risultato di un
segment.rapido
innesco Also, dianunADSR
“off” generator
dopo un “on”: may be (b)retriggered
durante il “on” segmentobefore di the release
decadimen-
segment
to is finished
e (c) ancor prima,or durante
even during the attack,
l’attacco. decay, or ADSR
Il generatore sustainreagisce
segments. Part
a queste
(d) of the annullando
situazioni figure shows a reattack
qualsiasi during
residuo dei the sustain
segmenti di segment,
attacco e and part (e),
di decadimen-
during
to the decay segment.
e proseguendo direttamente nel segmento di rilascio. Inoltre, un generatore
ADSR può essere retriggerizzato con un “on” prima che il segmento di rilascio
The classicoapplication
sia terminato addiritturaofdurantean ADSR envelopediisattacco,
i segmenti using a decadimento
voltage-control key-
o soste-
board or sequencer to make musical notes on a synthesizer.
gno. La parte (d) della figura mostra una ri-attivazione durante il segmento Depressing and re-di
leasing a key (for example) would generate
sostegno e la parte (e) durante il segmento di decadimento. “on” and “off” triggers. The ADSR
generator could then control the amplitude of synthesis so that “notes” would
start and stop withclassica
L’applicazione the keys.di un Ininviluppo
addition to ADSRamplitude,
è quellathedi ADSR
utilizzaregenerator
una ta-
stiera o un sequencer, voltage-control, per effettuare note musicali to
can (and often is) used to control timbre, which can then be made su evolve
un sin-
naturally overLathe
tetizzatore. course ofe each
pressione note. di un tasto (ad esempio) genererebbero
il rilascio
triggers “on” e “off”. Il generatore ADSR potrebbe allora controllare l’ampiez-
za della sintesi in modo che le “note” partirebbero e si fermerebbero in funzione
dei tasti. Oltre all’ampiezza, il generatore ADSR può essere (e spesso è) utiliz-
zato per controllare il timbro, che può quindi evolvere naturalmente nel corso
di ogni nota.
4.2. Forme di ampiezza lineari e curvilinee 87

4.1. ENVELOPE GENERATORS 91

attack
decay
sustain
(a) release

on off time

(b)
on off

(c)
on off

(d)
on on

(e)
on on

Figure 4.2: ADSR envelope output: (a) with “on” and “off” triggers separated;
Figura
(b), (c) 4.2:
withOutput dell’inviluppo
early “off” ADSR:
trigger; (d), (a) con triggers “on” e “off” separati;
(e) re-attacked.
(b), (c) con il trigger “off” attivato prima che siano passati i tempi di attacco
e/o decadimento; (d), (e) con successiva riattivazione.
88 Capitolo 4. Automazione e gestione della voce

4.2 Forme di ampiezza lineari e curvilinee


Supponiamo che si desideri aumentare l’ampiezza di un segnale in un periodo
di dieci secondi, vale a dire che si desidera moltiplicarlo mediante un segnale di
controllo di ampiezza y[n] che sale in valore da 0 a 1 su 10R campioni, dove
R è la frequenza di campionamento. La scelta più ovvia sarebbe una rampa
lineare: y[n] = n/(10R). Ma questo non risulterebbe essere il metodo migliore
per ottenere un aumento continuo del volume percepito. Nel primo secondo
y[n] aumenta da −∞ dB a −20 dB, nei successivi quattro di altri 14 dB, e nei
restanti cinque, solo per i rimanenti 6 dB. Durante la maggior parte dei dieci
secondi, l’aumento dell’ampiezza sarà appena percepibile.
Un’altra possibilità sarebbe quella di considerare una rampa y[n] che cresce
in modo esponenziale, in modo che aumentasse a una velocità costante in dB. Per
far ciò dobbiamo fissare l’ampiezza iniziale in modo che sia inaudibile, diciamo
0 dB (se fissiamo a 100 dB l’equivalente dell’unità di ampiezza). Ora abbiamo il
problema opposto: per i primi cinque secondi il controllo di ampiezza sale da 0
dB (non udibile) a 50 dB (pianissimo); questa parte della dissolvenza in entrata
(fade-in) dovrebbe corrispondere solo al primo secondo o giù di lı̀.
Una progressione più naturale dovrebbe forse considerare il fade-in come una
successione temporizzata di dinamica, 0-ppp-pp-p-mp-mf-f-ff-fff, con ogni passo
che impiega circa un secondo.
Una fade-in dovrebbe idealmente rispettare una certa scala tra logaritmica
e lineare. Una scelta piuttosto arbitraria, ma utile nella pratica, è la curva
quartica:
 n 4
y[n] = ,
N
dove N è il numero di campioni su cui fare il fade-in (nell’esempio precedente, è
10R). Quindi, dopo il primo secondo dei dieci, saremmo saliti a −80 dB, dopo
cinque secondi a −24 dB, e dopo nove a circa −4 dB.
La Figura 4.3 mostra tre funzioni di trasferimento di ampiezza:
f1 (x) = x (lineare),

f2 (x) = 102(x−1) (da dB a lineare),

f3 (x) = x4 (quartica).

La seconda funzione che converte da dB a lineare, è disposta in modo che


l’intervallo di ingresso, da 0 a 1, corrisponda a 40 dB (questa gamma di ingresso
di 40 dB corrisponde ad una gamma dinamica ragionevole, consentendo 5 dB
per ciascuno degli otto passi in dinamica). La curva quartica imita la curva
esponenziale (dB) abbastanza bene per le ampiezze superiori, ma scende troppo
rapidamente per piccole ampiezze, raggiungendo il vero zero (mentre la curva
esponenziale scende solo a 1/100).
Possiamo pensare a queste tre curve come esempi di funzioni di trasferimen-
to, da un controllo astratto (nel range da 0 a 1) ad un’ampiezza lineare. Dopo
aver scelto un’appropriata funzione di trasferimento f , possiamo calcolare un
corrispondente segnale di controllo dell’ampiezza; se vogliamo una rampa su N
campioni, dal silenzio all’unità di ampiezza, il segnale di controllo sarebbe:

y[n] = f (n/N ).
4.2. LINEAR AND CURVED AMPLITUDE SHAPES 93

4.2. Forme di ampiezza lineari e curvilinee 89

linear

ampli-
tude

decibels
quartic
0
0 1
units

Figure 4.3: Three amplitude transfer functions. The horizontal axis is in linear,
Figura 4.3:or Tre
logarithmic, funzioni
fourth-root didepending
units trasferimento di ampiezza. L’asse orizzontale è in
on the curve.
unità lineari, logaritmiche o radici quarte dell’unità, a seconda della curva.
94 CHAPTER 4. AUTOMATION AND VOICE MANAGEMENT

FREQUENCY

-1
f()

OUT

Figure 4.4: Using a transfer function to alter the shape of amplitude curves.
Figura 4.4: Utilizzo di una funzione di trasferimento per modificare la forma
delle curve di ampiezza.
A block diagram for this is shown in Figure 4.4. Here we are introducing a new
type of block to represent the application of a transfer function. For now we
won’t worry about its implementation; depending on the function desired, this
might be best done arithmetically or using table lookup.

4.3 Continuous and discontinuous control changes


Synthesis algorithms vary widely in their ability to deal with discontinuously
changing controls. Until now in this chapter we have assumed that controls must
90 Capitolo 4. Automazione e gestione della voce

Un diagramma a blocchi per fare questa operazione è mostrato in Figura


4.4. Qui introduciamo un nuovo tipo di blocco per rappresentare l’applicazione
di una funzione di trasferimento. Per ora non ci preoccupiamo della sua imple-
mentazione; a seconda della funzione desiderata, questo può essere eseguito in
modo aritmetico o utilizzando la wavetable lookup.

4.3 Cambiamenti di controllo continui e discon-


tinui
Gli algoritmi di sintesi variano notevolmente nella loro capacità di trattare i
controlli che cambiano in modo discontinuo. Fino ad ora in questo capitolo
abbiamo assunto che i controlli debbano cambiare con continuità e che il ge-
neratore di inviluppo ADSR risulti idealmente adatto per tali controlli. Può
anche accadere che l’ampiezza massima di una nota sia inferiore al valore cor-
rente dell’ampiezza del suo predecessore (utilizzando lo stesso generatore) e che
l’inviluppo ADSR semplicemente si abbassi (anziché alzare) al nuovo valore per
un attacco.
Ciò non è necessariamente auspicabile, tuttavia, in situazioni in cui un gene-
ratore di inviluppo è responsabile di un aspetto del timbro: forse, per esempio,
non vogliamo che la nitidezza di una nota diventi più mite durante l’attacco,
ma piuttosto che salti a un valore molto più basso in modo che sia sempre in
grado di salire durante l’attacco.
Questa situazione può anche sorgere con gli inviluppi di intonazione (pitch
envelopes): può essere auspicabile scorrere l’intonazione da una nota alla suc-
cessiva oppure può essere auspicabile che la traiettoria dell’intonazione di ogni
nota riprenda nuovamente da un punto indipendente dal suono precedente.
Due situazioni si presentano quando vogliamo apportare modifiche disconti-
nue ai parametri di sintesi: o li facciamo semplicemente senza interruzione (ad
esempio, facendo un cambiamento discontinuo nell’intonazione); o, altrimenti,
non possiamo, come un cambiamento dell’indice in una wavetable (che fa una
modifica discontinua nell’output). Ci sono anche parametri che non possono
eventualmente essere cambiati continuamente; ad esempio, una selezione tra
una collezione di wavetables. In generale, modificare in modo discontinuo la
fase di un oscillatore o l’ampiezza di un segnale provocherà un artefatto udibi-
le, ma gli incrementi di fase (come intonazioni) possono saltare senza risultati
negativi.
In quei casi in cui una modifica di un parametro non può essere fatta con-
tinuamente per un motivo o per un altro, esistono almeno due strategie per
rendere la modifica più pulita: muting e switch-and-ramp.

4.3.1 Muting
La tecnica del muting consiste nell’applicare un inviluppo all’ampiezza in uscita,
che viene rapidamente spostata a zero prima che il parametro cambi e successi-
vamente ripristinata. Può o non può essere il caso in cui le modifiche discontinue
si traducano in un segnale che saga senza salti dopo lo zero. Nella Figura 4.5
(parte a) prendiamo l’esempio di un inviluppo di ampiezza (il segnale di uscita
di un generatore ADSR) e supponiamo che la modifica discontinua sia quella di
avviare una nuova nota ad ampiezza zero.
4.3. Cambiamenti di controllo continui e discontinui 91

4.3. CONTINUOUS AND DISCONTINUOUS CONTROL CHANGES 95

(a)

time

(b)

Figure 4.5: Muting technique for hiding discontinuous changes: (a) the enve-
Figura 4.5: Tecnica del muting per nascondere cambiamenti discontinui: (a)
lope (upper graph) is set discontinuously to zero and the muting signal (lower
l’inviluppo (grafico superiore) viene impostato in maniera discontinua a zero e
graph) ramps down in advance to prepare for the change, and then is restored
il segnale di muting (grafico inferiore) si abbassa in anticipo per prepararsi alla
(discontinuously) to its previous value; (b) the envelope changes discontinuously
modifica e quindi viene ripristinato (discontinuamente) al valore precedente; (b)
between two nonzero values; the muting signal must both ramp down before-
l’inviluppo cambia in modo discontinuo tra due valori non nulli; il segnale di
hand and ramp back up afterward.
muting deve sia abbassarsi prima e tornare su dopo.

for example, a selection among a collection of wavetables. In general, discontin-


uously changing the phase of an oscillator or the amplitude of a signal will cause
an audible artifact, but phase increments (such as pitches) may jump without
bad results.
In those cases where a parameter change can’t be made continuously for
one reason or another, there are at least two strategies for making the change
cleanly: muting and switch-and-ramp.

4.3.1 Muting
The muting technique is to apply an envelope to the output amplitude, which
is quickly ramped to zero before the parameter change and then restored after-
ward. It may or may not be the case that the discontinuous changes will result
in a signal that rises smoothly from zero afterward. In Figure 4.5 (part a),
we take the example of an amplitude envelope (the output signal of an ADSR
generator), and assume that the discontinuous change is to start a new note at
amplitude zero.
To change the ADSR generator’s output discontinuously we reset it. This is
4.3. CONTINUOUS AND DISCONTINUOUS CONTROL CHANGES 97

92 Capitolo 4. Automazione e gestione della voce

time

Figure
Figura 4.6: Thetecnica
4.6: La switch-and-ramp technique
switch-and-ramp for canceling
per annullare out discontinuous
le modifiche discontinue.
changes. A discontinuity
Una discontinuità (grafico (upper graph)
superiore) vieneis misurata
measurede annullata
and canceled
con out with
un segna-
alesignal
aventehaving the opposite
la discontinuità discontinuity
opposta (lower graph),
(grafico inferiore), which decade
che quindi then decays
senza
smoothly.
intoppi.

Per cambiare discontinuamente l’uscita del generatore ADSR, la resettiamo.


Questo è un’operazione diversa rispetto al triggering; il risultato è quello di
farlo saltare a un nuovo valore, dopo di che possiamo semplicemente lasciarlo
trigger
o innescarlo nuovamente. La Figura 4.5 (parte a) mostra l’effetto di reset e
ri-partenza di un generatore ADSR.
Sotto l’uscita del generatore ADSR vediamo il segnale di muting appropria-
to, che passa a zero per preparare la discontinuità. La quantità di tempo che
ci possiamo permettere per il muting dovrebbe essere piccola (in modo da di-
sturbare il meno possibilesnapshot
il suono precedente), ma non cosı̀ piccola da causare
artefatti udibili in reset/
output. Un esempio di come lavora questo tipo di muting è
già stato mostratotrigger
a pagina 77;level
lı̀ abbiamo utilizzato 5 msec per la rampa in
discesa. Il segnale di muting viene moltiplicato per l’uscita del processo a cui
togliere il click.
...
La Figura 4.5 (parte b) mostra la situazione in cui supponiamo che la va-
riazione discontinua sia tra due valori eventualmente diversi da zero. Qui il
segnale di muting non deve solo abbassarsi come prima (in anticipo rispetto alla
discontinuità), ma dopo deve anche risalire. Il tempo di rampa in discesa non
deve essere uguale al tempo di rampa in salita; entrambi devono essere scelti,
come sempre, ascoltando il suono di uscita.
In generale, il muting presenta la difficoltà di avviare tale operazione prima
di modificare il controllo desiderato. Nei contesti in tempo reale, questo richiede
spesso di ritardare intenzionalmente il cambiamento di controllo. Questo è un
OUT
altro motivo per mantenere il tempo di muting più basso possibile (inoltre, è una
brutta idea cercare di ridurre al minimo il ritardo omettendo condizionatamente
il periodo di rampa in discesa quando non è necessario: un ritardo costante è
molto migliore di uno
Figure 4.7: che diagram
Block varia, anche se èswitch-and-ramp
for the più piccolo in media).
technique.

4.3.2 Switch-and-ramp
Anche la tecnica switch-and-ramp cerca di eliminare le discontinuità derivanti
da cambiamenti di controllo discontinui, ma lo fa in modo diverso: sintetizzando
una discontinuità opposta che aggiungiamo per annullare l’originale. La Figura
4.6 mostra un esempio in cui un suono percussivo sintetico (una sinusoide in-
viluppata) inizia una nota a metà di una precedente. L’attacco del suono non
time

Figure 4.6: The switch-and-ramp technique for canceling out discontinuous


changes. A discontinuity (upper graph) is measured and canceled out with
a signal having the opposite discontinuity (lower graph), which then decays
smoothly.

4.4. Polifonia 93

trigger

snapshot
reset/
trigger level

...

OUT

Figura 4.7: Diagramma a blocchi per la tecnica switch-and-ramp.


Figure 4.7: Block diagram for the switch-and-ramp technique.

deriva dall’inviluppo di ampiezza, ma dalla fase iniziale della sinusoide, come è


spesso appropriato per i suoni percussivi. Il grafico inferiore della figura mostra
un segnale audio compensativo con una discontinuità opposta, che può essere
aggiunto alla parte superiore per rimuovere la discontinuità. I vantaggi di que-
sta tecnica rispetto al muting sono, da un lato, che non c’è bisogno di alcun
ritardo tra la decisione di fare un attacco e il suono dell’attacco; e, inoltre, che
ogni artefatto derivante da questa tecnica è più probabile che sia mascherato
dall’insorgenza del nuovo suono.
La Figura 4.7 mostra come la tecnica switch-and-ramp possa essere realiz-
zata con un diagramma a blocchi. La scatola contrassegnata con le virgolette
(“...”) può contenere qualsiasi algoritmo di sintesi che vogliamo interrompere
discontinuamente in modo che riparta da zero (come ad esempio la parte (a) del-
la figura precedente). Nello stesso momento in cui inneschiamo le modifiche di
controllo necessarie (esemplificate dal generatore ADSR superiore), resettiamo
e facciamo ripartire un altro generatore ADSR (al centro a destra) per annullare
la discontinuità. La discontinuità è minore dell’ultimo valore di uscita di sintesi
appena prima di essere resettata a zero.
Per fare questo, misuriamo il livello a cui il generatore ADSR deve ora sal-
tare. Questo è il proprio livello attuale (che potrebbe non essere zero) meno la
discontinuità (o equivalente, più l’ultimo valore di uscita della sintesi). I due
vengono sommati (dall’oggetto +∼ in basso), quindi viene eseguita un’istanta-
nea. Il generatore di inviluppo di annullamento (a destra) viene ripristinato in
modo discontinuo a questo nuovo valore e quindi innescato per fare una rampa a
zero. L’output dell’oggetto +∼ in basso (la somma dell’uscita del sintetizzatore
e del segnale di annullamento della discontinuità) è il segnale de-cliccato.
4.6. VOICE TAGS
94 99
Capitolo 4. Automazione e gestione della voce

control

voice 1

voice 2

voice 3

OUT

Figure 4.8: A voice bank for polyphonic synthesis.


Figura 4.8: Banco di voci per la sintesi polifonica.

other hand, musical writing for ensembles frequently specifies explicitly which
4.4 Polifonia
instrument plays which note, so that the notes will connect to each other end-
to-end in a desirable way.
One simple voice allocation algorithm works as shown in Figure 4.10. Here
Nella musica, il termine polifonia viene solitamente usato per indicare “più di
we suppose that the voice bank has only two voices, and we try to allocate voices
una voce distinta che cantano o che suonano note diverse l’una dall’altra”.
for the tasks a, b, c, and d. Things go smoothly until task d comes along, but
Quando ci si riferisce a strumenti musicali elettronici usiamo questo termine
then we see no free voices (they are taken up by b and c). We could now elect
per “mantenere in parallelo diverse copie dello stesso processo”. Solitamente
either to drop task d, or else to steal the voice of either task b or c. In practice
chiamiamo ogni copia una “voce” in linea con l’analogia, sebbene le voci non
the best choice is usually to steal one. In this particular example, we chose to
devono necessariamente suonare suoni distinguibili separati.
steal the voice of the oldest task, b.
In
If wequesti
happentermini,
to knowun pianoforte
the lengthèofuno thestrumento
tasks b andpolifonico, con 88of“voci”.
c at the outset task d,
Ogni voce del pianoforte è normalmente in grado di suonare
we may be able to make a better choice of which voice to steal. In this example esattamente una
nota. Non esiste mai il dubbio di quale voce usare per suonare
it might have been better to steal from c, so that d and b would be playing una nota di una
determinata
together at the end and not d alone. In some situations this information willpiù
altezza e nemmeno se si possano suonare contemporaneamente be
note alla stessa
available when the intonazione.
choice must be made, and in some (live keyboard input, for
example) it will not.musicali elettronici polifonici usano un approccio più flessi-
Molti strumenti
bile per la gestione delle voci. La maggior parte dei softwares di sintesi (come
Csound) utilizzano uno schema di allocazione vocale dinamica, per cui, in ef-
4.6 viene
fetti, Voice
creata unatags nuova voce per ogni nota nello spartito. In sistemi come
Max o Pd, orientati verso un uso interattivo in tempo reale, un banco di voci
viene
Suppose allocato
now in anticipo
that we’re eusing
il lavoro da eseguire
a voice bank to(suonare note as
play notes, o qualunque altra
in the example
cosa)
above,viene distribuito
but suppose thetra le voci
notes a, b,del banco.
c, and d all have the same pitch, and further-
more that all
Questo their other
è illustrato nel parameters
diagramma are dellaidentical. How
Figura 4.8, canciascuna
dove we design a control
delle diver-
stream so that, when any one note is turned off, we know which
se voci produce un segnale di uscita, che sono poi sommati per ottenere l’output one it is?
totale del banco di voci. Spesso le singole voci richiedono più uscite separate;
per esempio, possono richiedere diversi canali in modo che possano essere spa-
zializzate singolarmente; o possono avere uscite individuali di invio effetti, in
modo che ognuna possa avere il proprio livello di invio.
100 CHAPTER 4. AUTOMATION AND VOICE MANAGEMENT
4.5. Allocazione vocale 95

"notes"

voice
allocation

voice 1

voice 2

voice 3

OUT

Figure 4.9: Polyphonic voice allocation.


Figura 4.9: Assegnazione di voci polifoniche.

4.5 Allocazione vocale


a automatizzare la selezione delle voci da associare ai singoli
Spesso è desiderabile
compiti (tasks) (ad esempio
b le note da suonare). Ad esempio, un musicista che
suona una tastiera non può praticamente scegliere quale voce deve associare con
c
ogni nota suonata. Per automatizzare la selezione vocale abbiamo bisogno di
un algoritmo di allocazione vocale, dad utilizzare come mostrato in Figura 4.9.
Munito di un appropriato algoritmo di allocazione delle voci, la sorgente di
controllo
voice non1... deve preoccuparsi
.. del dettaglio di quale voce si occupa di quale
..........
compito; i generatori algoritmici di note e i sequencers si basano spesso su questo
voice 2....... ...
fatto. D’altra parte, la scrittura musicale per gli ensembles spesso specifica
esattamente quale strumento suona quale nota, in modo che le note si connettano
time
a vicenda in modo desiderabile.
Un semplice algoritmo di allocazione vocale funziona come mostrato nella
Figura 4.10.
Figure 4.10:Supponiamo chevoice
A polyphonic il banco di voci
allocation abbia solo
algorithm, due voci
showing e cerchiamo
voice stealing.
di assegnare le voci per i compiti a, b, c e d. Le cose vanno bene fino a che si
arriva al compito d, ma allora ci accorgiamo che non abbiano voci libere (sono
prese da b e c). Ora potremmo scegliere di abbandonare l’attività d, oppure
togliere la voce di entrambi i compiti b o c. In pratica la scelta migliore è di
toglierne uno. In questo esempio particolare, abbiamo scelto di togliere la voce
del compito più vecchio, b.
Se ci capita di conoscere la durata dei compiti b e c e l’avvio del compito d,
potremmo essere in grado di fare una scelta migliore di quale voce togliere. In
questo esempio potrebbe essere stato meglio togliere c, in modo che d e b stiano
+

OUT

Figure 4.9: Polyphonic voice allocation.

96 Capitolo 4. Automazione e gestione della voce

a
b
c
d

voice 1... .. ..........

voice 2....... ...

time

Figure 4.10:
Figura 4.10: Un
A polyphonic voice allocation
algoritmo polifonico algorithm,
di allocazione showing
vocale, voice stealing.
che mostra la voce
da togliere.

suonando insieme alla fine, rispetto ad avere solo d. In alcune situazioni queste
informazioni saranno disponibili quando la scelta deve essere fatta, mentre in
altre (l’input da tastiera in situazioni live, per esempio) non lo sarà.

4.6 Tags vocali


Supponiamo ora che stiamo usando un banco di voci per riprodurre le note,
come nell’esempio precedente, ma supponiamo che le note a, b, c e d abbiano
tutte la stessa intonazione e, inoltre, che tutti gli altri loro parametri siano
identici. Come possiamo progettare un flusso di controllo in modo che, quando
una nota viene spenta, sappiamo quale è?
Questa domanda non sorge se la sorgente di controllo è una tastiera Clavier
perché è impossibile riprodurre più di una nota simultanea su un singolo tasto.
Ma potrebbe facilmente emergere in modo algoritmico, o semplicemente come
risultato di unire insieme due flussi da tastiera. Inoltre, spegnere l’evento nota
è solo il più semplice esempio di un problema più generale, che riguarda come,
una volta stabilito un compito in un banco, possiamo tornare alla stessa voce
per guidare la sua evoluzione tramite una funzione di input in tempo reale o
qualsiasi altro fattore imprevedibile.
Per affrontare situazioni come questa possiamo aggiungere uno o più tags
al messaggio che inizia una nota (o, in generale, un’attività). Un tag è una
qualsiasi raccolta di dati con i quali possiamo identificare più tardi l’attività,
che possiamo allora utilizzare per cercare la voce a cui viene assegnata.
Riprendendo l’esempio di Figura 4.10, ecco un modo per scrivere quei quattro
compiti come un flusso di controllo:
start-time end-time pitch ...
1 3 60 ...
2 8 62 ...
4 6 64 ...
5 8 65 ...
4.7. Incapsulamento in Pd 97

In questa rappresentazione non abbiamo bisogno di tags perché ogni messag-


gio (ogni riga di testo) contiene tutte le informazioni necessarie per specificare
l’intera attività (qui abbiamo assunto che i compiti a, . . . , d siano infatti note
musicali con pitch 60, 62, 64 e 65). In effetti stiamo rappresentando ciascuna
attività come un singolo evento in un flusso di controllo (paragrafo 3.3).
D’altra parte, se supponiamo ora di non conoscere in anticipo la durata di
ogni nota, una rappresentazione migliore sarebbe questa:
time tag action parameters
1 a start 60 . . .
2 b start 62 . . .
3 a end
4 c start 64 . . .
5 d start 65 . . .
6 c end
8 b end
8 d end
Qui ogni nota è stata suddivisa in due eventi distinti per avviarla e termi-
narla. Le etichette a, . . . , d vengono utilizzate come tags; sappiamo quale inizio
va con quale fine poiché i loro tags sono gli stessi. Si noti che il tag non è
necessariamente correlato alla voce che verrà utilizzata per riprodurre ciascuna
nota.
Lo standard MIDI non fornisce i tags; in un uso normale, il pitch di una nota
serve anche come tag (in modo che i tag vengono costantemente riutilizzati).
Se due note con lo stesso pitch devono essere indirizzate separatamente (per
utilizzare il loro pitch per indicazioni differenti, per esempio), il canale MIDI
può essere utilizzato (oltre alla nota) come tag.
Nel software musicale in tempo reale è spesso necessario passare avanti e
indietro tra la rappresentazione evento-per-attività e quella contrassegnata dai
tags vista prima, poiché la prima rappresentazione è più adatta per l’archivia-
zione e l’editing grafico, mentre la seconda è più adatta per operazioni in tempo
reale.

4.7 Incapsulamento in Pd
Gli esempi di questo capitolo utilizzeranno il meccanismo di incapsulamento
di Pd, che consente la costruzione di patches che possono essere riutilizzate
un qualsiasi numero di volte. Una o più caselle di oggetti, in una patch Pd,
possono essere sottopatches, che sono patches distinte e incapsulate all’interno
delle caselle. Queste sottopatches possono essere di due tipi: one-off subpatches
e abstractions. In entrambi i casi la sottopatch appare come una casella di
oggetto in un’altra patch, chiamata genitore (parent).
Se si digita “pd” o “pd my-name” in una object box, questo crea una sot-
topatch one-off. I contenuti della sottopatch vengono salvati come parte della
parent patch, in un unico file. Se si utilizzano più copie di una sottopatch,
è possibile modificarle individualmente. D’altra parte, è possibile richiamare
un’abstraction digitando nella casella il nome di una patch Pd (senza l’esten-
sione “.pd”) salvata in un file. In questa situazione Pd leggerà quel file nella
4.8. EXAMPLES 103
98 Capitolo 4. Automazione e gestione della voce

(a) (b)

inlet
8
plusminus 5 + $1 − $1
13 3 outlet outlet

Figura 4.11:
Figure 4.11: Pd’s
Meccanismo di mechanism:
abstraction abstraction in
(a) Pd: (a) invocare
invoking l’abstrac-
the abstraction,
tion plusminus
plusminus with 5 con 5 come argument;
as a creation creation (b)
argument; (b) of
the contents il the
contenuto del file
file, “plusmi-
nus.pd”.
“plusminus.pd”.

inlets and outlets


sottopatch. of themodo,
In questo plusminus object. al
le modifiche Thefiletwo
si “$1” arguments
propagano (to the
ovunque si sia
and - objects)
+caricato are replaced by 5 (the creation argument of the plusminus
come abstraction.
object).
Una sottopatch (sia one-off che abstraction) può avere entrate e uscite che
We have
appaiono already
nella seenrelativa
casella one abstraction
nella patchin the examples:
genitore. the output~
Questo object
viene specificato
introduced in Figure 1.10 (Page 16). That example also shows that an abstrac-
utilizzando i seguenti oggetti:
tion may display controls as part of its box on the parent patch; see the Pd
documentation
inlet , inlet∼ for a: description of this
crea le entrate perfeature.
la object box contenente la sottopatch.
La versione inlet∼ crea un ingresso per i segnali audio, mentre inlet ne crea
uno per i flussi di controllo. In entrambi i casi, qualunque cosa entri dagli
4.8 Examples
inputs della object box nella patch genitore esce dall’oggetto inlet o inlet∼
nella sottopatch.
ADSR envelope generator
outlet , outlet∼ : oggetti corrispondenti per l’output dalla sottopatch.
Example D01.envelope.gen.pd
Pd fornisce un meccanismo (Figure 4.12) shows
di passaggio how the line~
di argomenti objectdamay
in modo poter
be used to generate an ADSR envelope to control a synthesis
parametrizzare diverse chiamate di un’abstraction. Se in una casella patch (only the
di oggetto
ADSR
digitateenvelope is shown
“$1”, viene in the figure).
interpretato come “ilTheprimo
“attack” button,
creation when pressed,
argument nella mia
has
casella sulla patch genitore” e allo stesso modo per $2 e cosı̀ via. Il object
two effects. The first (leftmost in the figure) is to set the line~ testo inonuna
its attack segment, with a target of 10 (the peak amplitude) over 200 msec (the
casella di oggetto viene interpretato nel momento della creazione della casella,
attack time). Second, the attack button sets a delay 200 object, so that after
a differenza del testo in una casella di messaggio. Nelle caselle di messaggio, lo
the attack segment is done, the decay segment can start. The decay segment
stesso $1 significa “il primo argomento del messaggio appena ricevuto” e viene
falls to a target of 1 (the sustain level) after another 2500 msec (the decay time).
interpretato ogni volta che un nuovo messaggio arriva.
The “release” button sends the same line~ object back to zero over 500 more
Un esempio
milliseconds (thedirelease
abstraction, che utilizza
time). Also, in case entrate,
the delay uscite
200 eobject
parametrizzazione,
happens to
è mostrato in Figura 4.11. Nella parte (a), una patch invoca
be set at the moment the “release” button is pressed, a “stop” plusminus in una
message is sent
casella di oggetto, con un creation argument pari a 5. Il numero
to it. This prevents the ADSR generator from launching its decay segment after 8 viene inviato
all’oggettoitsplusminus
launching e in uscita otteniamo la somma e la differenza di 8 e 5.
release segment.
L’oggetto plusminus
In Example D02.adsr.pd non(Figure
è definito dawe
4.13) Pd,encapsulate
ma è piuttosto definitogenerator
the ADSR dalla patch
che risiede nel file denominato “plusminus.pd”. Questa patch è mostrata nella
parte (b) della figura. L’unico inlet e i due outlet corrispondono all’entrata
e alle uscite dell’oggetto plusminus. I due argomenti $1 (agli oggetti + e -)
vengono sostituiti da 5 (il creation argument dell’oggetto plusminus).
Abbiamo già visto un’abstraction negli esempi: l’oggetto output∼ introdot-
to in Figura 1.10 (pagina 15). Questo esempio mostra anche che un’abstrac-
tion può mostrare i controlli come parte della sua casella sulla patch genitore;
104 4.8. Esempi
CHAPTER 4. AUTOMATION AND VOICE MANAGEMENT 99

attack release

stop
10 200 del 200
1 2500 0 500

(IN)
| line~
*~
|
(OUT)

Figure
Figura4.12:
4.12:Using a line~
Utilizzo di unobject tolline∼
oggetto generate angenerare
per ADSR envelope.
un inviluppo ADSR.

si consiglia di vedere la trigger


documentazione di Pd per una descrizione di questa
funzionalità.
adsr 1 100 200 50 300

osc~ 440
4.8 Esempi
*~
|
Generatore di inviluppo ADSR
(OUT)
L’esempio D01.envelope.gen.pd (Figura 4.12) mostra come l’oggetto line∼ pos-
sa essere utilizzato per generare un inviluppo ADSR per controllare una patch
di sintesi (in figura
Figure è mostrato
4.13: Invoking solo l’inviluppo
the adsr ADSR). Il pulsante “attack”,
abstraction.
quando premuto, ha due effetti. Il primo (nella parte più sinistra della figura) è
quello di impostare l’oggetto line∼ sul suo segmento di attacco, con un obiet-
in a Pdtivo
abstraction (named adsr)
di 10 (l’ampiezza so that
di picco) in it200
canmsec
easily(ilbetempo
replicated. The design
di attacco). In secondo
of the adsr
luogo,abstraction
il pulsantemakes“attack” it possible
impostatoun control
delaythe200, five in
ADSR
modoparameters
che, dopo che il
either by supplying
segmento creationsia
di attacco arguments
stato fatto,or byil connecting
segmento dicontrol streams può
decadimento to itsiniziare.
inlets. Il segmento di decadimento scende ad un obiettivo di 1 (il livello di sostegno)
In this
dopoexample the msec
altri 2500 five creation
(il tempo arguments (1, 100, 200, 50, and 300) specify
di decadimento).
the peak level, attack“release”
Il pulsante time, decay manda time, sustain
lo stesso level (as
oggetto line∼a percentage
a zero in 500of millisecondi
peak
level), (il
andtempo
releasedi time. There
rilascio). are sixnel
Inoltre, control
caso ininlets: the first to
cui l’oggetto trigger
delay 200thesia stato
ADSR attivato,
generator, neland the others
momento in cuitoviene
update the values
premuto of the “release”,
il pulsante five parameters.
viene inviato
The output of the abstraction
un messaggio “stop”. Ciò is animpedisce
audio signal. al generatore ADSR di lanciare il suo
This abstraction
segmento is realized as
di decadimento doposhown in Figure
il lancio del suo 4.14. (You di
segmento canrilascio.
open this
subpatch by clicking onD02.adsr.pd
Nell’esempio the adsr object (Figurain the
4.13)patch.) The onlyil signal
incapsuliamo objects
generatore ADSR in
are line~
unaand outlet~. diThe
abstraction Pdthree nomeobjects
(conpack adsr)correspond
in modo che to the three
possa message
essere facilmente
objectsreplicata.
from the earlier Figure dell’abstraction
La struttura 4.12. From left adsr to right, they take
consente care of the
di controllare i cinque
attack,parametri
decay, andADSRrelease segments.
fornendo creation arguments o collegando flussi di controllo ai
Thesuoiattack segment goes to a target specified as “$1” (the first creation
ingressi.
In questo esempio i cinque creation arguments (1, 100, 200, 50 e 300) speci-
ficano il livello di picco, il tempo di attacco, il tempo di decadimento, il livello
di sostegno (come percentuale del livello di picco) e il tempo di rilascio. Ci sono
sei ingressi di controllo: il primo serve per attivare il generatore ADSR e gli altri
(IN)
| line~
*~
|
(OUT)

Figure 4.12:100Using a line~ object to generate


Capitolo 4. Automazione
an ADSR envelope. e gestione della voce

trigger

adsr 1 100 200 50 300

osc~ 440

*~
|
(OUT)

Figure 4.13: Invoking the adsr abstraction.


Figura 4.13: Invocazione dell’abstraction adsr.

in a Pd abstraction (named adsr) so that it can easily be replicated. The design


per aggiornare i valori dei cinque parametri. L’uscita dell’abstraction fornisce
of the adsr abstraction makes it possible to control the five ADSR parameters
un segnale audio.
either by supplying creation arguments or by connecting control streams to its
Questa abstraction è realizzata come mostrato nella Figura 4.14 (è possibile
inlets.
aprire questa sottopatch facendo clic sull’oggetto adsr nella patch). Gli unici
In this example the five
oggetti di creation arguments
segnale sono line∼(1, 100, 200, 50,
e outlet∼. andoggetti
I tre 300) specify
pack corrispondono
the peak level, attack
ai tre oggetti di messaggio della precedente Figura 4.12.ofDa
time, decay time, sustain level (as a percentage peak
sinistra a destra,
level), and release
gestiscono i segmenti di attacco, di decadimento e di rilascio. the
time. There are six control inlets: the first to trigger
ADSR generator, and the othersdito
Il segmento update
attacco vathe
ad unvalues of specificato
target the five parameters.
da $1 (il primo creation
The output of theargument
abstraction is an audio signal.
dell’abstraction) in $2 millisecondi; questi valori possono essere so-
This abstraction is realized
vrascritti as shown
inviando numeri inalleFigure
entrate4.14.
“peak (You can
level” open this Il segmento di
e “attack”.
subpatch by clicking on the
rilascio adsrma
è simile, object in the patch.)
più semplice, poichéThe only èsignal
il target sempre objects
zero. La parte com-
are line~ and outlet~.
plicata èThe three pack
il segmento objects correspond
di decadimento, che deve to essere
the three messagedopo un ritardo
disinserito
objects from the pari al tempo
earlier Figure di attacco
4.12. From(l’oggetto del $2).
left to right, theyIltake
livello di of
care sostegno
the è calcolato
attack, decay, andtramite
releaseilsegments.
livello di picco e la percentuale di sostegno (moltiplicando i due e
dividendo
The attack segment goesperto100).
a target specified as “$1” (the first creation
L’entrata del trigger, se invia un numero diverso da zero, innesca un inizio
(i segmenti di attacco e decadimento) e se invia zero, innesca il segmento di
rilascio. Inoltre, il generatore ADSR può essere resettato a zero inviando un
trigger negativo (che genera comunque un innesco).

Funzioni di trasferimento per il controllo di ampiezza


Il paragrafo 4.2 ha descritto l’utilizzo di un inviluppo ADSR per controllare l’am-
piezza, per la quale i segmenti esponenziali o curvilinei quartici forniscono spes-
so risultati sonori più naturali di quelli lineari. Le patches D03.envelope.dB.pd
e D04.envelope.quartic.pd (quest’ultimo in Figura 4.15) mostrano l’utilizzo di
segmenti di decibel e quartici. In aggiunta, oltre all’ampiezza, nell’esempio
D04.envelope.quartic.pd viene anche controllata la frequenza di un suono, uti-
lizzando, per un confronto, forme lineari e quartiche.
Poiché la conversione da decibel in unità di ampiezza lineare è un’opera-
zione costosa (almeno rispetto ad un oscillatore o ad un generatore di rampe),
l’esempio D03.envelope.dB.pd utilizza la ricerca su tabella per implementare la
funzione di trasferimento necessaria. Questo ha il vantaggio dell’efficienza, ma
lo svantaggio che dobbiamo decidere in anticipo la gamma di valori ammissibili
(qui da 0 a 120 dB).
4.8. EXAMPLES 105

4.8. Esempi 101

attack
trigger test for negative trigger
moses
inlet
t b b if so, zero the output
release
sel 0
if zero t b ... do this anyway
cancel stop peak
decay
level attack decay sustain
inlet inlet inlet inlet
ATTACK:
optionally
f $1
jump DECAY
0 release
to zero pack 0 $2 del $2
inlet
f $4 * $1
... then * 0.01 pack 0 $3 pack 0 $5
recall peak level RELEASE: ramp
and pack with back to zero
line~
attack time
outlet~

106 CHAPTER 4. Inside


Figure 4.14: AUTOMATION AND VOICE MANAGEMENT
the adsr abstraction.
Figura 4.14: L’interno dell’abstraction adsr.

LINEAR QUARTIC

r freq r freq r amp

line~ unpack unpack


r amp
osc~ sqrt sqrt
line~
*~ sqrt sqrt
| line~ line~
(OUT)
*~ *~

*~ *~
osc~
sample messages *~
; |
freq 1760 5000 (OUT)

;
freq 55 5000

Figure 4.15: Linear and quartic transfer functions for changing amplitude and
Figura 4.15: Funzioni di trasferimento lineari e quartiche per cambiare ampiezza
pitch.
e intonazione.

argument of the abstraction) over “$2” milliseconds; these values may be over-
written by sending numbers to the “peak level” and “attack” inlets. The release
segment is similar, but simpler, since the target is always zero. The hard part is
the decay segment, which again must be set off after a delay equal to the attack
time (the del $2 object). The sustain level is calculated from the peak level
and the sustain percentage (multiplying the two and dividing by 100).
The trigger inlet, if sent a number other than zero, triggers an onset (the
attack and decay segments), and if sent zero, triggers the release segment. Fur-
thermore, the ADSR generator may be reset to zero by sending a negative trigger
102 Capitolo 4. Automazione e gestione della voce

Per un segmento quartico, come nell’Esempio D04.envelope.quartic.pd, non è


richiesta nessuna ricerca su tabella; abbiamo semplicemente elevato al quadrato
il segnale di uscita dell’oggetto line∼ due volte in successione. Per compensa-
re l’aumento dell’output alla quarta potenza, i valori inviati all’oggetto line∼
devono essere la radice quarta di quelli voluti. Quindi, i messaggi che varia-
no la frequenza o l’ampiezza vengono prima divisi per separare l’intervallo di
destinazione e l’intervallo di tempo, viene presa la radice quarta dei valori di de-
stinazione (tramite due radici quadrate in successione), e i due vengono quindi
inviati all’oggetto line∼. Qui abbiamo fatto uso di un nuovo oggetto di Pd:
unpack : spacchetta un elenco di numeri (e/o simboli) e li distribuisce a uscite
separate. Come al solito, le uscite appaiono nell’ordine da destra a sinistra. Il
numero di uscite e dei loro tipi è determinato dai creation arguments (si veda
anche pack, pagina 45).
Gli esempi D05.envelope.pitch.pd e D06.envelope.portamento.pd usano un
generatore di inviluppo ADSR per creare una inviluppo di note e un sempli-
ce oggetto line∼, anche lui che controlla l’intonazione, per dare portamento.
In entrambi i casi i segmenti esponenziali sono preferibili e vengono calcolati
utilizzando la ricerca su tabella.

Sintesi additiva: campana di Risset


Il meccanismo delle abstractions di Pd, che abbiamo usato sopra per creare un
generatore ADSR riutilizzabile, è utile anche per creare banchi di voci. Qui
usiamo le abstractions per organizzare banchi di oscillatori per la sintesi addi-
tiva. Ci sono molti modi possibili per organizzare banchi di oscillatori oltre a
quelli indicati qui.
L’organizzazione più semplice e più diretta delle sinusoidi è quella di formare
parziali da aggiungere ad una nota. Il risultato è monofonico, nel senso che la
patch suonerà solo una nota alla volta, che tuttavia sarà costituita da più sinu-
soidi le cui frequenze e ampiezze individuali potrebbero dipendere sia da quelle
della nota che stiamo suonando, sia anche dal loro posizionamento individuale
in una serie di ipertoni armonici (o inarmonici),
L’esempio D07.additive.pd (Figura 4.16) utilizza un banco di 11 copie di
un’abstraction denominata partial (Figura 4.17) simulando un noto strumento
a campana di Jean-Claude Risset. Come descritto in [DJ85, p. 94], il suono a
campana ha 11 parziali, ognuna con la propria ampiezza relativa, frequenza e
durata.
Per ogni nota, l’abstraction partial calcola un semplice inviluppo (quartico)
di ampiezza costituito solo da un segmento di attacco e da uno di decadimento;
non ci sono segmenti di sostegno e di rilascio. Questo inviluppo viene moltipli-
cato per una sinusoide e il prodotto viene sommato in un bus di somma. Sono
state introdotte due nuove classi di oggetti per implementare il bus di somma:
catch∼ : definisce ed eroga un bus di somma. Il creation argument (“sum”
in questo esempio) dà al bus di somma un nome in modo che l’oggetto throw∼
sotto vi si possa riferire. Si possono avere molti buses di somma (cioè oggetti
catch∼), ma devono avere tutti nomi diversi.
throw∼ : invia ad un bus di somma. Il creation argument seleziona quale bus
utilizzare.
4.8. Esempi 103

108 CHAPTER 4. AUTOMATION AND VOICE MANAGEMENT

partial 1 1 0.56 0
partial 0.67 0.9 0.56 1 0 pitch

partial 1 0.65 0.92 0 mtof


partial 1.8 0.55 0.92 1.7 s frequency
partial 2.67 0.325 1.19 0
duration, tenths
partial 1.67 0.35 1.7 0 0 of a second
partial 1.46 0.25 2 0 * 100
partial 1.33 0.2 2.74 0 s duration
partial 1.33 0.15 3 0
partial 1 0.1 3.76 0 <-- click to play
partial 1.33 0.075 4.07 0
s trigger

catch~ sum
|
(OUT)

Figure 4.16: A Pd realization of Jean-Claude Risset’s bell instrument. The bell


Figura
sound is4.16:
madeRealizzazione
by summingin11Pd di uno strumento
sinusoids, each madeaby
campana di the
a copy of Jean-Claude
partial
Risset. Il suono
abstraction. della campana viene realizzato sommando 11 sinusoidi, ciascuna
ottenuta da una copia dell’abstraction partial.
104 Capitolo 4. Automazione e gestione della voce

$1 amplitude;
trigger $2 relative duration;
arguments:
r trigger $3 relative frequency;
$4 detune

t b b ATTACK
relative
frequency del 5 DECAY float $1
float $3 relative
float $2 * 0.1
r frequency duration
sqrt
times global r duration
*
frequency * sqrt
actual duration
+ $4 plus detune
0 $1 $1 5
osc~ attack time
line~
*~ 5 msec
*~ quartic amplitude
throw~ sum curve
*~
add to global
summing bus

Figure 4.17: The partial abstraction used by Risset’s bell instrument from
Figura 4.17: L’abstraction partial utilizzata dallo strumento a campana di
Figure 4.16.
Risset di Figura 4.16.

L’interfaccia di controllo è spartana: le number boxes controllano la fre-


quenza “fondamentale” della campana e la sua durata. L’invio di un messaggio
“bang” all’oggetto s trigger suona una nota (la nota poi decade nel periodo di
tempo controllato dal parametro della durata; non esiste alcun trigger separato
per arrestare la nota). Non esiste alcun controllo di ampiezza tranne l’oggetto
di output∼.
I quattro argomenti ad ogni invocazione dell’abstraction partial specifica-
no:
1. ampiezza. L’ampiezza della parziale al suo picco, alla fine dell’attacco e
all’inizio del decadimento della nota.
2. durata relativa. Questa viene moltiplicata per la durata complessiva della
nota (controllata nella patch principale) per determinare la durata della
porzione di decadimento della sinusoide. Le parziali individuali possono
quindi avere diversi tempi di decadimento, in modo che alcune parziali
decadano più velocemente di altre, sotto il controllo generale della patch
principale.
3. frequenza relativa. Come per la durata relativa, questa controlla la fre-
quenza di ciascuna parziale come un multiplo della frequenza complessiva
controllata nella patch principale.
4. detune. Una frequenza in Hertz da aggiungere al prodotto della frequenza
globale e la relativa frequenza.
4.8. Esempi 105
4.8. EXAMPLES 111

50 loadbang send bangs to "poll-table"


s pitch metro 30 needed by the abstraction
s poll-table
0
s whammybar spectrum-partial 1
spectrum-partial 2
spectrum-partial 3

spectrum-tab

Figure 4.18: Additive synthesis for a specified spectral envelope, drawn in a


Figura 4.18: Sintesi additiva per un inviluppo spettrale specificato, disegnato
table.
in una tabella.

repeating. The spectral envelope is arranged to have a peak at the middle of


All’interno dell’abstraction partial, l’ampiezza viene semplicemente prelevata
the pitch range and drop off to inaudibility at the edges of the range so that we
direttamente dall’argomento $1 (moltiplicando per 0.1 per regolare le ampiezze
hear only the continuous sweeping and not the jumping. The result is a famous
individuali troppo elevate); la durata viene calcolata dall’oggetto r duration,
auditory conundrum, an indefinitely ascending or descending tone.
moltiplicandolo con l’argomento $2. La frequenza viene calcolata come f p +
The technique of synthesizing to a specified spectral envelope can be general-
d dove f è la frequenza globale (dall’oggetto r frequency), p è la frequenza
ized in many ways: the envelope may be made to vary in time either as a result
relativa della parziale e d è la frequenza di detune.
of a live analysis of another signal, or by calculating from a set of compositional
rules, or by cross-fading between a collection of pre-designed spectral envelopes,
or by frequency-warping
Sintesi the envelopes,
additiva: controllo to name a few possibilities.
dell’inviluppo spettrale
L’esempio successivo, D08.table.spectrum.pd (Figura 4.18), mostra un’applica-
Polyphonic synthesis:
zione molto diversa sampler
della sintesi additiva rispetto alla precedente. Qui le sinu-
soidimove
We sononowgestite
to andall’abstraction
example using spectrum-partial mostrataasindescribed
dynamic voice allocation Figura 4.19.
in
Ogni parziale calcola la propria frequenza come nella patch precedente.
Section 4.5. In the additive synthesis examples shown previously, each voice Ogni
is
parziale
used for acalcola anche la propria
fixed purpose. ampiezza
In the present periodicamente
example, we allocate(quando vieneaattiva-
voices from bank
ta needed
as dall’oggetto r notes
to play poll-table), utilizzando
in a control stream. un oggetto tabread4. Il contenuto
della tabella (che ha un range nominale
Example D11.sampler.poly.pd (Figure 4.20) di 50shows
dB) viene convertitosampler,
the polyphonic in unità
lineari e utilizzato come controllo di ampiezza nel modo usuale.
which uses the abstraction sampvoice (whose interior is shown in Figure 4.21).
TheUn esempiofor
techniques simile,
alteringD09.shepard.tone.pd (non in figura),
the pitch and other parameters crea unsampler
in a one-shot tono di
Shepard utilizzando la stessa tecnica. Qui le frequenze delle sinusoidi spaziano
su una gamma fissa, saltando dalla fine indietro all’inizio ripetutamente.
L’inviluppo spettrale è disposto in modo di avere un picco al centro del range
del pitch e scendere a ampiezza inaudibile agli estremi del range, in modo da
106 Capitolo 4. Automazione e gestione della voce

$1: partial number


r pitch
mtof pitch to frequency
* $1 then get the frequency of this specific partial
ftom ... and then convert back to pitch.
r poll−table calling patch bangs this every 30 msec.

f ... at which time we get the pitch back...

− r whammybar and transpose by shifting table index.


tabread4 spectrum−tab get the strength from the table
moses 1
The vertical scale is dB from 1 to 50,
0 + 50 but we want true zero when
dbtorms the table value is 0 or less.
pack 0 30
osc~
line~
*~
throw~ sum−bus

Figura4.19:
Figure 4.19:The
L’abstraction abstraction utilizzata
spectrum-partial
spectrum-partial in Figura
used in Figure 4.18. 4.18.

sentire solo uno scorrere continuo e non salti. Il risultato è un famoso repertorio
uditivo, un tono indefinito ascendente o discendente.
La tecnica per sintetizzare uno specifico inviluppo spettrale può essere gene-
ralizzata in molti modi: l’inviluppo può essere fatto variare nel tempo sia come
risultato di un’analisi live di un altro segnale, sia calcolandolo da un insieme di
regole di composizione o attraverso il cross-fading tra una collezione di inviluppi
spettrali pre-disegnati o attuando un warping sulle frequenze degli inviluppi, per
citare alcune possibilità.

Sintesi polifonica: campionatore


Ci spostiamo ora ad un esempio che usa l’allocazione dinamica delle voci co-
me descritto nel paragrafo 4.5. Negli esempi di sintesi additiva, mostrati in
precedenza, ogni voce viene utilizzata per uno scopo prefissato. Nell’esempio
corrente, assegniamo le voci da un banco in modo da riprodurre le note in un
flusso di controllo.
L’esempio D11.sampler.poly.pd (Figura 4.20) mostra il campionatore polifo-
nico, che utilizza l’abstraction sampvoice (il cui interno è mostrato in Figura
4.21). Le tecniche per modificare il tono e altri parametri in un campionatore
one-shot sono mostrati nell’esempio D10.sampler.notes.pd (non mostrato) che
a sua volta deriva dal campionatore one-shot originale del capitolo precedente
(C05.sampler.oneshot.pd, mostrato in Figura 3.14).
Gli oggetti sampvoice in Figura 4.20 sono disposti in un diverso tipo di bus
di somma rispetto a quelli precedenti; qui, ognuno aggiunge la propria uscita
4.8. Esempi 107

114 CHAPTER 4. AUTOMATION AND VOICE MANAGEMENT

r note
unpack 0 0 0 0 0 0 0

t b f

counter to f + 1
generate tags
mod 1e+06

supply later makenote 64


note-off
allocate voice poly 8 1

get rid of stripnote


note-off
pack 0 0 0 0 0 0 0 0
route to a voice depending
on voice number from poly route 1 2 3 4 5 6 7 8

sampvoice
one "sampvoice"
sampvoice
abstraction
sampvoice
for each
voice, each sampvoice
adding its sampvoice
own output
to a sum (left sampvoice
inlets and sampvoice
outlets)
sampvoice
|
(OUT)

Figure
Figura 4.20:
4.20: A
Unpolyphonic sampler
campionatore demonstrating
polifonico voice
che mostra allocationdella
l’allocazione and use
voceofe
tags.
l’uso dei tags.
108 Capitolo 4. Automazione e gestione della voce

al segnale di ingresso, e manda la somma sulla sua outlet. Nella parte inferiore
degli otto oggetti l’outlet ha quindi la somma di tutti e otto. Questo ha il
vantaggio di essere più esplicito dei busses throw∼/catch∼ ed è preferibile
quando l’apparenza visiva non è un problema.
Il lavoro principale della patch, tuttavia, è quello di distribuire i messaggi
“note” agli oggetti sampvoice. A tal fine occorre introdurre alcuni nuovi oggetti
Pd:
mod : modulo intero. Ad esempio, 17 mod 10 dà 7 e −2 mod 10 dà 8. Esiste
anche un oggetto di divisione intera denominato div ; dividendo 17 per 10
tramite div dà 1, e −2 diviso 10 dà −1.
poly : allineatore polifonico di voci. I creation arguments indicano il numero di
voci nel banco e un indicatore (1 se è necessaria togliere una voce, 0 altrimenti).
L’entrata a sinistra serve per il tag numerico e quella a destra è un flag che
indica se avviare o interrompere una voce con il tag dato (numeri diversi da
zero significano “inizio” e zero significa “stop”). Le uscite sono, a sinistra, il
numero di voce, al centro nuovamente il tag e a destra la flag start/stop. Nelle
applicazioni MIDI, il tag può essere la nota e il flag start/stop può essere la
velocity della nota.
makenote : fornisce i messaggi ritardati di note-off che corrispondono a relativi
messaggi di note-on. Le entrate sono un tag e un flag start/stop (“pitch” e
“velocity” nell’utilizzo MIDI) e la durata desiderata in millisecondi. La coppia
di tag/flag viene ripetuta alle due uscite quanto viene ricevuta; quindi, dopo il
ritardo, il tag viene ripetuto con il flag zero per arrestare la nota dopo la durata
desiderata.
I messaggi “note” contengono campi per la nota, l’ampiezza, la durata, il
sample number, la posizione di partenza del campione, il tempo di salita e il
tempo di decadimento. Ad esempio, il messaggio,

60 90 1000 2 500 10 20
(se ricevuto dall’oggetto r note) significa riprodurre una nota con pitch 60
(unità MIDI), ampiezza 90 dB, durata di un secondo, dalla wavetable denomi-
nato “sample2”, a partire dal punto a 500 msec nella wavetable, con tempi di
attacco e decadimento di 10 e 20 msec.
Dopo aver spacchettato il messaggio nelle sue sette componenti, la patch crea
un tag per la nota. Per fare questo, innanzitutto l’oggetto t b f emette un bang
dopo che l’ultimo dei sette parametri appare separatamente. La combinazione
degli oggetti +, f, e mod funge da contatore che riparte dopo un milione di passi,
generando essenzialmente un numero univoco corrispondente alla nota.
Il passo successivo consiste nell’utilizzare l’oggetto poly per determinare
con quale voce suonare la nota. L’oggetto poly prevede messaggi separati per
avviare e arrestare i compiti (ad esempio note). Quindi il tag e la durata vengono
prima inseriti nell’oggetto makenote, le cui uscite includono un flag (“velocity”)
a destra e il tag nuovamente a sinistra. Per ciascun tag ricevuto da makenote
vengono emesse due coppie di numeri, una per avviare la nota e un’altra, dopo
un ritardo pari alla durata della nota, per fermarla.
Dopo aver trattato con poly questo ingresso separato, ora dobbiamo ricavare
i messaggi corrispondenti alla chiusura delle note, poiché in realtà abbiamo
4.8. Esempi 109

solo bisogno di messaggi “note” combinati con parametri di durata. L’oggetto


stripnote fa questo lavoro. Infine, il numero di voce che abbiamo calcolato
viene posto prima dei sette parametri con cui abbiamo iniziato (l’oggetto pack),
in modo che l’output dell’oggetto pack appaia cosı̀:

4 60 90 1000 2 500 10 20

dove il “4” è il numero di voce emesso dall’oggetto poly. Il numero di voce viene
utilizzato per indirizzare il messaggio alla voce desiderata utilizzando l’oggetto
route. L’appropriato oggetto sampvoice ottiene quindi la lista originale che
inizia con “60”.
All’interno dell’oggetto sampvoice (Figura 4.21), il messaggio viene utiliz-
zato per controllare tabread4∼ e gli oggetti circostanti line∼ e vline∼. Il
controllo avviene con un ritardo di 5 msec come nell’esempio precedente di
campionatore. Qui, tuttavia, dobbiamo memorizzare i sette parametri della no-
ta (precedentemente non c’erano parametri). Questo viene fatto usando i sei
oggetti f, più l’ingresso destro dell’oggetto delay più a destra. Questi valori
vengono utilizzati dopo il ritardo di 5 msec. Ciò avviene in combinazione con
il meccanismo di muting descritto a pagina 90, utilizzando un altro oggetto
vline∼.
Quando i 5 msec sono trascorsi, l’oggetto vline∼, responsabile della gene-
razione dell’indice della wavetable, ottiene i suoi ordini di marcia (e contem-
poraneamente il numero della wavetable è impostato per l’oggetto tabread4∼
e il generatore di inviluppo di ampiezza inizia il suo attacco). L’indice della
wavetable deve essere impostato in modo discontinuo rispetto all’indice di av-
viamento, quindi scende all’indice finale con un tempo appropriato per ottenere
la trasposizione necessaria. L’indice di partenza, in campioni, è proprio 44,1
volte la posizione di partenza in millisecondi, più uno per consentire l’interpola-
zione a quattro punti nella tabella. Questo diventa il terzo numero in una lista
generata dall’oggetto pack al centro della patch della voce.
Decidiamo arbitrariamente che la rampa durerà diecimila secondi (questo è
il “1e+07” che compare nella casella di messaggio inviata al generatore di indici
della wavetable), sperando che questo sia lungo almeno quanto ogni nota che
verrà suonata. L’indice di fine è l’indice di partenza più il numero di campioni
nella rampa. A un fattore di trasposizione di uno, dobbiamo spostarci per
441,000,000 campioni durante quei 10,000,000 millisecondi, o proporzionalmente
più o meno a seconda del fattore di trasposizione. Questo fattore di trasposizione
è calcolato dall’oggetto mtof, diviso per 261.62 (la frequenza corrispondente alla
nota MIDI 60) in modo che un “pitch” specificato di 60 determini un fattore di
trasposizione di uno.
Questi e altri parametri vengono combinati in un messaggio tramite l’oggetto
pack in modo che le caselle di messaggi seguenti possano generare i messaggi
di controllo necessari. L’unica novità è l’oggetto makefilename che converte
numeri come “2” in simboli come “sample2” in modo che sia possibile impostare
la wavetable nell’oggetto tabread4∼.
Nella parte inferiore della patch vocale vediamo come viene implementato
un bus sommatore all’interno di una sottopatch; un oggetto inlet∼ cattura la
somma di tutte le voci precedenti, l’output della voce corrente viene aggiunto e
il risultato viene inviato alla voce successiva tramite l’oggetto outlet∼.
110 Capitolo 4. Automazione e gestione della voce

4.8. EXAMPLES 115

bang inlet store parameters first in


delay for floats below until muted
mute to delay 5
unpack 0 0 0 0 0 0 0
take effect
t b b b

f delay for
f f f f delay note end
mtof * 44.1 f
/ 261.62 + 1
starting
* 4.41e+08 read
point
+
ending
read pack 0 0 0 0 0
point
attack decay
mute and
unmute 0 5 1 5 $3, $4 1e+07 $5 0, $1 $2 0 $1

wavetable
index
vline~ makefilename sample%d vline~ unpack
set $1 select mute dbtorms
wavetable
sqrt
tabread4~ sample1
sqrt
*~ amplitude
line~ envelope
*~
*~
add to inlet~ *~
summing +~
bus
outlet~

Figura4.21:
Figure 4.21: The
L’abstraction abstractionutilizzata
sampvoicesampvoice nel polyphonic
used in the campionatore polifonico
sampler of di
Figura4.20.
Figure 4.20.
4.8. Esempi 111

Esercizi
1. Quale input a una funzione di trasferimento di quarta potenza fornisce
un’uscita di −12 dB, se un input di 1 fornisce 0 dB?
2. Un generatore di inviluppo sale da zero ad un valore di picco durante il
suo segmento di attacco. Quanti decibel inferiori al picco ha raggiunto
l’output a metà dell’attacco, assumendo l’output lineare? E con la quarta
potenza?
3. Quale funzione di trasferimento di tipo esponenziale (cioè quale scelta di
n per la funzione f (x) = xn ) dobbiamo usare se si desidera che il valore a
metà percorso sia −12 decibel?
4. Supponiamo che si desideri fare una dissolvenza incrociata tra due segnali,
cioè far salire a 1 un segnale e contemporaneamente farne scendere a 0 un
altro. Se hanno potenza uguale e non sono correlati, una dissolvenza
incrociata lineare comporterà una perdita di 3 decibel a metà percorso del
cross-fading. Quale legge esponenziale conviene utilizzare per mantenere
la potenza costante durante la dissolvenza incrociata?
5. Un accordo a tre note, di durata 1.5 secondi, viene riprodotto una volta
ogni secondo. Quante voci sono necessarie per sintetizzarlo senza tagliare
le note?

6. Supponiamo che una patch di sintesi dia output tra −1 e 1. Mentre una
nota viene riprodotta, viene avviata una nuova nota usando la tecnica
voice-stealing “rampdown”. Qual è l’output massimo?
112 Capitolo 4. Automazione e gestione della voce
Capitolo 5

Modulazione

Dopo aver fatto una deviazione di due capitoli per parlare di aspetti di controllo
e organizzazione nella musica elettronica, torniamo a descrivere le tecniche di
sintesi audio e di elaborazione. Finora abbiamo visto metodi additivi e basati
su wavetables. In questo capitolo introdurremo tre cosiddette tecniche di modu-
lazione: modulazione di ampiezza, modulazione di frequenza e waveshaping. Il
termine “modulazione” si riferisce liberamente a qualsiasi tecnica che modifica
sistematicamente la forma di una forma d’onda piegando il suo grafico verti-
calmente o orizzontalmente. La modulazione è ampiamente usata per costruire
suoni sintetici con varie famiglie di spettri, per cui dobbiamo introdurre alcune
terminologie prima di entrare nello specifico delle tecniche.

5.1 Tassonomia degli spettri


La Figura 5.1 introduce un modo di visualizzare lo spettro di un segnale audio.
Lo spettro descrive, approssimativamente, come la potenza del segnale è distri-
buita rispetto alle frequenze (possono essere date molte definizioni più precise
di quelle che noi svilupperemo qui, ma che richiederebbero un background più
matematico).
La parte (a) della figura mostra lo spettro di un segnale armonico, che è
un segnale periodico la cui frequenza fondamentale è nell’intervallo delle note
percepibili, approssimativamente tra 50 e 4000 Hertz. La serie di Fourier (pagina
11) fornisce una descrizione di un segnale periodico come somma di sinusoidi.
Le frequenze delle sinusoide sono in rapporto 0:1:2:· · · (il termine costante della
serie Fourier può essere considerato sinusoidale,

a0 = a0 cos(0 · ωn),

la cui frequenza è zero).


In un segnale armonico, la potenza mostrata nello spettro è concentrata su un
sottoinsieme discreto dell’asse delle frequenze (un insieme discreto è costituito
da punti isolati, in numero finito in qualsiasi intervallo limitato). Questo insieme
prende il nome di spettro discreto. Inoltre, le frequenze in cui si trova la potenza
del segnale sono nel rapporto 0:1:2:· · · , originate da un segnale periodico (non
è necessario che tutte le frequenze degli armonici siano presenti, alcuni armonici
possono avere ampiezza zero). Per un segnale armonico, il grafico dello spettro

113
114 Capitolo 5. Modulazione

120 CHAPTER 5. MODULATION

(a) harmonic
amplitude spectral
envelope

frequency

(b) inharmonic

(c.) continuous

Figure
Figura 5.1:
5.1: A taxonomy
Una of timbres.
tassonomia TheL’inviluppo
di timbri. spectral envelope describes
spettrale descrivethe
la shape
forma
of thespettro.
dello spectrum. The sound
Il suono may discretamente
può essere be discretely or continuously distributed
o continuamente distribuito in
in
frequency;
frequenza; ifsediscretely, it may
discretamente, be essere
può harmonic or inharmonic.
armonico o inarmonico.
5.1. Tassonomia degli spettri 115

mostra le ampiezze delle parziali del segnale. Conoscere le ampiezze e le fasi di


tutti le parziali determina completamente il segnale originale.
La parte (b) della figura mostra uno spettro che è anche discreto, in modo
che il segnale possa essere nuovamente considerato come una somma di una serie
di parziali. In questo caso, tuttavia, non esiste alcuna frequenza fondamentale,
cioè nessun sottomultiplo comune udibile di tutte le parziali. In questo caso si
ha un segnale inarmonico (i termini armonico e inarmonico possono essere usati
per descrivere sia i segnali che i loro spettri).
Quando si lavora con spettri discreti, riportiamo l’ampiezza di una parziale
in un modo leggermente non intuitivo. Ogni componente sinusoidale
a cos(ωn + φ)
conta solo come ampiezza a/2 finché la frequenza angolare ω è diversa da zero.
Ma per una componente di frequenza zero, per cui ω = φ = 0, l’ampiezza è data
da a – senza dover dividere per due (le componenti con frequenza zero sono
spesso chiamate componenti DC; “DC” è storicamente un acronimo di “corrente
diretta”). Queste convenzioni per le ampiezze degli spettri semplificheranno
l’aspetto matematico più avanti in questo capitolo; una ragione più profonda
diventerà evidente nel Capitolo 7.
La parte (c) della figura mostra una terza possibilità: lo spettro potrebbe
non essere concentrato in un insieme discreto di frequenze, ma potrebbe essere
distribuito tra tutte le frequenze possibili. Questo può essere chiamato uno
spettro continuo o rumoroso. Gli spettri non rientrano necessariamente nelle
categorie discrete o continue; i suoni reali, in particolare, sono di solito collocabili
tra le due definizioni.
Ciascuna delle tre parti della figura mostra una curva continua chiamata
inviluppo spettrale. In generale, i suoni non hanno un inviluppo spettrale unico
e ben definito; ci possono essere molti modi per disegnare una curva continua
attraverso uno spettro. D’altra parte, un inviluppo spettrale può essere specifi-
cato intenzionalmente; in quel caso, è solitamente chiaro come fare uno spettro
conforme ad esso. Per uno spettro discreto, ad esempio, potremmo semplice-
mente leggere, dall’inviluppo spettrale, l’ampiezza desiderata di ogni parziale e
quindi ricrearlo.
A volte il suono di una nota può essere determinato dal suo spettro. Per gli
spettri discreti, il tono è codificato principalmente nelle frequenze delle parziali.
I segnali armonici hanno un tono determinato dalla loro frequenza fondamenta-
le; per quelli inarmonici, il tono può essere chiaro, ambiguo o assente in totale,
secondo regole complesse e incomplete. Uno spettro rumoroso può anche pos-
sedere un tono percepibile se l’inviluppo spettrale contiene uno o più picchi
vicini. In generale, la rumorosità e il timbro di un suono dipendono maggior-
mente dal suo inviluppo spettrale rispetto alle frequenze nello spettro, anche se
la distinzione tra spettri continui e discreti può essere percepita come differenza
di timbro.
I timbri, cosı̀ come il tono, possono evolvere durante la vita di un suono.
Abbiamo parlato qui di spettri come entità statiche, non considerando se cam-
biano nel tempo oppure no. Se il tono e il timbro di un segnale cambiano
nel tempo, possiamo pensare allo spettro come una descrizione temporale del
comportamento momentaneo del segnale.
Questo modo di visualizzare i suoni è notevolmente semplificato. Il vero
comportamento del tono e del timbro acustico ha molti aspetti che non possono
116 Capitolo 5. Modulazione

essere spiegati in termini di questo modello. Per esempio, la qualità timbrica


chiamata “rugosità” è talvolta pensata come un riflesso di cambiamenti rapidi
dell’inviluppo spettrale nel tempo. La descrizione semplificata qui sviluppata
è comunque utile nelle discussioni su come costruire spettri discreti o continui
per un’ampia varietà di scopi musicali, come inizieremo a mostrare nel resto di
questo capitolo.

5.2 Moltiplicazione di segnali audio


Fin dal Capitolo 1 abbiamo sistematicamente sommato i segnali audio e molti-
plicati con segnali lentamente variabili (utilizzati, ad esempio, come inviluppi di
ampiezza). Per una comprensione completa dell’algebra dei segnali audio dob-
biamo anche considerare la situazione in cui si moltiplicano due segnali audio,
senza l’assunzione che nessuno dei due cambi lentamente. La chiave per capire
cosa succede è la formula del prodotto dei coseni:

1 
cos(a) cos(b) = cos(a + b) + cos(a − b) .
2
Per capire perché questa formula sia vera, possiamo usare la formula per il
coseno di una somma di due angoli

cos(a + b) = cos(a) cos(b) − sin(a) sin(b)

per valutare il lato destro della formula del prodotto dei coseni; quindi, applicato
anche a cos(a − b), e facendo le dovute semplificazioni, si ottiene il lato sinistro.
Possiamo usare questa formula per vedere cosa succede quando moltiplichia-
mo due sinusoidi (pagina 1):

cos(αn + φ) cos(βn + ξ) =

1
 
= 2 cos((α + β)n + (φ + ξ)) + cos((α − β)n + (φ − ξ)) .

In parole povere, moltiplicando due sinusoidi si ottiene un risultato con due


parziali, una è la somma delle due frequenze originali e una è la loro differenza (se
accade che la differenza α−β sia negativa, è sufficiente permutare le due sinusoidi
originali e la differenza sarà poi positiva). Queste due nuove componenti sono
chiamate sidebands (estremi di banda).
Ciò ci dà una tecnica per spostare le frequenze delle componenti di un suo-
no, che prende il nome di modulazione ad anello, e che viene mostrata nella sua
forma più semplice nella Figura 5.2. Un oscillatore fornisce un segnale portante
(carrier signal), che viene semplicemente moltiplicato per un input. In questo
contesto l’input viene chiamato segnale modulante (modulating signal). Il termi-
ne “modulazione ad anello” viene spesso usato in modo più generale per indicare
la moltiplicazione di due segnali insieme, ma qui prendiamo in considerazione
l’utilizzo di un segnale portante sinusoidale (la tecnica della modulazione ad
anello risale all’era analogica [Str95], i moltiplicatori digitali ora sostituiscono
entrambi i VCA (paragrafo 1.5) e il modulatore ad anello).
La Figura 5.3 mostra una serie di risultati che possono essere ottenuti mol-
tiplicando una sinusoide (modulante), di frequenza angolare α e ampiezza di
5.2.
5.2. MULTIPLYING
Moltiplicazione diAUDIO
segnali SIGNALS
audio 123
117

IN
1

-1
OUT

Figura5.2:
Figure 5.2: Block
Diagramma a blocchi
diagram for ring per modulazione
modulating ad anello
an input signalcon un asegnale
with di
sinusoid.
ingresso di tipo sinusoidale.

(carrier) sinusoid of angular frequency β and peak amplitude 1:


picco 2a, per una sinusoide (portante) di frequenza angolare β e ampiezza di
picco 1: [2a cos(αn)] · [cos(βn)]
[2a cos(αn)] · [cos(βn)]
(For
(persimplicity
semplicitàthe phase di
i termini terms
fase are
sonoomitted.)
omessi). Each partparte
Ciascuna of thedella
figure shows
figura both
mostra
the
sia modulation
il segnale disignal and the che
modulazione result in the same
il risultato nellospectrum. The modulating
stesso spettro. Il segnale
signal appears
modulante as a single
appare come unafrequency,
singolaα,frequenza,
at amplitude a. The product
α, all’ampiezza a. Ilinprodotto
general
has two component
in generale frequencies,
ha due frequenze pereach at an amplitude
le componenti, ognuna ofad
a/2.
un’ampiezza di a/2.
Parts (a) (a)
Le parti ande (b) of thefigura
(b) della figuremostrano
show “general” cases where
i casi “generali” in cuiα αand
e ββsono
are
nonzero
non nulle and differenttra
e diverse from
loro.each
Le other.
frequenze Thedelle
component frequencies
componenti of sono
in uscita the output
α+β
are
e αα−+β.β and − β. In
Nellaαparte (b),part
dato (b),
chesince
α −α β−<β0,<otteniamo
0, we get unaa negative frequency
componente con
component. Since cosine
frequenza negativa. is an
Poiché even function,
il coseno we havepari, abbiamo che
è una funzione

α)n),
cos((α − β)n) = cos((β − α)n)

quindi
so la componente
the negative componentnegativa è esattamente
is exactly equivalentequivalente
to one at athequella con frequency
positive frequenza
positiva β − α, con la stessa
β − α, at the same amplitude. ampiezza.
Nel
In thecaso speciale
special casedove α =α β,
where = laβ, seconda banda
the second laterale (differenza)
(difference) sideband hasha zero
una
frequenza pari a zero. In questo caso la fase sarà significativa quindi
frequency. In this case phase will be significant so we rewrite the product with riscriviamo
il prodotto
explicit con replacing
phases, fasi esplicite,
β bysostituendo
α, to get: β con α, per ottenere:
2a cos(αn + φ) cos(αn + ξ) =
2a cos(αn + φ) cos(αn + ξ) =
= a cos(2αn + (φ + ξ)) + acos(φ − ξ).
= a cos (2αn + (φ + ξ)) + a cos (φ − ξ).
Il secondo termine ha frequenza pari a zero; la sua ampiezza dipende dalla fase
The second term has zero frequency; its amplitude depends on the relative phase
relativa delle due sinusoidi e varia da +a a −a, poiché la differenza di fase φ − ξ
of the two sinusoids and ranges from +a to −a as the phase difference φ − ξ
varia da 0 a π radianti. Questa situazione è mostrata nella parte (c) della Figura
varies from 0 to π radians. This situation is shown in part (c) of Figure 5.3.
5.3.
Finally, part
Infine, la (d)(d)
parte shows a carrier
mostra signal modulante
un segnale whose frequency is zero. Itsè value
la cui frequenza is
zero. Il
the constant a (not 2a; zero frequency is a special case). Here we
suo valore è la costante a (non 2a, la frequenza zero è un caso speciale). Quiget only one
sideband,
abbiamo soloof amplitude
una banda a/2 as usual.
laterale, di ampiezza a/2 come al solito.
We can useusare
Possiamo the distributive rule for multiplication
la legge distributiva to find out
per la moltiplicazione perwhat happens
scoprire cosa
when
succedewe quando
multiplymoltiplichiamo
signals together which
segnali consistciascuno
insieme, of more dei
than oneè partial
quali each.
costituiti da
più di una parziale. Ad esempio, nella situazione precedente possiamo sostituire
il segnale di frequenza α con una somma di diverse sinusoidi, ad esempio:

a1 cos(α1 n) + · · · + ak cos(αk n).


118
124 Capitolo
CHAPTER 5. Modulazione
5. MODULATION

amplitude

a
(a)
a/2 a/2
OUT IN OUT
frequency

− +

a
(b)
a/2 a/2

a
(c)
a/2
z

a
(d)
a/2

=0

Figura 5.3:
Figure 5.3: Sidebands
Bande laterali derivanti
arising dalla moltiplicazione
from multiplying two sinusoidsdi due sinusoidi α
of frequency di
frequenze
and β: (a)α ewith
β: (a)
α > conβ α>> 0;
β> (b)0; with
(b) con
β >β> α αsointhat
modo chelower
the la banda laterale
sideband is
inferiore sia
reflected aboutriflessa
the frispetto l’asse
= 0 axis; (c)fwith
= 0; α(c)
= con α =which
β, for β, perthecuiamplitude
l’ampiezzaofdella
the
banda laterale sideband
zero-frequency a frequenza zero dipende
depends dalle fasi
on the phases delletwo
of the duesinusoids;
sinusoidi;(d)(d)with
con
α = 0.
5.2. Moltiplicazione di segnali audio 119

5.2. MULTIPLYING AUDIO SIGNALS 125

amplitude

(a)

frequency

(b)

(c)

Figure
Figura 5.4:
5.4: Result of ring
Risultato dellamodulation
modulazioneofad
a complex
anello di signal by a complesso
un segnale pure sinusoid:
per
(a) the original signal’s spectrum and spectral envelope; (b) modulated
una sinusoide pura: (a) lo spettro del segnale originale e l’inviluppo spettra-by a
relatively low modulating
le; (b) modulato frequency modulante
da una frequenza (1/3 of therelativamente
fundamental);bassa
(c) modulated
(1/3 della
by a higher frequency, 10/3 of the fundamental.
fondamentale); (c) modulato da una frequenza più alta, 10/3 del fondamentale.

For example, in the situation above we can replace the signal of frequency α
with a sum of several sinusoids, such as:

a1 cos(α1 n) + · · · + ak cos(αk n)

Multiplying by the signal of frequency β gives partials at frequencies equal to:

α1 + β, α1 − β, . . . , αk + β, αk − β

As before if any frequency is negative we take its absolute value.


Figure 5.4 shows the result of multiplying a complex periodic signal (with
several components tuned in the ratio 0:1:2:· · ·) by a sinusoid. Both the spectral
envelope and the component frequencies of the result are changed according to
relatively simple rules.
The resulting spectrum is essentially the original spectrum combined with
its reflection about the vertical axis. This combined spectrum is then shifted
120 Capitolo 5. Modulazione

Moltiplicandolo per il segnale di frequenza β otteniamo parziali alle frequenze:

α1 + β, α1 − β, . . . , αk + β, αk − β.

Come prima se qualche frequenza è negativa, prendiamo il suo valore assoluto.


La Figura 5.4 mostra il risultato della moltiplicazione di un segnale periodico
complesso (con diversi componenti in rapporto 0:1:2:· · · ) per una sinusoide.
Sia l’inviluppo spettrale che le frequenze delle componenti del risultato sono
modificate in base a regole relativamente semplici.
Lo spettro risultante è essenzialmente lo spettro originale combinato con la
sua riflessione rispetto all’asse verticale. Questo spettro combinato viene quindi
spostato a destra per la frequenza portante. Infine, se qualsiasi componente
dello spettro spostato rimane ancora a sinistra dell’asse verticale, questa viene
riflessa rispetto ad esso per ottenere frequenze positive.
Nella parte (b) della figura, la frequenza portante (la frequenza della sinusoi-
de) è inferiore alla frequenza fondamentale del segnale complesso. In questo caso
lo spostamento è pari a una distanza relativamente piccola, in modo che il ripie-
gamento dello spettro, alla fine, colloca i due alveoli quasi uno sopra all’altro.
Il risultato è un inviluppo spettrale approssimativamente uguale all’originale
(anche se alto metà) e uno spettro due volte più denso.
Un caso particolare, non mostrato, è quello di utilizzare una frequenza por-
tante pari alla metà della fondamentale. In questo caso, le coppie di parziali
cadranno una sull’altra e avranno i rapporti 1/2:3/2:5/2:· · · dando un segnale
con parziali dispari e un’ottava sotto l’originale. Questo è un octave divider
molto semplice ed efficace per un segnale armonico, supponendo di sapere o
di poter trovare la sua frequenza fondamentale. Se si desiderano anche le par-
ziali pari oltre che quelle dispari (per il segnale abbassato di un’ottava), basta
semplicemente mescolare il segnale originale con quello modulato.
La parte (c) della figura mostra l’effetto di utilizzare una frequenza portante
molto più alta della frequenza fondamentale del segnale complesso. Qui l’effetto
di ripiegamento è chiaramente molto più visibile (solo una parziale, quella più a
sinistra, deve essere riflessa per rendere la sua frequenza positiva). L’inviluppo
spettrale è ora spostato molto rispetto all’originale; questo spostamento è spesso
un effetto molto più udibile rispetto che alla sola ricollocazione delle parziali.
Come ulteriore caso particolare, la frequenza portante può essere un mul-
tiplo della fondamentale del segnale complesso periodico; allora le parziali si
posizionano tutte su altre parziali della stessa fondamentale, e l’unico effetto è
lo spostamento dell’inviluppo spettrale.

5.3 Waveshaping
Un altro approccio per modulare un segnale, chiamato waveshaping, consiste
semplicemente di passarlo attraverso una funzione non-lineare opportunamente
scelta. Un diagramma a blocchi per realizzare il waveshaping è mostrato in Fi-
gura 5.5. La funzione f () (chiamata funzione di trasferimento) distorce la forma
d’onda in ingresso in una forma diversa. La nuova forma dipende dalla forma
dell’onda in entrata, dalla funzione di trasferimento e, soprattutto, dall’am-
piezza del segnale in entrata. Poiché l’ampiezza della forma d’onda in ingresso
influenza la forma della forma d’onda di uscita (e quindi il timbro), questo ci
5.3. WAVESHAPING
5.3. Waveshaping 127
121

IN

f()

OUT

Figure 5.5: Block diagram for waveshaping an input signal using a nonlinear
Figura 5.5: Diagramma a blocchi per il waveshaping di un segnale in ingresso
function f (). An amplitude adjustment step precedes the function lookup, to
usando una funzione non-lineare f (). Un controllo di regolazione dell’ampiezza
take advantage of the different effect of the wavetable lookup at different am-
precede la funzione di ricerca, per approfittare del diverso effetto della ricerca
plitudes.
su wavetable a diverse ampiezze.

to a clipping function. This example shows clearly how the input amplitude—
offreindex—can
the un modo semplice
affect the peroutput
creare waveform.
una famigliaThe di timbri in continuo
clipping function mutamen-
passes its
input to the output unchanged as long as it stays in the interval Per
to, semplicemente variando il livello di input della trasformazione. questo-
between
0.3 and +0.3. So when the input does not exceed 0.3 in absolute value,parte
motivo, è consuetudine includere un controllo di ampiezza principale come the
dell’operazione
output is the same di waveshaping,
as the input. come mostrato
But when nel diagramma
the input grows pasta theblocchi.
limits, the
L’ampiezza
output della forma
stays within; and asd’onda in entrataofè the
the amplitude chiamata
signal indice
increasesdi waveshaping.
the effect of
this clipping action is progressively more severe. In the figure, the piccole
In molte situazioni un indice piccolo porta a distorsioni relativamente input is(ina
decaying sinusoid. The output evolves from a nearly square waveform timbro
modo che l’output somigli molto all’input) e un indice più grande dà un at the
più distorto
beginning to ea più
purericco.
sinusoid at the end. This effect will be well known to anyone
whoLa hasFigura
played5.6 anmostra un esempio
instrument through familiare di waveshaping,
an overdriven amplifier. inThecuilouder
f () è una
the
input, the more distorted will be the output. For this reason, waveshapingco-
funzione di taglio (clipping function). Questo esempio mostra chiaramente is
me l’ampiezza
also sometimesdell’input – l’indice – possa influenzare la forma d’onda di uscita.
called distortion.
La Figure
funzione 5.7dishows
taglio apassa
muchil suo
simpleringresso
and all’uscita
easier to invariato finché rimane
analyse situation, nel-
in which
l’intervallo tra −0.3 e +0.3. Perció,
the transfer function simply squares the input: quando l’input non supera 0.3 in valore
assoluto, l’output è uguale all’input. Ma quando l’input supera questi limiti,
l’output vi resterà all’interno; all’aumentare f (x) = x2 dell’ampiezza del segnale, l’effetto
di questa azione di taglio sarà progressivamente più drastica. Nella figura, l’in-
For a sinusoidal input,
put è una sinusoide che decade. L’output si evolve da una forma d’onda quasi
x[n] = a cos(ωn + φ)
quadra all’inizio fino a una sinusoide pura alla fine. Questo effetto sarà ben
we
notogeta chiunque abbia suonato uno strumento attraverso un amplificatore con
overdrive. Quanto più fforte a2
(x[n])è = l’ingresso, più l’uscita
(1 + cos(2ωn sarà distorta. Per questa
+ 2φ))
ragione, il waveshaping viene a volte 2 chiamato anche distorsione.
If the
Laamplitude
Figura 5.7amostraequals una
one,situazione
this just amounts
molto piùtosemplice
ring modulating
e facile dathe sinusoid
analizzare,
by a sinusoid
in cui la funzione of the same frequency,
di trasferimento whose
calcola result we described
semplicemente il quadrato in dell’input:
the previ-
ous section: the output is a DC (zero-frequency) sinusoid plus a sinusoid at
f (x) = x2 .

Per un input sinusoidale


x[n] = a cos(ωn + φ)
122 Capitolo 5. Modulazione

128 CHAPTER 5. MODULATION

1 (a)

-1

0.3
(b)
-0.3

(c)
0.3
-0.3

Figure
Figura 5.6:
5.6: Clipping
Esempio di aswaveshaping
an example con
of waveshaping: (a) the
taglio: (a) l’input, input,
una a decaying
sinusoide che de-
sinusoid; (b) the waveshaping function, which clips its input to the interval
cade; (b) la funzione di waveshaping, che taglia l’input al di fuori dell’intervallo
between
tra −0.3-0.3 and (c)
e +0.3; +0.3; (c) the result.
il risultato.
5.3. Waveshaping 123

5.3. WAVESHAPING 129

1
(a)

-1

(b)
-1 1

1
(c)

2
Figure
Figura5.7:
5.7:Waveshaping
Waveshaping using a quadratic
usando transferdifunction
una funzione f (x) = xquadratica
trasferimento : (a) the
input; (b) the transfer function; (c) the result, sounding at twice the
f (x) = x2 : (a) l’input; (b) la funzione di trasferimento; (c) il risultato, original
che
frequency.
suona al doppio della frequenza originale.

twice the original frequency. However, in this waveshaping example, unlike ring
modulation, the amplitude of the output grows as the square of the input.
Keeping the same transfer function, we now consider the effect of sending in
a combination of two sinusoids with amplitudes a and b, and angular frequencies
α and β. For simplicity, we’ll omit the initial phase terms. We set:

x[n] = a cos(αn) + b cos(βn)

and plugging this into f () gives

a2
f (x[n]) = (1 + cos(2αn)) +
2

b2
+ (1 + cos(2βn))
2
+ab [cos((α + β)n) + cos((α − β)n)]
The first two terms are just what we would get by sending the two sinusoids
through separately. The third term is twice the product of the two input terms,
124 Capitolo 5. Modulazione

si ottiene
a2
f (x[n]) = (1 + cos(2ωn + 2φ)).
2
Se l’ampiezza a è uguale a 1, ciò equivale semplicemente ad una modulazione ad
anello della sinusoide tramite una sinusoide alla stessa frequenza, il cui risultato
abbiamo descritto nel paragrafo precedente: l’output è una sinusoide DC (a
frequenza nulla) più una sinusoide al doppio della frequenza originale. Tuttavia,
in questo esempio di waveshaping, diversamente dalla modulazione ad anello,
l’ampiezza dell’output cresce come il quadrato dell’input.
Utilizzando la stessa funzione di trasferimento, consideriamo ora l’effetto
di inviare una combinazione di due sinusoidi con ampiezze a e b e frequenze
angolari α e β. Per semplicità, ometteremo i termini di fase iniziale. Sia quindi

x[n] = a cos(αn) + b cos(βn)

e applicandovi f () si ottiene
a2
f (x[n]) = 2 (1 + cos(2αn))+
2
+ b2 (1 + cos(2βn))+

+ab[cos((α + β)n) + cos((α − β)n)].

I primi due termini sono proprio quello che avremmo ottenuto inviando separa-
tamente le due sinusoidi. Il terzo termine è due volte il prodotto dei due termini
in input, che proviene dal termine misto nell’espansione

f (x + y) = x2 + 2xy + y 2 .

Questo effetto, chiamato intermodulazione, diventa sempre più dominante al-


l’aumentare del numero di termini in input; se ci sono k sinusoidi in ingresso ci
sono solo k termini “puri” nel prodotto, ma ci sono anche (k 2 − k)/2 termini di
intermodulazione.
In contrasto con la modulazione ad anello, che è una funzione lineare del suo
segnale di ingresso, il waveshaping è non-lineare. Mentre siamo stati in grado di
analizzare i processi lineari considerando la loro azione separatamente su tutte
le componenti dell’input, nel caso non-lineare dobbiamo anche considerare le
interazioni tra le componenti. I risultati sono molto più complessi, a volte
molto più ricchi da un punto di vista sonoro, ma, d’altra parte, più difficili da
capire o prevedere.
In generale, possiamo dimostrare che un input periodico, non importa quanto
complesso sia, avrà lo stesso periodo dopo il waveshaping: se il periodo è τ in
modo che
x[n + τ ] = x[n]
e impostiamo temporaneamente l’indice a = 1,

f (x[n + τ ]) = f (x[n])

(in alcuni casi speciali l’output può avere periodo pari ad un sottomultiplo di τ ,
in modo da ottenere, come risultato, un armonico dell’input, questo accade, ad
esempio, in Figura 5.4).
5.3. Waveshaping 125

Le combinazioni di toni periodici a intervalli di consonanza possono dare


origine a distorsioni sub-armoniche. Per esempio, se due segnali periodici x e y
sono distanti una quarta musicale (periodi nel rapporto 4:3), allora la somma
dei due si ripete ad una frequenza più bassa data dalla sub-armonica comune.
Nelle equazioni avremo:
x[t + τ /3] = x[t]

y[t + τ /4] = y[t]


il che implica
x[t + τ ] + y[t + τ ] = x[t] + y[t]
e quindi la somma distorta f (x + y) si ripeterà dopo un periodo di τ :

f (x + y)[n + τ ] = f (x + y)[n].

Questo è stato sperimentato da ogni chitarrista elettrico che ha impostato l’am-


plificatore su overdrive e ha suonato insieme le corde Si e Mi Cantino: il pro-
dotto della distorsione suona qualche volta sulla nota della corda di Mi basso,
due ottave al di sotto di quella alta.
Per ottenere un’analisi un po’ più esplicita dell’effetto di waveshaping su
un segnale in entrata, è talvolta utile scrivere la funzione f come una serie di
potenze finite o infinite:

f (x) = f0 + f1 x + f2 x2 + f3 x3 + · · ·

Se il segnale di ingresso x[n] è una sinusoide di ampiezza unitaria, cos(ωn),


possiamo considerare l’azione dei suddetti termini separatamente:

f (a · x[n]) = f0 + af1 cos(ωn) + a2 f2 cos2 (ωn) + a3 f3 cos3 (ωn) + · · ·

Poiché i termini della serie sono successivamente moltiplicati per potenze su-
periori dell’indice a, un valore piccolo di a enfatizzerà i primi termini più
pesantemente e un valore più alto sottolineerà quelli superiori.
Gli spettri dei singoli termini possono essere trovati applicando ripetutamen-
te la formula del prodotto del coseno:

1 = cos(0)

x[n] = cos(ωn)

1 1
x2 [n] = 2 + 2 cos(2ωn)

1 2 1
x3 [n] = 4 cos(−ωn) + 4 cos(ωn) + 4 cos(3ωn)

1 3 3 1
x4 [n] = 8 cos(−2ωn) + 8 cos(0) + 8 cos(2ωn) + 8 cos(4ωn)

1 4 6 4 1
x5 [n] = 16 cos(−3ωn) + 16 cos(−ωn) + 16 cos(ωn) + 16 cos(3ωn) + 16 cos(5ωn)

e cosı̀ via. I numeratori delle frazioni sono individuati dal triangolo di Pascal. Il
Teorema del Limite Centrale, in Teoria delle Probabilità, implica che la k−esima
riga può essere approssimata da una curva gaussiana la cui deviazione standard
(una misura di larghezza) è proporzionale alla radice quadrata di k.
126 Capitolo 5. Modulazione

I termini a frequenza negativa (che sono stati qui illustrati separatamente


per chiarezza) vanno combinati con quelli positivi; l’inviluppo spettrale viene
piegato su se stesso in modo analogo all’esempio di modulazione ad anello di
Figura 5.4.
Finché i coefficienti fk sono tutti numeri positivi o zero, tutte le ampiezze
delle sinusoidi sono presenti nelle espansioni sopra indicate. In questo caso tutte
le fasi restano coerenti quando a varia e quindi si ottiene un allargamento dello
spettro (e forse un’ampiezza drasticamente crescente) al crescere di a. D’altra
parte, se alcuni degli fk sono positivi e altri negativi, le diverse espansioni in-
terferiranno in modo distruttivo; questo darà origine ad un’evoluzione spettrale
più complessa.
Si noti inoltre che le espansioni successive contengono solo parziali pari o
dispari. Se accade che la funzione di trasferimento (in forma di serie) contenga
solo le potenze pari
f (x) = f0 + f2 x2 + f4 x4 + · · ·
allora il risultato, avendo solo parziali pari, suonerà un’ottava superiore rispetto
alla sinusoide in entrata. Se nell’espansione di f (x) ci sono solo potenze dispari,
l’output conterrà solo parziali dispari. Anche se f non può essere espressa
esattamente come una serie di potenze (ad esempio, la funzione di clipping
della Figura 5.3), è ancora vero che se f è una funzione pari, cioè se

f (−x) = f (x)

si otterranno solo armonici pari e se f è una funzione dispari,

f (−x) = −f (x)

si otterranno solo armonici dispari.


Molti trucchi matematici sono stati proposti per usare il waveshaping per
generare spettri specifici. Osserviamo che è possibile generare sinusoidi pure a
qualsiasi armonico della fondamentale usando un polinomio di Chebychev come
funzione di trasferimento [Leb79] [DJ85] e da lı̀ si può continuare e costruire
qualsiasi spettro statico desiderato (l’esempio E05.chebychev.pd dimostra que-
sto). Generare famiglie di spettri tramite il waveshaping di una sinusoide di
ampiezza variabile risulta essere più complesso, anche se sono stati trovati di-
versi interessanti casi particolari, alcuni dei quali sono sviluppati in dettaglio
nel Capitolo 6.

5.4 Modulazione di frequenza e di fase


Se una sinusoide ha una frequenza che varia lentamente nel tempo, noi la per-
cepiamo con un tono variabile. Ma se il tono cambia cosı̀ rapidamente che le
nostre orecchie non riescono a tenere traccia del cambiamento – ad esempio, se
la variazione stessa si verifica al pari o al di sopra della frequenza fondamentale
della sinusoide – sentiamo un cambiamento timbrico. I timbri cosı̀ generati sono
ricchi e ampiamente variabili. La scoperta di John Chowning di questa possibi-
lità [Cho73] ha rivoluzionato il campo della computer music. Qui sviluppiamo
la modulazione di frequenza, di solito chiamata FM, come un caso speciale di
waveshaping [Leb79] [DJ85, pp.155-158]; l’analisi data in [Puc01] è leggermente
diversa.
5.4. Modulazione
5.4. FREQUENCY di AND
frequenza e di MODULATION
PHASE fase 127
133

(a) (b)

modulation modulation
frequency frequency

1 1

-1 -1

index of
index of
modulation
modulation
carrier
1 frequency

carrier N
frequency
1

-1

OUT
OUT

Figure 5.8: Block diagram for frequency modulation (FM) synthesis: (a) the
Figura 5.8: Diagramma a blocchi per la sintesi di modulazione di frequenza
classic form; (b) realized as phase modulation.
(FM): (a) forma classica; (b) realizzata come modulazione di fase.

relative to the carrier frequency ωc . If a = 0, there is no frequency variation


and Lathetecnica
expression reduces
FM, nella sua to the più
forma unmodified,
semplice, carrier sinusoid;
è mostrata as a 5.8
in Figura increases
(parte
the waveform becomes more complex.
a). Una sinusoide modulata in frequenza è quella la cui frequenza varia sinu-
To analyseadthe
soidalmente resulting
una frequenzaspectrum
angolare weωcan rewrite ad
m rispetto theuna
signal as,
frequenza centrale
ωc , in modo che le frequenze istantanee varino tra (1 − r)ωc e (1 + r)ωc , dove
x[n] la
il parametro ωm controlla cos(ωc n) ∗dicos(a
= frequenza cos(ωmen))
variazione r controlla la profondità
della variazione. I parametri ωc , ωm e r sono chiamati rispettivamente frequenza
portante, frequenza modulante e indice
− sin(ω di modulazione.
c n) ∗ sin(a cos(ωm n))
È consuetudine utilizzare una formulazione più semplice e sostanzialmente
We can consider the result as a sum of two waveshaping generators, each oper-
equivalente in cui è la fase della sinusoide portante, anziché la frequenza, ad
ating on a sinusoid of frequency ωm and with a waveshaping index a, and each
essere modulata in modo sinusoidale (questo dà un risultato equivalente poiché
ring modulated with a sinusoid of frequency ωc . The waveshaping function f is
la frequenza istantanea è il tasso di variazione della fase e poiché la velocità
given by f (x) = cos(x) for the first term and by f (x) = sin(x) for the second.
di cambiamento di una sinusoide è ancora un’altra sinusoide). La formulazione
Returning to Figure 5.4, we can predict what the spectrum will look like.
della modulazione di fase è mostrata nella parte (b) della figura.
Possiamo analizzare il risultato della modulazione di fase come segue, sup-
ponendo che l’oscillatore modulante e la wavetable siano entrambi sinusoidali
e che le frequenze portante e di modulazione non varino nel tempo. Il segnale
128 Capitolo 5. Modulazione

risultante può quindi essere scritto come

x[n] = cos(a cos(ωm n) + ωc n).

Il parametro a, che sostituisce il parametro precedente r, è analogamente chia-


mato indice di modulazione; questo controlla anche l’entità della variazione di
frequenza rispetto alla frequenza portante ωc . Se a = 0, non c’è alcuna variazio-
ne di frequenza e l’espressione si riduce alla sinusoide portante non modificata;
all’aumentare di a la forma d’onda diventa più complessa.
Per analizzare lo spettro risultante possiamo riscrivere il segnale come,

x[n] = cos(ωc n) · cos(a cos(ωm n))

− sin(ωc n) · sin(a cos(ωm n)).

Possiamo considerare il risultato come una somma di due generatori di wave-


shaping, ciascuno operante su una sinusoide di frequenza ωm e con un indice di
waveshaping a, e ciascuno modulato ad anello con una sinusoide di frequenza
ωc . La funzione di waveshaping f è data da f (x) = cos(x) per il primo termine
e da f (x) = sin(x) per il secondo.
Tornando alla Figura 5.4, possiamo prevedere quale sarà lo spettro.
I due spettri armonici, degli outputs del waveshaping

cos(a cos(ωm n))

e
sin(a cos(ωm n))
hanno, rispettivamente, armonici sintonizzati a

0, 2ωm , 4ωm , . . .

e
ωm , 3ωm , 5ωm , . . .
e ognuno è moltiplicato per una sinusoide alla frequenza portante. Quindi, ci
sarà uno spettro centrato sulla frequenza portante ωc , con bande laterali ai
multipli sia pari che dispari della frequenza di modulazione ωm , prodotti rispet-
tivamente dai waveshaping, sopra, con seno e il coseno. L’indice di modulazione
a, quando cambia, controlla la forza relativa delle varie parziali. Le parziali
stesse sono situate alle frequenze

ωc + mωm

dove
m = . . . , −2, −1, 0, 1, 2, . . .
Come per tutte le situazioni in cui si moltiplicano due segnali periodici, se c’è
un sopramultiplo comune dei due periodi, il prodotto risultante si ripeterà a
quel periodo più lungo. Quindi se i due periodi sono kτ e mτ , dove k e m
sono relativamente primi, entrambi si ripetono dopo un intervallo di tempo di
kmτ . In altri termini, se i due hanno frequenze che sono entrambe multiple
di una frequenza comune, cosicché ωm = kω e ωc = mω, ancora con k e m
relativamente primi, il risultato si ripete alla frequenza del sottomultiplo comune
5.5. Esempi 129

ω. D’altra parte, se non è possibile trovare un comune sottomultiplo ω, o se gli


unici sottomultipli sono inferiori a qualsiasi tono discernibile, allora il risultato
sarà inarmonico.
Molto di più sulla tecnica FM si può trovare nei libri di testo [Moo90, p.
316], [DJ85, pp.115-139], [Bou00] e nella letteratura di ricerca. Alcune delle
possibilità sono indicate nei seguenti esempi.

5.5 Esempi
Modulazione ad anello e spettri
L’esempio E01.spectrum.pd serve per introdurre uno strumento di misura dello
spettro che useremo; qui saltiamo al secondo esempio, E02.ring.modulation.pd
(Figura 5.9), che mostra l’effetto di modulare ad anello uno spettro armonico
(che è stato trattato teoricamente nel paragrafo 5.2 e mostrato in Figura 5.4).
In questo esempio consideriamo un segnale i cui armonici (da 0 a 5) hanno tutti
ampiezza unitaria.
Gli armonici possono essere attivati e disattivati separatamente con dei tog-
gles. Quando sono accesi, l’inviluppo spettrale ha un picco al DC (perché il
segnale costante è due volte più forte delle altre sinusoidi), ha poi una regione
piatta dal primo al quinto armonico e infine scende a zero.
Nella porzione della patch che riguarda la generazione del segnale (parte (a)
della figura), le sei parziali sono sommate e tale somma viene moltiplicata per il
singolo oscillatore portante (i sei segnali vengono sommati implicitamente colle-
gandoli tutti alla stessa entrata dell’oggetto ∗ ∼). Il valore della “fondamentale”
in alto viene calcolato per allinearsi bene all’analisi spettrale, il cui risultato è
indicato nella parte (b) della figura.
L’analisi spettrale (che utilizza tecniche che non descriveremo fino al Capitolo
9) mostra l’ubicazione delle sinusoidi (assumendo uno spettro discreto) sull’asse
orizzontale e le loro grandezze su quello verticale. Quindi la presenza di un
picco in DC, di magnitudine uno, nello spettro del segnale di ingresso ci dice,
secondo la Figura 5.3, che dovrebbe esserci un picco nello spettro di uscita,
alla frequenza portante, di altezza 1/2. Analogamente, le altre due sinusoidi
nel segnale di ingresso, che hanno l’altezza 1/2 nello spettro, danno origine,
ciascuna, a due picchi in uscita, di altezza 1/4. Uno di questi quattro è stato
riflesso sul bordo sinistro della figura (prendendo il valore assoluto della sua
frequenza negativa).

Octave divider e formant adder


Come indicato nel paragrafo 5.2, quando consideriamo il risultato di modulare
un segnale armonico complesso (cioè periodico) tramite una sinusoide, un caso
speciale interessante è quello di impostare l’oscillatore portante a metà della fre-
quenza fondamentale abbassando cosı̀ il suono risultante di un’ottava con solo
una deformazione relativamente piccola dell’inviluppo spettrale. Un altro caso è
quello di modulare con una sinusoide ad un multiplo della frequenza fondamen-
tale, che sposta, in effetti, l’inviluppo spettrale senza cambiare la frequenza fon-
damentale del risultato. Questo è mostrato nell’Esempio E03.octave.divider.pd
130 Capitolo 5. Modulazione
136 CHAPTER 5. MODULATION

r fundamental

* 0 * 1 * 2 * 3 * 4 * 5

osc~ osc~ osc~ osc~ osc~ osc~


partials
<-- On/Off

*~ *~ *~ *~ *~ *~

0 carrier
*~ osc~ frequency
|
(OUT) (a)

SPECTRUM
.
1

0.5

0
0 1 2 3 4 5 6 7
-- partial number --

(b)

Figura5.9:
Figure 5.9:Ring
Modulazione ad anello
modulation di un tono
of a complex tonecomplesso tramite
by a sinusoid: unarealization;
(a) its sinusoide:
(a) la sua realizzazione;
(b) a measured spectrum. (b) uno spettro misurato.
5.5. Esempi 131

(Figura 5.10). Il segnale che processiamo qui è una registrazione di una voce
che parla.
Le sottopatches pd looper e pd delay nascondono i dettagli. Il primo è un
campionatore a loop del tipo descritto nel Capitolo 2. Il secondo è un ritardo
di 1024 campioni, che utilizza oggetti che introdurremo più avanti nel Capitolo
7. Presentiamo qui una classe di oggetti:
fiddle∼ : tracker di pitch. L’ingresso accetta un segnale da analizzare e
messaggi per modificare le impostazioni. A seconda dei suoi creation arguments,
fiddle∼ può avere un numero variabile di uscite che offrono varie informazioni
sul segnale di ingresso. Come mostrato qui, con un solo creation argument per
specificare la dimensione della finestra, la terza uscita tenta di analizzare il tono
del segnale di ingresso e l’ampiezza di quella porzione dell’input che si ripete
(almeno approssimativamente) al tono riportato. Questi vengono emessi come
un elenco di due numeri. Il tono, che è in note MIDI, viene riportato con il
valore zero se non vi è identificazione.
In questa patch la terza uscita viene spacchettata nelle sue componenti di
tono e ampiezza e il componente tono viene filtrata dall’oggetto moses in modo
che siano utilizzate solo le stime riuscite di tono (non nulle). Queste vengono
convertite in frequenze dall’oggetto mtof. Infine, le stime di frequenza vengono
ridotte di 1/2 o moltiplicate per 15, a seconda del moltiplicatore selezionato,
per fornire la frequenza di modulazione. Nel primo caso otteniamo un octave
divider, e nel secondo, un’aggiunta di ulteriori armonici superiori che deformano
le vocali.

Waveshaping e differenza di toni


L’esempio E04.difference.tone.pd (Figura 5.11) introduce un waveshaping, di-
mostrando la non-linearità del processo. Due sinusoidi (300 e 225 Hertz, o un
rapporto di 4 a 3) vengono sommate e poi ritagliate, utilizzando una nuova
classe di oggetti:
clip∼ : ritaglio di segnale. Quando il segnale si trova tra i limiti specificati
dai creation arguments all’oggetto clip∼, viene passato in modo invariato; ma
quando scende al di sotto del limite inferiore o si alza al di sopra del limite
superiore, viene sostituito dal relativo limite. L’effetto del clipping di un segnale
sinusoidale è stato mostrato graficamente in Figura 5.6.
Finché l’ampiezza della somma delle sinusoidi è inferiore al 50 percento, la
somma non può superare uno in valore assoluto e l’oggetto clip∼ passa la
coppia invariata di sinusoidi all’uscita. Tuttavia, non appena l’ampiezza supera
il 50%, la non-linearità dell’oggetto clip∼ produce dei prodotti di distorsione
(alle frequenze 300m + 225n per numeri interi m e n), ciascuno dei quali sono
multipli di 75, che è quindi la fondamentale del tono risultante. Visto in un altro
modo, il più breve periodo comune delle due sinusoidi è di 1/75 secondi (cioè
quattro periodi del tono a 300 Hertz e tre periodi del tono a 225 Hz), quindi il
risultato si ripete 75 volte al secondo.
La frequenza del tono a 225 Hertz nella patch può essere variata. Se viene
spostata leggermente da 225, si ottiene un battimento. Altri valori fornisco-
no ulteriori sub-armonici comuni e altri ancora danno origine a toni ricchi e
inarmonici.
132 Capitolo 5. Modulazione
136 CHAPTER 5. MODULATION

r fundamental

* 0 * 1 * 2 * 3 * 4 * 5

osc~ osc~ osc~ osc~ osc~ osc~


partials
<-- On/Off

*~ *~ *~ *~ *~ *~

0 carrier
*~ osc~ frequency
|
(OUT) (a)

SPECTRUM
.
1

0.5

0
0 1 2 3 4 5 6 7
-- partial number --

(b)

Figura5.9:
Figure 5.10:
RingAbbassamento
modulation of adel tono tone
complex di unby suono di un’ottava
a sinusoid: tramite
(a) its realization;
individuazione
(b) a measured del suo tono e modulando a metà della fondamentale.
spectrum.
5.5. Esempi 133

138 CHAPTER 5. MODULATION

osc~ 300

loadbang

225
225 <-- frequency of second tone
osc~
loadbang
+~
50
*~ amplitude of sum
50 <-- before clipping

clip~ -1 1 / 100
|
(OUT)

Figure 5.11: Nonlinear distortion of a sum of two sinusoids to create a difference


Figura
tone. 5.11: Distorsione non-lineare di una somma di due sinusoidi per creare
una differenza di tono.

of frequency by the mtof object. Finally, the frequency estimates are either
reduced by 1/2 or else multiplied by 15, depending on the selected multiplier,
5.5. EXAMPLES 139
to provide the modulation frequency. In the first case we get an octave divider,
and in the second, additional high harmonics that deform the vowels.

osc~ 220
Waveshaping and difference tones
E05-tab
0 <- index
Example E04.difference.tone.pd (Figure 5.11) introduces waveshaping, demon-
strating/the
100nonlinearity of the process. Two sinusoids (300 and 225 Hertz, or
a ratio of 4 to 03) 50
pack are summed and then clipped, using a new object class:
clip~ : signal clipper. When the signal lies between the limits specified by
line~
the arguments to the clip~ object, it is passed through unchanged; but when
*~below the lower limit or rises above the upper limit, it is replaced by the
it falls
limit. The effect of clipping a sinusoidal signal was shown graphically in Figure
*~ 128
5.6.
+~long
As 129as the amplitude of the sum of sinusoids is less than 50 percent, the
sum can’t exceed one in absolute value and the clip~ object passes the pair of
tabread4~ E05-tab
sinusoids through unchanged to the output. As soon as the amplitude exceeds
hip~ 5however, the nonlinearity of the clip~ object brings forth distor-
50 percent,
tion|products (at frequencies 300m + 225n for integers m and n), all of which
(OUT) to be multiples of 75, which is thus the fundamental of the resulting
happening
tone. Seen another way, the shortest common period of the two sinusoids is
1/75 second
Figure (whichChebychev
5.12: Using is four periods of the 300
polynomials Hertz, tone and
as waveshaping three functions.
transfer periods of
Figura
the 2255.12:
HertzUtilizzo deithe
tone), so polinomi di Chebychev
result repeats come
75 times perfunzioni
second. di trasferimento
waveshaping.
The frequency of the 225 Hertz tone in the patch may be varied. If it is
moved slightly away from 225, a beating sound results. Other values find other
common subharmonics, and still others give rise to rich, inharmonic tones.

Waveshaping using Chebychev polynomials


Example E05.chebychev.pd (Figure 5.12) demonstrates how you can use wave-
shaping to generate pure harmonics. We’ll limit ourselves to a specific example
here in which we would like to generate the pure fifth harmonic,

cos(5ωn)

by waveshaping a sinusoid
134 Capitolo 5. Modulazione

Waveshaping utilizzando i polinomi di Chebychev


L’esempio E05.chebychev.pd (Figura 5.12) illustra come sia possibile utilizzare il
waveshaping per generare armonici puri. Ci limiteremo ad un esempio specifico
in cui vorremmo generare l’armonico quinto puro,

cos(5ωn)

tramite il waveshaping di una sinusoide

x[n] = cos(ωn).

Dobbiamo trovare una appropriata funzione di trasferimento f (x). Innanzitutto


ricordiamo la formula per la funzione waveshaping f (x) = x5 (pagina 125), che
fornisce il primo, il terzo e il quinto armonico:

16x5 = cos(5ωn) + 5 cos(3ωn) + 10 cos(ωn).

Successivamente aggiungiamo un opportuno multiplo di x3 per annullare il terzo


armonico:
16x5 − 20x3 = cos(5ωn) − 5 cos(ωn)
e quindi un multiplo di x per annullare il primo armonico:

16x5 − 20x3 + 5x = cos(5ωn).

Quindi come funzione di waveshaping sceglieremo

f (x) = 16x5 − 20x3 + 5x.

Questa procedura ci permette di isolare qualsiasi armonico desiderato; le fun-


zioni risultanti f sono conosciute come polinomi di Chebychev [Leb79].
Per incorporarlo in uno strumento waveshaping, abbiamo semplicemente
creato una patch che funziona come nella Figura 5.5, calcolando l’espressione

x[n] = f (a[n] cos(ωn))

dove a[n] è un indice opportuno che può variare in funzione del sample number
n. Quando accade che a valga uno, l’output è il quinto armonico puro. Altri
valori di a danno spettri variabili che, in generale, hanno il primo e il terzo
armonico oltre che il quinto.
Combinando opportunamente i polinomi di Chebychev, possiamo ottenere
qualsiasi sovrapposizione desiderata di componenti nella forma d’onda di uscita
(sempre, fino a quando l’indice del waveshaping è uno). Ma il vero aspetto inte-
ressante del waveshaping – cioè che cambiando semplicemente l’indice possiamo
produrre spettri che si evolvono in modi interessanti ma controllabili – non è
affrontato, almeno direttamente, dalla teoria di Chebychev.

Waveshaping usando una funzione esponenziale


Ritorniamo nuovamente allo spettro calcolato a pagina 125, corrispondente alle
funzioni di waveshaping della forma f (x) = xk . Osserviamo con piacere che
non solo sono tutti in fase (in modo che possano essere sovrapposti con risultati
5.5. Esempi 135

facilmente prevedibili) ma anche che gli spettri si estendono all’aumentare di k.


Inoltre, in una serie della forma

f (x) = f0 + f1 x + f2 x2 + · · · ,

un indice di modulazione più alto darà, nell’espansione, un peso relativo mag-


giore ai termini di potenze più elevati; come abbiamo visto visto in precedenza,
se l’indice di modulazione è a, i vari termini xk sono moltiplicati per f0 , af1 ,
a2 f2 e cosı̀ via.
Ora supponiamo di voler organizzare la suddetta espansione in termini di-
versi per controllare il risultato in modo prevedibile in funzione dell’indice a.
Per scegliere l’esempio più semplice possibile, supponiamo che vogliamo che f0
sia il termine più grande per 0 < a < 1, per poi essere quindi superato dal
termine più rapidamente crescente af1 for 1 < a < 2, che è superato da a2 f2
per 2 < a < 3 e cosı̀ via, in modo che il termine n−esimo subentri all’indice n.
Per far ciò basta richiedere che

f1 = f0 , 2f2 = f1 , 3f3 = f2 , . . .

e scegliendo f0 = 1 si ha f1 = 1, f2 = 1/2, f3 = 1/6, e, in generale


1
fk = .
1 · 2 · 3···k
Questi sono i coefficienti della serie di potenze per la funzione f (x) = ex , dove
e ≈ 2.7 è la costante di Eulero.
Prima di utilizzare ex come funzione di trasferimento è consigliabile pianifi-
care come gestire l’ampiezza del segnale, dal momento che ex cresce rapidamente
al crescere di x. Se intendiamo utilizzare ex su una sinusoide di ampiezza a,
l’output massimo sarà ea , che si verifica ogni volta che la fase è zero. Una scelta
semplice e naturale è semplicemente quella di dividere per ea in modo da ridurre
il picco a uno, cioè:

ea cos(ωn)
f (a cos(ωn)) = = ea cos(ωn)−1 .
ea
Questo è realizzato nell’Esempio E06.exponential.pd. Gli spettri risultanti
per a = 0, 4 e 16 sono mostrati in Figura 5.13. Al crescere dell’indice di wave-
shaping, decresce l’energia presente nella fondamentale; l’energia viene sempre
di più diffusa sulle parziali.

Waveshaping sinusoidale: parità e disparità


Un’altra interessante classe di funzioni di trasferimento waveshaping sono le
sinusoidi:
f (x) = cos(x + φ)
che includono le funzioni coseno e seno (ottenute scegliendo rispettivamente
φ = 0 e φ = −π/2). Queste funzioni, essendo una pari e l’altra dispari, danno
origine a spettri con armonici pari e dispari, che risultano essere:
cos(a cos(ωn)) = J0 (a) − 2J2 (a) cos(2ωn) + 2J4 (a) cos(4ωn) − 2J6 (a) cos(6ωn) ± · · ·

sin(a cos(ωn)) = 2J1 cos(ωn) − 2J3 (a) cos(3ωn) + 2J5 (a) cos(5ωn) ∓ · · ·
136 Capitolo 5. Modulazione

142 CHAPTER 5. MODULATION

a=0 0

0.25

a=4 0

0.25

a=16 0
0 1 2 3 4 5 6 7
−− partial number −−

Figura
Figure 5.13: Spettri di
5.13: Spectra of output di waveshaping
waveshaping usando
output using una funzione
an exponential di trasferi-
transfer func-
mento esponenziale.
tion. Indices Sono mostrati
of modulation of 0, 4, indici
and 16diare
modulazione
shown; notepari
theadifferent
0, 4 e 16;vertical
notare
le diverse scale verticali.
scales.
5.5. EXAMPLES 143

5.5. Esempi 137

(frequency)
|
(index)
osc~
|
*~
symmetry
+~ 0.1 0.1 mixed
cos~ 0 even
| odd
0.25
(OUT)

Figura 5.14: Utilizzo di un offset additivo su una funzione di trasferimento


Figure
coseno 5.14: Using an additive
per modificare offsettra
la simmetria to pari
a cosine transfer
e dispari. function
Senza to alter the
compensazione la
symmetry
simmetria è pari. Per la simmetria dispari, viene aggiunto un quartoFor
between even and odd. With no offset the symmetry is even. odd
di ciclo
symmetry, a quarter
alla fase. Gli offsets cycle is added
più piccoli to the
danno unaphase. Smaller
miscela di parioffsets give a mixture
e dispari.
of even and odd.

Le funzioni Jk (a) sono le funzioni di Bessel del primo tipo, che gli ingegneri
utilizzano talvolta per risolvere i problemi relativi alle vibrazioni o al flusso di
calore sui dischi. Per altri valori di φ possiamo espandere l’espressione di f :
f (x) = cos(x) cos(φ) − sin(x) sin(φ)
quindi il risultato è un mix tra gli armonici pari e dispari,
modulation con φ che controlla
modulation
frequency frequency descritta in
le relative ampiezze. Ciò è mostrato nella patch E07.evenodd.pd,
Figura 5.14. | |
osc~ osc~
carrier
Modulazione di modulationfase e FM frequency modulation
index | index
carrier
L’esempio E08.phase.mod.pd, illustrato in Figura 5.15, mostra
| come utilizza-
| phasor~
frequency
*~
re Pd per| realizzare*~effettivamente la modulazione di frequenza (parte a) e la
modulazione+~ di fase (parte b). Queste corrispondono
+~ ai diagrammi a blocchi
della Figura 5.8. Per realizzare la modulazione di fase, l’oscillatore portante è
suddiviso osc~ cos~
nelle sue componenti di ricerca di fase e di coseno. Il segnale è della
forma | |
(OUT) x[n] = cos(ωc n + a (OUT)
cos(ωm n))
dove ωc è la frequenza (b)
(a) portante, ωm è la frequenza di modulazione, e a è l’indice
di modulazione – tutto in unità angolari.
Possiamo prevedere lo spettro espandendo il coseno esterno:
Figure 5.15: Pd patches for: (a) frequency modulation; (b) phase modulation.
x[n] = cos(ωc n) cos(a cos(ωm n)) − sin(ωc n) sin(a cos(ωm n)).
Incorporando le espansioni di pagina 135 e semplificando i termini si ha
x[n] = J0 (a) cos(ωc n)+

+J1 (a) cos((ωc + ωm )n + π2 ) + J1 (a) cos((ωc − ωm )n + π2 )+

+J2 (a) cos((ωc + 2ωm )n + π) + J2 (a) cos((ωc − 2ωm )n + π)+

3π 3π
+J3 (a) cos((ωc + 3ωm )n + 2 ) + J3 (a) cos((ωc − 3ωm )n + 2 ) + ···
Figure 5.14: Using an additive offset to a cosine transfer function to alter the
symmetry between even and odd. With no offset the symmetry is even. For odd
symmetry, a quarter cycle is added to the phase. Smaller offsets give a mixture
of even and odd.

138 Capitolo 5. Modulazione

modulation modulation
frequency frequency
| |
osc~ osc~
carrier
modulation frequency modulation
index | index
carrier |
| phasor~
frequency
*~ *~
|
+~ +~

osc~ cos~
| |
(OUT) (OUT)
(a) (b)

Figure
Figura5.15:
5.15: Pd patches
Patches for:per:
in Pd (a) (a)
frequency modulation;
modulazione (b) phase
di frequenza; modulation.
(b) modulazione
di fase.

Cosı̀ le componenti sono centrate intorno alla frequenza portante ωc con bande
laterali che si estendono in entrambe le direzioni, ognuna distanziata ωm dalla
successiva. Le ampiezze sono in funzione dell’indice di modulazione e non di-
pendono dalle frequenze. La Figura 5.16 mostra alcuni spettri di modulazione
di fase a due operatori, misurati usando l’esempio E09.FM.spectrum.pd.
La modulazione di fase può quindi essere vista semplicemente come una
forma di waveshaping modulata ad anello. Quindi possiamo usare le strategie
descritte nel paragrafo 5.2 per generare combinazioni particolari di frequenze.
Ad esempio, se la frequenza portante è la metà della frequenza di modulazione,
si ottiene un suono con armonici dispari esattamente come nell’esempio di octave
divider (Figura 5.10).
La modulazione di frequenza non deve essere limitata a oscillatori portanti o
modulanti puramente sinusoidali. Un strada ben percorsa è quella di effettuare
la modulazione di fase nello spettro della modulazione di fase stessa. Esisto-
no quindi due indici di modulazione (li chiamano a e b) e due frequenze di
modulazione (ωm e ωp ) e la forma d’onda è:

x[n] = cos(ωc n + a cos(ωm n) + b cos(ωp n)).

Per analizzare il risultato, basta riscrivere la serie FM originale, descritta sopra,


sostituendo ovunque ωc n con ωc n + b cos(ωp n). La terza banda laterale positiva
diventa per esempio:

J3 (a) cos((ωc + 3ωm )n + + b cos(ωp n)).
2
Questo è solo un altro spettro FM, con le proprie bande laterali di frequenza

ωc + 3ωm + kωp , k = 0, ±1, ±2, . . .

aventi ampiezza J3 (a)Jk (b) e fase (3 + k)π/2 [Leb77].


5.5. EXAMPLES 145

5.5. Esempi 139

0.5

a=0.15 0
0 2 4 6 8 10 12 14

0.25

a=0.38 0
0 2 4 6 8 10 12 14

0.25

a=0.84 0
0 2 4 6 8 10 12 14
−− partial number −−

Figure
Figura5.16:
5.16: Spectra
Spettri from
dalla phase modulation
modulazione di faseata three different
tre diversi indices.
indici. The
Gli indici
indices are come
sono dati given multipli
as multiples
di 2πofradianti.
2π radians.

L’esempio E10.complex.FM.pd (non mostrato qui) illustra questo procedi-


mento mediante il grafico di uno spettro di uno strumento con due modulatori
FM.
Sin dai primi periodi [Sch77] i ricercatori hanno cercato combinazioni di fasi,
frequenze e indici di modulazione per strumenti di modulazione di fase semplici e
compatti, che riescano a imitare suoni strumentali familiari. Con l’introduzione
dei sintetizzatori FM commerciali questo è diventata un importante ambito
industriale.

Esercizi
1. Un suono ha fondamentale 440. Come potrebbe essere modulato ad anel-
lo per dare un tono a 110 Hertz con solo le parziali dispari? Come si
potrebbero aggiungere le pari se richieste?

2. Una sinusoide con frequenza 400 e ampiezza di picco unitaria è elevata


al quadrato. Quali sono le ampiezze e le frequenze delle componenti del
nuovo segnale?
140 Capitolo 5. Modulazione

3. Quali frequenze portanti e di modulazione vanno considerate per uno stru-


mento FM a due operatori per ottenere frequenze di 618, 1000 e 2618
Hertz? (Questa è una caratteristica di Stria di Chowning [DJ85]).

4. Due sinusoidi con frequenza 300 e 400 Hertz e ampiezza di picco uno
(e quindi l’ampiezza RMS è circa 0.707) vengono moltiplicate. Qual è
l’ampiezza RMS del prodotto?
5. Supponiamo di voler rendere una FM ancora più complicata modulando
l’oscillatore modulante, come in:

cos(ωc n + a cos(ωm n + b cos(ωp n)))

Come, qualitativamente parlando, lo spettro differirà da quello del sem-


plice esempio a due modulatori (paragrafo 5.5)?

6. Una sinusoide a frequenza ω è modulata ad anello da un’altra sinusoide


esattamente alla stessa frequenza. A quali differenze di fase scomparirà la
componente DC del risultato?
Capitolo 6

Progettare spettri

Come suggerito all’inizio del capitolo precedente, un modo potente per sinte-
tizzare i suoni musicali è quello di specificare – e quindi realizzare – specifiche
traiettorie di tono (o, più in generale, di frequenze di parziali), insieme a traiet-
torie di inviluppo spettrale [Puc01]. L’inviluppo spettrale viene utilizzato per
determinare l’ampiezza delle singoli parziali, in funzione delle loro frequenze, e
viene pensato come un controllo del timbro del suono (eventualmente variabile
nel tempo).
Un semplice esempio di ciò potrebbe essere quello di imitare una corda piz-
zicata costruendo un suono con parziali armonicamente distanziate in cui l’invi-
luppo spettrale parte molto ricco ma poi decade in maniera esponenziale con le
frequenze più alte che decadono più velocemente di quelle basse, in modo che il
timbro maturi nel tempo. Sono stati proposti modelli di evoluzione spettrale per
vari strumenti acustici [GM77], [RM69]. Un esempio più complicato è la voce
parlata o cantata, in cui le vocali appaiono come inviluppi spettrali, i dittonghi
e molte consonanti appaiono come variazioni temporali negli inviluppi spettrali
e altre consonanti appaiono come rumore spettralmente formato.
Gli inviluppi spettrali possono essere ottenute dall’analisi dei suoni registra-
ti (sviluppata nel Capitolo 9) o da criteri puramente sintetici. Per specificare,
da zero, un inviluppo spettrale, per ogni frequenza possibile, sarebbe noioso e
nella maggior parte dei casi si vorrebbero descrivere in termini di caratteristiche
salienti. Il modo più noto per farlo è quello di specificare la dimensione e la
forma dei picchi dell’inviluppo spettrale, che sono chiamati formanti. La Figura
6.1 mostra un inviluppo spettrale con due formanti. Anche se le forme dei due
picchi nell’inviluppo spettrale sono differenti, possono essere descritti grossola-
namente dando le coordinate di ciascun apice (che danno la frequenza centrale
e l’ampiezza della formante) e la larghezza di banda di ciascuna formante. Una
misura tipica della larghezza di banda potrebbe essere la larghezza del picco a
un livello di 3 decibel al di sotto del suo apice. Si noti che se il picco è sull’asse
f = 0 (o vicino ad esso), facciamo finta che scenda a sinistra allo stesso tasso
con cui (nella realtà) scende a destra.
Supponiamo che vogliamo generare un suono armonico con un determinato
insieme di formanti. Indipendentemente dalla frequenza fondamentale deside-
rata, vogliamo che lo spettro abbia picchi con frequenze centrali, ampiezze e
larghezze di banda prescritte. Tornando agli spettri di modulazione di fase mo-
strati nella Figura 5.16, vediamo che, almeno a piccoli indici di modulazione,

141
148
142 CHAPTER 6. DESIGNER
Capitolo SPECTRA
6. Progettare spettri

(f , a )
1 1

b
1
(f , a )
2 2

b
ampli- 2
tude

frequency

Figure
Figura6.1:
6.1:AUna
spectral envelope
inviluppo showing
spettrale chethe frequencies,
mostra amplitudes,
le frequenze, and band-
le ampiezze e le
widths of two
larghezze formants.
di banda di due formanti.

bandwidths.
il risultato haReturning
un piccotospettrale
the phase modulation
singolo spectra shown
e ben definito. in Figure
Possiamo 5.16,
immagina-
we see that, at
re l’aggiunta di small indicestutti
più picchi, of modulation
che condividonoat least,
una the result fondamentale
frequenza has a single,
well-defined
(modulante)spectral
ma con peak. Wesintonizzate
portanti can imagine adding armonici
a diversi several ofper
these, all shar-
selezionare le
ing a fundamental
varie (modulating)
frequenze centrali desiderate,frequency but di
e con indici with carriers tuned
modulazione sceltitoper
different
dare le
harmonics
larghezze dito banda
select desiderate.
the various Questo
desired fatto
center frequencies,
è stato studiatoand
perwith indices
la prima of
volta
da Chowning
modulation [Cho89]
chosen che the
to give ha organizzato formanti This
desired bandwidths. generate dallaexplored
was first modulazio-by
ne di fase [Cho89]
Chowning per sintetizzare voci che
who arranged cantano.generated
formants In questobycapitolo stabiliremo un
phase modulation to
quadro generale
synthesize singingper la costruzione
voices. di spettri
In this chapter we’ll armonici
establish con formanti
a general desiderate,
framework for
eventualmente
building harmonicvariabili
spectranelwith
tempo.
desired, possibly time-varying, formants.

6.1 Carrier/modulator
6.1 Modello carrier/modulator
model
In precedenza
Earlier we saw abbiamo
how to use visto come
ring usare la to
modulation modulazione
modify thead anello per
spectrum of modifi-
a peri-
care lo spettro di un segnale periodico, collocando picchi spettrali
odic signal, placing spectral peaks in specified locations (see Figure 5.4, in posizioni
Page
specifiche
125). To do(vedere
so we Figura
need to5.4,be Pagina
able to119). Per fare
generate ciò bisogna
periodic signals essere
whose in grado
spectra
di generare
have maximasegnali
at DC periodici
and fall offi cui spettri abbiano
monotonically with massimi
increasing al frequency.
DC e scendanoIf we
monotonicamente al crescere della frequenza. Se possiamo
can make a signal with a formant at frequency zero—and no other fare un segnale con
formants
besides that one—we can use ring modulation to displace the formant to any–
una formante alla frequenza zero – e nessun altra formante oltre a questa
possiamo
desired usare la modulazione
harmonic. ad anello per
If we use waveshaping spostare the
to generate la formante su qualsiasi
initial formant, the
armonico desiderato. Se usiamo il
ring modulation product will be of the formwaveshaping per generare la formante iniziale,
il prodotto della modulazione ad anello sarà della forma
x[n] = cos(ωc n)f (a cos(ωm n))
x[n] = cos(ωc n)f (a cos(ωm n))
where
dove ωωcc (la
(thefrequenza
carrier frequency)
portante) is
è set to the formant
impostata center frequency
sulla frequenza (a ·
and ffor-
centrale della
cos(ω
mante n)) is a signal with fundamental frequency determined
m e f (a cos(ωm n)) è un segnale con frequenza fondamentale m by ω , produced
determinata
da ωm , prodotto usando una funzione di waveshaping f e un indice a. Que-
sto secondo termine è il segnale che vogliamo dare a una formante sul DC con
una larghezza di banda controllabile. Un diagramma a blocchi per sintetizzare
questo segnale è mostrato in Figura 6.2.
6.1. Modello carrier/modulator 143

6.1. CARRIER/MODULATOR MODEL 149

modulation
frequency

-1
index of
modulation

1
carrier
frequency

-1 1

-1
OUT

Figura 6.2:
Figure 6.2: Waveshaping modulato
Ring modulated ad anello per for
waveshaping la generazione di formanti.
formant generation

using a waveshaping function f and index a. This second term is the signal we
wish to give a formant at DC with a controllable bandwidth. A block diagram
for synthesizing this signal is shown in Figure 6.2.
Much earlier in Section 2.4 we introduced the technique of timbre stretching,
as part of the discussion of wavetable synthesis. This technique, which is capable
of generating complex, variable timbres, can be fit into the same framework. The
enveloped wavetable output for one cycle is:

x(φ) = T (cφ) ∗ W (aφ),

where φ, the phase, satisfies −π ≤ φ ≤ π. Here T is a function stored in a


wavetable, W is a windowing function, and c and a are the wavetable stretching
and a modulation index for the windowing function. Figure 6.3 shows how to
realize this in block diagram form. Comparing this to Figure 2.7, we see that
the only significant new feature is the addition of the index a.
144 Capitolo 6. Progettare spettri

frequency

-1

stretch index

1 1

-1
-M M -N N

OUT

Figure 6.3: Wavetable synthesis generalized as a variable spectrum generator.


Figura 6.3: Sintesi wavetable generalizzata a generatore di spettro variabile.

Molto prima, nel paragrafo 2.4, abbiamo introdotto la tecnica del timbre
stretching, come parte della discussione sulla sintesi wavetable. Questa tecnica,
capace di generare timbri variabili complessi, può essere inserita nello stesso
schema. L’output della wavetable inviluppata, per un ciclo, è:

x(φ) = T (cφ) · W (aφ),

dove φ, la fase, soddisfa −π ≤ φ ≤ π. Qui T è una funzione memorizzata in


una wavetable, W è una funzione di windowing e c e a sono lo stretching della
wavetable e l’indice di modulazione per la funzione di windowing. La Figura 6.3
mostra come realizzarla in forma di diagramma a blocchi. Facendo riferimento
alla Figura 2.7, vediamo che l’unica novità significativa è l’aggiunta dell’indice
a.
In questa configurazione, come nella precedente, il primo termine specifica
il posizionamento di energia nello spettro – in questo caso, con il parametro
c che agisce per allungare lo spettro della wavetable. Questo è il ruolo che è
stato precedentemente effettuato dalla scelta della frequenza portante ωc nella
modulazione ad anello.
Entrambi (waveshaping modulato ad anello e sintesi di stretched wavetable)
possono essere considerati casi particolari di un approccio più generale che è
quello di calcolare funzioni della forma

x[n] = c(ωn)ma (ωn)


6.2. Treni di impulsi 145

dove c è una funzione periodica che descrive il segnale portante, e ma è una


funzione modulante periodica che dipende da un indice a. Le funzioni di modu-
lazione a cui siamo interessati avranno solitamente la forma di treni di impulsi
e l’indice a controllerà la larghezza dell’impulso; valori più alti di a daranno
impulsi più stretti. Nel caso delle wavetables, la funzione di modulazione deve
raggiungere lo zero nei punti di wraparound della fase per sopprimere eventua-
li discontinuità nella funzione portante quando la fase si avvolge. Il segnale
portante darà luogo ad un singolo picco spettrale (una formante) nel caso di
waveshaping modulato ad anello; per le wavetables, può avere uno spettro più
complicato.
Nel prossimo paragrafo svilupperemo ulteriormente le due forme di segnale
modulante che abbiamo introdotto qui e nel successivo verrà esaminato più
attentamente il segnale portante.

6.2 Treni di impulsi


I treni di impulsi possono essere generati utilizzando il waveshaping o la stret-
ched wavetable. La formulazione tramite waveshaping è più facile da analizzare
e controllare, e la studiamo per prima.

6.2.1 Treni di impulsi tramite waveshaping


Quando si utilizza il waveshaping, la forma della formante è determinata da un
termine di modulazione
ma [n] = f (a cos(ωn)).
Per valori piccoli dell’indice a, il termine di modulazione varia solo leggermente
dal valore costante f (0), pertanto la maggior parte dell’energia è concentrata
sul DC. All’aumentare di a, l’energia si diffonde tra gli armonici progressiva-
mente più alti rispetto alla fondamentale ω. A seconda della funzione f , questa
diffusione può essere ordinata o disordinata. Una diffusione ordinata può es-
sere auspicabile oppure no, a seconda che il nostro obiettivo sia uno spettro
prevedibile o una vasta gamma di spettri diversi (e forse difficile da prevedere).
La funzione di waveshaping f (x) = ex , analizzata a pagina 134, fornisce ri-
sultati che si comportano bene, semplici e prevedibili. Dopo aver adeguatamente
normalizzato, abbiamo ottenuto gli spettri mostrati in Figura 5.13. Una legge-
ra riscrittura del modulatore di waveshaping per questa scelta di f (e tenendo
conto della ri-normalizzazione) dà:
ω 2
ma [n] = ea·(cos(ωn)−1)) = e−[b sin 2]

dove b2 = 2a in modo che b sia proporzionale alla larghezza di banda. Questo


può essere riscritto come
ω
ma [n] = g(b sin n)
2
con 2
g(x) = e−x .
Ad eccezione di un fattore di normalizzazione mancante, si tratta di una di-
stribuzione gaussiana, a volte chiamata “curva a campana”. Le ampiezze degli
armonici sono date dalle funzioni di Bessel di tipo “I”.
146 Capitolo 6. Progettare spettri

Un’altra scelta ottimale è la distribuzione di Cauchy (ancora non normaliz-


zata):
1
h(x) =
1 + x2
che dà origine ad uno spettro di armonici che decadono esponenzialmente:
 
ω 1 2
h(b sin( n)) = G · + H cos(ωn) + H cos(2ωn) + · · ·
2 2
dove G e H sono in funzione dell’indice b (formule esplicite sono fornite in
[Puc95a]).
Sia in questo caso che nel caso gaussiano sopra, la larghezza di banda (conta-
ta in picchi, cioè in unità di ω) è approssimativamente proporzionale all’indice b
e l’ampiezza del termine DC (l’apice dello spettro) è approssimativamente pro-
porzionale a 1/(1 + b). Per entrambe le funzioni di waveshaping (g o h), se b è
maggiore di circa 2, la waveshape (forma dell’onda) di ma (ωn) è circa una scan-
sione (avanti o indietro) della funzione di trasferimento, in modo che la forma
d’onda risultante appaia come impulsi la cui larghezza diminuisce all’aumentare
della larghezza di banda specificata.

6.2.2 Treni di impulsi tramite wavetable stretching


Nella formulazione wavetable, un treno di impulsi può essere fatto tramite una
stretched wavetable:
Ma (φ) = W (aφ),
dove −π ≤ φ ≤ π è la fase, vale a dire il valore ωnche subisce il wrapping per
trovarsi tra −π e π. La funzione W deve essere zero nei punti −π e π e al di
fuori di questo intervallo, e salire fino ad un massimo in 0. Una possibile scelta
per la funzione W è
1
W (φ) = (cos(φ) + 1)
2
che viene illustrata nella parte (a) di Figura 6.4. Questa è noto come la funzione
finestra di Hann; verrà ripresa nel Capitolo 9.
Realizzando questa come una forma d’onda ripetuta, otteniamo una succes-
sione di copie (opportunamente campionate) della funzione W , il cui duty cycle
è 1/a (parti (b) e (c) della figura). Se non si desidera che le copie si sovrapponga-
no l’indice a deve essere almeno 1. Se si desidera consentire la sovrapposizione,
la strategia più semplice è duplicare il diagramma a blocchi (Figura 6.3) fuori
fase, come descritto nel paragrafo 2.4 e realizzato nel paragrafo 2.6.

6.2.3 Spettri risultanti


Prima di considerare segnali portanti più complessi da utilizzare con i modula-
tori che abbiamo visto finora, è istruttivo vedere che cosa ci dà, in termini di
forme d’onda e spettri, la moltiplicazione per una sinusoide pura. La Figura 6.5
mostra il risultato di moltiplicare due treni di impulsi diversi per una sinusoide
alla sesto parziale:
cos(6ωn)Ma (ωn)
dove l’indice della modulazione a è due in entrambi i casi. Nella parte (a) Ma è la
funzione, allungata, della finestra di Hann; la parte (b) mostra il waveshaping
6.2. PULSE TRAINS 153

6.2. Treni di impulsi 147

(a)

(b)

(c)

Figure
Figura6.4:
6.4: Pulse width modulation
Modulazione using
di larghezza the von Hann
dell’impulso usandowindow function:
la funzione (a)
finestra
the function
di Hann: (a)Wla(φ)funzione
= (1 + Wcos(φ))/2;
(φ) = (1(b) the function
+ cos(φ))/2; (b)aslaafunzione
waveform, repeated
come forma
atd’onda,
a dutyripetuta
cycle ofcon100% (modulation
duty index(indice
cycle del 100% a = 1);di(c) the waveform
modulazione a = at
1);a(c)
50% la
forma
duty
154 d’onda
cycle (a =con2). duty cycle del 50% (a = 2).
CHAPTER 6. DESIGNER SPECTRA

(a)

(b)

Figure 6.5: Audio signals resulting from multiplying a cosine (partial number
Figura 6.5: Segnali audio risultanti dalla moltiplicazione di un coseno (numero di
6) by pulse trains: (a) windowing function from the wavetable formulation; (b)
parziale 6) per un treno di impulsi: (a) funzione di windowing dalla formulazione
waveshaping output using the Cauchy lookup function.
wavetable; (b) output del waveshaping utilizzando la funzione di Cauchy.

6.2.3 Resulting spectra


Before considering more complicated carrier signals to go with the modulators
we’ve seen so far, it is instructive to see what multiplication by a pure sinusoid
gives us as waveforms and spectra. Figure 6.5 shows the result of multiplying
two different pulse trains by a sinusoid at the sixth partial:

cos(6ωn)Ma (ωn)
148 Capitolo 6. Progettare spettri

attraverso la distribuzione non-normalizzata di Cauchy. Viene mostrato un


periodo di ciascuna forma d’onda.

In entrambe le situazioni vediamo, in effetti, il sesto armonico (il segnale


portante) inviluppato in un pacchetto d’onda centrato al centro del ciclo, dove
la fase della sinusoide è zero. Cambiando la frequenza della sinusoide cambia
la frequenza centrale della formante; cambiando la larghezza del pacchetto (la
proporzione della forma d’onda durante la quale la sinusoide è forte) cambia la
larghezza di banda. Si noti che la funzione allungata della finestra di Hann è
zero all’inizio e alla fine del periodo, a differenza del pacchetto di waveshaping.
La Figura 6.6 mostra come la forma della formante dipenda dal metodo di
produzione. La stretched wavetable (parte (a) della figura) si comporta bene
nell’intorno del picco, ma qualcosa di sbagliato inizia alla distanza della quarta
parziale dal picco, al di là della quale si vedono i cosiddetti sidelobes: picchi
extra spuri ad ampiezza più bassa rispetto al picco centrale. Come prevede
l’analisi nel paragrafo 2.4, l’intera formante, i sidelobes e tutto, si estende o si
contrae in modo inverso a come il treno di impulsi viene contratto o allungato
nel tempo.
I primi sidelobes più forti su entrambi i lati sono circa 32 dB più bassi, in
ampiezza, rispetto al picco principale. Ulteriori sidelobes decadono lentamente
quando espressi in decibel; le ampiezze diminuiscono come il quadrato della
distanza dal picco centrale in modo che il sesto sidelobe a destra, tre volte più
lontano che il primo dalla frequenza centrale, è di circa venti decibel più in
basso. L’effetto di questi sidelobes è spesso udibile come un leggero rumore nel
suono.

La forma di questa formante può essere fatta arbitrariamente “grassa” (cioè


con larghezza di banda molto larga), ma c’è un limite per quanto sia invece pos-
sibile farla sottile, in quanto il duty cycle della forma d’onda non può superare
il 100%. A questo duty cycle massimo la forza della formante scende a zero alla
distanza di due armonici dal picco centrale. Se è necessaria una larghezza di
banda inferiore, le forme d’onda possono essere sovrapposte come descritto nel
paragrafo 2.6.
Le parti (b) e (c) della figura mostrano formanti generate utilizzando un
waveshaping modulato ad anello, con funzioni di trasferimento gaussiana e di
Cauchy. L’indice di modulazione è due in entrambi i casi (lo stesso per la
finestra di Hann della parte (a)) e la larghezza di banda è paragonabile a quella
dell’esempio di Hann. In questi esempi non ci sono sidelobes e, inoltre, l’indice
di modulazione può essere lasciato scendere fino a zero, fornendo una sinusoide
pura; non esiste alcun limite inferiore sulla larghezza di banda. D’altra parte,
poiché la forma d’onda non raggiunge lo zero alle estremità di un ciclo, questo
tipo di treno di impulsi non può essere usato per creare una finestra su una
wavetable arbitraria, come potrebbe invece fare il treno di impulsi Hann.
L’esempio di Cauchy è particolarmente utile per la progettazione di spettri,
in quanto la forma della formante è un triangolo isoscele perfetto, quando viene
rappresentato in decibel. D’altra parte, l’esempio gaussiano raccoglie più energia
verso la formante e scende più velocemente alle code, e cosı̀ ha un suono più
pulito e offre una migliore protezione contro il foldover.
6.3. Modulazione ad anello mobile 149

6.2. PULSE TRAINS 155

Hann
100

80

60

40

20

Gaussian
100

80

60

40

20

Cauchy
100

80

60

40

amplitude
20
(dB)

0 2 4 6 ...
partial number

Figura 6.6: Spettri di tre treni di impulsi modulati ad anello: (a) la funzione
Figure
di 6.6:di Spectra
finestra of three
Hann, con ring-modulated
duty cycle pulse trains: (a)
del 50% (corrispondente theindice
ad un von Hann
di 2);
window function, 50% duty cycle (corresponding to an index of 2); (b) a wave-
(b) un treno di impulsi waveshaping che utilizza una funzione di trasferimento
shaping pulse train using a Gaussian transfer function; (c) the same, with a
gaussiana; (c) lo stesso, ma con una funzione di trasferimento di Cauchy. Le
Cauchy transfer function. Amplitudes are in decibels.
ampiezze sono in decibel.
150 Capitolo 6. Progettare spettri
6.3. MOVABLE RING MODULATION 157

Figure 6.7:
Figura 6.7: Waveform for a wavetable-based
Forma d’onda per un segnale carrier signal
portante tunedsutowavetable,
basato 1.5 times
the fundamental.
sintonizzato a 1.5 Two
volte periods are shown.Sono mostrati due periodi.
la fondamentale.

the left hand


6.3 side would hold aad
Modulazione sinusoid (placedmobile
anello symmetrically so that the phase
is zero at the center of the wavetable). The right-hand-side wavetable would
hold a Hannadesso
Ritorniamo or other al appropriate
segnale portante,window function.
cercando deiIfmodi
we desire the fundamental
per renderlo più con-
frequency to be ω, the formant center frequency
trollabile. Ci piacerebbe soprattutto poter scorrere continuamente to be ω c , and the bandwidth to
l’energia
be ω b
spettrale, we set the “stretch” parameter to the center frequency
su e giù in frequenza. Usare semplicemente una rampa sulla frequenza quotient defined
as ωc /ω, and the
dell’oscillatore index of
portante nonmodulation to the scopo,
va bene a questo bandwidth quotient,
in quanto ωb /ω. non sa-
gli spettri
The output signal is simply a sample of a cosine wave
ranno armonici, tranne quando la portante è un multiplo intero della frequenza at the desired center
frequency,
fondamentale. repeated at the (unrelated in general) desired period, and windowed
to take out the discontinuities at period boundaries.
Nell’approccio con la stretched wavetable, possiamo riuscirci semplicemen-
Although we aren’t able to derive this result yet (we will need Fourier anal-
te campionando una sinusoide e trasportandola al “tono” desiderato. Il tono
ysis), it will turn out that, in the main lobe of the formant, the phases are all
trasposto non viene ascoltato come una periodicità poiché la wavetable stessa
zero at the center of the waveform (i.e., the components are all cosines if we con-
viene letta periodicamente alla frequenza fondamentale. Invece, la sinusoide è
sider the phase to be zero at the center of the waveform). This means we may
trasposta come fosse un inviluppo spettrale.
superpose any number of these formants to build a more complex spectrum and
La Figura 6.7 mostra un segnale portante prodotto in questo modo, sintoniz-
the amplitudes of the partials will combine by addition. (The sidelobes don’t
zato per produrre una formante centrata a 1.5 volte la frequenza fondamentale.
behave so well: they are alternately of opposite sign and will produce cancella-
Il segnale non ha una discontinuità palese alla frequenza di wraparound della
tion patterns; but we can often just shrug them off as a small, uncontrollable,
fase, ma ha una discontinuità nella pendenza, che, se non viene rimossa ap-
residual signal.)
plicando un adeguato segnale di modulazione, comporterebbe delle componenti
This method leads to an interesting generalization, which is to take a se-
molto udibili ad alte frequenze.
quence of recorded wavetables, align all their component phases to those of
Utilizzando
cosines, and usequesta
them inidea possiamo
place fare una
of the cosine descrizione
function completa
as the carrier di come
signal. The
utilizzare il diagramma a blocchi della Figura 6.3 per
phase alignment is necessary to allow coherent cross-fading between samples produrre una forman-so
te
thatdesiderata.
the spectral La envelope
wavetablecan lookup
change sulsmoothly.
lato sinistro produrrebbe
If, for example, we unausesinusoide
succes-
(posizionata
sive snippetssimmetricamente
of a vocal sampleinas modo chewe
input, la fase
get asiastrikingly
zero al centro dellavocoder;
effective waveta-
ble). La wavetable
see Section 9.6. sul lato destro produrrebbe una Hann o un’altra appropriata
funzione
Anotherfinestra. Se vogliamo
technique for makingche la frequenza
carrier signals fondamentale
that can besia slidω,continuously
la frequenza
centrale della formante
up and down in frequency while sia ω c e la larghezza di banda
maintaining a fundamental sia ω , dobbiamo
b frequency is imposta-
simply
re il parametro “stretch” alla frequenza centrale
to cross-fade between harmonics. The carrier signal is then: quoziente definita come ωc /ω e
l’indice di modulazione alla larghezza di banda quoziente, ωb /ω.
c(φ) =èc(ωn)
Il segnale di uscita = p cos(kωn)
semplicemente un + q cos((k
sample di +un’onda
1)ωn) cosinoidale alla
frequenza centrale desiderata, ripetuta al periodo desiderato (non-correlato in
where p + q = 1 and k is an integer, all three chosen so that
genere) e ristretto a una finestra per eliminare le discontinuità agli estremi del
periodo. (k + q) ∗ ω = ωc
Benché non possiamo ancora trarre questo risultato (avremo bisogno dell’a-
nalisi di Fourier), si scoprirà che, nel lobo principale della formante, le fasi sono
tutte zero al centro della forma d’onda (cioè, le componenti sono tutte coseni
se consideriamo che la fase sia zero al centro della forma d’onda). Ciò significa
6.3. Modulazione ad anello mobile 151

che possiamo utilizzare qualsiasi numero di queste formanti per costruire uno
spettro più complesso e le ampiezze delle parziali si combinano tramite somma
(i sidelobes non si comportano cosı̀ bene: sono alternativamente di segno con-
trario e producono schemi di cancellazione, ma spesso possiamo semplicemente
rimuoverli come un piccolo e incontrollabile segnale residuo).
Questo metodo porta ad una generalizzazione interessante, cioè a prendere
una sequenza di wavetables registrate, allineare tutte le fasi delle loro compo-
nenti a quelle dei coseni e utilizzarle al posto della funzione coseno come segnale
portante. L’allineamento delle fasi è necessario per consentire una dissolvenza
incrociata coerente tra i samples in modo che l’inviluppo spettrale possa cam-
biare senza problemi. Se, ad esempio, utilizziamo frammenti successivi di un
sample vocale come input, otteniamo un vocoder straordinariamente efficace; si
veda il paragrafo 9.6.
Un’altra tecnica per produrre segnali portanti, che possano essere mossi con-
tinuamente su e giù in frequenza pur mantenendo una frequenza fondamentale,
è semplicemente quella di usare una dissolvenza incrociata tra gli armonici. Il
segnale portante è quindi:
c(φ) = c(ωn) = p cos(kωn) + q cos((k + 1)ωn)
dove p + q = 1 e k è un intero, tutti e tre scelti in modo che
(k + q) · ω = ωc
in modo che il centro spettrale della massa dei due coseni sia posto a ωc (si noti
che impostiamo le ampiezze dei due coseni in modo che la loro somma sia uno
invece di impostare la potenza totale a uno; facciamo questo perché il modu-
latore agirà su essi coerentemente in fase). Per fare ciò, basta semplicemente
scegliere k e q come la parte intera e la parte frazionaria, rispettivamente, della
frequenza centrale quoziente ωc /ω.
Il modo più semplice di realizzare un’interfaccia di controllo per questa tec-
nica di sintesi sarebbe quello di utilizzare rampe per aggiornare ω e ωc e quindi
calcolare q e k come segnali audio da ω e ωc , uniformemente variabili nelle ram-
pe. Stranamente, nonostante il fatto che k, p e q siano funzioni discontinue
di ωc /ω, la portante c(φ) risulta variare in modo continuo con ωc /ω e quindi
se la frequenza centrale desiderata ωc passa, tramite una rampa, da un valore
a un altro valore, il risultato è un cambiamento continuo nella frequenza cen-
trale. Tuttavia, è necessario un maggior lavoro se sono necessari cambiamenti
discontinui nella frequenza centrale. Questa non è una cosa irragionevole da
desiderare, essendo analoga a cambiare la frequenza di un oscillatore in modo
discontinuo.
C’è un ottimo modo per fare questo. Il trucco per l’aggiornamento di k
e q è quello di osservare che c(φ) = 1 ogni volta che φ è un multiplo di 2π,
indipendentemente dalla scelta di k, p e q finché p + q = 1. Quindi possiamo
fare cambiamenti discontinui in k, p e q una volta per periodo (proprio quando
la fase è un multiplo di 2π), senza creare discontinuità nel segnale portante.
Nel caso specifico della FM, se vogliamo, possiamo ora tornare indietro e
modificare la formulazione originale a:
p cos(nω2 t + r cos(ω1 t))+

+q cos((n + 1)ω2 t + r cos(ω1 t)).


152 Capitolo 6. Progettare spettri

Ciò consente di aggiungere glissandi (udibili come dittonghi) alla tecnica origi-
nale di sintesi vocale basata sulla modulazione di fase di Chowning.

6.4 Phase-aligned formant generator (PAF)

Combinando il segnale portante di due coseni con il generatore di impulsi


waveshaping, si ottiene il generatore di formante allineata in fase (phase-aligned
formant generator), chiamato solitamente col suo acronimo PAF (il PAF è og-
getto di un brevetto del 1994 di proprietà dell’IRCAM). La formula combinata

x[n] = g(a sin(ωn/2)) [p cos(kωn) + q cos((k + 1)ωn)] .
| {z }| {z }
modulatore portante

Qui la funzione g può essere sia la funzione di waveshaping gaussiana o quella


di Cauchy, ω è la frequenza fondamentale, a è un indice di modulazione che
controlla la larghezza di banda e k, p e q controllano la frequenza centrale della
formante.
La Figura 6.8 mostra il PAF con un diagramma a blocchi, separato in un
blocco per la generazione di fase, uno per la portante e uno per il modulato-
re. Il blocco per la generazione di fase emette un segnale a dente di sega alla
frequenza fondamentale. Il modulatore è fatto con un waveshaping standard,
con una leggera torsione aggiunta. La formula per il segnale modulante, nel
PAF, richiede in input una sinusoide a metà della frequenza fondamentale, cioè
sin( ω2 ), e ciò richiederebbe di utilizzare un phasor con frequenza metà di quella
fondamentale. Tuttavia, poiché la funzione di waveshaping è pari, possiamo
sostituire con il valore assoluto della sinusoide:
ω

sin( )
2
che si ripete alla frequenza ω (il primo mezzo ciclo è lo stesso del secondo).
Possiamo calcolarlo semplicemente usando mezzo ciclo di una sinusoide come
funzione di ricerca su wavetable (con fase che va da −π/2 a π/2), ed è questa
sinusoide rettificata che passiamo alla funzione di waveshaping.
Anche se la funzione wavetable è rappresentata da valori sia negativi che po-
sitivi (con range da −10 a 10), in realtà stiamo utilizzando solo la parte positiva
per la ricerca, da 0 a b, che è l’indice di modulazione. Se l’indice di modulazione
supera l’intervallo di input della tabella (qui impostato per fermarsi a 10, come
esempio), l’indirizzo della ricerca della tabella dovrebbe essere tagliato. La ta-
bella dovrebbe estendersi abbastanza sulla coda della funzione di waveshaping
in modo che l’effetto del taglio non sia udibile.
Il segnale portante è una somma pesata di due coseni, le cui frequenze sono
aumentate per moltiplicazione (rispettivamente per k e k + 1) e subiscono suc-
cessivamente un’operazione di wrapping. In questo modo tutte le fasi di ricerca
sono controllate dallo stesso oscillatore a dente di sega.
Le quantità k, q e l’indice di wavetable b sono calcolate come mostrato
nella Figura 6.9. Sono in funzione della frequenza fondamentale specificata,
della frequenza centrale della formante e della larghezza di banda, che sono i
parametri di partenza dell’algoritmo. La quantità p, non mostrata in figura, è
pari a 1 − q.
6.4. Phase-aligned formant generator (PAF) 153

6.4. PHASE-ALIGNED FORMANT (PAF) GENERATOR 159

phase generator

fundamental
frequency
phase
trigger
S/H

modulator carrier

k k+1

WRAP WRAP
0 1

0 1 0 1

p q
-10 10

OUT

Figura 6.8:6.8:
Figure Diagramma a blocchi del
The PAF generator as ageneratore PAF.
block diagram.
154 Capitolo 6. Progettare spettri
6.4. PHASE-ALIGNED FORMANT (PAF) GENERATOR 161

center
frequency
bandwidth
fundamental
frequency fundamental
frequency

phase
phase
trigger
trigger
S/H
S/H

WRAP
b

Figure 6.9: Calculation of the time-varying parameters a (the waveshaping in-


Figura 6.9: Calcolo dei parametri, variabili nel tempo, a (l’indice di
dex), k, and q for use in the block diagram of Figure 6.8.
waveshaping), k e q, per l’utilizzo nel diagramma a blocchi di Figura 6.8.

the Come
center descritto
partial’s amplitude.
nel paragrafo However, if using
precedente, the PAF k,
le quantità to generate formants
p, e q dovrebbero
with
cambiare solo nei punti di wraparound della fase, cioè a periodi di 2π/ω. +Poiché
specified peak amplitudes, the output should be multiplied by 1 b (or
even, if necessary, a better approximation of the correction
il calcolo di k, p e q dipende dal valore del parametro ω, ne consegue che ω factor, whose exact
value
stessadepends
deve essereon the waveshaping
aggiornata function).
solo quando This
la fase amplitude
è un multiplocorrection should
di 2π; altrimenti
be ramped, not sampled-and-held.
una modifica di ω potrebbe inviare la frequenza centrale (k + q)ω ad un valore
Since
errato perthe
unaexpansion
frazione of the waveshaping
(comunque (modulator)
molto udibile) signal consists
di un periodo. of alltutti
In effetti, co-
sine termsdei
i calcoli (i.e., since they
parametri all have
devono initial
essere phase zero),con
sincronizzati as dola the
fasetwo components
dell’oscillatore
of the carrier, it follows from the cosine product formula that the components
originale.
of theUna result
voltaarecheallsicosines as well. This
ha il controllo della means that any number
fase dell’oscillatore, of PAF gen-
l’aggiornamento
erators,
della suaiffrequenza
they are made to sharedithe
è un esempio same oscillator
feedback, for phase
che in generale generation,
significa will
ri-utilizzare
all be in phase
l’output and combining
di qualsiasi processo them come gives
uno deithesuoi
suminputs.
of the individual
Quando sispectra.
elaborano So
we can make
segnali audioadigitali
multiple-formant
a una frequenzaversion di as campionamento
shown in Figure fissa 6.10. (come stiamo
Figure non
facendo), 6.12 èshows a possibleavere
mai possibile output of a pair
l’output of formants
corrente generated
del processo come thisinput,
way;
the firstnel
poiché formant
momento is centered
in cui ne halfway
avremmobetweenbisogno,partials 3 and 4,ancora
non l’abbiamo and the second
calcolato.
at partial che
Il meglio 12, possiamo
with lowersperareamplitude and bandwidth.
è utilizzare il precedente Thecampione
Cauchy waveshaping
in output –
function
in effetti,was used, whichun
aggiungendo makes linearly
campione di sloped
ritardo. spectra
Negli(viewed
ambienti in con
dB).strutture
The two
superpose
a blocchi (comeadditively,
Max,soPdthat the spectral
e Csound) envelopediventa
la situazione curves piùsmoothly from one
complicata, ma
formant
aspettiamo to the other. The
a discuterne finolower formant capitolo
al prossimo also adds (e to its own reflection
semplicemente about
eliminiamo
the vertical axis,
il problema negli so that it
esempi appears
alla fine di slightly
questo).curved upward there.
L’ampiezza
The del picco
PAF generator cancentrale
be alterednelloif desired
spettro to delmake
generatore
inharmonicPAF spectra
è di circaby
1/(1 +the
sliding b); partials
in altreupward
parole, orè downward
vicino all’unità quando To
in frequency. l’indice
do this,b èadd
piùa piccolo
second
di uno, etodiminuisce
oscillator the phase of inversamente
both carrieral crescere
cosines, butdinot b. toPer
the valori
phase di b minori
of the modula- di
circa 10, l’intensità dell’output non varia notevolmente, poiché l’introduzione di
altre parziali, anche a basse ampiezze, compensa la diminuzione dell’ampiezza
della parziale centrale. Tuttavia, se si utilizza il PAF per generare formanti
162 CHAPTER 6. DESIGNER SPECTRA

6.4. Phase-aligned formant generator (PAF) 155

fundamental
frequency

phase
generation

k1, k2,
b1 p1, q1 b2 p2, q2

modulator 1 carrier 1 modulator 2 carrier 2

OUT

Figure 6.10:
Figura 6.10: Block diagram
Diagramma for making
a blocchi a spectrumuno
per realizzare with two formants
spettro con due using the
formanti
PAF generator.
utilizzando il generatore PAF.

con ampiezze di picco specificate, l’output deve essere moltiplicato per 1 + b (o


anche, se necessario, per una migliore approssimazione del fattore di correzione,
il cui valore esatto dipende dalla funzione di waveshaping). Questa correzione
dell’ampiezza deve essere fatta tramite una rampa, e non con la tecnica del
sample-and-hold.
Poiché l’espansione del segnale (modulatore) di waveshaping è costituita da
termini che sono tutti coseni (vale a dire, poiché hanno tutti fase iniziale pari a
zero), cosı̀ come le due componenti della portante, ne deriva, dalla formula del
prodotto del coseno, che anche le componenti risultanti sono tutte coseni. Ciò
significa che qualunque numero di generatori PAF, se condividono lo stesso oscil-
latore per la generazione di fase, saranno tutti in fase e combinandoli otterremo
la somma dei singoli spettri. Quindi possiamo fare una versione multiformante
come mostrato in Figura 6.10.
La Figura 6.11 mostra un possibile output di una coppia di formanti generati
in questo modo; la prima formante è centrata a metà tra i parziali 3 e 4 e la
seconda è al parziale 12, con minore ampiezza e minore larghezza di banda.
È stata utilizzata la funzione di waveshaping di Cauchy, che produce spettri
linearmente inclinati (visualizzati in dB). Le due formanti si sovrappongono
6.5. EXAMPLES 163
156 Capitolo 6. Progettare spettri

.
100

80
ampli-
tude 60
(dB)
40

20

0 2 4 6 ...
partial number

Figura 6.11:
Figure Spettro
6.11: ottenuto
Spectrum fromdaaun generatore PAF
two-formant PAF agenerator.
due formanti..

tionadditivamente, in modo che


portion of the diagram, l’inviluppo
nor to spettrale
the controlling curvi
phase of regolarmente da una
the sample-and-hold
formante
units. It turnsall’altra.
out thatLa theformante inferiore aggiunge
sample-and-hold strategy anche la propria
for smooth riflessione
parameter up-
sull’asse verticale, in modo che l’inviluppo spettrale appaia
dates still works; and furthermore, multiple PAF generators sharing the same leggermente curvo
verso
phase l’alto. portion will still be in phase with each other.
generation
This technique PAF
Il generatore può essere modificato,
for superposing spectra doesse desiderato,
not workper as fare spettri inar-
predictably for
monici facendo scorrere le parziali verso l’alto o verso il basso
phase modulation as it does for the PAF generator; the partials of the phase in frequenza. Per
fare questo,
modulation aggiungiamo
output un secondo
have complicated oscillatore
phase alla fase
relationships anddithey
entrambi i coseni
seem difficult
portanti, ma non alla fase della parte di modulazione del diagramma, né alla fase
to combine coherently. In general, phase modulation will give more complicated
di controllo dell’unità di sample-and-hold. Risulta che la strategia di sample-
patterns of spectral evolution, whereas the PAF is easier to predict and turn to
and-hold per l’aggiornamento regolare dei parametri funziona ancora; e inoltre,
specific desired effects.
i generatori multipli PAF che condividono la stessa porzione di generazione di
fase saranno ancora in fase l’uno con l’altro.
6.5bile,Questa tecnica per la sovrapposizione di spettri non funziona, come prevedi-
Examples
per la modulazione di fase come invece fa per il generatore PAF; le parziali
dell’output della modulazione di fase hanno complesse relazioni di fase e sem-
Wavetable pulse
brano difficili train coerentemente. In generale, la modulazione di fase
da combinare
darà schemi
Example più complicati
F01.pulse.pd (Figure di evoluzione
6.13) generates spettrale, mentre il pulse
a variable-width PAF ètrain
più using
facile
da prevedere e si rivolge a specifici effetti desiderati.
stretched wavetable lookup. Figure 6.14 shows two intermediate products of the
patch and its output. The patch carries out the job in the simplest possible way,
placing the pulse at phase π instead of phase zero; in later examples this will
6.5 by Esempi
be fixed adding 0.5 to the phase and wrapping.
The initial phase is adjusted to run from -0.5 to 0.5 and then scaled by a
Trenoofdiat impulsi
multiplier least one,wavetable
resulting in the signal of Figure 6.14 (part a); this
corresponds to the output of the *~ object, fifth from bottom in the patch
L’esempio
shown. F01.pulse.pd
The graph in part (Figura
(b) shows6.12)
thegenera
result un treno di impulsi
of clipping a larghezza
the sawtooth wave
variabile usando stretched wavetable lookup. La Figura 6.13 mostra due pro-
back to the interval between −0.5 and 0.5, using the clip~ object. If the scaling
dotti intermedi della patch ed i suoi outputs. La patch svolge il lavoro nel
multiplier were at its minimum (one), the sawtooth would only range from -0.5
modo più semplice possibile, ponendo l’impulso a fase π anziché a fase zero;
negli esempi successivi questo sarà stabilito aggiungendo 0.5 alla fase e facendo
successivamente wrapping.
6.5. Esempi 157

6.5. EXAMPLES 165

0 <-frequency
phasor~
-~ 0.5 0-centered sawtooth

0 <-index
/ 10 ...in tenths
pack 0 50
line~ smooth it
+~ 1 add 1

*~ increase amplitude of sawtooth


clip~ -0.5 0.5 clip to range -1/2 to 1/2
cos~ cosine wave lookup (-1/2 and 1/2 give -1)
+~ 1 add one (range now from 0 to 2)
*~ 0.5 ...and now from 0 to 1
|
(OUT)

Figura 6.13:
Figure 6.12: Example
L’esempio della
patch patch F01.pulse.pd,
F01.pulse.pd, che sintetizza
which synthesizes a pulseun treno
train di
using
impulsi utilizzando
stretched wavetable la stretched wavetable lookup.
lookup.
166 CHAPTER 6. DESIGNER SPECTRA

158 Capitolo 6. Progettare spettri

phase
(a)
0.5

-0.5

clipped

(b) 0.5

-0.5

output
1

(c)

Figure
Figura 6.14:
6.13: Intermediate
Segnali audioaudio signals
intermedi da from Figure
Figura 6.12: 6.13:
(a) il (a) the result
risultato of
di mol-
multiplying
tiplicare
6.5. the phasor by the “index”; (b) the same, clipped to lie between -0.5
il phasor per un “indice”; (b) lo stesso, ristretto fra −0.5 e 0,5; 167
EXAMPLES (c)
and 0.5; (c) the output.
l’output.

RING MODULATED PULSE TRAINS

0 <-- bandwidth
pd pulse-train pulse train
generator from before

0 <-- carrier frequency as


multiple of fundamental
* r freq
osc~ carrier oscillator

*~
|
(OUT)

Figure 6.15: Excerpt from example F05.ring.modulation.pd combining ring


Figura 6.14:with
modulation Estratto dall’esempio
a stretched wavetableF05.ring.modulation.pd
pulse generator che combina la
modulazione ad anello con un generatore di impulsi da stretched wavetable.

the carrier signal is a broken sinusoid. Since its phase is the fundamental phase
times the center frequency quotient, the sample-to-sample phase increment is
the same as for a sinusoid at the center frequency. However, when the phase
wraps around, the carrier phase jumps to a different place in the cycle, as was
illustrated in Figure 6.7. Although the bandwidth quotient ωb /ω must be at
least one, the center frequency quotient ωc /ω may be as low as zero if desired.

Two-cosine carrier signal


6.5. Esempi 159

La fase iniziale viene regolata per muoversi tra −0.5 e 0.5 e poi scalata con un
moltiplicatore il cui valore è almeno 1, determinando il segnale di Figura 6.13
(parte a); questo corrisponde all’output dell’oggetto ∗ ∼, il quinto dal basso
nella patch mostrata. Il grafico nella parte (b) mostra il risultato di ritagliare
l’onda a dente di sega nell’intervallo tra −0.5 e 0.5, usando l’oggetto clip∼.
Se il moltiplicatore riscalante era al suo minimo (uno), il range dell’onda a
dente di sega sarebbe comunque solo da −0.5 a 0.5 ed il wrapping non avrebbe
alcun effetto. Per qualsiasi valore del moltiplicatore riscalante maggiore di uno,
l’output del clipping starebbe sul valore −0.5, quindi sale a 0.5, infine sta su 0.5.
Più alto è il moltiplicatore, più rapidamente la forma d’onda sale e più tempo
spende negli estremi in basso e in alto.
Successivamente l’oggetto cos∼ converte questa forma d’onda in un impulso.
Gli inputs pari a −0.5 e 0.5 vanno entrambi a −1 (sono separati da un ciclo); al
punto centrale della forma d’onda, l’input è 0 e l’output è quindi 1. L’output,
quindi, si trova a −1, traccia un ciclo completo della funzione coseno, poi torna
indietro e si ferma a −1. La percentuale di tempo che la forma d’onda spende
percorrendo la funzione coseno è divisa per il moltiplicatore; quindi è il 100%
per un moltiplicatore di 1, 50% per 2 e cosı̀ via. Infine, l’output degli impulsi
viene regolato per avere un range tra 0 e 1; questo è illustrato nella parte (c)
della figura.

Generatore semplice di formante


I tre esempi successivi mostrano il suono della larghezza variabile dell’impulso,
visualizzano il suo spettro e mostrano il contrasto col generatore di impulsi wa-
veshaping. Saltando all’esempio F05.ring.modulation.pd (Figura 6.14), mostria-
mo il modo più semplice di combinare il generatore di impulsi con un oscillatore
modulante ad anello per fare una formante. Il treno di impulsi dell’esempio
precedente è contenuto nella sottopatch pd pulse-train. Questo viene mol-
tiplicato per un oscillatore la cui frequenza è regolata come un multiplo della
frequenza fondamentale. Se il multiplo è un intero, si ottiene un suono armonico.
Non viene fatto alcun tentativo di controllare le fasi relative delle componenti
del treno di impulsi e della sinusoide portante.
L’esempio seguente, F06.packets.pd (Figura 6.15), mostra come combinare il
treno a impulsi, ottenuto con stretched wavetable, con una sinusoide campionata
per realizzare formanti mobili, come descritto nel paragrafo 6.3. Il generatore
di impulsi è come prima, ma adesso il segnale portante è una sinusoide rotta.
Poiché la sua fase è la fase fondamentale moltiplicata per la frequenza centrale
quoziente, l’incremento di fase campione-a-campione è lo stesso di una sinusoide
alla frequenza centrale. Tuttavia, quando la fase è nei punti di wraparound, la
fase portante salta ad una posizione differente nel ciclo, come illustrato nella
Figura 6.7. Anche se la larghezza di banda quoziente ωb /ω deve essere almeno
uno, la frequenza centrale quoziente ωc /ω può arrivare ad essere zero, se lo si
desidera.

Segnale portante a due coseni


L’esempio F08.two.cosines.pd (Figura 6.16) mostra come creare un segnale por-
tante che fa una dissolvenza incrociata tra gli armonici per creare frequenze
centrali variabili con continuità. La frequenza centrale quoziente appare come
160 Capitolo 6. Progettare spettri
168 CHAPTER 6. DESIGNER SPECTRA

center
(frequency) frequency
|
(as multiple of
phasor~ 100
fundamental)
-~ 0.5 |
*~
bandwidth
(as multiple of magnified
fundamental) phase signal
|
*~
clip~ -0.5 0.5
cos~ raised
+~ 1 cosine
pulse
*~ 0.5
cos~
*~ carrier
|
(OUT)

Figure
Figura 6.16:
6.15: Using stretched
Utilizzo di unawavetable
sintesi disynthesis
stretchedtowavetable
make a formant with mov-
per formare una
able center frequency.
formante con frequenza centrale mobile.

center frequency
output dell’oggetto line∼. Questo èto
(relative separato nella sua parte frazionaria (uti-
fundamental)
fundamental
lizzando l’oggetto wrap∼)| e la sua parte intera (sottraendo la parte frazionaria
frequency Questi due
dall’originale). line~
valori sono etichettati con q e k per uniformarsi alla
|
trattazione del paragrafo 6.3.
phasor~ wrap~ the fractional part "q"
La fase – un onda a dente di sega alla frequenza fondamentale – viene molti-
plicata sia per k che per k-~+ 1 (quest’ultimo
subtract to get the l’onda
aggiungendo integer part
a dente "k"
di sega
originaria al precedente) e vengono presi i coseni di entrambi; essi sono quindi a
k e k + 1 volte la *~
frequenza+~fondamentale
multiply e nonphase
hannobydiscontinuità
k and k+1nei punti di
wraparound dellacos~ fase. I cos~
seguentisynthesize
oggetti della patch calcolano la"c1"
two partials somma pesata
and "c2"
pc1 + qc2 , dove c1 , c2 sono le due sinusoidi e p = 1 − q, tramite un’espressione
equivalente, c1 +q(c2 −c1-~ ). Questo c2 ci-dàc1
il segnale portante, a frequenza mobile,
richiesto.
L’esempio F09.declickit.pd *~ (non q *mostrato
(c2 - c1) qui) mostra come, aggiungendo
un oggetto samphold∼ dopo +~ q * c2 + (1-q) *controlla
l’oggetto line∼ che la frequenza centra-
c1
le, è possibile evitare discontinuità
| nel segnale di uscita anche se la frequenza
centrale desiderata cambia
(OUT)in modo discontinuo. Nell’esempio la frequenza cen-
trale quoziente alterna tra i valori 4 e 13.5. Con tempi di rampa inferiori a circa
20 msec ci sono artefatti udibili quando si usa solo l’oggetto line∼ che scompa-
iono quando
Figure viene aggiunto
6.17: Cross-fading l’oggetto
between to make(uno
samphold∼
sinusoids svantaggio
movable center di applicare
frequencies.
il sample-and-hold alla frequenza quoziente è che, per frequenze fondamentali
molto basse, le modifiche possono essere percepite come passi discreti. Quindi,
in situazioni in cui la frequenza fondamentale è bassa e la frequenza centrale
non deve cambiare molto rapidamente, può essere meglio ignorare la parte di
+~ 1 cosine
pulse
*~ 0.5
cos~
*~ carrier
|
(OUT)

6.5. Esempi
Figure 6.16: Using stretched wavetable synthesis to make a formant with mov- 161
able center frequency.

center frequency
(relative to fundamental)
fundamental |
frequency line~
|
phasor~ wrap~ the fractional part "q"
-~ subtract to get the integer part "k"

*~ +~ multiply phase by k and k+1


cos~ cos~ synthesize two partials "c1" and "c2"

-~ c2 - c1

*~ q * (c2 - c1)
+~ q * c2 + (1-q) * c1
|
(OUT)

Figure
Figura6.17:
6.16:Cross-fading
Dissolvenzabetween sinusoids
incrociata to make movable
tra sinusoidi center
per creare frequencies.
frequenze centrali
mobili.

sample-and-hold).
I due esempi successivi mostrano l’utilizzo di una portante fatta con oscilla-
tori in dissolvenza incrociata come parte della tecnica classica di modulazione
di fase a due operatori. Lo stesso oscillatore modulante viene aggiunto separa-
tamente alle fasi dei due coseni. Gli spettri risultanti possono essere fatti per
muoversi su e giù in frequenza, ma a causa delle complicate relazioni di fase
tra i picchi vicini nello spettro della modulazione di fase, indipendentemente da
quanto si allineino tali spettri non si può mai evitare di ottenere le cancellazioni
di fase dove si sovrappongono.

Il generatore PAF
L’esempio F12.paf.pd (Figura 6.17) è una realizzazione del generatore PAF de-
scritto nel paragrafo 6.4. Gli ingressi di controllo specificano la frequenza fonda-
mentale, la frequenza centrale e la larghezza di banda, tutte in unità “MIDI”. I
primi passaggi nella realizzazione sono quelli per dividere la frequenza centrale
per la fondamentale (per ottenere la frequenza centrale quoziente) e la larghezza
di banda per la fondamentale per ottenere l’indice di modulazione per il wave-
shaper. La frequenza centrale quoziente subisce un processo di sample-and-hold
in modo che sia aggiornata solo al periodo della fondamentale.
Un oscillatore (l’oggetto phasor∼) è attivo alla frequenza fondamentale.
Questo viene utilizzato sia per controllare un oggetto samphold∼ che sincronizza
gli aggiornamenti della frequenza centrale quoziente (etichettata come “C.F.
relative to fundamental” nella figura) e per calcolare le fasi per entrambi gli
oggetti cos∼ che operano come mostrato in precedenza nella Figura 6.16.
La parte di waveshaping della patch utilizza un mezzo periodo di sinusoide
come funzione di ricerca (per compensare il raddoppio di frequenza a causa
170 CHAPTER 6. DESIGNER SPECTRA

162 Capitolo 6. Progettare spettri

center
frequency
0
fundamental
(MIDI units) mtof

0 pack 0 50 bandwidth

mtof line~ 0
expr 1/$f1 mtof
*~ pack 0 50
phasor~ C.F. relative line~
to fundamental
divide by
*~ fundamental
*~ 0.5
samphold~
-~ 0.25
-~ wrap~ cos~ *~ 25
*~ +~ *~ range for table
cos~ cos~
offset to middle
+~ 100
-~ of table
tabread4~ bell-curve
+~ *~
waveshaper
*~ ring mod
|
(OUT)

Figura 6.17:
Figure Algoritmo
6.18: di sintesi performant
The phase-aligned la formante
(PAF)allineata in fase
synthesis (PAF).
algorithm.

della simmetria della funzione di ricerca). Per ottenere un mezzo ciclo della
funzione seno moltiplichiamo la fase per 0.5 e sottraiamo 0.25, in modo che la
fase regolata vada da −0.25 a +0.25, una volta per periodo. Questo esegue la
scansione della metà positiva del ciclo definito dall’oggetto cos∼.
L’ampiezza della mezza sinusoide viene quindi regolata da un indice di mo-
dulazione (che è proprio la larghezza di banda quoziente ωb /ω). La tabella
(“bell-curve”) contiene una curva Gaussiana non-normalizzata campionata da
−4 a 4 su 200 punti (25 punti per unità), quindi il centro della tabella, al
punto 100, corrisponde al picco centrale della curva a campana . Al di fuori
dell’intervallo da −4 a 4 la curva Gaussian è trascurabilmente piccola.
La Figura 6.18 mostra come viene preparata la wavetable Gaussiana. È
necessario un nuovo oggetto di controllo:
untill : quando l’ingresso “start” a sinistra riceve un bang, emette bang se-
quenziali (senza intervalli di tempo tra essi) in modo iterativo, finché l’entrata
“stop” a destra non riceve un bang. Il messaggio “bang” di arresto deve prove-
6.5. EXAMPLES
6.5. Esempi 163 171

t b b bell-curve
0
until
f + 1

sel 199 t f f

expr ($f1-100)/25
expr exp(-$f1*$f1)
tabwrite bell-curve

Figura 6.18: Riempimento della wavetable per la Figura 6.17.


Figure 6.19: Filling in the wavetable for Figure 6.18.
nire in qualche modo dall’uscita dell’oggetto until; altrimenti, l’uscita invierà
per sempre messaggi “bang”, congelando qualsiasi altro oggetto che potrebbe
until : When the left, “start” inlet is banged, output sequential bangs (with
interrompere il ciclo.
no elapsed time between them) iteratively, until the right, “stop” inlet is banged.
Per come viene usato qui, un ciclo guidato da un oggetto until conta da 0
The stopping “bang” message must originate somehow from the until object’s
a 199, compresi. Il conteggio del ciclo viene mantenuto dagli oggetti “f” e “+
outlet; otherwise,
1”, ognuno thealimenta
dei quali outlet will sendMa
l’altro. “bang”
poichémessages forever, freezing
l’uscita dell’oggetto “+ 1”’outva any
other object which could break the loop.
all’entrata destra di “f”, il suo risultato (uno più grande) uscirà da “f” solo
la As used here,
prossima voltaacheloopriceve
drivenun bybang an dauntiluntil.object counts
Quindi from
ogni bang 0 to
da199,
until inclu-
sive. The loop
incrementa count di
il valore is uno.
maintained by the “f” and “+ 1” objects, each of which
feedsL’ordine
the other. in cuiBut since
viene the “+
avviato 1” object’s
il loop outputl’oggetto
è importante: goes to “t thebright inlet of
b” supe-
the
riore“f”, its result (one
(abbreviazione pergreater)
“trigger will
bangonly bang”) emerge
deve from
primathe “f” the
inviare nextzero
il valore time it
isad “f”, cosı̀
banged inizializzandolo,
by “until”. So each e poi
bang impostare
from “until”l’oggetto until ad the
increments inviare bangs,
value by one.
incrementando
The order inil which valore,thefinoloop
a quando
is startednon si ferma. Per
matters: the arrestarlo
upper “t quando il
b b” object
valore raggiunge 199, un oggetto select controlla il valore
(short for “trigger bang bang”) must first send zero to the “f”, thus initializing e, quando vede la
it,corrispondenza,
and then set the mandauntilun bang
object all’entrata
sending “stop”bangs,dell’oggetto
incrementing until.the value, until
Nel frattempo, per ogni numero da 0 a 199
stopped. To stop it when the value reaches 199, a select object che esce dall’oggetto “f”, creiamo
checks the
una coppia ordinata di messaggi per l’oggetto tabwrite. Il primo, all’ingresso
value and, when it sees the match, bangs the “stop” inlet of the until object.
destro, invia l’indice stesso, da 0 a 199. Per l’ingresso sinistro, il primo oggetto
exprMeanwhile, for every
regola l’indice che vanumber
da −4from a 4 (in0 toprecedenza
199 that comesvariavaoutda of
0 the “f”edobject,
a 199) il
we create an ordered pair
secondo calcola la funzione gaussiana.of messages to the tabwrite object. First, at right,
goes In thequesta
indexpatch
itself,non
from 0 to 199.
abbiamo Then for
affrontato the left inlet,
completamente la the first expr
questione object
dell’ag-
adjusts the index
giornamento dellatofrequenza
range from -4 to quoziente
centrale 4 (it previously ranged
nei momenti from 0 to 199)
appropriati. Ogni and
the second
volta one evaluates
che viene modificatathe Gaussianportante,
la frequenza function.lo step sample-and-hold ritar-
daIn this patch we
correttamente have not fully
l’aggiornamento deladdressed
quoziente. the Ma issue of updating
se invece, the center
o in aggiunta, la
frequency quotient atcambia
stessa fondamentale the appropriate
bruscamente, times.
allora,Whenever the carrier
per una frazione di un frequency
periodo, is
la frequenza
changed dell’oggetto phasor∼
the sample-and-hold stepe il quoziente
properly non sono
delays the sincronizzati.
update of thePdquotient.
non
consente all’output di samphold∼ la retroazione nell’input
But if, instead or in addition, the fundamental itself changes abruptly, then for di phasor∼ senza
a l’inclusione
fraction ofdia un ritardo
period theesplicito
phasor~ (vedere
object’s il capitolo
frequencysuccessivo)
and thee quotient
non esisteareun out
modo semplice per modificare la patch per risolvere
of sync. Pd does not allow the samphold~ output to be connected back into thequesto problema.
Supponendo che abbiamo sincronizzato, in qualche modo, l’input dell’og-
164 Capitolo 6. Progettare spettri

getto phasor∼ con i suoi punti di wraparound, quindi dovremmo fare altret-
tanto per il quoziente larghezza di banda/fondamentale sul lato destro della
patch. Nello scenario corrente, tuttavia, non c’è alcun problema ad aggiornare
continuamente tale valore.
Una soluzione pratica a questo problema di aggiornamento potrebbe essere
semplicemente la riscrittura dell’intera patch in C come classe Pd; questo si tra-
duce anche nell’utilizzo di molto meno tempo della CPU rispetto alla patch in
figura, e rappresenta la soluzione più pratica in generale – finché non si desidera
sperimentare la creazione di abbellimenti o altre modifiche all’algoritmo. Ta-
li abbellimenti potrebbero includere: aggiungere uno spostamento inarmonico
verso l’alto o verso il basso nelle parziali; permettere di passare ad aggiorna-
menti della frequenza centrale in modo continuo o sample-and-hold; aggiungere
controlli separati di guadagno per parziali pari e dispari; introdurre grani mo-
dulando irregolarmente la fase; permettere miscele di due o più funzioni di wa-
veshaping; o fare attacchi percussivi più nitidi allineando la fase dell’oscillatore
con la temporizzazione di un generatore di inviluppo di ampiezza.
Un dettaglio finale sull’ampiezza è necessario: poiché l’ampiezza della par-
ziale più forte diminuisce approssimativamente come 1/(1 + b) dove b è l’indice
di modulazione, è auspicabile a volte (ma non sempre) correggere l’ampiezza
in output moltiplicando per 1 + b. Questa è solo un’opzione se b è aggiornato
senza salti (come in questo esempio), ma non quando viene aggiornato tramite
sample-and-hold. Una situazione in cui ciò è appropriato è quando si vuole si-
mulare corde pizzicate (impostando la frequenza centrale come la fondamentale,
a partire da un indice di modulazione alto e abbassandolo esponenzialmente);
sarebbe opportuno ascoltare la caduta, e non un aumento, della fondamentale
in ampiezza durante il decadimento della corda.

Stretched wavetables
Invece di usare la tecnica del waveshaping, è possibile anche creare formanti
utilizzando la tecnica delle stretched wavetables, come dimostrato nell’esempio
F14.wave.packet.pd (non mostrato qui). La tecnica è sostanzialmente quella
vista nell’esempio B10.sampler.overlap.pd (descritta nel paragrafo 2.6), con una
ricerca su coseno invece di quella più generale su wavetable, ma con l’aggiunta di
un controllo per impostare il duty cycle degli inviluppi di ampiezza. Le unità di
misura sono regolate per essere compatibili con quelle dell’esempio precedente.

Esercizi
1. Un treno a impulsi è costituito da finestre di Hann (coseni), da estremo a
estremo, senza alcun gap tra essi. Qual è lo spettro risultante?
2. Quali devono essere i valori di k e q (nella terminologia di Figura 6.8) per
sintetizzare una formante alla frequenza centrale di 2000 Hertz e frequenza
fondamentale di 300 Hertz?
3. Come deve essere modificato il diagramma a blocchi della Figura 6.8 per
produrre solo armonici dispari?
Capitolo 7

Spostamenti temporali e
ritardi

Alle 5:00 di un qualche pomeriggio, fate partire la vostra registrazione preferita


di Ramones string quarter number 5. Il sabato successivo, riproducete la stessa
registrazione alle 5:00:01, un secondo più tardi. Le due riproduzioni idealmente
dovrebbe essere identiche. Spostare l’intera cosa di un secondo (o, se vogliamo,
di qualche giorno e un secondo) non ha alcun effetto fisico sul suono.
Ma supponiamo ora che l’abbiate riprodotta alle 5:00 e alle 5:00:01 dello
stesso giorno (in due diversi sistemi di riproduzione, poiché la musica dura molto
più di un secondo). Ora il suono è molto diverso. La differenza, qualunque essa
sia, non risiede, chiaramente, in nessuna delle due riproduzioni individuali, ma
piuttosto nell’interferenza tra le due. Questa interferenza può essere percepita
in almeno quattro modi diversi:

Canoni: combinando due copie di un segnale con un intervallo di tempo suffi-


ciente per il segnale di cambiare in modo apprezzabile, potremmo sentire
i due come flussi musicali separati, in effetti confrontando un segnale con
lo stesso precedente. Se il segnale è una melodia, l’intervallo di tempo può
essere paragonabile alla lunghezza di una o più note.

Echi: a spostamenti temporali tra circa 30 millisecondi e circa un secondo, la


copia successiva del segnale può suonare come un’eco del precedente. Un
eco può ridurre l’intelligibilità del segnale (soprattutto se si tratta di un
parlato), ma di solito non cambierà la “forma” globale delle melodie o
delle frasi.

Filtraggio: a spostamenti temporali sotto i 30 millisecondi, le copie sono trop-


po vicine nel tempo per essere percepite separatamente, e l’effetto domi-
nante è che alcune frequenze sono esaltate e altre sono soppresse. Questo
modifica l’inviluppo spettrale del suono.

Qualità della stanza alterata: se la seconda copia viene riprodotta ad un


volume più basso della prima, e soprattutto se aggiungiamo più copie ritar-
date ad ampiezze ridotte, il risultato può imitare gli echi che si presentano
in una stanza o in altri spazi acustici.

165
166 Capitolo 7. Spostamenti temporali e ritardi

Il suono di una determinata disposizione di copie ritardate di un segnale può


combinare due o più di questi effetti.
Matematicamente, l’effetto di uno spostamento temporale su un segnale può
essere descritto come un cambio di fase in ciascuna delle componenti sinusoidali
del segnale. Lo spostamento di fase di ciascuna componente è diverso a seconda
della sua frequenza (nonché della quantità di spostamento temporale). Nel
resto di questo capitolo considereremo spesso sovrapposizioni di sinusoidi a fasi
diverse. Finora siamo stati contenti di utilizzare, nella nostra analisi, sinusoidi
a valori reali, ma in questo e nei prossimi capitoli le formule diventeranno più
complicate e avremo bisogno di strumenti matematici più potenti per gestirle.
In una sezione preliminare di questo capitolo svilupperemo le basi necessarie.

7.1 Numeri complessi


I numeri complessi sono scritti come:

Z = a + ib

dove a e b sono numeri reali e i = −1 (in questo libro usiamo le lettere
maiuscole romane Z per indicare i numeri complessi. I numeri reali sono indicati
con lettere minuscole romane o greche, ad eccezione di indici interi, normalmente
scritti come M o N ). Poiché un numero complesso ha due componenti reali,
usiamo un piano cartesiano (al posto di una linea numerica) per illustrarlo, come
mostrato in Figura 7.1. Le quantità a e b sono chiamate rispettivamente la parte
reale e la parte immaginaria di Z, scritte come:
a = re(Z),

b = im(Z).

Se Z è un numero complesso, il suo modulo (o valore assoluto o magnitudine),


indicato con |Z|, è proprio la distanza, nel piano, del punto (a, b) dall’origine:
p
|Z| = (a2 + b2 )

ed il suo argomento, indicato con ∠(Z), è l’angolo tra l’asse positivo a ed il


segmento congiungente l’origine ed il punto (a, b):
 
b
∠(Z) = arctan .
a
Se conosciamo il modulo e l’argomento di un numero complesso (li chiameremo
r e θ) possiamo determinare le sue parti reale e immaginaria:

a = r cos(θ),

b = r sin(θ).
Un numero complesso può essere scritto in termini delle sue parti reale e im-
maginaria, a e b, come Z = a + ib (questa prende il nome di forma rettangolare)
oppure, in alternativa, in forma polare, in termini di r e θ:

Z = r · [cos(θ) + i sin(θ)].
7.1. Numeri complessi 167
176 CHAPTER 7. TIME SHIFTS AND DELAYS

b
Z=a+bi
|Z|

arg(Z)
a

Figure
Figura7.1:
7.1: A
Unnumber,
numero,Z,Z,innel
thepiano
complex plane. Gli
complesso. Theassi
axessono
are per
for la
theparte
real reale
part
aa and the imaginary part b.
e la parte immaginaria b.

The sound of a given arrangement of delayed copies of a signal may combine


Le forme
two or morerettangolari e polari sono intercambiabili; le equazioni sopra mostrano
of these affects.
come calcolare a e b da r e θ e viceversa.
Mathematically, the effect of a time shift on a signal can be described as a
phaseIl motivo
change principale
of each of per the cui utilizziamo
signal’s i numeri
sinusoidal complessiThe
components. nella musica
phase elet-
shift of
tronica è perché magicamente automatizzano i calcoli trigonometrici.
each component is different depending on its frequency (as well as on the amount Dobbiamo
spesso
of time sommare
shift). Inangoli
the rest perofparlare del cambiamento
this chapter we will often di fase di unsuperpositions
consider segnale audio
all’avanzare del tempo (o quando subisce uno spostamento
of sinusoids at different phases. Heretofore we have been content to use temporale, come in
real-
questo capitolo). Si scopre che, se si moltiplicano due numeri complessi,
valued sinusoids in our analyses, but in this and later chapters the formulas will l’argo-
mento del
become moreprodotto è la somma
complicated and wedegli
willargomenti
need more deipowerful
due fattori. Per vedere tools
mathematical come
questo accada, moltiplichiamo due numeri Z 1 e Z 2 , scritti
to manage them. In a preliminary section of this chapter we will develop thein forma polare:
additional background needed.
Z1 = r1 · [cos(θ1 ) + i sin(θ1 )]

7.1 Complex numbers


Z2 = r2 · [cos(θ2 ) + i sin(θ2 )]

Complex numbers are written as:


ottenendo:

Z1 Z2 = r1 r2 · [cos(θ Z 1= a + bi
) cos(θ 2 ) − sin(θ1 ) sin(θ2 )+

where a and b are real numbers
+i(sin(θ and2 )i+=cos(θ
1 ) cos(θ −1. (In2 ))].
1 ) sin(θ this book we’ll use the
upper case Roman letters such as Z to denote complex numbers. Real numbers
appear as lower
Qui il segno casedavanti
meno Romanaor Greek
sin(θ letters, except for integer bounds, usually
1 ) sin(θ2 ) deriva dalla moltiplicazione di i per
written as M
se stesso, cheorvale
N .)−1.
Since a complex number
Nell’espressione soprahas two realpossiamo
descritta components, we use
utilizzare le
aformule
Cartesian plane (in
di somma deiplace of ae number
coseni dei seni line) to graph
e quindi it, as shown in Figure 7.1.
semplificare:
The quantities a and b are called the real and imaginary parts of Z, written as:
Z1 Z2 = r1 r2 · [cos(θ1 + θ2 ) + i sin(θ1 + θ2 )].
a = re(Z)
Risulta che il prodotto Z1 Z2 ha modulo r1 r2 e argomento θ1 + θ2 .
b = im(Z)
Possiamo usare questa proprietà dei numeri complessi per sommare e sot-
trarre angoli (moltiplicando e dividendo numeri complessi con gli argomenti
appropriati) e quindi prendere il coseno e il seno del risultato estraendo le parti
reale e immaginaria.
168 Capitolo 7. Spostamenti temporali e ritardi
178 CHAPTER 7. TIME SHIFTS AND DELAYS

A
AZ
Z2
AZ 2
Z
1

Z −1

Figure 7.2: The powers of a complex number Z with |Z| = 1, and the same
Figura 7.2:
sequence Le potenze
multiplied by a di un numero
constant A. complesso Z con |Z| = 1, e la stessa
sequenza moltiplicata per una costante A.

7.1.1
7.1.1 Complex
Sinusoidi sinusoids
complesse
Recall the formula
Richiamiamo for a (real-valued)
la formula sinusoid
di una sinusoide fromreali)
(a valori Page di
1: pagina 1:

x[n]
x[n] =
=aa cos(ωn
cos(ωn +
+ φ)
φ).

Questa
This is aè sequence
una sequenza di coseni
of cosines di angoli
of angles (chiamati
(called phases)fasi) che increase
which aumentano aritme-
arithmeti-
ticamente
cally with the con sample
il sample number
number n.n.The
I coseni sono
cosines aretutti moltiplicati
all adjusted per factor
by the il fattore
a.
a. Possiamo
We ora riscrivere
can now rewrite this asquesta formula
the real part ofcome la parte
a much reale
simpler and dieasier
una sequenza
to manip-di
numeri
ulate complessi
sequence molto piùnumbers,
of complex semplici by
e più manipolabili,
using utilizzando
the properties of theirlearguments
proprietà
dei loro
and argomenti e dei loro moduli.
magnitudes.
Supponiamo
Suppose thatche un numero
a complex complesso
number Z abbia modulo
Z happens to have unitario
magnitude(cioèone
modulo
and
1) e argomento
argument ω, initmodo
ω, so that can bechewritten
possa essere
as: scritto come

Z=
Z = cos(ω)
cos(ω) +
+ ii sin(ω)
sin(ω).

Quindi per ogni numero intero n, il numero Z n deve avere esso stesso modulo 1
Then for any integer n, the number Z n must have magnitude one as well (be-
(per la moltiplicazione di moduli) e argomento nω (per la somma di argomenti).
cause magnitudes multiply) and argument nω (because arguments add). So,
Quindi
Z nn =
Z = cos(nω)
cos(nω) +
+ ii sin(nω)
sin(nω).
Questo vale anche per i valori negativi di n, per esempio
This is also true for negative values of n, so for example,
1
= Z −1 = cos(ω) − i sin(ω).
1
Z
= Z −1 = cos(ω) − i sin(ω)
Z
La Figura 7.2 mostra graficamente come le potenze di Z si muovano intorno al
cerchio unitario (cioè di raggio 1), che
Figure 7.2 shows graphically how the powersè l’insieme
of Z di tuttiaround
wrap i numeri
thecomplessi di
unit circle,
modulo uno. Essi formano una sequenza geometrica:
which is the set of all complex numbers of magnitude one. They form a geometric
sequence:
. . . , Z 0, Z 1, Z 2, . . .
. . . , Z 0, Z 1, Z 2, . . .
e prendendo la parte reale di ogni termine otteniamo una sinusoide a valori reali
reale con fase iniziale pari a zero e ampiezza uno:

. . . , cos(0), cos(ω), cos(2ω), . . .


7.2. Spostamenti temporali e cambiamenti di fase 169

Inoltre, supponiamo di moltiplicare gli elementi della sequenza per una qualche
costante (complessa) A con modulo a e argomento φ. Questo dà

. . . , A, AZ, AZ 2 , . . .

I moduli sono tutti a e l’argomento del termine n−esimo è nω + φ, quindi la


sequenza è uguale a

AZ n = a · [cos(nω + φ) + i sin(nω + φ)]

e la parte reale è proprio la sinusoide a valori reali:

re(AZ n ) = a · cos(nω + φ).

Il numero complesso A incorpora sia l’ampiezza reale a che la fase iniziale φ;


il numero complesso, di modulo unitario, Z controlla invece la frequenza che è
proprio il suo argomento ω.
La Figura 7.2 mostra anche la sequenza A, AZ, AZ 2 , . . . ; in effetti questa è la
stessa sequenza di 1, Z, Z 2 , . . . , ma amplificata e ruotata a secondo dell’ampiezza
e della fase iniziale. In una sinusoide complessa di questa forma, A prende il
nome di ampiezza complessa.
L’utilizzo di numeri complessi per rappresentare le ampiezze e le fasi delle
sinusoidi può chiarire manipolazioni che altrimenti potrebbero sembrare immo-
tivate. Per esempio, supponiamo che vogliamo conoscere l’ampiezza e la fase
della somma di due sinusoidi con la stessa frequenza. Nel linguaggio di questo
capitolo, supponiamo che le due sinusoidi siano scritte come:

X[n] = AZ n , Y [n] = BZ n

dove A e B codificano le fasi e le ampiezze dei due segnali. La somma è quindi


uguale a:
X[n] + Y [n] = (A + B)Z n
che è una sinusoide la cui ampiezza è uguale a |A + B| e la cui fase è uguale a
∠(A + B). Questo è chiaramente un modo molto più semplice per manipolare
le ampiezze e le fasi anziché utilizzando le proprietà dei seni e dei coseni. Alla
fine, ovviamente, prenderemo la parte reale del risultato; questo, solitamente,
può essere fatto alla fine di tutte le operazioni che stiamo facendo.

7.2 Spostamenti temporali e cambiamenti di fa-


se
Partendo da un qualsiasi segnale (reale o complesso) X[n], possiamo ottenere
altri segnali spostando il segnale X per un intero (positivo o negativo) d:

Y [n] = X[n − d]

in modo che il campione d−esimo di Y sia il campione 0−esimo di X e cosı̀ via.


Se l’intero d è positivo, allora Y è una copia ritardata di X. Se d è negativo,
Y anticipa X; questo può essere fatto per un suono registrato ma non è pratico
come operazione in tempo reale.
170 Capitolo 7. Spostamenti temporali e ritardi

Lo spostamento temporale è un’operazione lineare (considerata come fun-


zione del segnale di ingresso X); se facciamo uno spostamento temporale su
una somma X1 + X2 si ottiene lo stesso risultato di applicare lo spostamento
separatamente sui due segnali e in seguito fare la somma.
Lo spostamento temporale ha l’ulteriore proprietà che, se si sposta, tempo-
ralmente, una sinusoide di frequenza ω, il risultato è un’altra sinusoide con la
stessa frequenza; lo spostamento temporale non introduce mai frequenze che non
erano presenti nel segnale prima che venisse spostato. Questa proprietà, chia-
mata invarianza temporale, rende facile analizzare gli effetti degli spostamenti
temporali – e delle loro combinazioni lineari – considerando separatamente cosa
fanno sulle singole sinusoidi.
Inoltre, l’effetto di uno spostamento temporale su una sinusoide è semplice:
cambia solo la fase. Se usiamo una sinusoide complessa, l’effetto è ancora più
semplice. Se per esempio
X[n] = AZ n
allora
Y [n] = X[n − d] = AZ (n−d) = Z −d AZ n = Z −d X[n]
e quindi lo spostamento temporale di d campioni, di una sinusoide complessa,
è la stessa cosa che moltiplicare per Z −d – è solo un cambiamento di ampiezza
per un particolare numero complesso. Poiché |Z| = 1 per una sinusoide, la
variazione dell’ampiezza non cambia il modulo della sinusoide, solo la sua fase.
La variazione di fase è uguale a −dω, dove ω = ∠(Z) è la frequenza angolare
della sinusoide. Questo è esattamente quello che ci si dovrebbe aspettare poiché
la sinusoide avanza di ω radianti per campione ed ha un offset (cioè, è ritardata)
di d campioni.

7.3 Reti di ritardo


Se consideriamo i nostri campioni audio digitali X[n] in corrispondenza di mo-
menti successivi nel tempo, allora lo spostamento temporale di d campioni del
segnale corrisponde ad un ritardo (delay) di d/R unità di tempo, dove R è la fre-
quenza di campionamento. La Figura 7.3 mostra un esempio di una rete lineare
di ritardo (linear delay network): un insieme di unità di ritardo, eventualmente
con operazioni di riscalatura di ampiezza, combinate usando somme e sottra-
zioni. L’output è una funzione lineare dell’input, nel senso che dare in input la
somma di due segnali è la stessa cosa che elaborare ciascuno separatamente e
sommare i risultati. Inoltre, le reti lineari di ritardo non creano, in uscita, nuove
frequenze che non erano presenti in input, fintanto che la rete rimane invariata
nel tempo, in modo che i guadagni e i tempi di ritardo non cambino nel tempo.
In generale ci sono due modi di pensare alle reti di ritardo. Possiamo pen-
sarle nel dominio del tempo (time domain), in cui tracciamo le forme d’onda
come funzioni del tempo (o dell’indice n) e consideriamo i ritardi come sposta-
menti temporali. In alternativa, possiamo pensarle nel dominio della frequenza
(frequency domain), in cui l’input viene alimentato con una sinusoide complessa
(in modo che il suo output sia una sinusoide alla stessa frequenza) e segnaliamo
i cambiamenti di ampiezza e/o di fase effettuati dalla rete, in funzione della
frequenza. Studiamo ora la rete di ritardo di Figura 7.3 in ciascuno dei due
modi.
7.3. Reti di ritardo 171

7.3. DELAY NETWORKS 181

IN

OUT

Figure 7.3: A delay network. Here we add the incoming signal to a delayed copy
ofFigura
itself. 7.3: Una rete di ritardo. Qui sommiamo il segnale in ingresso con una
copia ritardata di se stesso.

We’ll now look at the delay network of Figure 7.3 in each of the two ways in
turn.
Figure 7.4 shows the network’s behavior in the time domain. We invent some
sort of suitable test function as input (it’s a rectangular pulse eight samples wide
in182
this example) and graph the CHAPTER 7. TIME
input and output SHIFTS AND
as functions of theDELAYS
sample
number n. This particular delay network adds the input to a delayed copy of
itself.
A frequently
input
used test function is an impulse, which is a pulse lasting only
one sample. The utility of this is that, if we know the output of the network for
an impulse, we can find the output for any other digital audio signal—because
any signal x[n] is a sum of impulses, one of height x[0], the next one occurring
n
one sample later and having height x[1], and so on. Later, when the networks
get more complicated, we will move to using impulses as input signals to show
their time-domain behavior.
Onoutput
the other hand, we can analyze the same network in the frequency domain
by considering a (complex-valued) test signal,

X[n] = Z n

where Z has unit magnitude and argument


d ω. We already know that the output
is another complex sinusoid with the same frequency, that is,

HZ N
Figura 7.4:
Figure 7.4: The
La visualizzazione
time domain viewnel dominio del tempo
of the delay networkdella
of rete di ritardo
Figure di
7.3. The
for some7.3.
Figura complex number H (which we wante to find). So we write the output
output is theL’output è lainput
sum of the sommaanddell’input della
its time shifted sua
copy.copia traslata.
directly as the sum of the input and its delayed copy:

Z n + Z −d Z n = (1 + Z −d )Z n
and find by inspection that:
H = 1 + Z −d
We can understand the frequency-domain behavior of this delay network by
studying how the complex number H varies as a function of the angluar fre-
quency ω. We are especially interested in its argument and magnitude—which
tell us the relative phase and amplitude of the sinusoid that comes out. We will
work this example out in detail to show how the arithmetic of complex numbers
can predict what happens when sinusoids are combined additively.
Figure 7.5 shows the result, in the complex plane, when the quantities 1 and
Z −d are combined additively. To add complex numbers we add their real and
complex parts separately. So the complex number 1 (real part 1, imaginary part
172 Capitolo 7. Spostamenti temporali e ritardi

La Figura 7.4 mostra il comportamento della rete nel dominio del tempo.
Abbiamo inventato una sorta di funzione appropriata di test come input (in
questo esempio è un impulso rettangolare largo otto campioni) e disegniamo
il grafico dell’input e dell’output come funzioni del sample number n. Questa
particolare rete di ritardo somma l’input con una copia ritardata di se stesso.
Una funzione di test utilizzata di frequente è l’impulso, che è una pulsazione
della durata di solo un campione. L’utilità di ciò è che, se conosciamo l’output
della rete per un impulso, possiamo trovare l’output per qualsiasi altro segnale
audio digitale – perché qualsiasi segnale x[n] è una somma di impulsi, uno
di altezza x[0], il successivo che si verifica un campione più tardi e che ha
l’altezza x[1], e cosı̀ via. Più tardi, quando le reti diventeranno più complicate,
passeremo ad utilizzare gli impulsi come segnali di input per mostrare il loro
comportamento nel dominio del tempo.
D’altra parte, possiamo analizzare la stessa rete nel dominio della frequenza
considerando un segnale di prova (a valori complessi)

X[n] = Z n

dove Z ha modulo unitario e argomento ω. Sappiamo già che l’output è un’altra


sinusoide complessa con la stessa frequenza, cioè,

HZ n

per un numero complesso H (che vogliamo trovare). Quindi scriviamo l’output


direttamente come la somma dell’input e della sua copia ritardata:

Z n + Z −d Z n = (1 + Z −d )Z n

e confrontando si ottiene che

H = 1 + Z −d .

Possiamo comprendere il comportamento nel dominio della frequenza di questa


rete di ritardo, studiando come il numero complesso H varia in funzione della
frequenza angolare ω. Siamo particolarmente interessati al suo argomento e al
suo modulo – che ci forniscono la fase relativa e l’ampiezza della sinusoide che
otteniamo. Facciamo questo esempio in dettaglio per mostrare come l’aritmetica
dei numeri complessi possa prevedere cosa succede quando le sinusoidi vengano
combinate additivamente.
La Figura 7.5 mostra il risultato, nel piano complesso, quando le quantità
1 e Z −d sono combinate in modo additivo. Per sommare numeri complessi,
basta sommare separatamente le loro parti reali e complesse. Cosı̀ il numero
complesso 1 (parte reale 1, parte immaginaria 0) viene sommato, coordinata per
coordinata, al numero complesso Z −d (parte reale cos(−dω), parte immaginaria
sin(−dω)). Questa operazione è ottenuta, graficamente, facendo un parallelo-
gramma, con spigoli all’origine e ai due punti di cui si fa la somma, e il cui
quarto spigolo è la somma H.
Come mostra la figura, il risultato può essere compreso simmetrizzandolo
sull’asse reale: invece di 1 e Z −d , è più facile sommare le quantità Z d/2 e
Z −d/2 , perché sono simmetriche rispetto all’asse (orizzontale) reale (in senso
stretto, non abbiamo definito correttamente le quantità Z d/2 e Z −d/2 ; stiamo
usando queste espressioni per indicare numeri complessi di modulo unitario i cui
7.3. Reti
7.3. DELAYdi ritardo
NETWORKS 173
183

d/2
Z

d/2
HZ
real 1
Z -d/2

H
imaginary -d
Z

Figure 7.5: Analysis, in the complex plane, of the frequency-domain behavior of


Figura
the delay7.5: Analisi,
network nel piano
of Figure 7.3.complesso,
The complexdel comportamento
number Z encodes nelthe
dominio della
frequency
frequenza della rete di ritardo di Figura 7.3. Il numero − complesso Z codifica la
of the input. The delay line output is the input times Z d. The total (complex)
frequenza
gain is H. Wedell’input. L’output della
find the magnitude and linea di ritardo
argument è l’input
of H by moltiplicato
symmetrizing per
the sum,
−d
Z . Il guadagno totale (complesso) è H. Troviamo
rotating it by d/2 times the angular frequency of the input. il modulo e l’argomento
di H simmetrizzando la somma, ruotandola per d/2 volte la frequenza angolare
dell’input.
in rectangular form:
Z d/2 + Z −d/2
argomenti sono la metà di quelli di Z d e Z −d , in modo che il loro elevamento al
quadrato dia = (cos(ωd/2)
Z d e Z −d .)+Riscriviamo
i sin(ωd/2))il+guadagno
(cos(ωd/2) − i sin(ωd/2))
come:
= 2 cos(ωd/2)
H = Z −d/2 (Z d/2 + Z −d/2 ).
This real-valued quantity may be either positive or negative; its absolute value
Il primo
gives the termine
magnitude è uno output: di fase di −dω/2. Il secondo termine è più
spostamento
of the
comprensibile in forma rettangolare:
|H| = 2| cos(ωd/2)|
Z d/2 + Z −d/2
The quantity |H| is called the gain of the delay network at the angular frequency
= (cos(ωd/2)
ω, and is graphed in Figure+ i sin(ωd/2)) (cos(ωd/2) − i sin(ωd/2))
7.6. The +frequency-dependent gain of a delay
network (that is, the gain as a function of frequency) is called the network’s
frequency response. = 2 cos(ωd/2).
Since the network has greater gain at some frequencies than at others, it may
Questa
be quantità,
considered as a afilter
valori
thatreali,
can può essere
be used positiva ocertain
to separate negativa; il suo valore
components of a
assoluto dà il modulo dell’output:
sound from others. Because of the shape of this particular gain expression as
a function of ω, this kind of delay |H| = network is called a (non-recirculating) comb
2|cos(ωd/2)|.
filter.
La The output
quantità |H|of prende
the network
il nome is di
a sum of two(gain)
guadagno sinusoids
dellaofrete
equal di amplitude,
ritardo alla
and whose angolare
frequenza phases differ
ω ed by ωd. The resulting
è rappresentata frequency
in Figura response agrees
7.6. Il guadagno, with
dipendente
common sense: if(cioè
dalla frequenza the angular
il guadagno frequency ω is set
in funzione so that
della an integer
frequenza), number
di una rete ofdi
periods
ritardo fit into dilsamples,
prende nome di i.e., if ω isinafrequenza
risposta multiple of 2π/d,
della the output of the delay
rete.
is exactly the same as the original signal, and so
Poiché la rete ha un guadagno maggiore ad alcune frequenze the two combine to make
rispetto an
ad altre,
output with twice the original amplitude. On the other hand, if
può essere considerato come un filtro che può essere utilizzato per separare, in for example we
un suono, determinate componenti da altre. A causa della forma di questa
particolare espressione del guadagno in funzione di ω, questo tipo di rete di
ritardo prende il nome di filtro a pettine (non-ricircolante) ((non-recirculating)
comb filter).
184 CHAPTER 7. TIME SHIFTS AND DELAYS
174 Capitolo 7. Spostamenti temporali e ritardi

gain
2

2 4
d d

Figure 7.6: Gain of the delay network of Figure 7.3, shown as a function of
Figura 7.6: Guadagno della rete di ritardo di Figura 7.3, mostrato in funzione
angular frequency ω.
della frequenza angolare ω.

take ω = π/d so that the delay is half the period, then the delay output is out
of phase and cancels the input exactly.
This particular delay network has an interesting application: if we have a
L’output
periodic della rete
(or nearly è una incoming
periodic) somma disignal,due sinusoidi di uguale ampiezza
whose fundamental frequency e le
is
ω radians per sample, we can tune the comb filter so that the peaks in con
cui fasi differiscono di ωd. La risposta in frequenza risultante è in accordo the
il buon
gain aresenso:
aligned se at la frequenza angolare
even harmonics andω theè impostata
odd onesinfall modo where che the
un numero
gain is
zero. To do this we choose d = π/ω, i.e., set the delay time to exactly di
intero di periodi stia esattamente in d campioni, cioè se ω è un multiplo one2π/d,
half
l’output
period of del
theritardo
incoming è esattamente
signal. In thisuguale
way we al segnale
get a new originale,
signal whose e quindi i due si
harmonics
combinano
are 2ω, 4ω, 6ω, per .dare
. ., and un output
so it nowcon has
ampiezza
a newdue volte quellafrequency
fundamental originale.atD’altra
twice
the original one. Except for a factor of two, the amplitudes of thesia
parte, se per esempio noi prendiamo ω = π/d in modo che il ritardo la metà
remaining
del periodo,still
harmonics allora
follow l’output del ritardo
the spectral è fuoriof
envelope fase
thee annulla
original esattamente
sound. So we l’input.
have
a tool now for raising the pitch of an incoming sound by an octave without
Questaitsparticolare
changing spectral envelope.rete di ritardo ha un’interessante
This octave doubler is the applicazione:
reverse of the se octave
abbia-
mo un segnale in entrata
divider introduced back in Chapter 5. periodico (o quasi periodico), la cui frequenza fonda-
mentale
The timeè ω and
radianti per campione,
frequency domains offerpossiamo sintonizzareways
complementary il filtro a pettine
of looking in
at the
modo che i picchi nel guadagno siano allineati agli
same delay network. When the delays inside the network are smaller than thearmonici pari mentre quelli
dispari
ear’s si trovino
ability to resolve doveevents
il guadagno è zero.than
in time—less Perabout
fare ciò sceglieremo d = π/ω,
20 milliseconds—the time
domain picture becomes less relevant to our understanding ofdel
cioè, impostiamo il tempo di ritardo a esattamente metà theperiodo del se-
delay network,
gnaleweinturn
and ingresso.
mostlyIn to questo modo otterremopicture.
the frequency-domain un nuovo Onsegnale
the other i cui armonici
hand, when
sono 2ω, 4ω, 6ω, . . . e quindi adesso ha una nuova frequenza
delays are greater than about 50 msec, the peaks and valleys of plots showing fondamentale pari
a due volte quella originale. Fatta eccezione per un fattore
gain versus frequency (such as that of Figure 7.6) crowd so closely together that di due, le ampiezze
dei frequency-domain
the restanti armonici seguono ancoraless
view becomes l’inviluppo
important. spettrale
Both are delnonetheless
suono originale.
valid
Quindi abbiamo uno strumento
over the entire range of possible delay times. per aumentare di un’ottava il tono di un suono
in ingresso senza cambiare il suo inviluppo spettrale. Questo octave doubler è
l’opposto dell’octave divider introdotto nel Capitolo 5.
7.4 Recirculating delay networks
I domini del tempo e della frequenza offrono modalità complementari per
It is sometimes
esaminare desirable
una stessa toritardo.
rete di connectQuando
the outputs of all’interno
i ritardi one or more delays
della in a
rete sono
network back intorispetto
a tempi inferiori their own
alla or each others’
capacità inputs.diInstead
dell’orecchio of getting
distinguere onenel
gli eventi or
several
tempo echos
– meno of di
thecirca
original sound as in –thelaexample
20 millisecondi above, wenel
rappresentazione candominio
potentially
del
get
tempoan diventa
infinite meno
number of echos,
rilevante each
per la one comprensione
nostra feeding back della
into rete
the di
network
ritardotoe
engender yet others.
ci rivolgiamo principalmente alla rappresentazione nel dominio della frequenza.
D’altro canto, quando i ritardi sono superiori a circa 50 msec, i picchi e le valli
della rappresentazione che mostrano il guadagno in funzione della frequenza
(come quella in Figura 7.6) sono cosı̀ strettamente vicini che la visualizzazione
nel dominio della frequenza diventa meno importante. Entrambe sono comunque
valide per tutta la gamma di possibili tempi di ritardo.
7.4. Reti
7.4. di ritardo ricircolanti
RECIRCULATING DELAY NETWORKS 175
185

IN

OUT

Figure
Figura 7.7:
7.7: Block diagram
Diagramma for a recirculating
a blocchi per un filtro comb filter.
a pettine Here d is the
ricircolante. Qui delay
d è il
time in samples and g is the feedback coefficient.
tempo di ritardo in campioni e g è il coefficiente di feedback.

The simplest example of a recirculating network is the recirculating comb


7.4 whose
filter Reti blockdi ritardo
diagram is shownricircolanti
in Figure 7.7. As with the earlier, simple
comb filter, the input signal is sent down a delay line whose length is d samples.
But
A voltenow èthe delay line’s
auspicabile output le
collegare is also
uscitefeddiback
uno to its input;
o più ritardi, theindelay’s
una rete,input is
nuo-
the sum of the original input and the delay’s output. The
vamente al proprio ingresso o a quelli degli altri. Invece di ottenere uno o più output is multiplied
by
echia del
number
suonog originale
before feeding it back into its
come nell’esempio input. possiamo potenzialmente
precedente,
The time domain behavior of the recirculating
ottenere un numero infinito di echi, ciascuno di essi comb chefilter is shown
ritorna nellainrete
Figure
per
7.8. Here we consider
generarne ancora altri. the effect of sending an impulse into the network. We
get back the original impulse, plus a series of echos, each in turn d samples
L’esempio più semplice di una rete ricircolante è il filtro a pettine ricircolante
after the previous one, and multiplied each time by the gain g. In general, a
il cui diagramma a blocchi è mostrato in Figura 7.7. Come per il filtro a pettine
delay network’s output given an impulse as input is called the network’s impulse
semplice visto prima, il segnale in input viene inviato ad una linea di ritardo la
response.
cui lunghezza è d campioni. Ma ora anche l’output della linea di ritardo torna
Note that we have chosen a gain g that is less than one in absolute value.
al suo input; l’input del ritardo è la somma dell’input originale e dell’output
Ifdelweritardo.
chose aL’output
gain greater than one
del ritardo (or moltiplicato
viene less than -1), pereach echo would
un numero have di
g prima a
larger magnitude than
ritornare al suo ingresso. the previous one. Instead of falling exponentially as they
do in the figure, they would grow exponentially. A recirculating network whose
output Il comportamento
eventually fallsnel dominio
toward zerodel tempo
after del filtro
its input a pettine
terminates ricircolante
is called stable;è
mostrato in Figura 7.8. Qui consideriamo
one whose output grows without bound is called unstable. l’effetto di inviare un impulso nella
rete. Otteniamo l’impulso originale, più una serie di echi,
We can also analyse the recirculating comb filter in the frequency domain. ognuno d campioni
doposituation
The il precedente, e moltiplicato
is now quite ogni volta
hard to analyze usingper realilsinusoids,
guadagnoand g. soInwegenerale,
get the
quando si ha un impulso come input, l’output di una rete
first big payoff for having introduced complex numbers, which greatly simplify di ritardo è chiamato
risposta
the all’impulso della rete.
analysis.
Si as
If, notibefore,
che abbiamo
we feedscelto un guadagno
the input with theg signal,
che è inferiore a 1 in valore assoluto.
Se avessimo scelto un guadagno maggiore di 1 (o minore di −1), ogni eco avrebbe
un modulo maggiore rispetto al precedente. X[n] = Z n Invece di calare esponenzialmente
come fanno nella figura, crescerebbero esponenzialmente. Una rete ricircolante
il cui|Z|
with = 1, we
output can write
scende a zerothe dopooutput as
che l’input è finito si dice stabile; una rete il
cui output cresce senza limiti è detta instabile.
Y [n] = (1 + gZ −d + g 2 Z −2d + · · ·)X[n]
Possiamo anche analizzare il filtro a pettine ricircolante nel dominio della
frequenza. La situazione adesso è molto difficile da analizzare usando sinusoidi
reali e pertanto otteniamo il primo grande guadagno di aver introdotto i numeri
complessi, che semplificano notevolmente l’analisi.
186
176 CHAPTER
Capitolo 7. TIME SHIFTS
7. Spostamenti AND DELAYS
temporali e ritardi

input

output

Figura
Figure 7.8: Analisi nel dominio
7.8: Time-domain analysisdelof tempo del filtro acomb
the recirculating pettine ricircolante,
filter, using an
utilizzando un impulso
impulse as input. come input.

Se,the
Here come prima,
terms in thel’input della from
sum come rete èthe
il segnale,
series of discrete echos. It follows that
the amplitude of the output is:
X[n] = Z n
2
+ gZ −d +
H = 1 l’output
con |Z| = 1, possiamo scrivere (gZ −d ) + · · ·
come
This is a geometricYseries; we+can
[n] = (1 sum
gZ −d + git2 Zusing
−2d the standard technique. First
+ · · · )X[n].
−d
multiply both sides by gZ to give:
Qui i termini della somma provengono dalla serie di echi discreti. Ne consegue
2 3
gZ −d H =è:gZ −d + (gZ −d ) + (gZ −d ) + · · ·
che l’ampiezza dell’output

H =1+
and subtract from the original gZ −d +to
equation (gZ −d 2
) + ···
give:

H − gZ −dsommarla
Questa è una serie geometrica; possiamo H =1 usando la tecnica standard.
Innanzitutto moltiplichiamo entrambi i lati per gZ −d per avere
Then solve for H:
gZ −d H = gZ −d 1 2 + (gZ −d )3 + · · ·
−d
H +=(gZ ) −d
1 − gZ
e sottraendola dall’equazione originale si ottiene:
A faster (but slightly less intuitive) method to get the same result is to
examine the recirculating network H −itself
gZ −dtoH yield
= 1. an equation for H, as follows.
We named the input X[n] and the output Y [n]. The signal going into the delay
Quindi, risolvendo
line is the output Yper
[n],Hand
si ha:
passing this through the delay line and multiplier
gives
1
H Y=[n] · gZ −d .
1 − gZ −d
This plus the input is just the output signal again, so:
Un metodo più veloce (ma meno intuitivo) per ottenere lo stesso risultato
è quello di esaminare la rete
Y [n]ricircolante
= X[n] + Y stessa per−dprodurre un’equazione per
[n] · gZ
H, nel modo seguente. Chiamiamo X[n] l’input e Y [n] l’output. Il segnale che
entra nella linea di ritardo è l’output Y [n] e passando questo attraverso la linea
di ritardo ed il moltiplicatore otteniamo

Y [n] · gZ −d .
7.4. Reti di ritardo ricircolanti 177

Questo, insieme all’input, è proprio il segnale di uscita, quindi:


Y [n] = X[n] + Y [n] · gZ −d
e dividendo per X[n] e ponendo poi H = Y [n]/X[n] si ha:
H = 1 + HgZ −d
che è equivalente all’equazione trovata precedentemente per H.
Ora vorremmo fare un grafico della risposta in frequenza (il guadagno in fun-
zione della frequenza) come abbiamo fatto per i filtri a pettine non-ricircolanti
in Figura 7.6. Questo richiede ancora di fare un passaggio preliminare nel piano
complesso. Vorremmo stimare il modulo di H uguale a:
1
|H| =
|1 − gZ −d |
dove abbiamo usato la proprietà moltiplicativa dei moduli per concludere che il
modulo di un inverso (complesso) è l’inverso di un modulo (reale). La Figura 7.9
mostra la situazione graficamente. Il guadagno |H| è l’inverso della lunghezza
del segmento che va dal punto 1 al punto gZ −d . La Figura 7.10 mostra un grafico
della risposta in frequenza |H| in funzione della frequenza angolare ω = ∠(Z).
La Figura 7.9 può essere utilizzata per analizzare come la risposta in frequen-
za |H(ω)| dovrebbe comportarsi qualitativamente in funzione di g. L’altezza e
la larghezza di banda dei picchi dipendono entrambi da g. Il valore massimo
che |H| può raggiungere è quando
Z −d = 1.
Ciò si verifica alle frequenze ω = 0, 2π/d, 4π/d, . . . come nel caso del filtro a
pettine semplice visto sopra. A queste frequenze il guadagno raggiunge
1
|H| = .
1−g
La prossima importante domanda riguarda la larghezza di banda dei picchi
nella risposta in frequenza. Quindi vorremmo trovare sinusoidi W n , con fre-
quenza ∠(W ), che danno origine ad un valore di |H| che è, diciamo, 3 decibel al
di sotto del massimo. Per fare questo, torniamo alla Figura 7.9 e cerchiamo di
posizionare
√ W in modo che la distanza√dal punto 1 al punto gW −d sia di circa
2 volte la distanza da 1 a g (poiché 2:1 è un rapporto di circa 3 decibel).
Facciamo ciò imponendo che la parte immaginaria di gW −d sia approssima-
tivamente 1 − g o il suo opposto negativo, ottenendo un triangolo nei punti 1,
1 − g e gW −d che è quasi un triangolo rettangolo isoscele (qui supponiamo che g
sia almeno 2/3 o quasi, altrimenti questa approssimazione √ non è molto buona).
L’ipotenusa di un triangolo rettangolo isoscele è sempre 2 volte il cateto, e
quindi il guadagno scende per quel fattore rispetto al suo massimo.
Ora facciamo un’altra approssimazione, cioè che la parte immaginaria di
gW −d sia approssimativamente l’angolo in radianti che taglia sull’asse reale:
±(1 − g) ≈ im(gW −d ) ≈ ∠(W −d ).
Quindi la regione di ogni picco che resta entro 3 decibel del valore massimo è
circa
(1 − g)/d
178 Capitolo 7. Spostamenti temporali e ritardi
188 CHAPTER 7. TIME SHIFTS AND DELAYS
188 CHAPTER 7. TIME SHIFTS AND DELAYS

imaginary
imaginary

1−g
1−g

real 1

real −d 1
gW
−d −d
gW 1−gW
−d
−d 1−gW
gZ
−d
gZ

Figure 7.9: Diagram in the complex plane for approximating the output gain
Figura 7.9: Diagramma nel piano complesso per approssimare il guadagno di
|H| of the recirculating comb filters at three different frequencies: 0, and the
uscita |H|
Figure 7.9: dei filtri ainpettine
Diagram ricircolanti
the complex planea for
treapproximating
diverse frequenze: 0, e gligain
the output ar-
arguments of two unit complex numbers W and Z; W is chosen to give a gain
|H|
gomenti
of thedi recirculating
due numeri complessi
comb filtersunitari W edifferent
at three Z; W viene scelto per
frequencies: 0, avere un
and the
about 3 dB below the peak.
guadagno di
arguments of circa 3 dBcomplex
two unit al di sotto del picco.
numbers W and Z; W is chosen to give a gain
about 3 dB below the peak.

gain
5
gain
5

2 4
2d 4d
d d
Figure 7.10: Frequency response of the recirculating comb filter with g = 0.8.
The peak gain is 1/(1 − g) = 5. Peaks are much narrower than for the non-
Figure 7.10: Frequency response of the recirculating comb filter with g = 0.8.
Figura 7.10: comb
recirculating Risposta in frequenza del filtro a pettine ricircolante con g = 0.8.
filter.
The peak gain is 1/(1 − g) = 5. Peaks are much narrower than for the non-
Il guadagno di picco è 1/(1 − g) = 5. I picchi sono molto più stretti che nel caso
recirculating comb filter.
del filtro a pettine non-ricircolante.
7.5. Conservazione della potenza e reti di ritardo complesse 179

(in radianti) ai due lati del picco. La larghezza di banda si restringe (e i picchi
del filtro diventano più nitidi), quando g si avvicina al suo valore massimo, pari
a 1.
Come per il filtro a pettine non-ricircolante del paragrafo 7.3, i denti del
pettine sono più vicini tra loro per valori più grandi del ritardo d. D’altra
parte, un ritardo di d = 1 (il più breve possibile) fornisce solo un dente (a
frequenza zero) al di sotto della frequenza di Nyquist π (il dente successivo, a
2π, corrisponde nuovamente a una frequenza pari a zero a causa del foldover).
Quindi il filtro a pettine ricircolante con d = 1 è praticamente un filtro passa-
basso. Le reti di ritardo con ritardi di un campione saranno la base per la
progettazione di molti altri tipi di filtri digitali nel Capitolo 8.

7.5 Conservazione della potenza e reti di ritardo


complesse
Le stesse tecniche funzionano per analizzare qualsiasi rete di ritardo, anche se
per reti più complicate diventa più difficile caratterizzare i risultati, o progettare
la rete per avere proprietà specifiche e desiderate. Un altro punto di vista
può talvolta essere utile per la situazione, soprattutto quando sono necessarie
risposte piatte in frequenza, per motivi propri o altrimenti per assicurare che
una rete ricircolante complessa rimanga stabile a guadagni di feedback vicini a
uno.
Il fatto principale che useremo è che se una qualsiasi rete di ritardo, con uno
o più inputs e outputs, è costruita in modo che la sua potenza di uscita (in media
nel tempo) sia sempre uguale alla sua potenza in entrata, tale rete deve avere
una risposta piatta in frequenza. Questa è quasi una tautologia; se inseriamo
una sinusoide, a qualsiasi frequenza, su uno degli ingressi, si otterranno sinusoidi
della stessa frequenza nelle uscite e la somma della potenza su tutte le uscite sarà
uguale alla potenza dell’ingresso, quindi il guadagno, opportunamente definito,
è esattamente uno.
Al fine di lavorare con reti di ritardo con conservazione della potenza avremo
bisogno di una definizione esplicita di “potenza media totale”. Se c’è un solo
segnale (chiamiamolo x[n]), la potenza media è data da:
 
P (x[n]) = |x[0]|2 + |x[1]|2 + · · · + |x[N − 1]|2 /N

dove N è un numero sufficientemente grande in modo che tutte le fluttuazioni


dell’ampiezza si calcolino in media. Questa definizione funziona sia per segnali
complessi che per quelli a valori reali. La potenza totale media per diversi segnali
audio digitali non è altro che la somma delle potenze dei segnali individuali:

P (x1 [n], . . . , xr [n]) = P (x1 [n]) + · · · + P (xr [n])

dove r è il numero di segnali da combinare.


Si scopre che una vasta gamma di interessanti reti di ritardo ha la proprietà
che la potenza totale in output sia uguale alla potenza totale in input; queste
reti prendono il nome di unitarie. Per cominciare, possiamo mettere in parallelo
qualsiasi numero di ritardi, come mostrato in Figura 7.11. Qualunque sia la
potenza totale degli ingressi, la potenza totale delle uscite deve essere uguale.
190
180 CHAPTER
Capitolo 7. TIME SHIFTS
7. Spostamenti AND DELAYS
temporali e ritardi

IN

d d d d
1 2 3 4

OUT

Figure 7.11:
Figura 7.11: First fundamental
Primo building
fondamentale blockdifor
blocco unitary delay
costruzione pernetworks: delay
reti di ritardo
lines in parallel.
unitarie: linee di ritardo in parallelo.

To start with, wefamiglia


Una seconda can putdiany number of delays
trasformazioni in parallel,della
di conservazione as shown
potenza in Figure
è com-
7.11. da
posta Whatever
rotazionithe total power
e riflessioni dei of the inputs,
segnali x1 [n], . .the
. , xtotal power of the outputs
r [n], considerandoli, in ogni
has to nequal
punto it. come le r coordinate di un punto nello spazio r−dimensionale.
fissato,
A second ofamily
La rotazione of power-preserving
la riflessione deve essere una transformations
che lascia l’origine is composed
(0, . . . 0)offissata.
rota-
tions and
Per ognireflections of the n,
sample number signals x1 [n], ...totale
il contributo , xr [n],
allaconsidering
potenza media them, delat each
segnale
èfixed time point an, as the r coordinates of a point in r-dimensional space. The
proporzionale
rotation or reflection must be one |x1 |2that
+ · ·leaves |2 . origin (0, . . . , 0) fixed.
· + |xrthe
QuestaFor each sample
è proprio la number
distanzan,pitagorica
the total contribution
del punto (xto the average signal power
1 , . . . , xr ) dall’origine. Sic-
is proportional to
come le rotazioni e le riflessioni sono 2 trasformazioni 2 che preservano le distanze,
la distanza dall’origine prima |x 1| +
della · · · + |xr |
trasformazione deve essere uguale alla di-
stanza
This is dall’origine dopo. Quindi
just the Pythagorean la potenza
distance totale
from the di un
origin to insieme
the point di (x
segnali
1 , . . . , deve
xr ).
essere preservata
Since rotations perreflections
and rotazione.are distance-preserving transformations, the dis-
La from
tance Figurathe7.12 mostra
origin unatransforming
before matrice di rotazione
must equal chethe
opera su duefrom
distance segnali.
the
Nella
origin parte (a) la So
afterward. trasformazione
the total power è mostrata esplicitamente.
of a collection of signals Se
must i segnali
must be di
ingresso
preservedsono x1 [n] e x2 [n], gli outputs sono:
by rotation.
Figure 7.12 shows a rotation matrix operating on two signals. In part (a)
y1 [n] = cx1 [n] − sx2 [n]
the transformation is shown explicitly. If the input signals are x1 [n] and x2 [n],
the outputs are:
y [n] = sx [n] + cx [n]
y12[n] = cx11[n] − sx22[n]
dove c, s sono dai da y2 [n] = sx1 [n] + cx2 [n]
c = cos(θ)
where c, s are given by
cs == cos(θ)
sin(θ)
per un angolo di rotazione θ. Consideratos = sin(θ)come un punto sul piano cartesiano,
il punto (y1 , y2 ) è proprio il punto (x1 , x2 ) ruotato in senso antiorario di un
for an angle
angolo pari a of θ. rotation θ. Considered
I due punti sono quindi as allapoints
stessaondistanza
the Cartesian plane, the
dall’origine:
point (y1 , y2 ) is just the point (x1 , x2 ) rotated counter-clockwise by the angle θ.
2
The two points are thus at|ythe 1| + |y2 |2distance
same = |x1 |2 from 2
+ |x2 |the origin:
e quindi i due segnali di uscita2 hanno2 la stessa
|y1 | + |y2 | = |x1 | +potenza
2
|x2 |
2 totale dei due segnali di
ingresso.
Per una descrizione alternativa della rotazione in dimensione 2, consideriamo
numeri complessi X = x1 + ix2 e Y = y1 + iy2 . La trasformazione di cui sopra
equivale a porre
Y = XZ
7.5. Conservazione
POWER CONSERVATION
della potenza eAND COMPLEX
reti di DELAY NETWORKS 191
ritardo complesse 181

(a) (b)
IN

IN

c -s s c
c -s

s c

OUT
OUT

Figura 7.12: Second


Figure Secondofundamental
fondamentalebuilding
blocco block
per la for
costruzione di retinetworks:
unitary delay di ritar-
do unitarie:
rotating rotazione
two digital di signals.
audio due segnali
Part audio digitali.
(a) shows La parte (a) explicitly;
the transformation mostra la
trasformazione
(b) shows it as ainmatrix
modo esplicito;
operation.(b) la mostra in termini matriciali.

dovesoZthe
and è un
twonumero complesso
output signals havecon modulo
the same unitario
total power ase argomento θ. signals.
the two input Poiché
|Z| For
= 1,ansegue che |X| description
alternative = |Y |. of rotation in two dimensions, consider com-
plexSenumbers
eseguiamo X una
= xrotazione
1 + x2 i and Y =
su una y1 +diy2segnali
coppia i. Thee above
poi ne transformation
invertiamo uno
amounts to setting
(ma non l’altro), il risultato è una riflessione. Anche la riflessione conserva la
potenza totale del segnale, in quanto Y possiamo
= XZ invertire uno o tutti gli elementi
in un insieme di segnali senza cambiare la potenza totale. In dimensione 2, una
where Z is a complex number with unit magnitude and argument θ. Since
riflessione appare come una trasformazione della forma
|Z| = 1, it follows that |X| = |Y |.
If we perform a rotation on a pair of signals and then invert one (but not
y1 [n] = cx1 [n] + sx2 [n]
the other) of them, the result is a reflection. This also preserves total signal
.
power, since we can invert any or all of a collection of signals without changing
y2 [n] = sx1 [n] − cx2 [n]
the total power. In two dimensions, a reflection appears as a transformation of
the form
Una matrice di rotazione particolare ed utile viene ottenuta impostando
y [n] p= cx1 [n] + sx2 [n]
θ = π/4, in modo che s = c1 = 1/2. Ciò consente di semplificare i calcoli,
come mostrato in Figura 7.13 y2 [n](parte a), −perché
= sx1 [n] cx2 [n] ciascun segnale deve essere
moltiplicato per la sola quantità c = s.
A special
! andeffettuare
useful rotation matrix is obtained by setting θ = π/4, so that
È possibile rotazioni o riflessioni più complicate di più di due
s = c = 1/2. This allows us to simplify the computation as shown in Figure
segnali di ingresso semplicemente ruotandoli e/o riflettendoli ripetutamente a
7.13 (part a) because each signal need only be multiplied by the one quantity
coppie. Ad esempio, in Figura 7.13 (parte b), quattro segnali vengono combinati
c = s.
in coppia, in due passaggi successivi, in modo che alla fine ogni ingresso di
More complicated rotations or reflections of more than two input signals may
segnale appaia in tutte le uscite. Potremmo fare altrettanto con otto segnali
be made by repeatedly rotating and/or reflecting them in pairs. For example,
(usando tre passaggi) e cosı̀ via. Inoltre, se usiamo l’angolo speciale π/4, tutti
in Figure 7.13 (part b), four signals are combined in pairs, in two successive
i segnali di ingresso contribuiranno ugualmente a ciascuna delle uscite.
Qualsiasi combinazione di ritardi e matrici di rotazione, applicata in suc-
cessione ad una collezione di segnali audio, provocherà una risposta piatta in
frequenza, in quanto ogni singola operazione fa questo. Ciò ci permette già di
generare un’infinità di reti di ritardo a risposta piatta, ma finora, nessuna di
192 CHAPTER 7. TIME SHIFTS AND DELAYS
182 Capitolo 7. Spostamenti temporali e ritardi

(a) (b)
IN
IN

R R
1 2

R
3
a a
R
4

OUT OUT

Figure 7.13: Details about rotation (and reflection) matrix! operations: (a) ro-
Figuraby
tation 7.13:
the Dettagli
angle θ =sulle π/4,operazioni
so that a matriciali
= cos(θ) =disin(θ) rotazione
= (e 1/2riflessione):
≈ 0.7071;
p (b) (a)
rotazione di un angolo di θ = π/4, cosicché
combining two-dimensional rotations to make higher-dimensional ones. a = cos(θ) = sin(θ) = 1/2 ≈
0.7071; (b) combinazione di rotazioni bidimensionali per ottenere quelle in
dimensione maggiore.
stages, so that in the end every signal input feeds into all the outputs. We could
do the same with eight signals (using three stages) and so on. Furthermore, if
esseuse
we è ricircolante.
the special angle Unaπ/4,
terzaalloperazione,
the input signalsmostrata willincontribute
Figura 7.14, consente
equally di
to each
effettuare
of the outputs. reti ricircolanti che danno ancora risposte piatte in frequenza.
La parte (a) della figura mostra il layout generale. La trasformazione R è
Any combination of delays and rotation matrices, applied in succession to
una qualsiasi combinazione di ritardi e matrici di miscelazione che preservano
a collection of audio signals, will result in a flat frequency response, since each
la potenza totale. I segnali x1 , . . . , xk entrano in una rete di ritardo unitaria
individual operation does. This already allows us to generate an infinitude of
e ne emergono i segnali di uscita y1 , . . . , yk . Altri segnali w1 , . . . , wj (dove j
flat-response delay networks, but so far, none of them are recirculating. A third
non è necessariamente uguale a k) appaiono all’uscita della trasformazione R e
operation, shown in Figure 7.14, allows us to make recirculating networks that
vengono riportati al suo ingresso.
still enjoy flat frequency responses.
Se R conserva effettivamente la potenza, la potenza totale di ingresso (la
Part (a) of the figure shows the general layout. The transformation R is
potenza dei segnali x1 , . . . , xk più quella dei segnali w1 , . . . , wj ) deve essere
assumed to be any combination of delays and mixing matrices that preserves
uguale alla potenza di uscita (la potenza dei segnali y1 , . . . , yk più quella dei
total power. The signals x1 , . . . xk go into a unitary delay network, and the
segnali w1 , . . . , wj ) e sottraendo tutti gli w dall’uguaglianza, troviamo che le
output signals y1 , . . . yk emerge. Some other signals w1 , . . . wj (where j is not
potenze totali di ingresso e di uscita sono uguali.
necessarily equal to k) appear at the output of the transformation R and are
Se poniamo j = k = 1 in modo di avere un solo segnale x, y e w e supponiamo
fed back to its input.
che la trasformazione R sia una rotazione di un angolo θ seguita da un ritardo di
If R is indeed
d campioni sull’outputpowerWpreserving,
, il risultatothe è iltotal
ben noto inputall-pass
power filter.
(the power of the
Con qualche
signals x 1 , . . . x k plus that of the signals w 1 , . .
manipolazione e ponendo c = cos(θ) possiamo dimostrare che è equivalente. w j ) must equal the output power
(the power of the signals y 1 , . . . y k plus w 1 , . . . w j ),
alla rete mostrata nella parte (b) della figura. I filtri all-pass hanno molte and subtracting all the w from
the equality, we find that the total input and output
applicazioni, alcune delle quali verrano viste più avanti in questo libro. power are equal.
If we let j = k = 1 so that there is one x, y, and w, and let the transformation
R be a rotation by θ followed by a delay of d samples on the W output, the result
7.6 Riverberazione artificiale
La riverberazione artificiale è ampiamente utilizzata per migliorare il suono
delle registrazioni, ma ha una vasta gamma di altre applicazioni musicali [DJ85,
pp.289-340]. La riverberazione in spazi naturali, reali, deriva da un complesso
7.6. Riverberazione artificiale
ARTIFICIAL REVERBERATION 183
193

(a) (b)
IN
x1 xk

...
...

R
wj w d c
1
...
d1 ... dj

c
y y
1 k
OUT

Figure 7.14: Flat frequency response in recirculating networks: (a) in general,


Figura 7.14: Risposta in frequenza piatta nelle reti ricircolanti: (a) in generale,
using a rotation matrix R; (b) the “all-pass” configuration.
utilizzando una matrice di rotazione R; (b) la configurazione “all-pass”

is the well-known all-pass filter. With some juggling, and letting c = cos(θ), we
schema
can show diitriflessioni sonore
is equivalent to sulle pareti e shown
the network su altriin oggetti
part (b)cheofdefiniscono
the figure.loAll-pass
spazio.
Imitare questo processo utilizzando reti di ritardo ricircolanti
filters have many applications, some of which we will visit later in this book. e discrete è una
grande semplificazione. Tuttavia, modellare la riverberazione utilizzando linee
di ritardo ricircolanti può, con molto lavoro, essere fatto per dare buoni risultati.
7.6L’ideaArtificial
centrale è quella reverberation
di idealizzare qualsiasi stanza (o altro spazio riverbe-
rante) come una collezione di linee di ritardo parallele che modellano la memoria
Artificialall’interno
dell’aria reverberation dellaisstanza.
widely usedAd ognito improve
punto sullethe pareti
sound della
of recordings,
stanza molti but
has a wide
percorsi range
lineari of other musical
terminano, ciascuno applications [DJ85, pp.289-340].
dei quali trasporta il suono a quel Reverbera-
punto;
iltion in real,
suono alloranatural spaces
si riflette in arises
molti from
altri apercorsi,
complicatedognuno pattern of originato
di essi sound reflections
in quel
off the ewalls
punto, and other
che conduce objects thatad
eventualmente define the punto
un altro space. suItunis muro.
a great oversim-
plification
Anche se toilimitate
muro (ethis process
l’aria using recirculating,
che abbiamo attraversato discrete
per arrivaredelayallanetworks.
parete)
Nonetheless,
assorbe un po’modeling
del suono, reverberation
una parte della usingpotenza
recirculating
incidente delay lines can,
è riflessa versowithun
muchmuro.
altro work, Sebe lamade to yield
maggior partegood results. ricircola, la stanza riverbera per un
dell’energia
tempo Thelungo;
central se idea
tuttaisl’energia
to idealize anyla room
lo fa, (or otherdura
riverberazione reverberant
per sempre. space) Seasa
a collection
qualsiasi of parallel
frequenza delayriflettono
le pareti lines that piùmodels
energiathe memory
rispetto of thericevuta,
a quella air inside il
the room.
suono verràAt each instabilmente;
ripreso point on the walls questo of non
the accade
room, manymai instraight-line
ambienti reali paths
(la
terminate, eachdell’energia
conservazione carrying sound to that point;
lo impedisce), the sound
ma può succederetheninreflects into many
un riverberatore
other paths,
artificiale eachèone
se non statooriginating
progettato at correttamente.
that point, and leading eventually to some
otherPerpoint
fare onun ariverberatore
wall. artificiale usando una rete di ritardo, dobbiamo
Although
soddisfare the wall (and the
simultaneamente air richieste
a due we passedconcorrenti.
through to Innanzitutto,
get to the wall) le absorbs
linee di
some ofdevono
ritardo the sound,esseresome portion of
abbastanza the incident
lunghe powerlaiscolorazione
per impedire reflected and makes it
nell’output
to another
come wall.delIf filtraggio
risultato most of the energy (anche
a pettine recirculates, the room
se passiamo al reverberates
di là del semplice for a
long time;
filtro if alldel
a pettine of paragrafo
it does, the 7.4,reverberation
la risposta inlasts forever.tende
frequenza If atad any frequency
avere picchi
ethe walls
valli la reflect more energy
cui distanza overall than they
varia inversamente receive,
al tempo the sound
totale will feed
di ritardo). back
D’altra
parte, non dovremmo ascoltare singoli echi; la densità di eco dovrebbe essere
idealmente almeno mille per secondo.
Nel perseguimento di questi obiettivi, assembliamo un certo numero di linee
di ritardo e connettiamo i loro outputs ai loro inputs. Il percorso di feedback –
184 Capitolo 7. Spostamenti temporali e ritardi

IN

R1

d1

R2

d2
R
9
R3

d3 g

d7 d8 d9

OUT

Figure 7.15: Reverberator design using power-preserving transformations and


Figura 7.15: Progettazione di un riverberatore che utilizza trasformazioni che
recirculating delays.
conservano la potenza e ritardi ricircolanti.

la connessione dalle uscite agli ingressi dei ritardi – dovrebbe avere un guadagno
aggregato che varia leggermente in funzione della frequenza e non supera mai
uno per nessuna frequenza. Un buon punto di partenza è dare al percorso di
feedback una risposta piatta in frequenza e un guadagno leggermente inferiore
a uno; questo può essere fatto usando le matrici di rotazione.
Idealmente questo è tutto ciò che dobbiamo fare, ma in realtà non vorremmo
sempre usare le migliaia di linee di ritardo che ci vorrebbero per modellare i
percorsi tra ogni possibile coppia di punti sulle pareti. Nella pratica usiamo
solitamente tra quattro e sedici linee di ritardo per modellare la stanza. Questa
semplificazione a volte riduce la densità di eco al di sotto di ciò che vorremmo, e
quindi potremmo utilizzare più linee di ritardo all’ingresso della rete ricircolante
per aumentare la densità.
La Figura 7.15 mostra un semplice progetto di riverberatore che usa questo
principio. Il suono in entrata, mostrato come due segnali separati in questo
esempio, viene prima ispessito ritardando progressivamente uno dei due segnali
e poi mescolandoli utilizzando una matrice di rotazione. Ad ogni passaggio il
numero di echi del segnale originale è raddoppiato; tipicamente utilizzeremo tra
i 6 e gli 8 passaggi per ottenere tra i 64 e i 256 echi, tutti con un ritardo totale
compreso tra i 30 e gli 80 millisecondi. La figura mostra tre di tali passaggi.
7.6. Riverberazione artificiale 185

Successivamente arriva la parte ricircolante del riverbero. Dopo l’ispessimen-


to iniziale, il segnale di ingresso entra in uno banco di linee di ritardo parallele
e le loro uscite vengono nuovamente miscelate utilizzando una matrice di rota-
zione. Le uscite miscelate sono attenuate da un guadagno g ≤ 1 e ricondotte
nelle linee di ritardo per creare una rete ricircolante.
Il valore g controlla il tempo di riverberazione. Se la lunghezza media delle
linee di ritardo ricircolanti è d, allora qualsiasi suono in ingresso viene attenuato
di un fattore pari a g dopo un ritardo di tempo pari a d. Dopo un tempo t il
segnale è ricircolato t/d volte, perdendo 20 log10 (g) decibel ogni volta, quindi il
guadagno totale, in decibel, è:

t
20 log10 (g).
d
La misura usuale del tempo di riverberazione (RT) è il tempo a cui il guadagno
scende di sessanta decibel:

20 RT
d log10 (g) = −60,

−3d
RT = log10 (g) .

Se g vale uno, questa formula dà ∞, poiché il logaritmo di uno è zero.


Il quadro illustrato in precedenza è la base di molti riverberatori moderni.
Sono state proposte molte estensioni di questo schema. Il passo successivo più
importante sarebbe quello di introdurre filtri nel percorso di ricircolo in modo
che le frequenze alte possano essere fatte decadere più rapidamente di quelle
basse; questo è facilmente realizzabile con un semplice filtro passa-basso, ma non
lo mostreremo qui, non avendo ancora sviluppato la teoria dei filtri necessaria.
In generale,utilizzare questo schema per progettare un riverberatore com-
porta delle scelte molto complicate sui tempi di ritardo, guadagni e coefficienti
di filtraggio. Sono state pubblicate montagne di letteratura su questo argo-
mento; Barry Blesser ha pubblicato una buon saggio [Ble01]. Molto altro si sa
sulla progettazione di riverberatori e sul tuning che non è ancora stato pubbli-
cato; progettazioni precise vengono spesso tenute segrete per motivi commer-
ciali. In generale, il processo di progettazione coinvolge impotenti e prolungate
sintonizzazioni con prove, errori e ascolti critici.

7.6.1 Controllo dei riverberatori


La riverberazione artificiale viene utilizzata quasi universalmente nella registra-
zione o nella ripresa sonora per addolcire il suono complessivo. Tuttavia, e più
interessante, la riverberazione può essere usata come fonte sonora in proprio. Il
caso speciale di riverberazione infinita è utile per catturare i suoni dal vivo e
estenderli nel tempo.
Per fare questo lavoro, in pratica, è necessario aprire l’ingresso del riverbe-
ratore solo per un breve periodo di tempo, durante il quale il suono d’ingresso
non varia troppo rapidamente. Se un ingresso di un riverberatore infinito viene
lasciato aperto troppo a lungo, il suono si raccoglierà e diventerà rapidamente
una massa indecifrabile. Per “riverberare infinitamente” una nota di uno stru-
mento dal vivo, è meglio aspettare dopo la parte di attacco della nota e quindi
7.7. VARIABLE AND FRACTIONAL SHIFTS 197

186 Capitolo 7. Spostamenti temporali e ritardi

IN (a)

reverb
feedback

OUT

(b)
input
1 gain

t1 t2 time
feedback
1

t3

Figure 7.16: Controlling a reverberator to capture sounds selectively: (a) the


Figura 7.16: Controllo di un riverberatore per catturare in modo selettivo i
network; (b) examples of how to control the input gain and feedback to capture
suoni: (a) la rete; (b) esempi di come controllare i guadagni d’ingresso e di
two sounds at times t1 and t2 , and to hold them until a later time t3 .
feedback per catturare due suoni ai tempi t1 e t2 e mantenerli fino a t3 .

lasciare entrare, nel riverberatore, forse 1/2 secondo dello stato stazionario del-
la nota. È possibile costruire accordi da uno strumento monofonico aprendo
ripetutamente l’ingresso in momenti diversi in cui il tono è stabile.

La Figura 7.16 mostra come ciò possa essere fatto in pratica. I due con-
trolli più importanti sono i guadagni di ingresso e di feedback del riverberatore.
Per catturare un suono, impostiamo il guadagno di feedback su uno (tempo di
riverbero infinito) e apriamo momentaneamente l’ingresso al tempo t1 . Per ag-
giungere altri suoni ad un già trattenuto, ri-apriamo semplicemente il guadagno
d’ingresso nei momenti appropriati (ad esempio t2 in figura). Infine, possiamo
cancellare il suono ricircolante, sia smorzando l’uscita sia svuotando il riverbe-
ratore impostando il guadagno di feedback ad un valore inferiore a uno (come al
momento t3 ). Più riduciamo il guadagno di feedback, più velocemente l’output
decadrà.
7.7. Spostamenti variabili e frazionari 187

7.7 Spostamenti variabili e frazionari


Come tutte le tecniche di sintesi o di elaborazione audio, le reti di ritardo di-
ventano molto più potenti e interessanti se le loro caratteristiche possono essere
fatte cambiare nel tempo. I parametri del guadagno (ad esempio g nel filtro a
pettine ricircolante) possono essere controllati da generatori di inviluppo, va-
riandoli evitando i clicks o altri artefatti. I tempi di ritardo (come d prima) non
sono cosı̀ facili da variare in maniera regolare per due motivi.
In primo luogo, abbiamo definito solo gli spostamenti temporali per valori
interi di d, poiché per valori frazionari di d un’espressione come x[n − d] non è
determinata se x[n] è definito solo per valori interi di n. Per fare ritardi frazio-
nari dovremo introdurre un adeguato schema di interpolazione. E se vogliamo
variare d con regolarità nel tempo, saltare semplicemente da un numero intero
al successivo non darà buoni risultati.
In secondo luogo, anche una volta che avessimo raggiunto cambiamenti dei
tempi di ritardo perfettamente uniformi, gli artefatti causati dalle variazioni dei
tempi di ritardo diventerebbero evidenti anche a piccolissimi tassi di variazione;
mentre nella maggior parte dei casi è possibile fare una rampa, su un controllo
di ampiezza, tra due valori con un tempo superiore a 30 millisecondi senza pro-
blemi, modificare un ritardo di un solo campione su un centinaio comporta un
notevole cambiamento nel tono – anzi, spesso si varierà un ritardo deliberata-
mente proprio per ascoltare gli artefatti, solo passando incidentalmente da un
valore specifico di tempo di ritardo ad un altro.
Il primo problema (ritardi frazionari) può essere affrontato utilizzando uno
schema di interpolazione, esattamente come per la wavetable lookup (paragrafo
2.5). Ad esempio, supponiamo che vogliamo un ritardo di d = 1.5 campioni.
Per ogni n dobbiamo stimare un valore per x[n − 1.5]. Possiamo fare questo
utilizzando l’interpolazione standard a quattro punti, prendendo un polinomio
cubico che passa per i quattro punti “conosciuti” (0, x[n]), (1, x[n − 1]), (2, x[n −
2]), (3, x[n − 3]) e quindi valutare il polinomio al punto 1.5. Facendo questo
ripetutamente per ogni valore di n, possiamo ottenere il segnale ritardato.
Questo schema di interpolazione a quattro punti può essere utilizzato per
qualsiasi ritardo di almeno un campione. I ritardi di meno di un campione non
possono essere calcolati in questo modo perché abbiamo bisogno di due punti di
ingresso recenti almeno come il ritardo desiderato. Questi erano disponibili nel-
l’esempio precedente, ma per un tempo di ritardo di 0.5 campioni, per esempio,
avremmo bisogno del valore di x[n + 1], che si trova nel futuro.
L’accuratezza della stima potrebbe essere ulteriormente migliorata utilizzan-
do schemi di interpolazione di ordine superiore. Tuttavia, esiste un compromesso
tra la qualità e l’efficienza computazionale. Inoltre, se passiamo a schemi di in-
terpolazione di ordine superiore, il tempo minimo possibile di ritardo aumenta,
causando problemi in alcune situazioni.
Il secondo problema da considerare sono gli artefatti – sia voluti che inde-
siderati – che derivano dalla modifica delle linee di ritardo. In generale, una
modifica discontinua del tempo di ritardo darà luogo a una modifica disconti-
nua del segnale di uscita, poiché è effettivamente interrotto in un punto e fatto
saltare ad un altro. Se l’ingresso è una sinusoide, il risultato è un cambiamento
di fase discontinuo.
Se si desidera modificare occasionalmente la linea di ritardo tra tempi di ri-
tardo fissati (ad esempio, all’inizio delle note musicali), allora è possibile utilizza-
7.7. VARIABLE AND FRACTIONAL SHIFTS 199

188 Capitolo 7. Spostamenti temporali e ritardi

input
time

D output time

Figure 7.17: A variable length delay line, whose output is the input from some
Figura
previous7.17:
time.Una
Thelinea di ritardo
output samplesa can’t
lunghezza variabile,
be newer than theil cui output
input è l’input
samples, nor
rispetto a qualche
older than tempo
the length D ofprecedente. I campioni
the delay line. di output
The slope non possono essere
of the input/output curve
più recenti
controls thedei campioni transposition
momentary di input, né of
piùthe
vecchi della lunghezza D della linea
output.
di ritardo. La pendenza della curva di input/output controlla la transizione
momentanea dell’output.

re le tecniche di gestione delle discontinuità sporadiche che abbiamo introdotto


nel paragrafo 4.3. In pratica queste tecniche funzionano mutando l’uscita in un
modo o nell’altro. D’altra parte, se si desidera che il tempo di ritardo cambi
continuamente – mentre si ascolta l’output – allora dobbiamo tener conto degli
artefatti che risultano dalle modifiche.
La Figura 7.17 mostra la relazione tra il tempo di input e di output in una
linea di ritardo variabile. Si suppone che la linea di ritardo abbia una lunghezza
massima fissata pari a D. Ad ogni campione di output (corrispondente ad un
punto sull’asse orizzontale), emetteremo un campione (probabilmente interpo-
lato) dell’input della linea di ritardo. L’asse verticale indica quale campione
(intero o frazionato) utilizzare dal segnale di ingresso. Se n denota il sample
number in output, l’asse verticale mostra la quantità n−d[n], dove d[n] è il ritar-
do (variabile nel tempo) in campioni. Se indichiamo la posizione del campione
di input con
y[n] = n − d[n]
allora l’output della linea di ritardo è:

z[n] = x[y[n]]
7.8. Fedeltà delle linee di ritardo interpolanti 189

dove il segnale x viene calcolato al punto y[n], interpolando opportunamente


nel caso y[n] non sia un intero. Questa è esattamente la formula per la waveta-
ble lookup (pagina 25). Possiamo utilizzare tutte le proprietà della wavetable
lookup di suoni registrati per prevedere il comportamento delle linee di ritardo
variabili.
Resta una differenza tra linee di ritardo e wavetables: il materiale nella linea
di ritardo viene costantemente aggiornato. Non solo non possiamo leggere nel
futuro, ma se la linea di ritardo ha una lunghezza di D campioni, non possiamo
leggere oltre i D campioni nel passato:

0 < d[n] < D

oppure, moltiplicando per −1 la disuguaglianza precedente e aggiungendo n ad


ogni lato,
n > y[n] > n − D.
Questa ultima relazione rappresenta la regione tra le due linee diagonali di
Figura 7.17; la funzione y[n] deve restare all’interno di questa striscia.
Tornando al paragrafo 2.2, possiamo usare le formule di transizione momen-
tanee per wavetables per calcolare la trasposizione t[n] dell’output. Ciò fornisce
la formula di transizione momentanea per le linee di ritardo:

t[n] = y[n] − y[n − 1] = 1 − (d[n] − d[n − 1]).

Se d[n] non cambia con n, il fattore di trasposizione è 1 e il suono emerge dalla


linea di ritardo alla stessa velocità in cui è entrato. Ma se il tempo di ritardo
aumenta in funzione di n, il suono risultante è trasposto verso il basso e se d[n]
diminuisce, verso l’alto.
Questo è chiamato effetto Doppler, e si verifica anche in natura. L’aria che
il suono attraversa può essere considerata come una linea di ritardo. Cambiare
la lunghezza della linea di ritardo corrisponde a spostare l’ascoltatore più vicino
o più lontano da una sorgente sonora stazionaria; l’effetto Doppler dovuto al
cambiamento della lunghezza del percorso funziona esattamente nello stesso
modo della linea di ritardo come se fosse nel caso fisico dell’aria.
Tornando alla Figura 7.17, possiamo prevedere che non ci sia uno sposta-
mento di tono all’inizio, ma poi quando la pendenza del percorso diminuisce,
il tono scenderà per un intervallo di tempo prima di tornare al tono originale
(quando la pendenza torna a uno). Il tempo di ritardo può essere manipolato
per dare una qualsiasi trasposizione desiderata, ma maggiore è la trasposizione,
tanto meno possiamo mantenerla prima di arrivare sulla parte inferiore o su
quella superiore della regione diagonale.

7.8 Fedeltà delle linee di ritardo interpolanti


Poiché stiamo in effetti facendo una ricerca su wavetable, le linee di ritardo
variabili introducono distorsioni ai segnali su cui operano. Inoltre, un problema
più sottile può sopraggiungere anche quando la linea di ritardo non cambia in
lunghezza: la risposta in frequenza, in situazioni reali, non è mai perfettamente
piatta per una linea di ritardo la cui lunghezza non sia un intero.
Se il tempo di ritardo cambia da campione a campione, si applicano i risulta-
ti sulla distorsione del paragrafo 2.5. Per utilizzarli, supponiamo che l’ingresso
190 Capitolo 7. Spostamenti temporali e ritardi

della linea di ritardo possa essere suddiviso in sinusoidi e consideriamo sepa-


ratamente ciò che accade a ciascuna singola sinusoide. Possiamo utilizzare la
Tabella 2.1 (pagina 43) per prevedere il livello RMS dei prodotti di distorsione
combinati per una linea di ritardo variabile interpolata.
Assumiamo qui che vogliamo utilizzare l’interpolazione a quattro punti. Per
le sinusoidi con periodi superiori a 32 campioni (cioè per frequenze inferiori a
1/16 della frequenza di Nyquist), la distorsione è di 96 dB o migliore – improba-
bile che sia mai evidente. Ad una frequenza di campionamento di 44 kHz, questi
periodi corrisponderebbero alle frequenze fino a circa 1400 Hertz. A frequenze
più alte la qualità si degrada, e al di sopra di 1/4 della frequenza di Nyquist
i prodotti di distorsione, che sono solo a circa 50 dB, saranno probabilmente
udibili.
La situazione per un tono complesso dipende principalmente dalle ampiezze
e dalle frequenze delle sue parziali superiori. Supponiamo, ad esempio, che le
parziali di un tono sopra a 5000 Hz siano almeno 20 dB in meno rispetto alle sue
parziali più forti e che al di sopra di 10000 Hertz siano inferiori a 60 dB. Allora,
da una stima approssimativa, i prodotti di distorsione nel range 5000 − 10000
saranno ciascuno limitati a circa −68 dB e quelli oltre i 10000 Hertz saranno
limitati a circa −75 dB (perché la situazione peggiore nella tabella è di circa
−15 dB e questo deve essere aggiunto alla forza della parziale coinvolta).
Se il contenuto nelle frequenze alte del segnale di ingresso fornisce prodotti
di distorsione non accettabili, in generale è più efficace aumentare la frequenza
di campionamento rispetto al numero di punti di interpolazione. Per periodi
superiori a 4 campioni, raddoppiando il periodo (raddoppiando per esempio la
frequenza di campionamento) la distorsione diminuisce di circa 24 dB.
La risposta in frequenza della linea di ritardo interpolanti a 4 punti è quasi
piatta fino a metà della frequenza di Nyquist, ma successivamente scende rapida-
mente. Supponiamo (per scegliere il caso peggiore) che il ritardo sia impostato
a metà tra due interi, ad esempio 1.5. L’interpolazione cubica dà:
−x[0] + 9x[1] + 9x[2] − x[3]
x[1.5] = .
8
Ora, sia x[n] una sinusoide (a valori reali) di ampiezza unitaria con frequenza
angolare ω, la cui fase è zero a 1.5:
x[n] = cos(ω · (n − 1.5))
e calcoliamo x[1.5] utilizzando la formula sopra:
9 cos(ω/2) − cos(3ω/2)
x[1.5] = .
4
Questo è il valore di picco della sinusoide che esce fuori dalla linea di ritardo e
poiché l’ampiezza di picco in entrata valeva 1, ciò mostra la risposta in frequenza
della linea di ritardo. Questo è illustrato nella Figura 7.18. A metà della
frequenza di Nyquist (ω = π/2) il guadagno è di circa −1 dB, che è un calo
appena percettibile dell’ampiezza. Alla frequenza di Nyquist stessa, tuttavia, il
guadagno è zero.
Come per i risultati della distorsione, la risposta in frequenza migliora radi-
calmente con un raddoppio della frequenza di campionamento. Se eseguiamo il
nostro ritardo ad una frequenza di campionamento di 88200 Hertz invece dello
standard a 44100, avremo solo circa 1 dB di scivolamento fino a 20000 Hertz.
7.9. Spostamento di tono
202 191
CHAPTER 7. TIME SHIFTS AND DELAYS

gain
1

Figure 7.18: Gain of a four-point interpolating delay line with a delay halfway
Figura 7.18: Guadagno di una linea di ritardo con interpolazione a quattro punti
between two integers. The DC gain is one.
con un ritardo a metà tra due interi. Il guadagno DC è uno.

ω, whose phase is zero at 1.5:


7.9 Spostamento di tono (pitch shifting)
x[n] = cos(ω · (n − 1.5))
Uno degli utilizzi preferiti delle linee di ritardo variabili è quello di modificare
il tono
and di un x[1.5]
compute suono using
in entrata utilizzando
the above formula:l’effetto Doppler. Può essere deside-
rabile modificare il tono in modo variabile (casualmente o periodicamente, ad
esempio), oppure mantenere un intervallo 9 cos(ω/2)musicale
− cos(3ω/2)di trasposizione per un certo
periodo di tempo. x[1.5] =
4
Ritornando alla Figura 7.17, vediamo che con una singola linea di ritardo
This is the
variabile peak value
possiamo of the sinusoid
mantenere qualsiasi that comes back
spostamento out of the
desiderato delay
di tono perline,
un
and since the
intervallo peak di
limitato amplitude
tempo, ma goingse in was one,
vogliamo this shows
sostenere una the frequency re-
trasposizione fis-
sponse
sa, allaoffine
thearriveremo
delay line.sempre
This isalgraphed
di fuori in Figure
dalla 7.18.diagonale
striscia At half dei
the tempi
Nyquist di
frequency (ω = π/2) the
ritardo ammissibili. gainscenario
Nello is aboutpiù
-1 dB, which varieremo
semplice, is a barelysemplicemente
perceptible drop la
in amplitude. verso
trasposizione At thel’alto
Nyquist frequency
e verso il bassoitself,
in modohowever, the gainnella
da rimanere is zero.
striscia.
As with funziona,
Questo the resultsadfor distortion,
esempio, the frequency
se vogliamo response
applicare improves
un vibrato radically
ad un suono
with
comeamostrato
doublinginofFigura
sample7.19.rate.Qui
If we run our delay
la funzione at a èsample rate of 88200
di ritardo
Hertz instead of the standard 44100, we will get only about 1 dB of roll-off all
the way up to 20000 Hertz. d[n] = d0 + a cos(ωn)

dove d0 è il ritardo medio, a è l’ampiezza della variazione del ritardo medio


7.9 Pitch
e ω è una shifting
frequenza angolare. La trasposizione momentanea (pagina 189) è
approssimativamente
A favorite use of variable delay t = 1lines
+ aωiscos(ωnto alter the pitch of an incoming sound
− π/2).
using the Doppler effect. It may be desirable to alter the pitch variably (ran-
Questaorvaria
domly in valore for
periodically, 1 − aω e 1or+else
traexample), aω. to maintain a fixed musical interval
Supponiamo,over
of transposition d’altra parte,of che
a length time. vogliamo mantenere una trasposizione co-
stante su un intervallo
Returning to Figure di tempo
7.17, we seepiùthat
lungo.
withIna questo caso non
single variable possiamo
delay line weman-
can
tenere per
maintain anysempre
desiredlapitch
trasposizione,
shift for a ma è comunque
limited interval ofpossibile
time, butmantenerla su
if we wish to
intervalli
sustain fissatitransposition
a fixed di tempo interrotti
we will da alwaysmodifiche discontinue,
eventually comethe
land outside mostrato in
diagonal
Figura
strip of 7.20. Il tempo
admissible di times.
delay ritardo In è l’output di unascenario,
the simplest opportunawe funzione
simply varya dente
the
di sega normalizzata
transposition up and edown
l’output
so asdella linea diinritardo
to remain variabile viene inviluppata,
the strip.
come mostrato in figura, per evitare le discontinuità.
Questo viene eseguito come mostrato in Figura 7.21. L’output del gene-
ratore a dente di sega è utilizzato in due modi. Innanzitutto è regolato per
funzionare tra i limiti d0 e d0 + s, e questa dente di sega modificata controlla
192 Capitolo 7. Spostamenti temporali e ritardi

input
time

output time

Figure
Figura7.19:
7.19:Vibrato
Vibratousing a variable
usando una linea delay
di line. Since
ritardo the pitch
variabile. shift alternates
Poiché lo sposta-
204 CHAPTER 7. TIME SHIFTS AND DELAYS
between
mento diupward and verso
tono varia downward,
l’alto eit verso
is possible to maintain
il basso, è possibileitmantenerlo
without drifting
senza
outside
deviarethe strip
al di of della
fuori admissible
strisciadelay.
di ritardo ammissibile.

input
time

output time

Figure
Figura 7.20: Funzioni
Piecewisedilinear delay
ritardo functions
lineari a tratti to
permaintain
mantenerea constant transpo-
una trasposizione
sition (except
costante at the points
(ad eccezione of discontinuity).
dei punti The Gli
di discontinuità). outputs are subiscono
outputs enveloped unas
suggested by thesuggerito
inviluppo come bars above each
dalle point,
barre toogni
sopra smooth theper
punto, output at the
smussare pointsnei
l’uscita of
discontinuity in delay time.
punti di discontinuità nel tempo di ritardo.

This works, for example, if we wish to apply vibrato to a sound as shown in


Figure 7.19. Here the delay function is

d[n] = d0 + a cos(ωn)

where d0 is the average delay, a is the amplitude of variation about the average
delay, and ω is an angular frequency. The Momentary Transposition (Page 200),
is approximately
7.9. Spostamento di tono 193

7.9. PITCH SHIFTING 205

IN
0

s
N
d
delay 0
time
1

0
0 N

OUT

Figure
Figura 7.21: Using
Utilizzoa variable delaydiline
di una linea as avariabile
ritardo pitch shifter.
come The
pitchsawtooth wave
shifter. L’on-
creates a smoothly
da a dente di sega increasing or decreasing
crea un tempo delay
di ritardo chetime. The output
aumenta of the senza
o diminuisce delay
line is enveloped
irregolarità. to avoid
L’output delladiscontinuities.
linea di ritardoAnother copy of
è inviluppato perthe same disconti-
evitare diagram
should run 180 degrees
nuità. Un’altra (π radians)
copia dello out of phase
stesso diagramma withessere
deve this one.
eseguita a 180 gradi
(π radianti) fuori fase rispetto al primo.
194 Capitolo 7. Spostamenti temporali e ritardi

il tempo di ritardo, in campioni. Il ritardo iniziale d0 deve essere almeno suf-


ficiente per rendere possibile il ritardo variabile; per l’interpolazione a quattro
punti deve essere di almeno un campione. Valori maggiori per d0 aggiungono un
ritardo addizionale, costante, all’output; questo è generalmente proposto come
un ulteriore controllo in un pitch shifter poiché è essenzialmente gratuito. La
quantità s è talvolta chiamata dimensione della finestra (window size) e corri-
sponde approssimativamente alla lunghezza del campione in un campionatore
ciclico (paragrafo 2.2).
L’output dell’onda a dente di sega è anche utilizzato per inviluppare l’output
stesso esattamente come nel caso del campionatore wavetable di Figura 2.7
(pagina 36). L’inviluppo è zero nei punti in cui l’onda a dente di sega si riavvolge
e, in mezzo, aumenta senza irregolarità fino ad un valore massimo di 1 (per
guadagno unitario).
Se la frequenza dell’onda a dente di sega è f (in cicli al secondo), il suo valore
spazia da 0 a 1 ogni R/f campioni (dove R è la frequenza di campionamento).
La differenza tra valori successivi è dunque f /R. Se denotiamo con x[n] l’output
dell’oscillatore a dente di sega, allora
f
x[n + 1] − x[n] =
R
(ad eccezione dei punti di wraparound). Se regoliamo l’intervallo di uscita del-
l’oscillatore wavetable sul valore s (come viene fatto in figura), otterremo una
nuova pendenza:
sf
s · x[n + 1] − s · x[n] = .
R
Aggiungere la costante d0 non ha alcun effetto su questa pendenza. La traspo-
sizione momentanea (pagina 189) è quindi:
sf
t=1− .
R
Per completare la progettazione del pitch shifter dobbiamo aggiungere un’altra
copia, ma metà fuori fase. Ciò dà origine ad uno schema di lettura del ritardo
come mostrato in Figura 7.22.
Il pitch shifter può trasportare sia in maniera ascendente (usando le fre-
quenze negative per l’onda a dente di sega, come nella figura) o in maniera
discendente, utilizzando quelle positive. Lo spostamento di tono è di solito
controllato cambiando f e mantenendo s fisso. Per ottenere un intervallo di
trasposizione desiderato t, poniamo
(t − 1)R
f= .
s
La window size s dovrebbe essere scelta abbastanza piccola, se possibile, in
modo che le due copie ritardate (di s/2 campioni) non suonino come echi distinti.
Tuttavia, per valori molto piccoli di s si ha un aumento di f ; valori di f superiore
a circa 5 Hertz comportano una modulazione molto udibile. Quindi, se sono
richieste trasposizioni molto grandi, potrebbe essere necessario aumentare il
valore di s. I valori tipici vanno da 30 a 100 millisecondi (circa da R/30 a R/10
campioni).
Anche se la frequenza può essere modificata a piacimento, anche in maniera
discontinua, è necessario modificare s con maggiore attenzione. Una possibile
7.10. Esempi 195

input
time

output time

Figure 7.22:
Figura 7.22: Schema
The pitch
di shifter’s delay
lettura del reading
ritardo pattern
del pitch usingutilizzando
shifter two delay due
lines, so
linee
that
di one isinatmodo
ritardo, maximum
che unoamplitude exactly massima
sia all’ampiezza when theesattamente
other is switching.
quando l’altro
sta commutando.

soluzione è quella di disattivare l’output mentre si cambia s in modo discontinuo;


in alternativa, s può essere variata, in maniera continua, con delle rampe, ma
questo provoca effetti Doppler difficili da controllare.

Una buona scelta per l’inviluppo è un mezzo ciclo di sinusoide. Se suppo-


niamo, in media, che le due uscite di ritardo siano non-correlate (pagina 10),
la potenza del segnale dalle due linee di ritardo, dopo l’inviluppo, avrà somma
pari ad una costante (poiché la somma dei quadrati dei due inviluppi è uno).

Su questo algoritmo di pitch shifting esistono molte varianti. Una variante


classica utilizza una singola linea di ritardo, senza alcun inviluppo. In questa
situazione è necessario scegliere il punto in cui il tempo di ritardo salta e il punto
a cui si salta, in modo che l’uscita rimanga continua. Ad esempio, si potrebbe
trovare un punto in cui il segnale di uscita passa attraverso lo zero (uno “zero-
crossing”) e saltare in maniera discontinuità ad un altro. Utilizzare una sola
linea di ritardo ha il vantaggio che l’uscita del segnale suona più “presente”.
Uno svantaggio è che, poiché il tempo di ritardo è in funzione del valore del
segnale di ingresso, l’output non è più una funzione lineare dell’input, pertanto
gli inputs non periodici possono dare origine ad artefatti quali la differenza di
tono.
208
196 CHAPTER
Capitolo 7. TIME SHIFTS
7. Spostamenti AND DELAYS
temporali e ritardi

loadbang
metro 1000
tabplay~ G01-tab
input signal

write to delay line


delwrite~ delay1 1000

0 <-- delay time


(msec)
delread~ delay1
+~ read from delay line
|
(OUT)

Figure 7.23: Example patch G01.delay.pd, showing a noninterpolating delay


Figura
with 7.23:timePatch
a delay dell’esempio
controlled G01.delay.pd, che mostra un ritardo
in milliseconds.
non-interpolato con un tempo di ritardo controllato in millisecondi.

A good choice of envelope is one half cycle of a sinusoid. If we assume on


7.10 that
average Esempi
the two delay outputs are uncorrelated (Page 11), the signal power
from the two delay lines, after enveloping, will add to a constant (since the sum
Linea
of squaresdiofritardo fissa, non-interpolata
the two envelopes is one).
Many variations exist on this pitch shifting algorithm. One classic variant
L’esempio
uses a singleG01.delay.pd
delay line, with(Figura 7.23) applica
no enveloping at all.unaIn linea di ritardo
this situation semplice
it is ad
necessary
un segnale in ingresso. Sono necessari due nuovi oggetti:
to choose the point at which the delay time jumps, and the point it jumps to, so
that the output
delwrite∼ stays continuous.
: definisce e scrive suFor example,
una linea dione couldIlfind
ritardo. a point
primo whereargu-
creation the
output signal passes through zero (a “zero crossing”) and jump
ment fornisce il nome della linea di ritardo (e due linee di ritardo non possono discontinuously
to another one.
condividere Using
lo stesso only one
nome). delay line
Il secondo has the
creation advantage
argument è la that the signal
lunghezza della
output
linea di ritardo in millisecondi. L’ingresso riceve un segnale audio e lotime
sounds more “present”. A disadvantage is that, since the delay is
scrive
acontinuamente
function of input signal value, the
nella linea di ritardo. output is no longer a linear function of the
input, so non-periodic inputs can give rise to artifacts such as difference tones.
delread∼ : legge (o “tap’, da“to tap”-tamburellare, NdT) una linea di ri-
tardo. Il primo creation argument fornisce il nome della linea di ritardo (che
7.10 Examples
dovrebbe coincidere con il nome del corrispondente oggetto delwrite∼; questo
è il modo in cui Pd sa quale delwrite∼ associare all’oggetto delread∼). Il
secondo creation
Fixed, argument (opzionale)
noninterpolating delay fornisce
line il tempo di ritardo in millise-
condi. Questo non può essere negativo e non può neanche superare la lunghezza
della lineaG01.delay.pd
Example di ritardo specificata
(Figure 7.23)nell’oggetto simple delayI line
applies adelwrite∼. numerito an in entra-
input
ta (messaggi)
signal. Two new possono
objectsessere utilizzati per modificare dinamicamente il tempo
are needed:
didelwrite~
ritardo. Tuttavia,
: define andciò comporterà unaline.
write to a delay modifica discontinua
The first creation dell’output,
argument gives che
dovrebbe pertanto essere disattivato quando il tempo di ritardo
the name of the delay line (and two delay lines may not share the same name). cambia.
L’esempio accoppia semplicemente un oggetto delwrite∼ con un oggetto
delread∼ per fare un ritardo semplice non-interpolante. Il segnale di ingresso
è una registrazione in loop. Il segnale ritardato e quello non ritardato vengono
sommati per creare un filtro a pettine non-ricircolante. A tempi di ritardo
inferiori a circa 10 millisecondi, l’effetto filtrante è più prominente e, soprattutto,
7.10. Esempi
210 CHAPTER 7. TIME SHIFTS AND DELAYS 197

0 <-- pitch

mtof 1
phasor~ adsr 1 100 1000 0 1000
*~ *~
input
signal 0 <-- delay time
delread~ G02-del 160 read from delay line
*~ 0.7 feedback gain
+~ add the original and the delayed signal
|
(OUT) delwrite~ G02-del 2000 write to delay line

Figure 7.24: Recirculating delay (still noninterpolating).


Figura 7.24: Ritardo ricircolante (ancora non-interpolante).

0 <-- pitch
si sente un eco discreto. Non c’è alcuna protezione di disattivazione per l’output
mtof
del ritardo,0 quindi
<-- i timbre
clicks sono possibili quando cambia il tempo di ritardo.
* 0.5
* 0.01 0 <-- cycle frequency (hundredths)
Filtro
osc~ a pettine ricircolante
pack 0 100 / 100
0
L’esempio G02.delay.loop.pd (Figura 7.24)<-- cycle
mostra comedepth (msec)
effettuare una rete di
line~ osc~ 0
ritardo ricircolante. Il ritardo è nuovamente ottenuto utilizzando una coppia
pack 0 100
*~ L’output
delwrite∼/delread∼. +~ 1 dell’oggetto delread∼ è moltiplicato per un
line~
guadagno
cos~ di feedback di 0.7 e poi inviato all’oggetto delwrite∼. Un input
*~
(fornito dal phasor∼ e dagli oggetti ad esso associati) viene aggiunto all’ingresso
0 <-- feedback
hip~
di 10
delwrite∼; questa somma diventa l’output della rete. Questo è il filtro a
+~ 1.46
pettine * 0.01 (hundredths)
clip~ ricircolante
-0.2 0.2 del paragrafo 7.4.
vd~ G03-del
La rete di oggetti tilde non ha cicli, nel pack senso 0di100
oggetti che alimentano
+~
direttamente o indirettamente (tramite connessioni attraverso altri oggetti) se
stessi. line~ tra gli oggetti delwrite∼
Il feedback della rete si verifica implicitamente
hip~ 5
e| delread∼.
*~
(OUT)
clip~ -1 1
Linea di ritardo variabile
delwrite~ G03-del 1000
L’esempio seguente, G03.delay.variable.pd (Figura 7.25), è un altro filtro a petti-
ne ricircolante, questa volta ottenuto utilizzando una linea di ritardo a lunghezza
variabile. Qui7.25:
Figure vieneThe
introdotto un interpolating,
flanger: an nuovo oggetto:variable delay line.
vd∼ : lettura da una linea di ritardo, con un tempo di ritardo variabile.
Come l’oggetto delread∼, questo legge da una linea di ritardo il cui nome è
specificato come creation argument. Invece di utilizzare un secondo argomento
e/o messaggi di controllo per specificare il tempo di ritardo, per l’oggetto vd∼
il ritardo in millisecondi è specificato da un segnale audio in entrata. La linea
di ritardo viene letta utilizzando l’interpolazione (cubica) a quattro punti; il
ritardo minimo ottenibile è un campione.
signal 0 <-- delay time
delread~ G02-del 160 read from delay line
*~ 0.7 feedback gain
+~ add the original and the delayed signal
|
(OUT) delwrite~ G02-del 2000 write to delay line

198 Capitolo 7. Spostamenti temporali e ritardi


Figure 7.24: Recirculating delay (still noninterpolating).

0 <-- pitch
mtof
0 <-- timbre
* 0.5
* 0.01 0 <-- cycle frequency (hundredths)
osc~
pack 0 100 / 100
0 <-- cycle depth (msec)
line~ osc~ 0
pack 0 100
*~
+~ 1
line~
cos~
*~
0 <-- feedback
hip~ 10
+~ 1.46
* 0.01 (hundredths)
clip~ -0.2 0.2
vd~ G03-del
pack 0 100
+~
line~
hip~ 5
| *~
(OUT)
clip~ -1 1

delwrite~ G03-del 1000

Figure 7.25: The flanger: an interpolating, variable delay line.


Figura 7.25: Il flanger: una linea di ritardo variabile, interpolante.

Qui gli oggetti sul lato sinistro, dall’alto verso il basso fino all’oggetto clip∼
-0.2 0.2, formano una rete waveshaping; l’indice è impostato dal controllo
“timbre” e l’output del waveshaping varia tra una quasi sinusoide e un suono
brillante e ronzante. L’output viene sommato all’output dell’oggetto vd∼. La
somma viene poi filtrata con un passa-alto (l’oggetto hip∼ in basso a sinistra),
moltiplicata per un guadagno di feedback, ritagliata e scritta nella linea di
ritardo in basso a destra. C’è un controllo a destra per impostare il guadagno di
feedback; qui, in contrasto con l’esempio precedente, è possibile specificare un
guadagno superiore a uno per ottenere feedback instabili. Per questo motivo il
secondo oggetto clip∼ viene inserito nel ciclo di ritardo (appena sopra l’oggetto
delwrite∼) in modo che il segnale non possa superare 1 in valore assoluto.
La lunghezza del ritardo è controllata dall’input del segnale nell’oggetto vd∼.
Un oscillatore con frequenza e guadagno variabili, al centro della figura, fornisce
il tempo di ritardo. All’oscillatore viene sommato 1 per renderlo non-negativo
prima di moltiplicarlo per il controllo “cycle depth”, che imposta effettivamente
il range dei tempi di ritardo. Il tempo di ritardo minimo di 1.46 millisecondi
viene aggiunto in modo che il range vero dei tempi di ritardo sia tra il minimo
e lo stesso più due volte la “depth” (profondità). La ragione di questo tempo
di ritardo minimo sarà ripresa nella spiegazione del prossimo esempio.
I filtri a pettine con tempi di ritardo variabili sono a volte chiamati flan-
gers. Quando il tempo di ritardo cambia, i picchi della risposta in frequenza si
muovono in su e in giù in frequenza, in modo che il timbro dell’output cambia
costantemente in modo caratteristico.
7.10. Esempi
212 199
CHAPTER 7. TIME SHIFTS AND DELAYS

(a)
(b)
a~

b~ c~ a~ b~

d~

Figure 7.26: Order of execution of tilde objects in Pd: (a), an acyclic network.
Figura
The 7.26: may
objects Ordinebe di esecuzione
executed di oggetti
in either the tilde
orderin“a-b-c-d”
Pd: (a), or
una“a-c-b-d”.
rete aciclica.
In
Gli oggetti possono essere eseguiti nell’ordine “a-b-c-d” o “a-c-b-d”.
part (b), there is a cycle, and there is thus no compatible linear orderingNellaofparte
the
(b), c’è because
objects un ciclo, e quindi
each non need
one would c’è un ordinamento
to be run before lineare compatibile degli
the other.
oggetti perché ognuno avrebbe bisogno di essere eseguito prima dell’altro.

details.)
Ordine di effect
To see the esecuzione e limiti
of the order inferiori
of computation on asui tempi di ritardo
delwrite~/delread~ pair,
we can write explicitly the input and output signals in the two possible
Quando si utilizzano ritardi (cosı̀ come altri oggetti di tilde, in Pd, di condivi-orders,
with
sionethe minimum
di stato), possible
l’ordine delay.
in cui If the write
le operazioni di operation
scrittura ecomes first,
lettura sonoat eseguite
a block
starting at sample number N , the operation can be written as:
può influenzare l’esito del calcolo. Anche se gli oggetti tilde in una patch pos-
sono avere una topologia x[N ], . complessa
. . , x[N + Bdi−connessioni
1] −→ delwrite~ audio, in realtà Pd li esegue
tutti in ordine sequenziale, uno dopo l’altro, per calcolare ogni blocco di output
audio. BQuesto
where ordinesize
is the block lineare
(as inèSection
garantito3.2).perHaving
essere put
compatibile con le intercon-
those particular samples
nessioni
into audio,line,
the delay nel senso che non
a following viene eseguito
delread~ is ablealcunto read calcolo di unvalues
the same oggetto tilde
out:
finché non sono stati calcolati tutti gli inputs, per quel blocco stesso.
La Figura 7.26 mostra delread~ due −→ esempix[Ndi], .topologie B − 1]
. . , x[N +degli oggetti tilde e la loro
interpretazione in una sequenza di calcolo. Nella parte (a) ci sono quattro
On the
oggetti other
tilde e, hand,
a causasuppose
delle the object comes
delread~l’oggetto
connessioni, a∼ before the delwrite~.
deve produrre il suo
Then the samples x[N ], . . . , x[N + B − 1] have
output prima che si possa eseguire sia b∼ o c∼; ed entrambi questi, not yet been stored in the adelay
loro
line,
volta,sovengono
the mostutilizzati
recent samples
nel calcolo that may
di d∼. be read
Quindibelong to the ordini
i possibili previous di block:
questi
quattro oggetti sono “a-b-c-d” e “a-c-b-d”. Questi due ordinamenti avranno
delread~ −→ x[N − B], . . . , x[N − 1]
esattamente lo stesso risultato, a meno che il calcolo di b∼ e c∼ non influenzi,
in qualche modo, l’output l’uno dell’altro (come potrebbero fare, ad esempio, le
x[N ], . . . , x[N + B − 1] −→ delwrite~
operazioni di ritardo).
HereLatheparteminimum
(b) delladelay
figura we mostra
can possibly
un ciclo obtain is thetilde.
di oggetti block Questa
size B. reteSo nonthe
minimum
può esseredelay is eitherin0 un
organizzata or B, depending
ordine sequenziale on the order in which
compatibile, the sia
poiché delread~
a∼ che
and delwrite~objects
b∼ richiedono che l’outputare sorted
dell’altrointosia
a sequence
calcolato of execution.
prima. In generale, un ordine
Looking di
sequenziale back at the
oggetti tildepatches of Figures
è possibile se e solo7.24seandnon7.25, which
ci sono cicliboth feature
in qualsiasi
recirculating
punto della rete delays,
deglithe delread~
oggetti tilde eordelle
vd~loroobject must be placed
interconnessioni earlier in
di segnale the
audio.
sequence
Pd segnala than
unthe quando object.
delwrite~
errore appare This
un taleis true of (si
ciclo anynotidesign
cheinlawhich a delay’s
situazione per
output is fed back di
le interconnessioni into its input.
controllo tra The minimum
oggetti possible delay
è più complicata is B samples.
e flessibile, si veda
For a (typical) sample
la documentazione di Pd rate perofi dettagli).
44100 Hertz and block size of 64 samples, this
comes
Pertovedere
1.45 milliseconds.
l’effetto dell’ordineThis might not sound
di calcolo su unaatcoppia
first like a very important
delwrite∼/read∼,
restriction. But if esplicitamente
possiamo scrivere you are trying itosegnali tune adirecirculating
ingresso e dicomb uscitafilter to a possibili
nei due specific
ordini, con il minimo ritardo possibile. Se l’operazione di scrittura viene prima,
in un blocco a partire dal sample number N , l’operazione può essere scritta
come:
x[N ], . . . , x[N + B − 1] −→ delwrite∼
200 Capitolo 7. Spostamenti temporali e ritardi

dove B è la dimensione del blocco (come nel paragrafo 3.2). Avendo inserito
questi particolari campioni nella linea di ritardo, un delread∼ successivo è in
grado di leggere gli stessi valori:
delread∼ −→ x[N ], . . . , x[N + B − 1].
D’altra parte, supponiamo che l’oggetto delread∼ arrivi prima dell’oggetto
delwrite∼. Quindi i campioni x[N ], . . . , x[N + B − 1] non sono ancora stati
memorizzati nella linea di ritardo, perciò i campioni più recenti che possono
essere letti appartengono al blocco precedente:
delread∼ −→ x[N − B], . . . , x[N − 1]

x[N ], . . . , x[N + B − 1] −→ delwrite∼ .


Qui il ritardo minimo che possiamo ottenere è la dimensione B del blocco. Quin-
di il ritardo minimo è 0 o B, a seconda dell’ordine in cui gli oggetti delwrite∼
e read∼, vengono ordinati in una sequenza di esecuzione.
Guardando nuovamente alle patch delle Figure 7.24 e 7.25, che forniscono
entrambi ritardi ricircolanti, gli oggetti delread∼ o vd∼ devono essere posizio-
nati prima, nella sequenza, dell’oggetto delwrite∼. Questo vale per qualsiasi
schema in cui l’output del ritardo viene ri-inviato al suo ingresso. Il ritardo
minimo possibile è B campioni. Per una frequenza di campionamento (tipica)
di 44100 Hertz e una dimensione del blocco di 64 campioni, si ha un ritardo mi-
nimo di 1.45 millisecondi. Questo, in un primo momento, potrebbe non suonare
come una limitazione molto importante. Ma se si sta tentando di sintonizzare
un filtro a pettine ricircolante a uno specifico tono, quello più alto possibile
che si può ottenere è solo di circa 690 Hertz. Per ottenere ritardi ricircolanti
più brevi è necessario aumentare la frequenza di campionamento o diminuire la
dimensione del blocco.
L’esempio G04.control.blocksize.pd (Figura 7.27) mostra come la dimensione
del blocco possa essere controllata in Pd utilizzando un nuovo oggetto:
block∼ , switch∼ : imposta la dimensione del blocco locale nella finestra
della patch in cui l’oggetto si trova. Le dimensioni dei blocchi sono normalmente
potenze di due. Inoltre, l’oggetto switch∼ può essere utilizzato per attivare e
disattivare il calcolo dell’audio all’interno della finestra, utilizzando i messaggi
di controllo. I creation arguments aggiuntivi possono impostare la frequenza di
campionamento locale e specificare i calcoli sovrapposti (illustrati nel Capitolo
9).
Nella parte (a) della figura (la patch principale), un impulso rettangolare
viene inviato alla sottopatch pd delay-writer, il cui output viene quindi resti-
tuito alla patch principale. La parte (b) mostra il contenuto della sottopatch,
che invia gli impulsi in una rete di ritardo ricircolante. L’oggetto block∼ speci-
fica che, in questa sottopatch, il calcolo del segnale utilizza una dimensione del
blocco (B) di solo un campione. Quindi il ritardo minimo raggiungibile è un
campione invece dei 64 di default.
Mettere un impulso (o un altro segnale di eccitazione) in un filtro a pettine
ricircolante per ottenere un tono viene a volte chiamata sintesi di Karplus-
Strong, ed è stata descritta in un loro lavoro [KS83], anche se l’idea sembra
essere più vecchia. Si ritrova ad esempio nel pezzo di Paul Lansky del 1979, Six
Fantasies on a Poem by Thomas Campion.
7.10. Esempi 201

7.10. EXAMPLES 213

(a) (b)
loadbang incoming delay
pulses time
metro 500
inlet~ inlet
random 60
del 1 delread~ G04-del
+ 30
1 0 +~ *~ 0.99
mtof
vline~ expr 1000/$f1 delwrite~ G04-del 1000
pd delay-writer
outlet~ block~ 1
|
(OUT) set block size

Figure 7.27: A patch using block size control to lower the loop delay below the
Figura 64
normal 7.27: Una patch
samples: (a) theche utilizza
main patch;il(b)
controllo della dimensione
the “delay-writer” delwith
subpatch blocco
a per
abbassare
block~ il ritardo
object del ciclo al delay
and a recirculating di sotto dei normali 64 campioni: (a) la patch
network.
principale; (b) la sottopatch “delay-writer” con un oggetto block∼ e una rete
di ritardo ricircolante.

pitch, the highest you can get only comes to about 690 Hertz. To get shorter
214
recirculating CHAPTER
delays you must increase 7. TIME
the sample rate orSHIFTS
decreaseAND DELAYS
the block
size.

Example G04.control.blocksize.pd (Figure 7.27) shows how the block size


delay in
can be controlled in Pd using a new object: 45 samples
(a) (b)
switch~ : Set the local block size of the patch /window
pd ,pulse
block~ 44.1 the object

sits in. Block sizes are normally powers of two. The switch~ pack
object, 0in 30
addition,
can be used delwrite~ G05−d1
to turn audio 1000 within the window on and off, using
computation
control messages. Additional creation arguments can set theline~ local sample rate
and specifyvd~ G05−d1computations (demonstrated in Chapter 9).
overlapping
pd pulse
In +~
part (a) of the figure (the main patch), a rectangular pulse is sent to the
pd delay-writer subpatch, whose output pd delay−writer
is then returned to the main patch.
(BAD)
Part (b) shows the contents of the subpatch, which sends the pulses into a
pd delay−reader
recirculating delay. The block~ object specifies that, in this subpatch, signal
computation uses a block size (B) of only one. So the minimum achievable delay
(GOOD)
is one sample instead of the default 64.

Putting a pulse (or other excitation signal) into a recirculating comb filter
Figure
Figura
to make 7.28: Using
Utilizzo
a pitch subpatches
calledtoKarplus-Strong
di sottopatches
is sometimes ensure that delay
per assicurare chelines are diwritten
le linee
synthesis, having de-before
ritardo
been siano
they are
scritte read
prima in
di non-recirculating
essere lette in retinetworks: (a) the
non-ricircolanti: delwrite~
(a) gli
scribed in a paper by them [KS83], although the idea seems to be older. It and
oggetti vd~ objects
delwrite∼
might
e vd∼up
shows be executed
potrebbero
for example in either
essere
in Paul the “right”
eseguiti
Lansky’s or the
in 1979
ordine “wrong”
“giusto”
piece, oorder; (b)
on athe
“errato”;
Six Fantasies delwrite~
(b)
Poem l’oggetto
by
object
delwrite∼
Thomas isCampion.
inside the pd delay-writer
è all’interno della sottopatch subpatch and the vd~e l’oggetto
pd delay-writer object is vd∼ insideè
the pd delay-reader
all’interno one. pd
della sottopatch Because of the audio
delay-reader. connection
A causa between theaudio
della connessione two
subpatches, the order ofl’ordine
tra le due sottopatches, execution of the read/write
di esecuzione pair is
della coppia di forced to be the
lettura/scrittura
correct one.a essere quello corretto.
è costretto

Order of execution in non-recirculating delay lines


In non-recirculating delay networks, it should be possible to place the operation
of writing into the delay line earlier in the sequence than that of reading it.
There should thus be no lower limit on the length of the delay line (except
whatever is imposed by the interpolation scheme; see Section 7.7). In languages
such as Csound, the sequence of unit generator computation is (mostly) explicit,
so this is easy to specify. In graphical patching environments, however, the order
is implicit and another approach must be taken to ensuring that, for example, a
delwrite~ object is computed before the corresponding delread~ object. One
way of accomplishing this is shown in example G05.execution.order.pd (Figure
7.10.
202 EXAMPLES 215
Capitolo 7. Spostamenti temporali e ritardi

pd looper
delwrite~ G06-del 100
fiddle~ 2048
unpack mtof fundamental frequency
moses 1 expr 500/$f1 1/2 period, in msec
t f b samplerate~

expr 2048000/$f1
estimate fiddle~ delay
+ as one window (in msec)
delread~ G06-del pack 0 20
line~
vd~ G06-del
+~
|
(OUT)

Figure 7.29: An “octave doubler” uses pitch information (obtained using a


Figura 7.29:
fiddle~ Unto“octave
object) tune a doubler” utilizza
comb filter le informazioni
to remove di tono in
the odd harmonics (ottenute
an in-
usando un oggetto
coming sound. fiddle∼) per sintonizzare un filtro a pettine per rimuovere
gli armonici dispari in un suono in entrata.

In this example, the “right” and the “wrong” way to make the comb filter
Ordine
have audiblydi different
esecuzione results.inForlinee
delays diless
ritardo
than 64non-ricircolanti
samples, the right hand
side of the patch (using subpatches) gives the correct result, but the left hand
Nellecan’t
side reti di ritardodelays
produce non-ricircolanti,
below the 64 dovrebbe
sample essere
block possibile
size. posizionare, nella
sequenza, l’operazione di scrittura nella linea di ritardo prima di quella che la
legge. Non è quindi previsto un limite inferiore della lunghezza della linea di
Non-recirculating
ritardo (ad eccezione di ciò comb
che è filter
impostoas octave
dallo schemadoubler
di interpolazione, vedere
il paragrafo 7.7). In linguaggi come Csound,
In example G06.octave.doubler.pd (Figure 7.29) we revisit la sequenza di calcolo del generatore
the idea of pitch-
unitario è (in gran parte) esplicita, quindi è facile da specificare.
based octave shifting introduced earlier in E03.octave.divider.pd. There, Negli ambienti
know-
di patching grafici, tuttavia, l’ordine è implicito ed è
ing the periodicity of an incoming sound allowed us to tune a ring modulator necessario adottare un
altro approccio per assicurare che, ad esempio, un oggetto
to introduce subharmonics. Here we realize the octave doubler described in delwrite∼ venga
calcolato7.3.
Section prima
Usingdela corrispondente oggetto delread∼.
variable, non-recirculating comb filter Unwemodo
takeper
out realizzare
odd har-
ciò è mostrato nell’esempio G05.execution.order.pd (Figura
monics, leaving only the even ones, which sound an octave higher. As before, 7.28).
the Nella
spectralparte (a) della
envelope figura,
of the soundle isconnessioni nella patch
roughly preserved nonoperation,
by the determinano so wein
quale ordine le due operazioni di ritardo appaiano nella
can avoid the “chipmunk” effect we would have got by using speed change to sequenza di calcolo de-
gli the
do oggetti tilde; l’oggetto delwrite∼ potrebbe essere calcolato prima o dopo
transposition.
l’oggetto vd∼. Se vogliamo
The comb filtering is doneassicurarci
by combining che l’operazione di scrittura
two delayed copies of thesiincoming
verifichi
prima dell’operazione di lettura, possiamo procedere come
signal (from the pd looper subpatch at top). The fixed one (delread~) is set nella parte (b) della
to
figura e mettere le due operazioni in sottopatches, collegandole
the window size of the pitch following algorithm. Whereas in the earlier example tramite segnali
audio in modo che la prima sottopatch debba essere calcolata prima della se-
conda (il calcolo audio nelle sottopatches è fatto atomicamente, nel senso che
tutti i contenuti della sottopatch sono considerati come per il calcolo audio per
la sottopatch nel suo complesso. Quindi tutto quello che c’è in una sottopatch
si verifica prima di tutto quello che c’è nella seconda).
7.10. Esempi 203

In questo esempio, il modo “giusto” e quello “sbagliato” per fare il filtro a


pettine hanno risultati udibili diversi. Per i ritardi di meno di 64 campioni, il
lato destro della patch (utilizzando le sottopatches) dà il risultato corretto, ma
il lato sinistro non può produrre ritardi con blocchi di dimensione inferiori a 64
campioni.

Filtro a pettine non-ricircolante come octave doubler


Nell’esempio G06.octave.doubler.pd (Figura 7.29) rivisitiamo l’idea di sposta-
mento di ottave, basato sul tono, che è stata introdotta precedentemente nell’e-
sempio E03.octave.divider.pd. In quel caso, conoscere la periodicità di un suono
in entrata ci ha permesso di sintonizzare un modulatore ad anello per introdur-
re sub-armonici. Qui realizziamo l’octave doubler descritto nel paragrafo 7.3.
Utilizzando un filtro a pettine variabile e non-ricircolante, rimuoviamo gli armo-
nici dispari, lasciando solo quelli pari, che suoneranno ad un’ottava superiore.
Come prima, l’inviluppo spettrale del suono è preservato approssimativamente
dall’operazione, in modo da evitare l’effetto “chipmunk” che avremmo ottenuto
utilizzando il cambio di velocità per effettuare la trasposizione.
Il filtraggio a pettine è fatto combinando due copie ritardate del segna-
le in entrata (dalla sottopatch pd looper in cima). Quella fissa (delread∼)
è impostata sulla dimensione della finestra dell’algoritmo di tracciamento del
tono. Mentre nell’esempio precedente questo è stato nascosto in un’altra sot-
topatch, possiamo adesso mostrarlo esplicitamente. Il ritardo in millisecondi è
stimato essere pari alla finestra di analisi, di 2048 campioni, utilizzata dall’og-
getto fiddle∼; in millisecondi questo diventa pari a 1000 · 2048/R dove R è la
frequenza di campionamento.
Il ritardo variabile è lo stesso, più 1/2 del periodo misurato del suono in
entrata, o 1000/(2f ) millisecondi dove f è la frequenza in cicli al secondo. La
somma di questo e del tempo di ritardo fisso viene quindi resa regolare usando
un oggetto line∼ per ottenere il segnale di ingresso per la linea di ritardo
variabile.
Poiché la differenza tra i due ritardi è 1/(2f ), le frequenze di risonanza del
filtro a pettine risultante sono 2f, 4f, 6f, . . . ; la risposta in frequenza (paragrafo
7.3) è zero alle frequenze f, 3f, . . . , quindi il suono risultante contiene solo le
parziali multiple di 2f – un’ottava superiore all’originale. Visto in un altro
modo, il suono in entrata viene emesso due volte, con una differenza di metà
ciclo; gli armonici dispari vengono quindi spostati a 180 gradi (π radianti) e
annullati; gli armonici pari sono in fase con le loro copie ritardate e rimangono
nella somma.
Sia questo che l’octave divider possono essere alterati per fare spostamenti
con rapporti di 3 o 4 a 1 in frequenza e possono anche essere combinati per fare
spostamenti composti come una quinta musicale (un rapporto di 3:2) spostando
in basso di un’ottava e quindi alzando di un fattore tre (lo spostamento in basso
va fatto prima di quello verso l’alto per ottenere i risultati migliori).

Filtro a pettine complesso variabile: shakers


L’esempio G07.shaker.pd (Figura 7.30) mostra un modo diverso di estendere
l’idea di un filtro a pettine. Qui combiniamo il segnale di ingresso con quattro
204 Capitolo 7. Spostamenti temporali e ritardi

frequency time constant


on/off
(msec)
0 0
phasor~ 80 metro
* 4
delwrite~ G07-del 30 f + 1

*~ line~ mod 4
t f b
delread~ G07-del 30
random 1000
*~ line~
expr 2 * $f1/1000 - 0.7
delread~ G07-del 17
pack 0 0 200
*~ line~
route 0 1 2 3
delread~ G07-del 11
*~ line~
+~
|
(OUT)

Figure 7.30: A “shaker”, a four-tap comb filter with randomly varying gains on
Figura
the taps.7.30: Uno “shaker”, un filtro a pettine a quattro taps con guadagni a
variazione casuale nei taps.

diversi spostamenti di tempo (invece di due, come nel filtro a pettine non-
ricircolante originale), ognuno con un diverso guadagno positivo o negativo. A
tal fine, inseriamo il segnale di ingresso in una linea di ritardo e facciamo un
“tap” in tre punti diversi; il quarto “tap” è il segnale originale, non ritardato.
Per pensare alla risposta in frequenza di un filtro a pettine a quattro taps,
consideriamo innanzitutto cosa succede quando due dei quattro guadagni sono
vicini allo zero. Otterremo quindi un semplice filtro a pettine non-ricircolante,
con la leggera complicazione che i guadagni delle due copie ritardate possono
essere diversi. Se sono entrambi dello stesso segno, otteniamo li stessi picchi e
le stesse valli come previsto nel paragrafo 7.3, solo che le valli tra i picchi sono
forse meno profonde. Se sono di segno contrario, le valli diventano picchi e i
picchi diventano valli.
A seconda di quali dei due taps si suppongano essere diversi da zero, i picchi
e le valli sono distanziate da quantità diverse; i tempi di ritardo vengono scelti
in modo che si possano verificare 6 tempi di ritardo diversi, compresi tra 6 e
30 millisecondi. Nel caso generale in cui tutti i guadagni sono diversi da zero,
possiamo immaginare che la funzione di risposta in frequenza vari continuamen-
te tra questi estremi, dando cosı̀ una successione di configurazioni complicate.
Questo ha l’effetto di sollevare e abbassare le ampiezze delle parziali del segnale
in entrata, tutte indipendentemente dalle altre, in uno schema complicato, per
dare un timbro costantemente variabile nel tempo.
Il lato destro della patch si occupa della modifica dei guadagni del segnale
di ingresso e delle sue tre copie spostate. Ogni volta che l’oggetto metro emette
un bang, un contatore viene incrementato (gli oggetti f, + 1 e mod 4). Questo
controlla quali delle ampiezze saranno cambiate. L’ampiezza stessa è calcolata
7.10. Esempi 205

creando un numero casuale e normalizzandolo affinché si trovi in valore tra −0.7


e 1.3. Il valore casuale e l’indice sono impacchettati (insieme ad un terzo valore,
un intervallo di tempo) e questa terna passa all’oggetto route. Il primo elemento
della terna (il contatore) seleziona a quale uscita inviare gli altri due valori; di
conseguenza, uno dei quattro possibili oggetti line∼ riceve un messaggio per
fare una rampa ad un nuovo valore.
Se la variazione del tempo viene eseguita abbastanza rapidamente, c’è anche
un effetto di modulazione sul segnale originale; in questa situazione i segmenti
di linea retta utilizzati in questo esempio devono essere sostituiti da segnali mo-
dulanti con un contenuto di frequenza più controllabile, ad esempio utilizzando
i filtri (l’argomento del Capitolo 8).

Riverberatore
L’esempio G08.reverb.pd (Figura 7.31) mostra un semplice riverberatore arti-
ficiale, in sostanza una realizzazione del progetto mostrato nella Figura 7.15.
Quattro linee di ritardo vengono alimentate con l’input e con la propria uscita
ricircolante. Le uscite dei ritardi vengono mescolate utilizzando matrici di ro-
tazione, costruite da rotazioni elementari di π/4 come nella Figura 7.13 (parte
a).
p
La moltiplicazione di normalizzazione (per 1/2 ad ogni passo) viene assor-
bita nel guadagno di feedback, che quindi non può superare 1/2. A un guadagno
di feedback di esattamente 1/2, tutta l’energia che lascia le linee di ritardo viene
reinserita in esse, quindi la riverberazione dura per sempre.
La Figura 7.32 mostra l’interno dell’abstraction reverb-echo utilizzata nel
riverberatore. I due ingressi sono miscelati (usando la stessa matrice di rotazio-
ne e lasciando nuovamente la ri-normalizzazione a più tardi). Un canale viene
quindi ritardato. I tempi di ritardo sono definiti per crescere approssimativa-
mente in maniera esponenziale; questo assicura uno schema di echi regolare e
diffuso.
Sono possibili molte estensioni di questa idea delle quali ne citeremo solo
alcune. È naturale, innanzitutto, mettere filtri passa-basso alla fine delle linee
di ritardo, per imitare il decadimento, tipicamente più veloce, delle frequenze
alte rispetto a quelle basse. È anche comune utilizzare più di quattro ritardi
ricircolanti; un riverberatore nella distribuzione Pd ne usa sedici. Infine è norma
comune consentire un controllo separato delle ampiezze dei primi echi (ascoltati
direttamente) e di quella del segnale ricircolante; parametri come questi sono
pensati per controllare le qualità soniche descritte come “presenza”, “calore”,
“chiarezza” e cosı̀ via.

Pitch shifter
L’esempio G09.pitchshift.pd (Figura 7.33) mostra una realizzazione del pitch
shifter descritto nel paragrafo 7.9. Una linea di ritardo (definita e scritta altrove
nella patch) viene letta usando due oggetti vd∼. I tempi di ritardo variano tra
un ritardo minimo (fornito dal controllo “delay”) e il minimo più la dimensione
di una finestra (il controllo “window”).
206 Capitolo 7. Spostamenti temporali e ritardi

7.10. EXAMPLES 219

inlet~

reverb-echo echo-del1 5.43216 "early echo" generators,


reverb-echo echo-del2 8.45346 which also increase echo
density.
reverb-echo echo-del3 13.4367

reverb-echo echo-del4 21.5463

reverb-echo echo-del5 34.3876

reverb-echo echo-del6 55.5437


Get the outputs of the recirculating
delays. Add the inputs to two of them.
delread~ loop-del1 60

delread~ loop-del2 71.9345

delread~ loop-del3 86.7545


+~ +~
delread~ loop-del4 95.945

outlet~ outlet~
Do a power-conserving
Tap outputs here.
+~ mix of them in pairs.
-~ +~ -~
First combine (1, 2) and
(3, 4)...
+~ +~ -~ -~ then (1, 3) and (2, 4)
feedback gain on a scale
of 0-100 controls reverb
/ 200 time.
inlet
min 100
*~ *~ *~ *~
max 0

delwrite~ loop-del4 95.945


delwrite~ loop-del3 86.7545
delwrite~ loop-del2 71.9345
delwrite~ loop-del1 60
Put the signals back into
the recirculating delays.

Figure 7.31:
Figura 7.31:AnUn
artificial reverberator.
riverberatore artificiale.
220 7.10. Esempi CHAPTER 7. TIME SHIFTS AND
207DELAYS

220 CHAPTER 7. TIME SHIFTS AND DELAYS

inlet~ inlet~
inlet~ inlet~

+~ -~
+~ -~
delwrite~ $1 $2
delwrite~ $1 $2
delread~ $1 $2
delread~ $1 $2
outlet~
outlet~ outlet~
outlet~

Figure 7.32: The echo generator used in the reverberator.


FigureFigura
7.32:7.32:
TheIl echo generator
generatore usednelinriverberatore.
di eco usato the reverberator.

r transpose
7 <-- transposition r window
r transpose (halftones)
80 <--window
7 * 0.05776
<-- transposition r window (msec)
exp
(halftones) max 1
80 <--window
* 0.05776 speed
1.4982 (msec)
change max 1
exp - 1
* 0.001
speed t b f
1.4982* -1 delay
change
(msec)
- 1 tape head* 0.001
/ rotation freq r delay
t b f pack 0 200
* -1 -6.228 +~ 0.5 0 delay
line~ (msec)
phasor~
tape head wrap~ max 1.5
/ rotation freq r delay
pack 0 200
-6.228-~ 0.5 +~*~ 0.5 -~pack
0.5 0
*~
200
line~
0
*~ 0.5 +~ line~
*~ 0.5 +~
phasor~ wrap~ max 1.5
cos~ vd~ G09-del
cos~ vd~ G09-del
*~ pack 0 200
-~ 0.5 *~ -~*~0.5 *~
+~ line~
*~ 0.5| +~
(OUT) *~ 0.5 +~
cos~ vd~ G09-del
cos~ vd~ G09-del
Figure
Figura 7.33:
7.33: Un A pitch
pitch shifter
shifter conusing two variabili
due taps variableintaps
unainto
lineaa di
delay line.
ritardo.
*~
*~
+~
|
(OUT)

Figure 7.33: A pitch shifter using two variable taps into a delay line.
208 Capitolo 7. Spostamenti temporali e ritardi

Lo spostamento di tono desiderato in semitono (h) viene prima convertito


in un fattore di trasposizione

t = 2h/12 = elog(2)/12·h ≈ e0.05776h

(denominato “speed change” nella patch). Il calcolo etichettato come “tape


head rotation speed” è lo stesso della formula per f data a pagina 194. Qui
l’intervallo positivo (sette semitoni) genera un fattore di trasposizione maggiore
di uno e quindi un valore negativo per f .
Una volta calcolata f , la produzione dei due segnali a dente di sega in fase ed
i corrispondenti inviluppi riprende esattamente quella dell’overlapping sample
looper (esempio B10.sampler.overlap.pd, pagina 52). Il ritardo minimo viene
aggiunto a ciascuno dei due segnali delle onde a dente di sega per creare gli inputs
di ritardo per gli oggetti vd∼, i cui outputs sono moltiplicati per i corrispondenti
inviluppi e sommati.

Esercizi
1. Un numero complesso ha modulo uno e argomento π/4. Quali sono le sue
parti reale e immaginaria?
2. Un numero complesso ha modulo uno e parte reale 1/2. Qual è la sua
parte immaginaria? (Ci sono due valori possibili.)
3. Quale tempo di ritardo si deve dare ad un filtro a pettine in modo che il
suo primo picco di risposta in frequenza sia a 440 Hertz? Se la frequenza
di campionamento è 44100, quale frequenza corrisponderebbe al ritardo
intero più vicino?
4. Supponiamo di fare una variazione del filtro a pettine non-ricircolante in
modo che il segnale ritardato venga sottratto dall’originale anziché essere
sommato. Qual è la nuova risposta in frequenza?
5. Se si desidera effettuare un vibrato a 6 Hz con una linea di ritardo che varia
in maniera sinusoidale e se si desidera che il vibrato modifichi la frequenza
del 5%, quanto è necessario che sia grande la variazione di ritardo? Come
cambierebbe se si volesse che la stessa profondità del vibrato fosse a 12
Hertz?
6. Una sinusoide complessa X[n] ha frequenza 11025 Hertz, ampiezza 50 e
fase iniziale 135 gradi. Un’altra, Y [n], ha la stessa frequenza, ma ampiezza
20 e fase iniziale di 45 gradi. Qual è l’ampiezza e la fase iniziale della
somma di X e Y ?
7. Qual è la frequenza, la fase iniziale e l’ampiezza del segnale ottenuto
quando X[n] (sopra) viene ritardato di 4 campioni?
8. Mostrare che la risposta in frequenza di un filtro a pettine ricircolante, con
tempo di ritardo d e guadagno di feedback g, in funzione della frequenza
angolare ω, è uguale a:

[(1 − g cos(ωd))2 + (g sin(ωd))2 ]−1/2 .


Capitolo 8

Filtri

Nel capitolo precedente abbiamo visto che una rete di ritardo può avere una
risposta in frequenza non uniforme – un guadagno che varia in funzione della
frequenza. Le reti di ritardo modificano anche la fase dei segnali in ingresso
variabilmente dipendente della frequenza. Quando i tempi di ritardo usati sono
molto brevi, le proprietà più importanti di una rete di ritardo diventano la
sua risposta in frequenza e la sua risposta di fase. Una rete di ritardo che è
progettata appositamente per la sua risposta in frequenza o di fase è chiamata
un filtro.
Nei diagrammi a blocchi, i filtri sono mostrati come nella Figura 8.1 (parte
a). La curva mostrata all’interno del blocco fornisce una rappresentazione quali-
tativa della risposta in frequenza del filtro. La risposta in frequenza può variare
nel tempo e, a seconda della progettazione del filtro, è possibile utilizzare uno
o più controlli (o ingressi audio aggiuntivi) per modificarla.
Supponiamo che, seguendo la procedura del paragrafo 7.3, introduciamo una
sinusoide complessa con frequenza angolare ω, a ampiezza unitaria, in un filtro.
Ci aspettiamo di ottenere una sinusoide della stessa frequenza e con qualche
ampiezza, che dipende da ω. Ciò ci dà una funzione complessa H(ω), che viene
chiamata funzione di trasferimento del filtro.
La risposta in frequenza è il guadagno in funzione della frequenza ω. È
uguale al modulo della funzione di trasferimento. La risposta in frequenza di un
filtro viene normalmente rappresentata graficamente come in Figura 8.1 (parte
b). Una sinusoide in entrata, di ampiezza unitaria e frequenza ω, esce dal filtro
con modulo |H(ω)|.
A volte è utile conoscere anche la risposta di fase del filtro, pari a ∠(H(ω)).
Per una frequenza fissata ω, la fase dell’output del filtro sarà ∠(H(ω)) radianti
in anticipo rispetto alla fase in ingresso.
La progettazione e l’uso dei filtri sono un soggetto enorme: l’ampia gamma
di usi che un filtro può avere ci suggerisce un’ampia varietà di processi di pro-
gettazione dei filtri. In alcune applicazioni un filtro deve seguire esattamente
una risposta in frequenza prescritta, in altri è importante minimizzare i tempi
di calcolo, in altri la risposta di fase è importante e in altri ancora il filtro deve
comportarsi bene quando i suoi parametri cambiano rapidamente con il tempo.

209
224
210 CHAPTER 8. FILTERS
Capitolo 8. Filtri

gain

(a) (b)

Figure
Figura 8.1:
8.1: Representations
Rappresentazioniofdia un
filter: (a) (a)
filtro: in ainblock diagram; (b)
un diagramma a graph (b)
a blocchi; of
its frequency response.
un grafico della sua risposta in frequenza.

8.1 Taxonomy
Tassonomiaofdei
filters
filtri
Over
Durantethetutta
history of electronic
la storia music
della musica the technology
elettronica, for building
la tecnologia filters has
per la costruzione
changed
di filtri èconstantly, but certain kinds
cambiata costantemente, maofcerti
filters
tipireappear
di filtri often. In this
riappaiono section
spesso. In
we will give
questo some nomenclature
paragrafo for describing
forniremo alcune nomenclaturefilters of descrivere
per several generic,
filtri recurring
di diversi
types. Later we’ll
tipi, generici develop some
e ricorrenti. basic strategies
Successivamente for making filters
svilupperemo alcunewith desired
strategie di
characteristics, and finally
base per creare filtri we’ll discuss some
con le caratteristiche common
desiderate applications
e infine of filters
discuteremo in
alcune
electronic
applicazioni music.
comuni dei filtri nella musica elettronica.

8.1.1 Filtri passa-basso


Low-pass e passa-alto
and high-pass filters
Lo scopo
By far thedimost
gran frequent
lunga piùpurpose
frequente forper l’utilizzo
using a filterdiisun filtro è quello
extracting eitherditheestrarre
low-
una porzione
frequency a bassa
or the frequenza portion
high-frequency o ad alta frequenza
of an di unattenuating
audio signal, segnale audio, atte-
the rest.
nuando
This il resto. Ciò siusing
is accomplished ottiene utilizzando
a low-pass un filtro filter.
or high-pass passa-basso (low-pass filter)
o unIdeally,
filtro passa-alto
a low-pass (high-pass
or high-pass filter).
filter would have a frequency response of one
up toIdealmente,
(or down to) un afiltro passa-basso
specified o passa-alto
cutoff frequency anddovrebbe
zero past avereit; butunasuchrisposta
filters
in frequenza
cannot in su in
be realized (opractice.
in giù) fino a unawefrequenza
Instead, try to finddirealizable
taglio (cutoff frequency)
approximations
specificata,
to this ideale response.
zero passataThequesta;
more designma tali filtriand
effort noncomputation
possono essere timerealizzati
we put
in pratica.
into Invece,wecerchiamo
it, the closer can get. di trovare approssimazioni realizzabili di questa
risposta
Figureideale. Maggiore
8.2 shows è lo sforzoresponse
the frequency di progettazione
of a low-passe il tempo
filter. di calcolo che
Frequency is
abbiamointo
divided messo in esso,
three bands, tanto più ci
labeled onpossiamo avvicinare.
the horizontal axis. The passband is the
La Figura
region (frequency 8.2 mostra
band) wherela risposta in frequenza
the filter should pass di units filtro
inputpassa-basso.
through to its La
frequenza
output withè suddivisa
unit gain.inFor treabande,
low-pass etichettate
filter (as sull’asse
shown), orizzontale.
the passbandLareaches banda
passante
from è la regione
a frequency (banda
of zero up todia frequenza)
certain frequencyin cui limit.
il filtroFordeve lasciar passare
a high-pass filter,
con passband
the guadagnowould unitario il suo
appear oninput verso la sua
the right-hand uscita.
side of the Per
graph unandfiltro passa-basso
would extend
(comethe
from mostrato),
frequencylalimit banda up passante
to the highestva dalla frequenza
frequency zero fino
possible. Anyadrealizable
una cer-
ta frequenza
filter’s passband limite.
will bePeronly
un approximately
filtro passa-alto, flat;la the
banda passante
deviation from apparirà
flatnesssulis
lato destro
called del grafico
the ripple, and iseoften
si estenderà
specifieddalla frequenza
by giving limite
the ratio fino alla
between themassima
highest
frequenza possibile. Ogni banda passante realizzabile del filtro sarà solo ap-
prossimativamente piatta (flat); la deviazione dalla piattezza è chiamata ripple
(ondulazione) e viene spesso specificata dando il rapporto tra il maggiore e il
minor guadagno nella banda passante, espresso in decibel. Il filtro passa-basso
o passa-alto ideale avrebbe un ripple di 0 dB.
8.1. Tassonomia dei filtri 211

ripple

stopband
attenuation

passband stopband

transition
band

Figura 8.2:
Figure 8.2: Terminology
Terminologiaforperdescribing
descriverethe la risposta
frequencyin response
frequenzaofdei filtri passa-
low-pass and
basso e passa-alto.
high-pass filters. TheL’asse orizzontale
horizontal axis isèfrequency
la frequenza
andethe l’asse verticale
vertical axis èisilgain.
gua-
Adagno. Viene
low-pass visualizzato
filter is shown; aun filtro passa-basso;
high-pass filter has theunsame
filtrofeatures
passa-alto ha le stesse
switched from
caratteristiche
right to left. commutate da destra a sinistra.

La stopband (fascia di arresto) di un filtro passa-basso o passa-alto è la


banda di frequenza in cui il filtro non trasmette il suo input. L’attenuazione
della stopband è la differenza, in decibel, tra il guadagno più basso nella banda
passante e il guadagno più alto nella stopband. Idealmente questo sarebbe
infinito; più sarà alto, migliore sarà il filtro.
Infine, un filtro realizzabile, la cui risposta in frequenza è sempre una fun-
zione continua della frequenza, deve avere una banda di frequenza su cui il gua-
dagno scende dal guadagno della banda passante al guadagno della stopband;
questa si chiama banda di transizione (transition band). Più sottile questa banda
può essere fatta, più il filtro sarà ideale.

8.1.2 Filtri passa-banda ed elimina-banda


Un filtro passa-banda (pass-band) ammette frequenze all’interno di una data
banda, rifiutando le frequenze al di sotto e al di sopra di essa. La Figura 8.3
mostra la risposta in frequenza di un filtro passa-banda, con i parametri chiave
etichettati. Un filtro elimina-banda (stop-band) fa l’azione inversa, respingendo
le frequenze all’interno della banda e lasciando passare le frequenze al di fuori
di essa.
Nella pratica, spesso viene utilizzato un linguaggio più semplice per la de-
scrizione dei filtri passa-banda, come mostrato nella Figura 8.4. Qui ci sono
solo due parametri: una frequenza centrale e una larghezza di banda. La banda
passante viene considerata quella regione in cui il filtro ha almeno la metà del
212 Capitolo 8. Filtri
226 CHAPTER 8. FILTERS

ripple

stopband
attenuation

passband
stopband

stopband transition
bands

Figure
Figura 8.3:
8.3: Terminology
Terminologiaforperdescribing
descriverethe
la frequency
risposta inresponse
frequenza of dei
band-pass and
filtri passa-
stop-band filters. The horizontal axis is frequency and the vertical axis
banda ed elimina-banda. L’asse orizzontale è la frequenza e l’asse verticale è is gain.
A
il band-pass
guadagno. filter is shown;
Viene a stop-band
visualizzato filter
un filtro would haveun
passa-banda; a contiguous stopband
filtro elimina-banda
surrounded by two passbands.
avrebbe una stop-band circondata da due bande passanti.
8.1. TAXONOMY OF FILTERS 227
and lowest gain in the passband, expressed in decibels. The ideal low-pass or
high-pass filter would have a ripple of 0 dB.
The stopband of a low-pass or high-pass filter is the frequency band over
which the filter is intended
bandwidthnot to transmit its input. The stopband attenuation
is the difference, in decibels, between the lowest gain in the passband and the
highest gain in the stopband. Ideally this would be infinite; the higher the
better.
Finally, a realizable filter, whose frequency response is always a continuous
function of frequency, must have a frequency band over which the gain drops
from the passband gain to the stopband gain; this is called the transition band.
The thinner this band can be made, the more nearly ideal the filter.

8.1.2 Band-pass and stop-band filters


center
A band-pass filter admits frequency
frequencies within a given band, rejecting frequencies
below it and above it. Figure 8.3 shows the frequency response of a band-pass
filter, with the key parameters labelled. A stop-band filter does the reverse,
Figure
Figura 8.4:
rejecting 8.4: AUna
simplified
frequencies within
vista view of a band-pass
the band
semplificata and letting
di un filter,
filtro showing
through bandwidth
frequencies
passa-banda, and
che outside
mostra it.
la
center frequency.
larghezza di banda e la frequenza centrale.

In practice, a simpler language is often used for describing bandpass filters,


as shown in Figure 8.4. Here there are only two parameters: a center frequency
and a bandwidth. The passband is considered to be the region where the filter has
at least half the power gain as at the peak (i.e., the gain is within 3 decibels of
its maximum). The bandwidth is the width, in frequency units, of the passband.
The center frequency is the point of maximum gain, which is approximately the
midpoint of the passband.

8.1.3 Equalizing filters


228 CHAPTER 8. FILTERS

8.2. Filtri elementari 213

high
frequency
gain

low frequency gain

crossover frequency

Figure
Figura8.5:
8.5:AUn
shelving filter, showing
filtro shelving, low and
che mostra il high frequency
guadagno gain,
a bassa and crossover
e alta frequenza
frequency.
e la frequenza di crossover.

guadagno di potenza del picco (vale a dire, il guadagno è entro 3 decibel del
suo massimo). La larghezza di banda è la larghezza, in unità di frequenza, della
banda passante. La frequenza centrale è il punto di massimo guadagno, che è
approssimativamente il punto medio della banda passante.
bandwidth
8.1.3 Filtri di equalizzazione
in-band
In alcune applicazioni, come l’equalizzazione,
gain l’obiettivo non è quello di passare
segnali a determinate frequenze, eliminandone altre, ma di effettuare regolazioni
controllabili, aumentando o attenuando un segnale, su una gamma di frequenze,
tramite un guadagno desiderato. Due tipi di filtri sono utili per questo scopo.
In primo luogo, viene utilizzato un filtro shelving (Figura 8.5) per aumentare o
ridurre selettivamentegain
out-of-band l’estremità bassa o alta della gamma delle frequenze. Al di
sotto di una frequenza di crossover selezionabile, il filtro tende verso un guadagno
a bassa frequenza, e al di sopra di essa tende verso uno ad alta frequenza. La
frequenza di crossover, il guadagno a bassa frequenza e il guadagno ad alta
frequenza possonocenter frequency
essere regolati indipendentemente.
In secondo luogo, un peaking filter (filtro di picco, Figura 8.6) è in grado di
aumentare o attenuare i segnali entro un intervallo di frequenze. La frequenza
Figure
centrale8.6:
e laAlarghezza
peaking filter, with(che
di banda controllable center frequency,
insieme controllano bandwidth,
l’intervallo and
di frequenze
in-band and out-of-band
interessate), e i guadagnigains.
in-banda e fuori-banda sono regolabili separatamente.
Gli equalizzatori parametrici utilizzano spesso due filtri shelving (per rego-
lare le estremità basse e alte dello spettro) e due o tre filtri di picco per regolare
le bande in mezzo.

8.2 Filtri elementari


Abbiamo visto nel Capitolo 7 come prevedere la risposta in frequenza e di fase
delle reti di ritardo. L’arte della progettazione dei filtri sta nel trovare una rete
di ritardo la cui funzione di trasferimento (che controlla la risposta in frequenza
crossover frequency

Figure 8.5: A shelving filter, showing low and high frequency gain, and crossover
frequency.

214 Capitolo 8. Filtri

bandwidth

in-band
gain

out-of-band gain

center frequency

Figure
Figura8.6:
8.6:A Un
peaking
filtrofilter, with con
peaking, controllable
frequenzacenter frequency,
centrale, bandwidth,
larghezza ande
di banda
in-band and
guadagni out-of-band
in-banda gains. controllabili.
e fuori-banda

e di fase) abbia una forma desiderata. Svilupperemo un approccio per costruire


reti di ritardo a partire dai due tipi di filtro a pettine sviluppati nel Capitolo 7:
ricircolante e non-ricircolante. Adesso saremo interessati al caso speciale in cui il
ritardo ha lunghezza pari ad un solo campione. In questa situazione, le risposte
in frequenza mostrate nelle Figure 7.6 e 7.10 non sono più simili a pettini; il
secondo picco scende fino alla frequenza di campionamento, 2π radianti, quando
d = 1. Poiché solo le frequenze tra 0 e la frequenza di Nyquist (π radianti) sono
udibili c’è, in effetti, solo un picco quando d = 1.
Nei filtri a pettine mostrati nel Capitolo 7, i picchi sono situati a DC (fre-
quenza zero), ma spesso vorremmo collocarli in altre frequenze diverse da zero.
Questo viene fatto usando reti di ritardo – filtri a pettine – con guadagni a valori
complessi.

8.2.1 Filtro elementare non-ricircolante


Il filtro a pettine non-ricircolante può essere generalizzato per produrre il disegno
mostrato in Figura 8.7. Questo è il filtro elementare non-ricircolante, della prima
forma. Il suo singolo parametro complesso Q controlla il guadagno complesso
del segnale ritardato, sottratto da quello originale.
Per trovare la sua risposta in frequenza, come nel Capitolo 7, alimentiamo
la rete di ritardo con una sinusoide complessa 1, Z, Z 2 , . . . la cui frequenza è
ω = arg(Z). Il campione n−esimo dell’input è Z n e quello dell’output è
(1 − QZ −1 )Z n
quindi la funzione di trasferimento è
H(Z) = 1 − QZ −1 .
Questo può essere analizzato graficamente come mostrato in Figura 8.8. I
numeri reali r e α sono il modulo e l’argomento del numero complesso Q:
Q = r · (cos(α) + i sin(α)).
8.2. Filtri elementari 215
8.2. ELEMENTARY FILTERS 229

IN

d=1

OUT

Figure 8.7: A delay network with a single-sample delay and a complex gain Q.
Figura 8.7: Una rete di ritardo con un ritardo di un singolo campione e un
This is the non-recirculating elementary filter, first form. Compare the non-
guadagno complesso Q. Questo è il filtro elementare non-ricircolante, prima
recirculating comb filter shown in Figure 7.3, which corresponds to choosing
forma. Confrontandolo con il filtro a pettine non-ricircolante mostrato in Figura
Q = −1 here.
7.3, questo corrisponde, qui, a scegliere Q = −1.
230 CHAPTER 8. FILTERS
8.2 Elementary filters
We saw in Chapter 7 how to predict the frequency and phase response of delay
networks. The art of filter design lies in finding a delay network whose transfer
function (whichimaginary
controls the frequency and phase response) has a desired shape.
We will develop an approach to building such delay networks out of the two types
of comb filters developed in Chapter 7: recirculating
Z and non-recirculating. Here
we will be interested in the special case where the delay is only one sample in
length. In this situation, the frequency responses
Q
shown inZ-Q
Figures 7.6 and 7.10
no longer look like combs; the second r peak recedes all the way to the sample
rate, 2π radians, when d = 1. Since only frequencies between 0 and the Nyquist
frequency (π radians) are audible, in effect there is only one peak when d = 1.
In the comb filters shown in Chapter 7, the peaks
real 1 are situated at DC (zero
frequency), but we will often wish to place them at other, nonzero frequencies.
-1
This is done using delay networks—comb filters—with complex-valued gains.
QZ
-1
1-QZ
8.2.1 Elementary non-recirculating filter
The non-recirculating comb filter may be generalized to yield the design shown
in Figure 8.7. This is the elementary non-recirculating filter, of the first form.
Its single, complex-valued parameter Q controls the complex gain of the delayed
signal subtracted from the original one.
To find its frequency response, as in Chapter 7 we feed the delay network a
complex sinusoid 1, Z, Z 2 , . . . whose frequency is ω = arg(Z). The nth sample
of the input is Z n and that of the output is
Figure 8.8: Diagram for calculating −1 the nfrequency response of the non-
Figura 8.8: Diagramma per il calcolo
(1 − QZ della)Zrisposta in frequenza del filtro ele-
recirculating elementary filter (Figure 8.7). The frequency response is given
mentare non-ricircolante (Figura 8.7). La risposta in frequenza è data dalla
by the length of the segment connecting Z to Q in the complex plane.
lunghezza del segmento che collega Z a Q nel piano complesso.

so the transfer function is

H(Z) = 1 − QZ −1

This can be analyzed graphically as shown in Figure 8.8. The real numbers r
and α are the magnitude and argument of the complex number Q:

Q = r · (cos(α) + i sin(α))

The gain of the filter is the distance from the point Q to the point Z in the
complex plane. Analytically we can see this because
8.2.
216 ELEMENTARY FILTERS 231
Capitolo 8. Filtri

gain

|Q|=1
0.5
0

0 frequency 2

Figure 8.9: Frequency response of the elementary non-recirculating filter Figure


Figura 8.9: Risposta in frequenza del filtro elementare non-ricircolante di Figura
8.7. Three values of Q are used, all with the same argument (-2 radians), but
8.7. Si utilizzano tre valori di Q, tutti con lo stesso argomento (−2 radianti),
with varying absolute value (magnitude) r = |Q|.
ma con valore assoluto variabile (modulo) r = |Q|.

is at a minimum, equal to 1 − r. The maximum occurs which Z is at the


Il guadagno
opposite deloffiltro
point the ècircle.
la distanza dal8.9
Figure punto Q al
shows punto
the Z nelfunction
transfer piano complesso.
for three
Possiamo vedere questo
different values of r = |Q|. analiticamente perché

|1 − QZ −1 | = |Z||1 − QZ −1 | = |Q − Z|.
8.2.2 Non-recirculating filter, second form
Graficamente, il numero QZ −1 è proprio il numero Q ruotato all’indietro (in
Sometimes we will need a variant of the filter above, shown in Figure 8.10, called
senso orario) per la frequenza angolare ω della sinusoide in entrata. Il valore
the elementary non-recirculating filter, second form. Instead of multiplying the
|1 − QZ −1 | è la distanza da QZ −1 a 1 nel piano complesso, uguale alla distanza
delay output by Q we multiply the direct signal by its complex conjugate Q. If
da Q a Z.
Poiché la frequenzaAdell’input
= a + bi = spazia da 0 a+2π,
r · (cos(α) il punto Z si muove in senso
i sin(α))
orario attorno al cerchio unitario. Al punto in cui ω = α, la distanza è al
is any complex
minimo, pari a number,
1 − r. Ilits complexsiconjugate
massimo is defined
verifica quando Z èas:
al punto opposto del
cerchio. La Figura 8.9Amostra
= a − bi = r · (cos(α) − i sin(α)) per tre diversi valori
la funzione di trasferimento
di r = |Q|.
Graphically this reflects points of the complex plane up and down across the
real
8.2.2 axis. Filtro
The transfer function of the new
non-ricircolante, filter is forma
seconda
A volte abbiamo bisogno di una H(Z)variante, Z −1
= Q −mostrata in Figura 8.10, del filtro di
cui sopra chiamata filtro elementare non-ricircolante,
This gives rise to the same frequency response as before seconda
since forma. Invece di
moltiplicare l’output di ritardo per Q, moltiplichiamo il segnale diretto per il
coniugato complesso Q.|QSe − Z −1 | = |Q − Z −1 | = |Q − Z|
−1
Here we use the fact that
A =Za= +Z ib =, rfor any unit
· (cos(α) + icomplex
sin(α)) number Z, as can be
verified by writing out ZZ in either polar or rectangular form.
Although
è un the two forms
numero complesso, of coniugato
il suo the elementary non-recirculating
complesso filter have the
è definito come:
same frequency response, their phase responses are different; this will occasion-
a − ib form.
A =second
ally lead us to prefer the = r · (cos(α) − i sin(α)).

Graficamente corrisponde a riflettere i punti del piano complesso in su e in giù


attraverso l’asse reale. La funzione di trasferimento del nuovo filtro è

H(Z) = Q − Z −1 .
232 8.2. Filtri elementari CHAPTER 8. 217FILTERS

IN

Q d=1

OUT

Figure Figura
8.10: 8.10:
The Ilelementary non-recirculating
filtro elementare filter, forma.
non-ricircolante, seconda second form.

Ciò provoca la stessa risposta in frequenza di prima poiché


8.2.3 Elementary |Q
recirculating filter
− Z −1 | = |Q − Z −1 | = |Q − Z|.
The elementary
Qui usiamorecirculating
il fatto che Z = filter
Z −1 , is
perthe recirculating
qualsiasi comb filter
numero complesso of Z,
unitario Figure 7.7
with a complex-valued feedback gain P as shown in Figure 8.11 (part a). By
che si può verificare scrivendo ZZ in forma polare o rettangolare.
Sebbene leasdue
the same analysis forme del
before, filtro elementare
feeding this network non-ricircolante
a sinusoidhannowhosela stes-
nth sample
sa risposta in frequenza, le loro risposte di fase sono diverse; ciò ci porterà,
is Z n gives an output of:
occasionalmente, a preferire la seconda forma.
1
−1
Zn
8.2.3 Filtro elementare1 ricircolante − PZ
so the transfer function ricircolante
Il filtro elementare is è il filtro a pettine ricircolante di Figura 7.7
con un guadagno di feedback P a valori complessi come mostrato in Figura
8.11 (parte a). Con la stessaH(Z)
analisi=
1
di prima, introducendo in questa rete una
sinusoide il cui n−esimo campione è Z n1si−ha Z −1
P un output di
1
The recirculating filter is stable when |P | <Z n1;, when, instead, |P | > 1 the output
1 − P Z −1
grows exponentially as the delayed sample recirculates.
quindi la funzione di trasferimento è
The transfer function is thus just the inverse of that of the non-recirculating
1
filter (first form). If you put the H(Z)two = in series
1 − P Z −1
. with P = Q, the output the-
oretically equals the input. (This analysis only demonstrates it for sinusoidal
Il filtro ricircolante è stabile quando |P | < 1; quando, invece, |P | > 1 l’output
inputs; that
cresce it follows for other
esponenzialmente quandosignals as well
il campione canricircola.
ritardato be verified by working out
the impulseLaresponse
funzione dioftrasferimento
the combined network).
è quindi esattamente l’inverso di quella del
filtro non-ricircolante (prima forma). Se mettiamo i due in serie con P = Q,
l’output è teoricamente uguale all’input (questa analisi mostra ciò solo per gli
8.2.4 Compound
input sinusoidali; chefilters
si applichi anche ad altri segnali può essere verificato
elaborando la risposta all’impulso della rete combinata).
We can use the recirculating and non-recirculating filters developed here to
create a8.2.4
compound Filtrifilter by putting several elementary ones in series. If the
composti
parameters
Possiamo utilizzare i filtri ricircolantiones
of the non-recirculating (of the first
e non-ricircolanti, quitype) are per
sviluppati, Q1crea-
, . . . , Qj and
those of rethe
un recirculating ones areinPserie
filtro composto mettendo 1 , . . .più
, Pfiltri
k , then putting
elementari. Se them all indiseries, in
i parametri
any order, will give the transfer function:

(1 − Q1 Z −1 ) · · · (1 − Qj Z −1 )
H(Z) =
(1 − P1 Z −1 ) · · · (1 − Pk Z −1 )
The frequency response of the resulting compound filter is the product of those
of the elementary ones. (One could also combine elementary filters by adding
8.2.
218 ELEMENTARY FILTERS 233
Capitolo 8. Filtri

IN
|P|=0.75

0.5
OUT

d=1

0
P

0 frequency 2

(a) (b)

Figura 8.11: Il filtro elementare ricircolante: (a) diagramma a blocchi; (b)


Figure 8.11:
risposta The elementary recirculating filter: (a) block diagram; (b) fre-
in frequenza.
quency response.

quelli non-ricircolanti (del primo tipo) sono Q1 , . . . , Qj e quelli dei ricircolanti


their outputs, or making more complicated networks of them; but for most
sono P , . . . , Pk , allora mettendoli tutti in serie, in qualsiasi ordine, la funzione
purposes1 the series configuration is the easiest one to work with.)
di trasferimento sarà:
−1
8.2.5 Real outputs from
(1 − Qcomplex
1Z − Qj Z −1 )
) · · · (1filters
H(Z) = −1 −1
.
(1 − P Z ) · · · (1 − Pk Z )
In most applications, we start with a1 real-valued signal to filter and we need a
real-valued output, but in general, a compound filter with
La risposta in frequenza del filtro composto risultante è il prodotto a transferdifunction as
quelle dei
above will give a complex-valued output. However, we can construct
filtri elementari (si potrebbe anche combinare filtri elementari sommando i loro filters with
non-real-valued
outputs o facendo, coefficients
con essi,which nonetheless
reti più complicate; givemareal-valued outputs,
per la maggior parteso degli
that
the analysis that we carry out using complex numbers can
scopi la configurazione in serie è quella più semplice da utilizzare). be used to predict,
explain, and control real-valued output signals. We do this by pairing each
elementary filter (with coefficient P or Q) with another having as its coefficient
8.2.5
the complex Outputs
conjugatereali da filtri complessi
P or Q.
For example, putting two non-recirculating filters, with coefficients Q and
Nella maggior parte delle applicazioni, partiamo da un segnale reale da filtrare
Q, in series gives a transfer function equal to:
e abbiamo bisogno di un output a valori reali, ma in generale un filtro compo-
sto con una funzione H(Z) di trasferimento
= (1 − QZ −1 come
) · (1sopra
− QZdarà
−1 un output complesso.
)
Tuttavia, possiamo costruire filtri con coefficienti a valori non reali che tuttavia
which has the
forniscono property
outputs that: reale, in modo che l’analisi che realizziamo usan-
di valore
do numeri complessi possa essere utilizzata per predire, spiegare e controllare
H(Z) = H(Z)
segnali di uscita con outputs a valori reali. Facciamo ciò associando ad ogni
filtroifelementare
Now we put any(con il coefficiente
real-valued P o Q) un altro che ha come coefficiente il
sinusoid:
coniugato complesso P o Q. n n n
Ad esempio, mettereXnin=serie 2 re(AZ ) = AZ
due filtri + AZ
non-ricircolanti, con coefficienti Q e
Q,get
we fornisce
out: una funzione di trasferimento uguale a
n
A · H(Z) · Z n + A · H(Z) · Z
H(Z) = (1 − QZ −1 ) · (1 − QZ −1 )

che ha la proprietà che


H(Z) = H(Z).
8.2. Filtri elementari 219

Ora, se vi introduciamo una sinusoide valori reali:


n
Xn = 2re(AZ n ) = AZ n + AZ

otteniamo
n
A · H(Z) · Z n + A · H(Z) · Z
che, analizzandola, risulta un’altra sinusoide reale. Qui stiamo utilizzando due
proprietà dei coniugati complessi. Innanzitutto, possiamo sommarli e moltipli-
carli a piacere:
A+B =A+B

AB = A · B
e, in secondo luogo, se si somma qualcosa al suo coniugato complesso si ottiene
un numero reale, ed è infatti il doppio della sua parte reale:

A + A = 2re(A).

Questo risultato per due filtri coniugati si estende a qualsiasi filtro composto; in
generale, otteniamo sempre un output a valori reali da un input a valori reali se
ogni coefficiente Qi e Pi , nel filtro composto, è a valori reali, oppure se appare
in coppia con il suo coniugato complesso.

8.2.6 Due filtri ricircolanti al prezzo di uno


Quando accoppiamo filtri elementari ricircolanti, è possibile evitare l’elabora-
zione di un elemento in ciascuna coppia, a condizione che l’input sia reale (e
quindi anche l’output). Supponiamo che l’input sia una sinusoide reale della
forma:
AZ n + AZ −n
e che applichiamo un unico filtro ricircolante con coefficiente P . Denotiamo con
a[n] la parte reale dell’output, allora si ha
h i
a[n] = re 1−P1Z −1 AZ n + 1−P1Z −1 AZ −n
h i
1 n 1
= re 1−P Z −1 AZ + 1−P Z −1
AZ n
h i
2−2re(P )Z −1
= re (1−P Z −1 )(1−P Z −1 )
AZ n
h −1 i
1−re(P )Z −1 1−re(P )Z −n
= re (1−P Z −1 )(1−P Z −1 )
AZ n + −1 −1 AZ
(1−P Z )(1−P Z )

(nel secondo passaggio abbiamo usato il fatto che si può coniugare tutto o parte
di un’espressione, senza cambiare il risultato, se si vuole prendere solo la parte
reale. Il quarto passaggio fa la stessa cosa all’indietro). Confrontando l’input
e l’output, vediamo che l’effetto di passare un segnale reale attraverso un filtro
complesso a un polo, quindi prendere la parte reale, equivale a far passare il
segnale attraverso un filtro a due poli e uno zero, con funzione di trasferimento
uguale a
1 − re(P )Z −1
Hre (Z) = .
(1 − P Z −1 )(1 − P Z −1 )
220 Capitolo 8. Filtri

Un calcolo simile mostra che prendere la solo parte immaginaria (considerata


come un segnale reale) equivale a filtrare l’input con la funzione di trasferimento:

im(P )Z −1
Him (Z) = .
(1 − P Z −1 )(1 − P Z −1 )
Quindi, prendere la parte reale o quella immaginaria dell’output di un filtro a un
polo fornisce filtri con due poli coniugati. Le due parti possono essere combinate
per sintetizzare filtri con altri possibili numeratori; in altre parole, con un filtro
ricircolante complesso possiamo sintetizzare un filtro che agisce sui segnali reali
con due poli (complessi coniugati) ed uno zero (reale).
Questa tecnica, nota come partial fractions, può essere ripetuta per un qual-
siasi numero di iterazioni in serie finché calcoleremo l’appropriata combinazione
di parti reali e immaginarie dell’output di ciascuna iterazione per formare l’input
(reale) dell’iterazione successiva. Non esiste alcuna scorciatoia simile per i filtri
non-ricircolanti; per loro è necessario calcolare esplicitamente ciascun membro
di ciascuna coppia di coniugati complessi.

8.3 Progettazione dei filtri


La risposta in frequenza di una serie di filtri elementari ricircolanti e non-
ricircolanti può essere stimata graficamente disegnando, sul piano complesso,
tutti i coefficienti Q1 , . . . , Qj e P1 , . . . , Pk e ragionando come in Figura 8.8. La
risposta in frequenza globale è il prodotto di tutte le distanze dal punto Z ad
ognuno dei Qi , diviso per il prodotto delle distanze ad ognuno dei Pi .
Di solito si segna ciascuno degli Qi con un “o” (chiamandolo “zero”) e cia-
scuno degli Pi con un “x” (un ’“polo”); i loro nomi sono presi in prestito dal
campo dell’analisi complessa. Una rappresentazione grafica che mostra i poli e
gli zeri associati a un filtro è chiamata, senza troppa immaginazione, diagramma
polo-zero (pole-zero plot).
Quando Z è vicino ad uno zero, la risposta in frequenza tende a diminuire
e quando è vicino ad un polo, la risposta in frequenza tende ad aumentare.
L’effetto di un polo o di uno zero è più pronunciato, e anche più locale, se è
vicino al cerchio unitario su cui Z è costretto a giacere. Per avere un filtro
stabile i poli devono trovarsi all’interno del cerchio unitario. Gli zeri possono
trovarsi sul cerchio unitario o fuori di esso, ma qualsiasi zero Q al di fuori del
cerchio unitario può essere sostituito da uno all’interno di esso, al punto 1/Q,
per dare un multiplo costante della stessa risposta in frequenza. Tranne in casi
particolari, manterremo gli zeri, cosı̀ come i poli, all’interno del cerchio.
Nel resto di questo paragrafo mostreremo come costruire alcuni tipi di filtri
più ampiamente utilizzati nella musica elettronica. La teoria della progettazione
dei filtri digitali è vasta e qui daremo solo un’introduzione. Un trattamento più
approfondito è disponibile online, grazie a Julius Smith, su ccrma.stanford.edu.
Si può vedere anche [Ste96] per un’introduzione al filtraggio dal punto di vista
più generale dell’elaborazione di segnali digitali.

8.3.1 Filtro passa-basso ad un polo


Il filtro passa-basso ad un polo (one-pole) ha un singolo polo situato su un
numero reale positivo p, come mostrato in Figura 8.12. Questo altro non è
236 CHAPTER 8. FILTERS
8.3. Progettazione dei filtri 221

half-power
point

0 2

(b)
(a)

Figura 8.12: One-pole


Figure 8.12: Filtro passa-basso ad (a)
low-pass filter: un pole-zero
polo: (a) diagramma
diagram; polo-zero;
(b) frequency re- (b)
sponse. in frequenza.
risposta

8.3.1
che One-pole
un filtro a pettinelow-pass
ricircolante filter
con lunghezza di ritardo d = 1 e si applica
l’analisi del paragrafo 7.4. Il guadagno massimo si verifica a frequenza zero,
The one-pole low-pass filter has a single pole located at a positive real number
corrispondente al punto sul cerchio più vicino al punto p. Qui il guadagno è
p, as pictured in Figure 8.12. This is just a recirculating comb filter with delay
1/(1 − p). Supponendo che p sia vicino a uno, se ci spostiamo ad una distanza
length d = 1, and the analysis of Section 7.4 applies. The maximum gain occurs
at 1a −
di p verso of
frequency l’alto
zero,o corresponding
verso il √bassotodall’asse
the pointrealeon the (orizzontale),
circle closestlatodistanza
the
aumenta di un fattore di circa 2 e quindi
point p. The gain there is 1/(1 − p). Assuming p is close to one,ci aspettiamo che ilif punto
we move di ametà
potenza
distance venga
of 1 − pottenuto
units upad or una
down frequenza angolare di circa 1 − p.
√ from the real (horizontal) axis, the distance
Questo calcolo è spesso
increases by a factor of about 2, and fatto in senso
so weinverso:
expect the se half-power
vogliamo che pointil to
punto
di metà potenza si trovi ad una
occur at an angular frequency of about 1 − p. determinata frequenza angolare ω, poniamo
p =This 1 −calculation
ω. Questa is approssimazione
often made in reverse: funzionaif webene
wish solo se il valore
the half-power pointdi ω è
ben
to liesotto
at a π/2,
givencome
angular spesso accadeω,inwepratica.
frequency set p = Si 1− è ω.
soliti
Thisnormalizzare
approximation il filtro
passa-basso
only works well a unifpolo, moltiplicandolo
the value of ω is well per underil fattore it often 1is−inp practice.
π/2, ascostante per ottenere
It isguadagno
un customarydito1 normalize
alla frequenza the one-pole low-pass filter,
zero; frequenze multiplying
non-nulle avranno it by the un
quindi
constant factor
guadagno 1 − ap uno.
inferiore in order to give a gain of 1 at zero frequency; nonzero
frequencies
La risposta will then get a gainè less
in frequenza than one. in Figura 8.12 (parte b). Le fre-
rappresentata
quenzeThe udibili
frequency response is
raggiungono graphed
solo la metà in del
Figure 8.12il(part
grafico; b). The
lato destro audible
della curva di
frequencies
risposta only reachsitotrova
in frequenza the middle of thedella
al di sopra graph; the right-hand
frequenza di Nyquist sideπ.
of the
frequency
Il filtroresponse
passa-basso curve all polo
a un lies above
vienethe Nyquist
spesso frequency
utilizzato π.
per cercare andamenti in
segnali rumorosi. Ad esempio, se si utilizza un controller fisico e signals.
The one-pole low-pass filter is often used to seek trends in noisy For
ci si preoccupa
instance, if you use a physical controller and only care
solo di modifiche nell’ordine di 1/10 di secondo, è possibile regolare i valori about changes on the con
order of 1/10 second or so, you can smooth the values with a low-pass filter
un filtro passa-basso, il cui punto a metà potenza è 20 o 30 cicli al secondo.
whose half-power point is 20 or 30 cycles per second.

8.3.2 Filtro passa-alto ad un polo ed uno zero


A volte un segnale audio porta un offset costante indesiderato, o, in altre parole,
una componente a frequenza zero. Ad esempio, gli spettri di waveshaping del
paragrafo 5.3 contengono quasi sempre una componente costante. Questa non
è udibile ma, poiché specifica la potenza elettrica che viene inviata agli altopar-
lanti, la sua presenza riduce il livello di volume che è possibile raggiungere senza
222 Capitolo 8. Filtri
8.3. DESIGNING FILTERS 237

(b)
(a)

Figure
Figura8.13:
8.13: One-pole, one-zeroad
Filtro passa-alto high-pass
un polo filter:
e uno (a)
zero:pole-zero diagram;polo-zero;
(a) diagramma (b)
frequency response
(b) risposta (from zero
in frequenza (datozero
Nyquist frequency).di Nyquist).
alla frequenza

distorsioni.
8.3.2 Un altro nome
One-pole, per una
one-zero componente
high-pass di segnale costante è “DC”, che
filter
significa “direct current”.
Un modo
Sometimes an semplice
audio signale pratico
carriesper
an rimuovere
unwanted la componente
constant offset, di
orfrequenza
in other zero
da un segnale audio è quello di utilizzare un filtro passa-basso
words, a zero-frequency component. For example, the waveshaping spectra ad un polo
of per
estrarla e quindi sottrarre il risultato dal segnale originale.
Section 5.3 almost always contain a constant component. This is inaudible, La funzione di
trasferimento
but, risultante
since it specifies è 1 meno
electrical power la funzione
that di your
is sent to trasferimento delpresence
speakers, its filtro passa-
basso: the level of loudness you can reach without distortion. Another name
reduces
for a constant signal component 1−p 1 − Z −1
H(Z) = 1is−“DC”, meaning = p “direct current”.
.
1 − pZ −1 1 − pZ −1
An easy and practical way to remove the zero-frequency component from an
Il fattore
audio −to
signal1 is p nel
use numeratore della funzione
a one-pole low-pass di trasferimento
filter to extract it, and thenpassa-basso
subtract è il
fattore
the di from
result normalizzazione necessario
the signal. The in modo
resulting chefunction
transfer il guadagno
is onesia 1 a frequenza
minus the
zero. function of the low-pass filter:
transfer
Esaminando il lato destro dell’equazione (confrontandolo con la formula ge-
nerale dei filtri composti), vediamo
1 −che
p c’è ancora un polo nel numero reale p,
1 − Z −1
e adesso c’è anche H(Z)
uno zero −
= 1 (one-zero) =
nel p
punto
1 − pZ −1 1 − pZ −1 Il diagramma polo-zero è
1.
mostrato in Figura 8.13 (parte a) e la risposta in frequenza in parte (b) (da qui
di seguito riportiamo solo le risposte in frequenza fino alla frequenza di Nyquist
The factor of 1 − p in the numerator of the low-pass transfer function is the
π; nell’esempio precedente avevamo tracciato la risposta in frequenza fino alla
normalization factor needed so that the gain is one at zero frequency.
frequenza di campionamento, 2π).
By examining the right-hand side of the equation (comparing it to the general
formula for compound filters), we see that there is still a pole at the real number
p,8.3.3
and thereFiltro
is now shelving
also a zero at the point 1. The pole-zero plot is shown in
Figure 8.13 (part a),
Generalizzando il filtro and the frequency
ad un polo e response
uno zeroin(one-pole
part (b). one-zero)
(Henceforth, wesopra,
visto
will only plot frequency responses to the Nyquist frequency π; in
supponiamo di mettere lo zero in un punto q, un numero reale vicino, ma in- the previous
example
feriore, we
a 1.plotted it all
Il polo, al the wayp,upè to
punto inthe sample rate,
posizione simile2π.)
e può essere maggiore o
minore di q, cioè rispettivamente a destra o a sinistra, ma con entrambi q e p
all’interno del cerchio unitario. Questa situazione è illustrata nella Figura 8.14.
Nei punti del cerchio lontani da p e q, gli effetti del polo e dello zero sono
quasi inversi (le distanze da essi sono quasi uguali), quindi il filtro passa quelle
frequenze quasi inalterate. In un intorno di p e q, d’altra parte, il filtro avrà un
guadagno maggiore o minore di uno a seconda di chi, tra p e q sia più vicino
8.3. Progettazione dei filtri 223
238 CHAPTER 8. FILTERS

imaginary

1-d

q p real

0 d

(b)
(a)

Figure 8.14: One-pole, one-zero shelving filter: (a) pole-zero diagram; (b) fre-
Figura 8.14: Filtro shelving ad un polo e uno zero: (a) diagramma polo-zero;
quency response.
(b) risposta in frequenza.

8.3.3 Shelving
al cerchio. filter
Questa configurazione, dunque, funge da filtro shelving a bassa
frequenza (per fare un filtro shelving ad alta frequenza, facciamo la stessa cosa,
Generalizing the one-zero, one-pole filter above, suppose we place the zero at a
solo posizionando p e q vicini a −1 invece di 1).
point q, a real number close to, but less than, one. The pole, at the point p, is
Per trovare
similarly situated,i parametri
and mightdibeuneither
filtrogreater
shelving, data
than una than
or less frequenza
q, i.e.,ditotransi-
the
zione desiderata ω (in unità angolari) e un guadagno per
right or left, respectively, but with both q and p within the unit circle. la bassa frequenzaThis g,
innanzitutto
situation scegliamo una
is diagrammed distanza
in Figure media d, come mostrato in figura, dal polo
8.14.
e dallo zero al bordo del cerchio. Per valori di d piccoli, la regione di influenza
At points of the circle far from p and q, the effects of the pole and the zero
è di circa d radianti, quindi impostiamo semplicemente d = ω per ottenere la
are nearly inverse (the distances to them are nearly equal), so the filter passes
frequenza di transizione desiderata.
those frequencies nearly unaltered. In the neighborhood of p and q, on the other
√ √
hand, Quindi mettiamo
the filter will haveil polo
a gainingreater
p = 1or − less
d/ thang e lo
onezero in q = on
depending 1− d g.of Il
which
pguadagno a frequenza
or q is closer zero This
to the circle. è allora
configuration therefore acts as a low-frequency
shelving filter. (To make a high-frequency 1 − q shelving filter we do the same thing,
only placing p and q close to -1 instead of = 1.)g
1−p
To find the parameters of a shelving filter given a desired transition frequency
ωcome desiderato.
(in angular units)Ad andesempio, in figura,
low-frequency gaindg,è first
0.25 we
radianti
chooseean g average
è 2. distance
d, as pictured in the figure, from the pole and the zero to the edge of the circle.
For
8.3.4 small Filtro
values ofpassa-banda
d, the region of influence is about d radians, so simply set
d = ω to get the desired transition frequency.
Partendo dai the
tre pole
tipi di √ √ poli e zeri a
Then put atfiltri
p = 1mostrati
− d/ g in andprecedenza,
the zero attutti
q = dotati
1 − d di g. The gain
valori reali, ora li trasformiamo per operare su bande situate al di fuori dell’asse
reale. I filtri passa-basso, passa-alto e shelving diventano quindi filtri passa-
banda, elimina-band e peaking. In primo luogo sviluppiamo il filtro passa-
banda. Supponiamo di volere una frequenza centrale a ω radianti e una larghezza
di banda pari a β. Prendiamo il filtro passa-basso con frequenza di taglio β; il
224
8.3. DESIGNING FILTERS
Capitolo 8. 239
Filtri

P
1

P
2
0

(b)
(a)

Figure 8.15:
Figura 8.15: Two-pole band-pass filter:
Filtro passa-banda a due(a) pole-zero
poli: diagram; (b)
(a) diagramma frequency
polo-zero; (b)
response.
risposta in frequenza.

at zero
suo polofrequency is then
si trova, per valori piccoli di β, approssimativamente su p = 1 − β. Ora
1−q
ruotiamo questo valore di ω radianti nel = piano
g complesso, cioè moltiplichiamolo
1 −p
per il numero complesso cos(ω) + i sin(ω). Il nuovo polo si trova in
as desired. For example, in the figure, d is 0.25 radians and g is 2.
P1 = (1 − β)(cos(ω) + i sin(ω)).
8.3.4
Per Band-pass
ottenere un output filter
a valori reali, questo deve essere associato ad un altro
polo:
Starting with the three filter types shown above, which all have real-valued poles
P2 = P1them
and zeros, we now transform − operate
= (1to on −
β)(cos(ω) i sin ω)).
bands located off the real axis.
IlThe low-pass, polo-zero
diagramma high-pass,risultante
and shelving filters will
è mostrato in then become
Figura 8.15. band-pass, stop-
band,
Il picco è approssimativamente (non esattamente) allafilter.
and peaking filters. First we develop the band-pass Suppose
frequenza we
centrale
want a center frequency at ω radians and a bandwidth of β. We
desiderata ω, e la risposta in frequenza scende di 3 decibel a circa β radianti altake the low-
pass
di filter
sopra e alwith cutoff
di sotto di frequency β; èitsauspicabile
essa. Spesso pole is located, for small
normalizzare values
il filtro perofavere
β,
roughly at p = 1 − β. Now rotate this value by ω radians in the complex
un guadagno di picco vicino all’unità; questo viene fatto moltiplicando l’input o plane,
i.e., multiply by the complex number cos ω + i sin ω. The new pole is at:
l’output per il prodotto delle distanze dei due poli dal picco sul cerchio o (molto
approssimativamente):
P1 = (1 − β)(cos ω + i sin ω)
β · (β + 2ω).
To get
Per a real-valued
alcune output,
applicazioni this must aggiungere
è auspicabile be paired with
unoanother
zero neipole:
punti 1 e −1, in
modo che il guadagno scenda a zero alle frequenze angolari 0 e π.
P2 = P1 = (1 − β)(cos ω − i sin ω)

8.3.5 Filtri
The resulting peaking
pole-zero plot ised elimina-banda
as shown in Figure 8.15.
The peak is approximately (not exactly) at the desired center frequency ω,
Allo stesso modo, un filtro peaking viene ottenuto da un filtro shelving ruotando
and the frequency response drops by 3 decibels approximately β radians above
il polo e lo zero e fornendo un polo e uno zero coniugati, come mostrato in Figura
and below it. It is often desirable to normalize the filter to have a peak gain
8.16. Se la frequenza centrale desiderata è ω, e i raggi del polo e dello zero (come
per il filtro shelving) sono p e q, allora collochiamo il polo e lo zero superiori in

P1 = p · (cos(ω) + i sin(ω)),

Q1 = q · (cos(ω) + i sin(ω)).
8.3. Progettazione dei filtri 225
240 CHAPTER 8. FILTERS

(b)
(a)

Figure 8.16:
Figura 8.16: Un
A peaking
filtro difilter:
picco:(a)(a)
pole-zero diagram;
diagramma (b) frequency
polo-zero; response.
(b)