Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduzione
Questo è il terzo articolo della serie dedicata allo studio musicale con le tastiere a
schermo, comprese quelle microtonali:
• Studio musicale con la tastiera del computer isomorfo
• Microtonal Music Study with Chromatic Lattice Keyboard (attualmente l'articolo
è in fase di ricostruzione relativo al passaggio al Microtonal Fabric)
• Il presente articolo
Attualmente, tutto il software basato su Web Audio API è integrato in un unico
progetto Microtonal Fabric .
Motivazione
La principale forza motrice del presente lavoro è il mio forte bisogno di uno strumento
simile. È correlato al repository del mio lavoro Microtonal Music Study utilizzando
tastiere cromatiche specializzate e API Web Audio.
Due articoli relativi a questo argomento sono stati pubblicati come Musical Study with
Isomorphic Computer Keyboard e Microtonal Music Study with Chromatic Lattice
Keyboard (anche se il primo articolo non ha nulla a che fare con i sistemi microtonali,
fornisce però alcune spiegazioni teoriche di base sull'argomento).
La tastiera di cui al secondo articolo è microcromatica, molto innovativa, e funziona in
un browser Web con l'utilizzo delle API di WEB Audio. Di recente, WEB Audio ha
utilizzato il mio fork, pesantemente modificato, in una libreria open source di terze
parti, con difetti molto gravi di cui non voglio nemmeno discutere qui. Ad ogni modo, il
mio fork ha già svolto il suo ruolo quando era più importante la dimostrazione della
mia idea. In questi giorni, continuo la ricerca e lo sviluppo e non posso tollerare quei
difetti e la manutenibilità insufficiente.
Ma è molto difficile (o addirittura impossibile) trovare un sintetizzatore open source
decente, che soddisfi tutte le mie esigenze; quindi, ho deciso di svilupparne uno mio. In
altre parole, ho iniziato il lavoro solo perché lo desideravo a tutti i costi per ottenere il
risultato. Di recente, ho presentato i miei risultati ad alcuni musicisti di spicco,
specialisti in musica microtonale, teoria e pedagogia, e ho ricevuto feedback molto
positivi. Penso che lo strumento sia avanzato, accurato e abbastanza interessante da
condividerlo.
Funzionalità avanzate
Lo strumento è un sintetizzatore sintetizzatore o un generatore di istanze dello
strumento che possono essere esportate sotto forma di un singolo file JSON,
incorporato in qualche altro codice JavaScript e utilizzato per l'implementazione di uno
strumento musicale nel browser basato su Web Audio API , o qualche altro strumento
per la generazione di musica su una pagina Web. Lo strumento è orientato sia ad
applicazioni musicali di uso comune che microtonali o xenarmoniche .
Nessuna parte del codice utilizza alcuna operazione del sito del server, quindi qualsiasi
parte del codice può essere riprodotta localmente su un'ampia gamma di dispositivi,
anche senza connessione a Internet.
Alcune funzionalità dello strumento sono in qualche modo innovative. Nel complesso,
aiuta a generare suoni strumentali quasi realistici, definendo effetti avanzati in modo
grafico utilizzando una comoda interfaccia utente. Non è necessario che l'utente sia in
grado di lavorare con i nodi audio, di disegnare qualsiasi grafica o di comprendere l'API
Web Audio. Invece, la procedura di progettazione di uno strumento si basa sul
riempimento di dati in diverse tabelle, possibilmente un approccio per tentativi ed
errori con l'ascolto dei risultati intermedi della sintesi.
La procedura di creazione dello strumento parte da un singolo oscillatore definito da
uno spettro di Fourier. Tale spettro può essere importato da un analizzatore spettrale di
un campione di codice disponibile, ma di solito è necessaria un'edizione aggiuntiva. In
alternativa, sono disponibili anche le tradizionali forme d'onda del segnale, come il
dente di sega o il triangolo, ma suoni più realistici richiedono l'approccio basato su
Fourier.
Inoltre, l'utente può definire un numero illimitato di modulatori. Un modulatore può
essere utilizzato per la modulazione di frequenza o di ampiezza e ciascuno di essi può
essere un modulatore di frequenza assoluta o di frequenza relativa. Per le modulazioni
assolute, l'utente può definire una frequenza fissa per ognuna, ma per le modulazioni a
frequenza relativa, la frequenza del segnale di modulazione dipende dalla frequenza
fondamentale di ogni tono.
Inoltre, il risultato della sintesi può essere modellato utilizzando una busta. A differenza
dei sistemi di sintesi convenzionali, oltre al normale inviluppo di volume, ci sono tre tipi
aggiuntivi di inviluppo: uno per la desintonizzazione temporanea e due per le
modulazioni, separatamente per la modulazione di frequenza e di ampiezza.
Oltre a questo, c'è una serie di filtri con parametri definiti dall'utente. Qualsiasi
sottoinsieme di filtri può essere incluso in uso o escluso.
Infine, oltre a questo, c'è un sistema di compensazione del guadagno.
Durante il lavoro, l'autore di uno strumento utilizza una serie di strumenti interattivi
utilizzati per ascoltare i risultati intermedi. C'è una tastiera di prova in stile Jankó,
corrispondente al pianoforte standard a 88 tasti senza un tono più alto. La tastiera può
essere giocata con un mouse o con tutte e 10 le dita utilizzando un touch screen. Per
entrambi i metodi di gioco è possibile anche il glissando, che è un aspetto tecnico in
qualche modo non banale. Un'altra caratteristica importante è questa: durante il gioco
di prova, qualsiasi classe degli effetti può essere temporaneamente attivata, il che è
importante per i confronti. Inoltre, la riproduzione di prova può essere eseguita con il
controllo di volume, sustain (aggiuntivo) e trasposizione. Questi controlli non fanno
parte degli strumenti risultanti e sono progettati specificamente per l'esecuzione di
prova.
Grafico audio
Prima di tutto, la caratteristica di progettazione più importante è questa: tutti i tasti
della tastiera su schermo dovrebbero essere in grado di generare suoni
contemporaneamente. Ci si potrebbe chiedere: perché dovremmo aver bisogno di tutti
loro — se suoniamo con solo 10 dita? Semplice: questo è dovuto al sustain di uno
strumento. Ad esempio, se premiamo un pedale sustain di un pianoforte e lo teniamo
premuto, in linea di principio potremmo colpire rapidamente tutte le 88 corde… quindi,
in un certo momento tutte potrebber generare un suono (non importa quanto folle
questo possa sembrare).
Per raggiungere questo obiettivo, dobbiamo dedicare un numero considerevole di nodi
a ogni singolo tasto/chiave dello strumento. Queste parti del grafico sono
implementate da un oggetto di tipo Tone. Tuttavia, è bene ridurre anche al minimo il
numero di questi nodi per ogni tasto. Ciò può essere fatto condividendo alcuni dei
nostri effetti audio in un altro oggetto, di tipo Instrument.
Per prima cosa, vediamo cosa possiamo condividere.
Il set di filtri può essere condiviso.
Alcune modulazioni possono essere condivise, ma alcune dovrebbero essere riservate a
ciascun tasto.
Ho sviluppato quattro tipi di modulazione. Possiamo applicare un numero illimitato di
modulatori di frequenza (FM) e modulatori di ampiezza (AM). Ciascuno di questi
modulatori può essere a frequenza assoluta, o a frequenza relativa. Tutti i modulatori di
frequenza assoluta possono essere inseriti nell'unico Instrument, e le istanze Tone
possono condividerli. Ma i modulatori di frequenza relativa modulano a una frequenza
diversa per ciascuno dei toni. Nello strumento, la frequenza effettiva è la frequenza
fondamentale di ogni tono, semplicemente moltiplicata per qualche fattore, con
profondità di modulazione fisse, individuali per ogni modulatore.
Pertanto, entrambi (Instrument e Tone) sono basati sullo stesso tipo di dato
denominato ModulatorSet. Per l'implementazione di un insieme di modulatori, non
importa quale ruolo svolga (frequenza assoluta o frequenza relativa), l'implementazione
è la stessa.
Un'altra parte del grafico per ciascun tono è un insieme di nodi di guadagno, utilizzati
come obiettivi per gli inviluppi . Un inviluppo è un meccanismo utilizzato per
programmare il comportamento dinamico di un tono nel suo attacco e
smorzamento. La consueta tecnologia di sintesi di solito implementa solo l'inviluppo
che controlla il volume, con un numero fisso di stadi. L’inviluppo solito è detto ADSR
(Attack, Decay, Sustain, Release), ma non voglio discuterne qui, perché non mi
soddisfa.
Sound Builder dispone di un sistema unificato di creazione di inviluppi, di diversi tipi,
che rende possibile la creazione di inviluppi con un numero illimitato di stadi. Ogni fase
è caratterizzata dal tempo, dal guadagno e dalla scelta di una delle tre
funzioni. Esistono quattro caratteristiche di un nodo e ciascuna di esse può essere
programmata in busta: volume, detune, AM e FM.
Ora siamo pronti a presentare un grafico, partendo da una parte tonale. In primo
luogo, introduciamo alcune convenzioni grafiche.
Nodo oscillatore
Guadagno nodo
Kit modulatore
Catena di nodi
Nodo di uscita
Oscillatore principale
Questo nodo viene creato dal costruttore Web Audio OscillatorNode.
L'utente seleziona lo spettro del nodo assegnando un valore alla proprietà type, che
può essere un valore di stringa, "dente di sega", "triangolo" o personalizzato. Nel caso
di "custom", questa stringa non deve essere assegnata. Invece, viene chiamato il
metodo setPeriodicWave. Nell'interfaccia utente di Sound Builder, corrisponde alla
scelta "Fourier".
Questa chiamata è un “cavallo da lavoro” di sintesi. I dati per l'onda sono forniti
dall'istanza di Instrument e sono condivisi da tutti i toni. Questo perché le
componenti dello spettro di Fourier sono relative alla frequenza fondamentale.
Nell'interfaccia utente di Sound Builder, lo spettro non è rappresentato da un array o
da un numero complesso, ma da un array equivalente di ampiezze e fasi, che l'utente
può "disegnare" con il mouse su una tabella di cursori. Ogni dispositivo di scorrimento
è un elemento di input con type="range" con un comportamento modificato che
consente l'azione del mouse simile al disegno.
FFT dell’Onda
Un modo alternativo per inserire i dati consiste nell'utilizzare un'applicazione separata
"WaveFFT.exe" (da file WAV alla Fast Fourier Transform). Può caricare un file WAV,
osservarne la forma d'onda, selezionare un frammento della sequenza di campioni (la
FFT supporta un numero di campioni pari a potenze del 2, e questo è supportato
dall'interfaccia utente), eseguire la FFT, osservare lo spettro risultante e salvare questi
dati nel formato dei files di dati dello strumento Sound Builder.
In genere, il file di dati creato con WaveFFT funge da punto di partenza. Un altro modo
per iniziare è utilizzare alcuni file di esempio scaricabili con questo articolo.
Questa applicazione potrebbe essere oggetto di un articolo a parte. In breve, questa è
un'applicazione WPF con Core .NET, quindi può essere eseguita su piattaforme diverse
senza ricostruzione. Attualmente, include versioni per Windows, Linux e Mac OS. È
necessario installare il framework appropriato.
Controllo dell'oscillatore
Con le API di Web Audio, un nodo può essere connesso a un altro nodo oa un oggetto
che è una proprietà di un nodo, se questo oggetto supporta
l'interfaccia AudioParam. Questo è un modo per modulare il valore corrispondente
all'uno o all'altro parametro audio.
OscillatorNode ha due proprietà a-rate , che supportano l'interfaccia AudioParam:
frequency e detune.
L'ingresso Frequency AudioParam può essere utilizzato per la FM, che può essere
inviluppato facoltativamente. Lo stesso può essere fatto per detune, ma la modulazione
del parametro detune avrebbe poco senso. Invece, può essere modificato tramite un
inviluppo.
Modulazione
Due tipi di modulazione sono implementati in modi diversi: il segnale FM si collega
all'ingresso di frequenza di qualche oscillatore, mentre l'AF deve essere fatto sull’uscita,
per modulare il guadagno di un segnale, che è già stato generato e modulato in
frequenza.
Pertanto, il segnale FM è collegato a una frequenza di nodo dell'oscillatore AudioParam
come spiegato prima, e il segnale AM è collegato a qualche nodo di guadagno.
In entrambi i casi, i segnali FM e AM sono collegati a qualche nodo di guadagno,
mostrati sul grafico rispettivamente come "FM Envelope" e "AM Envelope".
Ognuna di queste modalità di guadagno riceve segnali FM e AM da due sorgenti,
segnali di modulazione di frequenza assoluta dall'istanza Instrument e segnali di
modulazione di frequenza relativa dall'interno della stessa istanza Tone.
In più, ricordiamo che anche i nodi di guadagno “FM Envelope” e “AM Envelope” sono
inviluppi. Il che significa che il valore di guadagno di questi nodi viene mantenuto a
zero finché un esecutore non preme un tasto. Quando ciò accade, una funzione di
inviluppo viene applicata al guadagno, per aprire ai segnali l’uscita. Vediamo come
funziona.
Inviluppi
Il funzionamento degli inviluppi si basa sulla funzionalità di AudioParam . Ogni istanza
di AudioParam può essere programmata per modificare automaticamente il valore in
un futuro momento. Quando un esecutore preme un tasto sulla tastiera di uno
strumento, il guadagno e alcuni altri parametri audio sono programmati per
implementare alcune dinamiche.
Envelope definisce una funzione del tempo, controllando il valore di
un'istanza AudioParam. Questa è una funzione graduale a tratti, composta dalla 3 tipi di
funzionalità: la funzione esponenziale, la funzione lineare e, con un certo grado di
convenzionalità, la meno utilizzabile funzione di Heaviside. Per ogni tratto, l'utente
aggiunge una riga a una tabella di inviluppo, e definisce la durata di ogni step e un
valore di target.
Questo è il core dell'implementazione di envelope da "sound/envelope.js":
javascript
for (let element of this.#implementation.data) {
switch (element.type) {
case this.#implementation.typeHeaviside:
audioParameter.setValueAtTime(element.gain, currentTime +
element.time);
break;
case this.#implementation.typeExponential:
if (element.gain == 0 || element.isLast)
audioParameter.setTargetAtTime(element.gain, currentTime,
element.time);
else
audioParameter.exponentialRampToValueAtTime(
element.gain,
currentTime + element.time);
break;
case this.#implementation.typeLinear:
audioParameter.linearRampToValueAtTime(element.gain, currentTime +
element.time);
break;
} //switch
currentTime += element.time;
}
Filtri
La parte sottrattiva della sintesi è rappresentata da un insieme di filtri biquadratici di
basso ordine. Un certo filtraggio si rende necessario nella maggior parte dei casi.
I parametri del filtro vengono inseriti in una tabella con l'aiuto di cursori. Ognuno dei
tipi di filtro forniti può essere incluso nel grafico dello strumento oppure può essere
escluso. Nella maggior parte dei casi è sufficiente un solo filtro passa-basso.
Per apprendere l'ottimizzazione dei filtri, un buon punto di partenza potrebbe essere la
documentazione di BiquadFilterNode.
La cucitura avviene nel punto di media frequenza (più precisamente nel punto di
derivata zero), ma con un passaggio in derivata seconda. Questa imperfetta levigatezza
può sembrare discutibile, ma dopo alcuni esperimenti, sembra produrre un suono
levigato (gioco di parole non intenzionale ;-).
La funzione di compensazione dipende dalla frequenza fondamentale di ciascuno degli
oscillatori principali, il valore della compensazione del guadagno è combinato come
risultato dell'operazione di molti nodi di guadagno, i nodi di guadagno di
"Compensazione", uno per istanza Tone, più un nodo dell'istanza Instrument,
“Compensazione del guadagno”, come mostrato nel grafico.
<body>
</body>
</html>
constructor(audioContext) {
this.#implementation.oscillator = new OscillatorNode(audioContext);
this.#implementation.depthNode = new GainNode(audioContext);
this.#implementation.depthNode.gain.value = 100;
this.#implementation.oscillator.connect(this.#implementation.depthNode);
this.#implementation.oscillator.start();
this.#implementation.output = this.#implementation.depthNode;
this.#implementation.deactivate = _ => {
this.#implementation.oscillator.stop();
this.#implementation.oscillator.disconnect();
this.#implementation.depthNode.disconnect();
}; //this.#implementation.deactivate
} //constructor
connect(audioParameter) {
this.#implementation.output.connect(audioParameter);
return this;
} //connect
disconnect() { this.#implementation.output.disconnect(); return this; }
deactivate() { this.#implementation.deactivate(); }
Compatibilità
Lo strumento è testato su un buon numero di browser e alcuni sistemi diversi.
Ho scoperto che al momento in cui scrivo esiste un solo tipo di browser con un
supporto sufficiente dell'API Web Audio: quelli basati sulla combinazione di
motori V8 + Blink . Fortunatamente, il set di tali browser è piuttosto ampio.
Sfortunatamente, i browser Mozilla, implementando formalmente l'API Web Audio
completa, producono un rumore scoppiettante piuttosto brutto che non può essere
eliminato, nella situazione in cui il funzionamento della combinazione V8 + Blink va
bene. Per il momento, l'applicazione impedisce l'utilizzo di questi e di alcuni altri
browser.
Ecco il testo delle raccomandazioni che una pagina mostra quando un browser non è in
grado di far fronte all'attività:
Questa applicazione richiede un motore JavaScript meglio conforme allo standard.
Si consigliano browser basati sul motore V8, come Chromium, Chrome, Opera, Vivaldi,
Microsoft Edge v. 80.0.361.111 o successivi, e altri...
A proposito, le mie congratulazioni alla gente di Microsoft, per la loro virtù di
rinunciare al praticamente defunto EdgeHTML utilizzato per Edge fino al 2020. :-)
Crediti
Wave FFT utilizza l’implementazione C# di Fast Fourier Transform di Chris Lomont .
Valeri Brainin , un eminente musicologo, manager musicale, compositore e poeta,
autore del famoso sistema pedagogico chiamato Metodo Brainin , ha partecipato
al progetto Microtonal Music Study come primo autore dell'ideazione, inventore o
coautore di alcuni progetti di tastiere microtonali , recentemente implementato sulla
base di Sound Builder. Ha iniziato a utilizzare quelle tastiere nella sua pratica
pedagogica e ha riportato risultati molto promettenti. Ha anche effettuato molti test
sulle prestazioni degli strumenti e sulla valutazione del suono durante lo sviluppo,
fornendo feedback che mi hanno aiutato a risolvere alcuni dei problemi e alcune idee
che sono state implementate o saranno implementate nelle versioni future.
Conclusioni
Ora funziona e penso che questo esperimento con la sintesi del suono musicale possa
essere definito un successo. Apprezzerò molto se qualcuno prova l'operazione e mi dà
un feedback; Sarò anche molto grato per qualsiasi domanda, commento, suggerimento
e soprattutto per le critiche.