Home

Rappresentazioni del suono e della musica¶

Indice¶

  • Introduzione
  • Rappresentazioni simboliche musicali
    • Notazione neumatica
    • Notazione mensurale
    • Notazione barocca
    • Notazione classica
    • Notazione romantica
    • Notazione nel primo '900
    • Notazione nel dopoguerra
    • Partiture grafiche
    • Partiture d'ascolto e d'analisi
  • Rappresentazioni fisiche
    • Oscillogramma
    • Spettrogramma, sonogramma e waterfall
  • Rappresentazioni elettroacustiche e informatiche
    • Diagrammi di flusso procedurali
      • Operatori
      • Programmazione strutturata
    • Algoritmi di sintesi
      • I/O
      • Connessioni
      • Switch
      • Amplificatori
      • Generatori
      • Memorie
      • Inviluppi
      • Filtri
      • Moduli generici
    • Disposizioni e routing

Introduzione Indice

[...] Così come la scrittura ha permesso di rappresentare e di tramandare stabilmente la storia e la cultura umana attraverso i secoli, anche nel campo musicale il sistema notazionale ha permesso alla musica stessa di fissare e tramandare le sue tappe evolutive contribuendo in modo fortemente sinergico al suo continuo processo di crescita. Nonostante l’incessante affinamento delle tecniche notazionali, la rappresentazione della musica non è mai stata in grado di trasferire in modo preciso tutta l’eventuale complessità sottesa nell’idea iniziale: non a caso l’interpretazione diventa quel valore aggiunto che può rendere più o meno compiuta, differenziata e differenziabile un’opera musicale.[...]

E.Giordani

Il succedersi di suoni nel tempo può essere rappresentato in diversi modi, a seconda delle ragioni o necessità che stanno alla base del tipo di rappresentazione stessa.

Rappresentazioni simboliche musicali Indice

Per sopperire inizialmente ad una necessità mnemotecnica, la musica nella tradizione occidentale è stata tramandata utilizzando una notazione simbolica, la partitura musicale.

Questo tipo di notazione possiede una duplice valenza:

  • rappresentare attraverso diversi simboli i parametri del suono come altezza, durata, intensità, etc.
In [1]:
from IPython.display import HTML 
HTML('<center><img src="media/partitura_2.png" width="55%"></center>')
Out[1]:
  • rappresentare i gesti e le azioni che il musicista deve effettuare sullo strumento necessari alla riproduzione dei suoni notati.
In [2]:
from IPython.display import HTML 
HTML('<center><img src="media/intavolatura.png" width="55%"></center>')
Out[2]:

Anche se a prima vista può sembrare non esserci molta differenza pratica tra le due in quanto una partitura che rappresenta i parametri astratti del suono può anche essere letta da un cantante o uno strumentista che, codificando i simboli effettua i gesti necessari alla riproduzione dei suoni notati, in realtà sono idealmente differenti.

  • la prima infatti permette una sedimentazione e stratificazione culturale dei segni che può portare a un'evoluzione del pensiero musicale (si pensi ai tropi o alle sequenze inserite nei canti gregoriani).
In [3]:
from IPython.display import HTML 
HTML('<center><img src="media/tropo.png" width="60%"></center>')
Out[3]:
  • la seconda ha una funzione strettamente tecnica che la colloca in un tempo reversibile e destoricizzante.

I simboli utilizzati nel corso dei secoli sono mutati parallelamente al modificarsi dei linguaggi musicali, al sopraggiungere di nuove esigenze espressive e, non ultimo all'invenzione di nuovi strumenti musicali.

Lo studio della notazione musicale si chiama semiografia musicale.

Notazione neumatica (800 - 1200) Indice

Fase premensurale

  • adiastematica
  • neumatica in campo aperto
  • dasiana
  • organum e prima polifonia
  • alfabetica
  • quadrata neografica
In [4]:
from IPython.display import HTML 
HTML('<center><img src="media/neumi.png" width="55%"></center>')
Out[4]:

Notazione mensurale (1200 - 1600) Indice

Fase mensurale

  • quadrata
  • Ars nova
  • bianca
  • polifonia
  • musica strumentale
In [5]:
from IPython.display import HTML 
HTML('<center><img src="media/mensurale.jpg" width="55%"></center>')
Out[5]:

Notazione barocca (1600 - 1700) Indice

  • notazione moderna
  • dal contrappunto all'armonia
  • pratica strumentale e basso continuo (cifrato)
  • segni agogici netti
In [6]:
from IPython.display import HTML 
HTML('<center><img src="media/vivaldi.png" width="55%"></center>')
Out[6]:

Notazione Classica (1700 - 1800) Indice

  • tonalità
  • partiture e parti
  • segni dinamici
  • legature di espressione
In [7]:
from IPython.display import HTML 
HTML('<center><img src="media/mozart.png" width="55%"></center>')
Out[7]:

Notazione Romantica (1800) Indice

  • aumento degli organici strumentali
  • simboli di partitura
  • orchestrazione e timbro
  • graduale dissoluzione della tonalità
  • nuovi segni per tecniche strumentali
In [8]:
from IPython.display import HTML 
HTML('<center><img src="media/mahler.png" width="55%"></center>')
Out[8]:

Notazione nel primo '900 Indice

  • atonalità
  • neoclassicismo
  • dodecafonia
  • nuovi segni per tecniche strumentali e vocali
  • maggiore precisione di scrittura delle intenzioni compositive
In [9]:
from IPython.display import HTML 
HTML('<center><img src="media/pierrot.png" width="65%"></center>')
Out[9]:

Notazione nel dopoguerra Indice

  • iperstrutturalismo
  • alea
  • decostruttivismo
  • dissoluzione dei segni tradizionali
  • grafismo come pensiero musicale
  • emancipazione del segno dal suono
In [10]:
from IPython.display import HTML 
HTML('<center><img src="media/boulez.png" width="70%"></center>')
Out[10]:

Partiture grafiche Indice

  • improvvisazione
  • assenza di codice condiviso
  • linguaggio musicale tradizionale verso il silenzio
  • dissoluzione della dicotomia suono/rumore
  • soundscape
  • musica acusmatica
In [11]:
from IPython.display import HTML 
HTML('<center><img src="media/cardew.png" width="60%"></center>')
Out[11]:

Partiture d'ascolto e d'analisi Indice

  • trascrizioni di suoni
  • rappresentazione dei parametri
  • notazioni per strumenti elettroacustici
  • codici informatici
  • live coding e live scoring
In [12]:
from IPython.display import HTML 
HTML('<center><img src="media/ligeti.png" width="60%"></center>')
Out[12]:

Rappresentazioni fisiche Indice

Possiamo anche rappresentare i parametri fisico/acutici del suono slegando questa informazione dalle regole appartenenti a un qualsiasi linguaggio musicale e dall'azione attraverso la quale è stato generato.

Per quanto riguarda la musica elettroacustica e l'informatica musicale queste rappresentazioni sono fondamentali per monitorare la correttezza tecnica del lavoro quotidiano e possono diventare anche fonti di ispirazione creativa nella ricerca di nuovi suoni.

Oscillogramma Indice

Un oscillogramma è la rappresentazione di una forma d'onda nel dominio del tempo.

In [13]:
from IPython.display import HTML 
HTML('<center><img src="media/oscillo_1.png" width="30%"></center>')
Out[13]:

Deriva dall'utilizzo di uno strumento elettroacustico (l'oscilloscopio) utilizzato per riprodurre e misurare le forme d’onda di segnali di tensione su di uno schermo illuminato sul quale è rappresentato un piano cartesiano.

In [14]:
from IPython.display import HTML 
HTML('<center><img src="media/oscillo_2.png" width="40%"></center>')
Out[14]:

Questo tipo di rappresentazione ci fornisce informazioni riguardo ampiezza e frequenza di un suono ma poco o nulla riguardo il timbro.

In realtà è una rappresentazione completa in quanto come abbiamo detto in precedenza è la forma d'onda che caratterizza il timbro, ma in un oscillogramma questo parametro è di difficile interpretazione salvo che in particolari casi come le forma d'onda classiche della musica elettroacustica.

In [15]:
from IPython.display import HTML 
HTML('<center><img src="media/forme_osc.png" width="50%"></center>')
Out[15]:

Spettrogramma, sonogramma e waterfall Indice

Per rappresentare le componenti spettrali e/o l'inviluppo spettrale (dominio delle frequenze) di un suono abbiamo tre possibilità:

  1. attraverso un tipo di spettrogramma che analizza e visualizza il contenuto spettrale di un suono nel dominio della frequenza dove l'asse delle ascisse (x) corrisponde alle frequenze mentre l'asse delle ordinate (y) corrisponde alle ampiezze.

    Può essere istantaneo ovvero la fotografia di un suono in un determinato momento oppure dinamico dove il grafico varia con il tempo e segue l'inviluppo spettrale.

    Le frequenze sono espresse in Hertz mentre le ampiezze possono essere espresse in ampiezza lineare (tra 0 e 1), in dB (tra - inf e 0) oppure in dBspl (tra 0 e +inf).

In [16]:
from IPython.display import HTML 
HTML('<center><img src="media/spettrogr.png" width="100%"></center>')
Out[16]:
  1. attraverso un altro tipo di spettrogramma chiamato anche sonogramma che visualizza il risultato dell'analisi del suono generata da uno strumento chiamato sonografo.
In [17]:
from IPython.display import HTML 
HTML('<center><img src="media/sonografo.png" width="40%"></center>')
Out[17]:

Questa è la forma di rappresentazione del suono più completa dove sull'asse delle ascisse (x) è indicato il tempo, sull'asse delle ordinate (y) la frequenza mentre i colori (o la gamma di grigi) rappresentano le ampiezze dei parziali.

In [18]:
from IPython.display import HTML 
HTML('<center><img src="media/sonogramma.png" width="100%"></center>')
Out[18]:

Come possiamo facilmente intuire dalle immagini, se la rappresentazione si basa sui colori i toni freddi come il blu scuro rappresentano suoni di bassa intensità mentre quelli gialli le alte intensità.

Nella scala di grigi il discorso è simile, il grigio chiaro corrisonde alle basse intensità e quelli scuri per le alte.

Osserviamo infine come le frequenze e le intensità possono essere riportate sia in scala lineare che logaritmica.

  1. attraverso una variante pseudo tridimensionale del sonogramma chiamata waterfall dove viene utilizzato l’asse delle ascisse per le frequenze, quello delle ordinate per le ampiezze e quello generato dalla sequenza degli spettri, come asse Z nel tempo.
In [19]:
from IPython.display import HTML 
HTML('<center><img src="media/waterfall.png" width="100%"></center>')
Out[19]:

A questo link possiamo trovare ultriori approfondimenti riguardo le relazioni che intercorrono tra le diverse notazioni.

Rappresentazioni elettroacustiche e informatiche Indice

Con l'ingresso dell'elettronica e dell'informatica in ambito musicale si sono rese necessarie nuove tipologie di rappresentazioni.

Oltre a eventuali partiture musicali come quelle illustrate potremmo dover fornire agli esecutori o realizzatori ulteriori informazioni riguardo alle procedure da seguire per la corretta messa in opera.

  • Algoritmi procedurali necessari alla generazione o manipolazione del materiale musicale o sonoro (parametri di controllo).
  • Algoritmi di sintesi che descrivono le modalità di generazione o elaborazione dei segnali audio (o di controllo).
  • Pianta e routing ovvero una descrizione della disposizione di strumenti, microfoni e altoparlanti sulla scena e il percorso dei segnali nel banco di mixaggio.

Possiamo rappresentare graficamente tutte queste informazioni attraverso schemi a blocchi (block diagrams).

Quando in ambito musicale è previsto l’utilizzo di uno strumento elettroacustico o informatico, fornire questi diagrammi diventa fondamentale in quanto permettono la riproducibilità del brano nel tempo fornendo le istruzioni per realizzare l’idea musicale originale con qualsiasi tipo di software o dispositivo passato, presente o futuro alla stessa stregua delle partiture musicali.

Fra dieci, venti o cento anni infatti ci saranno nuove tecnologie e saranno inventati nuovi software e hardware, e se dovessimo legare la possibilità di eseguire un brano a una specifica tecnologia o software potrebbe non essere più possibile riprodurlo.

A questo link un software dedicato alla realizzazione di diagrammi di flusso.

Diagrammi di flusso procedurali Indice

In informatica storicamente si utilizzano diagrammi di flusso (flowchart) che possiamo considerare schemi a blocchi più specifici che servono a rappresentare graficamente il flusso di controllo di algoritmi, procedure e istruzioni operative.

In [20]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_2.png" width="30%"></center>')
Out[20]:

Musicalmente possiamo impiegarli nell'ambito della composizione algoritmica sia nella generazione di partiture strumentali (anche senza parti elettroacustiche) sia nel controllo dei parametri di un qualche tipo di sintesi e/o elaborazione del suono.

In [21]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_1.png" width="100%"></center>')
Out[21]:

Il linguaggio dei diagrammi di flusso è un possibile formalismo per la descrizione di algoritmi che descrive il flusso delle operazioni da eseguire per realizzare la trasformazione, definita nell’algoritmo, dai dati iniziali (input) ai risultati (output).

Ogni istruzione dell’algoritmo è rappresentata da un particolare simbolo detto blocco elementare la cui forma grafica è determinata dal tipo di istruzione.

I cinque tipi di blocchi più comuni sono.

In [22]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_4.png" width="60%"></center>')
Out[22]:
  • Blocco iniziale. Ha forma ovale e viene posto all'inizio di ogni diagramma di flusso. Presenta sempre una sola linea di flusso in uscita.

  • Blocco finale. Ha forma ovale e viene posto alla fine di ogni diagramma di flusso. Presenta sempre una sola linea di flusso in entrata.

  • Blocco di lettura/scrittura. Ha forma trapezoidale e presenta i dati in ingresso oppure i risultati. Nel blocco entra una sola linea di flusso e ne esce un'altra.

  • Blocco di istruzioni. Ha forma rettangolare e contiene le istruzioni, i comandi e le operazioni che devono essere eseguite sui dati in ingresso. Nel blocco entra una sola linea di flusso e ne esce un'altra.

  • Blocco decisionale. Ha forma romboidale e permette di diramare il flusso a seconda del risultato di una operazione condizionale (vero/falso/nullo). Nel blocco entra una sola linea di flusso e ne escono due.

I blocchi sono collegati tra loro da linee di flusso, munite di frecce, che indicano il susseguirsi di azioni elementari.

Un diagramma di flusso minimo è composto dai seguenti elementi:

  • un blocco iniziale.
  • un numero finito (≥ 1) di blocchi di istruzioni e/o di blocchi di lettura/scrittura.
  • un numero finito (≥ 0) di blocchi di decisione.
  • un blocco finale.

Un diagramma di flusso deve soddisfare le seguenti condizioni.

  • ogni freccia entra o esce da un blocco oppure si innesta in un'altra freccia.
  • ogni blocco deve essere raggiungibile dal blocco iniziale.
  • il blocco finale deve essere raggiungibile da qualsiasi altro blocco direttamente o passando attraverso altri blocchi.

Il diagramma seguente ad esempio descrive una procedura per filtrare altezze appartenenti a una scala pentatonica da una scala cromatica.

In [23]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_3.2.png" width="20%"></center>')
Out[23]:

Nell'immagine seguente possiamo trovare un’elenco dei blocchi elementari meno comuni.

In [24]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_8.png" width="35%"></center>')
Out[24]:
  • Salva file. Indica il salvataggio dei dati.
  • Database. Indica informazioni memorizzate in una memoria fisica come un HD.
  • Data. Indica informazioni memorizzate nella RAM.
  • Input manuale. Indica un input manuale. Come il ricevere dati da una tastiera MIDI o da sensori esterni che vengono elaborati da un algoritmo.
  • Operazione manuale. Indica un’operazione di loop con un limite prestabilito manualmente. Come il metodo n.do({}) in SuperCollider.
  • Init. Descrive una serie di operazioni che sono preliminari all’inizio di un processo. Oppure il numero di ripetizioni di un loop.
  • Delay. Descrive ogni periodo d’attesa nel flusso. Come il metodo n.wait in SuperCollider oppure l’object del in Max.
  • Subroutine. Questo simbolo richiama un altro processo definito in un altro luogo. Come un subpatch o un’astrazione in Max.
  • Display. Indica un punto del processo dove i dati sono visibili (GUI).

Ogni procedura descrive una sequenza di operazioni che devono essere effettuate su dei dati.

Queste operazioni vengono effettuate attraverso diverse tipologie di operatori.

Operatori Indice

In informatica un operatore è un simbolo che specifica quale legge applicare a uno o più operandi per ottenere un risultato.

Gli operatori possono essere classificati in base al numero di operandi che accettano, ovvero in base al numero di dati su cui lavorano.

Gli esempi seguenti sono in SuperCollider e Max in quanto rappresentativi dei due principali paradigmi di programmazione.

Operatori unari.

Possiamo suddividerli in tre tipologie.

  1. Aritmetici. Effettuano un'operazione aritmetica su di un numero, un Array o un segnale.
In [ ]:
#[5,-4,7,-2,3].neg; // inversione di segno
-12.5.abs;          // valore assoluto
3.14.frac;          // restituisce i valori float
3.74.trunc;         // restituisce i valori int
3.sqrt;             // radice quadrata
  1. Trigonometrici. Operatori per calcoli trigonometrici.
In [ ]:
3.log;              // logaritmo naturale
2.log10;            // logaritmo in base 10
0.7.sin;            // seno
2.cos;              // coseno
  1. Conversioni. Le operazioni più frequentemente effettuate nella programmazione di un software musicale sono quelle di conversione da un’unità di misura ad un altra, da un range ad un altro.
In [ ]:
 60.midicps;        // da midi a cps (Hz)
440.cpsmidi;        // da cps a midi
-12.dbamp;          // da Decibel ad ampiezza lineare
0.9.ampdb;          // da ampiezza lineare a Decibel

In Max sono gli oggetti con un solo inlet.

In [25]:
from IPython.display import HTML 
HTML('<center><img src="media/max_unari.png" width="40%"></center>')
Out[25]:

Operatori binari.

Questo tipo di operatori agisce su due elementi e possiamo suddividerli in quattro tipologie.

  1. Aritmetici. Effettuano un'operazione aritmetica su due numeri.
In [ ]:
2 + 3;
2 * 3;
2 - 3;
2 / 3;
5 % 3;    // restituisce il resto della divisione (modulo) 
2**3;     // esponente (n elevato alla n)
pow(2, 3) // diversa scrittura
2 pow: 3; // diversa scrittura
2.pow(3)  // diversa scrittura
  1. Assegnazioni. Assegnano un dato a una variabile o argomento
In [ ]:
// ------------------------ Varibili globali

a = 23;                  // Lettere
~accidenti = 231.3       // Parole

// ------------------------ Variabili locali

var a = 23, ciao = 23.4; // Lettere e parole

// ------------------------ Argomenti di una funzione

5.do({arg i; i.postln});
5.do({|i| i.postln});    // Altra scrittura
  1. Relazionali. Restituiscono un boolean (true/false/nil)
In [ ]:
2 > 3;
3 > 3;
4 > 3;
2 >= 3;
3 >= 3;
4 >= 3;
2 < 3;
3 < 3;
4 < 3;
2 <= 3;
3 <= 3;
4 <= 3;
2 == 3; 
3 == 3;

(2 != 3).asInteger; // trasforma in int (1/0)
(3 != 3).asInteger;

1.asBoolean;        // trasforma in Boolean
4.asBoolean;
0.asBoolean;
-3.asBoolean;
  1. Logici. Sono gli operatori legati all’algebra di Boole. Sono usati spesso in congiunzione con gli operatori relazionali.
In [ ]:
// ---------- Dichiariamo tre variabili globali
a = 5 > 2; // true
b = 7 < 9; // true
c = 7 < 5; // false

a && b;    // AND
a && c;

a || b;    // OR
a || c;
c || c;

a.not;     // NOT
c.not;
In [26]:
from IPython.display import HTML 
HTML('<center><img src="media/max_binari.png" width="45%"></center>')
Out[26]:

Operatori ternari.

Questo tipo di operatori agisce su tre elementi. Il più utilizzato è if.

In [ ]:
// if (test, {esegui_se_true}, {esegui_se_false});

(
var a, z;
a = 10.rand;
z = if (a < 5, {75},{1000});
a.postln;
z.postln;
)
In [27]:
from IPython.display import HTML 
HTML('<center><img src="media/max_ternario.png" width="20%"></center>')
Out[27]:

Programmazione strutturata Indice

La programmazione strutturata è un paradigma che favorisce la descrizione di algoritmi facilmente documentabili e comprensibili.

Un diagramma a blocchi strutturato ha tre possibili schemi di flusso.

  1. Schema di sequenza. E' una sequenza di passi eseguiti uno alla volta nessuno dei quali è ripetuto e l’ordine di esecuzione è lo stesso in cui sono scritti.
In [28]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_6.png" width="50%"></center>')
Out[28]:
In [ ]:
~in = [0.25, 2];                          // INPUT

(
~val1 = rrand(~in[0],~in[1]);             // Scegli 4 valori nel range
~val2 = rrand(~in[0],~in[1]);
~val3 = rrand(~in[0],~in[1]);
~val4 = rrand(~in[0],~in[1]);

~seq = [~val1, ~val2, ~val3, ~val4];
~seq = [~val1, ~val2, ~val3, ~val4].sort; // Ordinali dal più corto al più lungo
~seq = ~seq.reverse;                      // Leggi dalla fina all'inizio
~seq = ~seq * 2;                          // Raddoppia i valori
)

~out = ~seq;                              // OUTPUT
In [29]:
from IPython.display import HTML 
HTML('<center><img src="media/max_seq.png" width="15%"></center>')
Out[29]:
  1. Schema di selezione. Viene usato quando si deve effettuare una scelta tra due condizioni alternative (vero/falso) e implica l’utilizzo di un test svolto da un operatore relazionale ed eventualmente da un operatore logico.
In [30]:
from IPython.display import HTML 
HTML('<center><img src="media/cond_1.png" width="50%"></center>')
Out[30]:
In [ ]:
(
~seq = [0.25,0.75,1];                    // INPUT

~val = ~seq[0];
if(~val == 0.25, {~seq.put(0, ~val*4)}); // Vero

~val = ~seq[1];
if(~val == 0.25, {~seq.put(1, ~val*4)}); // Falso

~val = ~seq[2];
if(~val == 0.25, {~seq.put(2, ~val*4)}); // Falso

~seq;                                    // OUTPUT
)

(
~seq = [0.25,0.75,1];                    // INPUT

~val = ~seq[0];
if(~val == 0.25, {~seq.put(0, ~val*4)}, {~seq.put(0, ~val-0.125)}); // else..

~val = ~seq[1];
if(~val == 0.25, {~seq.put(1, ~val*4)}, {~seq.put(1, ~val-0.125)}); 

~val = ~seq[2];
if(~val == 0.25, {~seq.put(2, ~val*4)}, {~seq.put(2, ~val-0.125)}); 

~seq;                                    // OUTPUT
)
In [31]:
from IPython.display import HTML 
HTML('<center><img src="media/max_cond_2.png" width="45%"></center>')
Out[31]:

Nei diversi linguaggi di programmazione ci sono in genere tre situazioni.

  1. if - un test e scelta tra due opzioni.
In [ ]:
(
a = 10.rand;
z = if (a < 5, {75},{1000});
a.postln;
z.postln;
)
In [32]:
from IPython.display import HTML 
HTML('<center><img src="media/if_max.png" width="75%"></center>')
Out[32]:
  1. switch - un test e scelta tra più opzioni.
In [ ]:
(
a = 5.rand;
z = switch (a,
              2, {200},
              1, {500},
              0, {600},
              3, {400},
              4, {800}
            );
a.postln;
z.postln;
)
In [33]:
from IPython.display import HTML 
HTML('<center><img src="media/gate_max.png" width="65%"></center>')
Out[33]:
  1. case - più test uno per ogni opzione.
In [ ]:
(
a = 13.rand; 
z = case{a >= 0 && a <= 6}  {200}
        {a == 7}            {50}
        {a >= 8 && a <= 12} {400};
a.postln;
z.postln; 
)
In [34]:
from IPython.display import HTML 
HTML('<center><img src="media/route_max.png" width="60%"></center>')
Out[34]:
  1. Schema di iterazione. Permette la ripetizione di certi passi un numero arbitrario di volte (loop).

    Viene spesso utilizzato per iterare gli elementi di una collezione.

In [35]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_7.png" width="50%"></center>')
Out[35]:

Nella maggior parte dei linguaggi ci sono almeno due oggetti dedicati.

  • for (loop)
In [ ]:
for(3, 7, {arg i; i.postln});                // Test esterno

7.do({arg i; i.postln});                     // i = Indici

[3,4,5,6,7].do({arg i; i.postln});           // i = Elementi

[3,4,5,6,7].do({arg i, id; [id, i].postln}); // i = Elementi, id = Indici
In [36]:
from IPython.display import HTML 
HTML('<center><img src="media/iter_max.png" width="38%"></center>')
Out[36]:
  • while
In [ ]:
(
i=0;                            // Init contatore

while ({i <= 8},                // Test interno 
                {i.postln;
                  i = i + 1});  // Aggiorna contatore
)
In [37]:
from IPython.display import HTML 
HTML('<center><img src="media/while_max.png" width="23%"></center>')
Out[37]:

Il teorema di Böhm-Jacopini afferma che qualsiasi algoritmo può essere implementato seguendo questi tre schemi.

Le tre strutture possono essere concatenate o nidificate, ma non possono essere intrecciate o accavallate.

In [ ]:
// -------------------- Concatenati (uno DOPO l'altro)
                                     
(         
~in = [0.25,2];                           
~seq = 4.collect({rrand(~in[0],~in[1])}).sort.reverse * 2; // Concatenati da sx a dx...
)

// -------------------- Nidificati (uno DENTRO un altro)

(         
~seq = [0.25,0.75,1];                                                        
~seq.do({arg i,id;                               // Schema di iterazione
             if(i == 0.25, {~seq.put(id, i*4)}); // Schema di selezione
         });
)

Algoritmi di sintesi Indice

Possiamo rappresentare graficamente anche il percorso che deve compiere un segnale audio per realizzare un algoritmo di sintesi o di elaborazione del suono rendendolo di fatto realizzabile attraverso qualsiasi tipo di software o hardware che lo consenta.

In [38]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_sig1.png" width="28%"></center>')
Out[38]:

Se la realizzazione viene effettuata attraverso un software in questo diagramma va specificato esclusivamente il percorso che i segnali compiono all'interno di esso.

Gli eventuali inputs e gli outputs saranno i segnali in ingresso e in uscita dalla scheda audio mentre il percorso degli stessi che va oltre la scheda audio dovrà essere illustrato in un altro diagramma riguardante il routing e la disposizione dei microfoni (eventuali) e degli altoparlanti.

Per poter rappresentare e leggere correttamente questo percorso dobbiamo adottare un insieme di simboli standardizzato e codificato.

Purtroppo però ancora oggi non esiste una codifica universalmente adottata come per altri ambiti ma ci sono alcune convenzioni grafiche utilizzate in importanti pubblicazioni ormai storiche riguardanti l'informatica musicale che si prestano maggiormante di altre a rappresentare elementi comuni a quasi tutti gli algoritmi di sintesi.

I/O Indice

Simboli che indicano le possibili comunicazioni con il mondo esterno al software.

In [39]:
from IPython.display import HTML 
HTML('<center><img src="media/InOut.png" width="18%"></center>')
Out[39]:

Connessioni Indice

I seguenti simboli indicano la somma e la moltiplicazione tra due o più segnali e i punti di connessione o ponte tra i collegamenti.

In [40]:
from IPython.display import HTML 
HTML('<center><img src="media/Conn.png" width="18%"></center>')
Out[40]:

Switch Indice

I seguenti simboli indicano interruttori e ripartitori del segnale.

In [41]:
from IPython.display import HTML 
HTML('<center><img src="media/Switch.png" width="18%"></center>')
Out[41]:

Amplificatori Indice

I seguenti simboli indicano potenziometri (fader o knob) e amplificatori.

In [42]:
from IPython.display import HTML 
HTML('<center><img src="media/Ampli.png" width="20%"></center>')
Out[42]:

Generatori Indice

Il simbolo comunemente adottato per gli oscillatori può essere impiegato per tutti i tipi di generatori di suono.

In [43]:
from IPython.display import HTML 
HTML('<center><img src="media/Oscillatori.png" width="45%"></center>')
Out[43]:

Nella prima e seconda riga sono rappresentati gli oscillatori a forma d'onda fissa più comuni, nella terza un generatore di rumore, un generatore di segnali di controllo (LFO) e un player di Buffer o sound files. Infine nell'ultima riga un oscillatore tabellare generico.

Memorie Indice

I seguenti simboli possono essere utilizzati per indicare supporti specifici per dati audio.

In [44]:
from IPython.display import HTML 
HTML('<center><img src="media/Memorie.png" width="60%"></center>')
Out[44]:

Inviluppi Indice

I seguenti simboli possono essere utilizzati per indicare qualsiasi tipo di inviluppo e Break Point Function.

In [45]:
from IPython.display import HTML 
HTML('<center><img src="media/Env.png" width="40%"></center>')
Out[45]:

Filtri Indice

I seguenti simboli possono essere utilizzati per indicare qualsiasi tipo di filtro ed equalizzatore, nonchè transfert function.

In [46]:
from IPython.display import HTML 
HTML('<center><img src="media/Filtri.png" width="60%"></center>')
Out[46]:

Moduli generici Indice

I seguenti simboli possono essere utilizzati per indicare qualsiasi tipo di modulo generico impiegato per l'elaborazione del segnale come delay, pan, etc.

In [47]:
from IPython.display import HTML 
HTML('<center><img src="media/Moduli.png" width="25%"></center>')
Out[47]:

Percorso Indice

Il percorso dei segnali può andare sia dall'alto verso il basso.

In [48]:
from IPython.display import HTML 
HTML('<center><img src="media/synth_dig.png" width="40%"></center>')
Out[48]:

Sia da sinistra a destra.

In [49]:
from IPython.display import HTML 
HTML('<center><img src="media/synth_gen.png" width="75%"></center>')
Out[49]:

in questo caso i simboli mantengono l'aspetto orizzontale ma cambia il lato di ingresso dei parametri di controllo.

Schemi a blocchi di questo tipo sono tipicamente utilizzati anche nella rappresentazione delle caratteristiche di una scheda audio.

In [50]:
from IPython.display import HTML 
HTML('<center><img src="media/ucx.png" width="100%"></center>')
Out[50]:

Oppure di catene elettroacustiche dedicate all'elaborazione di strumenti acustici in tempo reale.

In [51]:
from IPython.display import HTML 
HTML('<center><img src="media/nopie.png" width="100%"></center>')
Out[51]:

Disposizioni e routing Indice

Questo tipo di diagrammi serve a indicare tutte le informazioni necessarie alla corretta messa in scena di un lavoro e prevede sia la collocazione del pubblico e di eventuali esecutori che di tutta la strumentazione elettroacustica necessaria all'acquisizione, trasmissione e diffusione dei segnali audio.

Le immagini seguenti illustrano tre schemi di questo tipo in ordine crescente di complessità e detttaglio nelle indicazioni.

In [52]:
from IPython.display import HTML 
HTML('<center><img src="media/stage_1.png" width="60%"></center>')
Out[52]:
In [53]:
from IPython.display import HTML 
HTML('<center><img src="media/stage_2.png" width="80%"></center>')
Out[53]:
In [54]:
from IPython.display import HTML 
HTML('<center><img src="media/flow_outs3.png" width="100%"></center>')
Out[54]: