Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

10
voti

Una semplice chitarra con un PIC

Indice

Introduzione

Da quando mia figlia ha cominciato a studiare pianoforte mi sono chiesto come facessero alcuni strumenti musicali (piano elettronico, pianola, ecc) per riprodurre differenti strumenti (chitarra, basso, arpa, ecc.) con tanta naturalezza. Ho deciso di ‘studiare’ l’argomento e quindi ho voluto provare quanto acquisito realizzando un semplice circuito che potesse riprodurre il suono di uno di questi strumenti: la chitarra.

Nessuna pretesa di realizzare un vero sintetizzatore di chitarra, ma solo di vedere se quanto ‘appreso’(?) fosse o meno corretto. Doveva essere (ed è!) quindi solo un esperimento.

Non aspettatevi grandi cose ma solo spunti da cui partire se avete voglia di conoscere meglio e approfondire l’argomento.

Cercherò di esprimere quanti più concetti possibili sempre in modo semplice, evitando passaggi nelle varie formule ed esponendo, dove necessario, solo la soluzione.

La chitarra

Prima di tutto dobbiamo capire le caratteristiche generali di uno strumento a corde ed in particolare della chitarra. Il suono di una chitarra è prodotto dalla vibrazione delle corde e dall’amplificazione che tale vibrazione subisce grazie alla cassa di risonanza della chitarra stessa.

Materiale, spessore, lunghezza e tensione delle corde determinano la frequenza della nota oltre al timbro del suono prodotti. Molti sono gli strumenti a corda, ma proprio la diversa disposizione delle corde nello strumento, le diverse forme della cassa di risonanza, le diverse tipologie di ‘eccitazione’ delle corde e il diverso ‘inviluppo’ che ogni strumento ha, determinano differenze nel suono prodotto e quindi diversità sonora tra gli strumenti.

L’inviluppo in particolare rappresenta l’andamento dell’ampiezza del segnale nel tempo e si divide in 4 parti:

1) Attach: tempo necessario al segnale per passare da ampiezza zero alla massima ampiezza possibile.

2) Decay: tempo necessario al segnale per passare dal valore massimo di ampiezza all’ampiezza tipica dello strumento.

3) Sustain: tempo di durata del suono con ampiezza quasi invariata. Esempi di questo tempo sono il tempo di pressione di un tasto sulla tastiera di un pianoforte o la durata del movimento dell’archetto sulle corde di un violino.

4) Release: tempo necessario al suono per spegnersi dopo che è finita la fase di Sustain.

Il tutto prende il nome di ADSR e può essere rappresentato come segue:

ADSR

ADSR

Come detto ogni strumento presenta il proprio profilo di inviluppo ed il grafico tipico dell’ADSR di una chitarra è il seguente:

ADSR Chitarra

ADSR Chitarra

L’ADSR è paragonabile ad una modulazione di ampiezza del suono prodotto dalla corda.

Altra caratteristica del segnale generato da una corda è che inizialmente contiene un grande numero di armoniche e subisce nel tempo una attenuazione non lineare rispetto alle frequenze che lo compongono: vengono infatti attenuate in modo più rapido le frequenze alte rispetto alle frequenze basse.

Il nostro dispositivo dovrà quindi simulare la vibrazione di una corda generando suono con alto contenuto di armoniche, attenuare nel tempo le frequenze alte in modo più rapido rispetto alle frequenze basse ed il tutto dovrà essere modulato in ampiezza in modo da riprodurre il tipico inviluppo di una chitarra.

Sintesi del suono di una corda

Le tecniche di sintesi di suoni prodotti da corde sono molteplici, quasi tutte basate su modelli fisici della vibrazione delle corde stesse. Questi sistemi partono dall’assunto che il suono possa essere generato da equazioni matematiche che descrivono il comportamento fisico delle corde e di tutte le parti del sistema che interagiscono nella generazione del suono reale. Tali sistemi possono essere molto complessi e non certo realizzabili in un PIC.

Un algoritmo che è simile al modello fisico a guida d’onda e che consente pertanto di sintetizzare il suono di corde e/o percussioni è il sistema ideato da Kevin Karplus e da Alex Strong, successivamente perfezionato da altri, e che prende il loro nome: Algoritmo di Karplus-Strong.

L’algoritmo presenta il grande vantaggio di essere facilmente realizzabile anche con istruzioni elementari (addizione, divisione per 2), essere poco pesante dal punto di vista computazionale e quindi essere realizzabile anche con un PIC.

Per contro il sistema presenta, all’aumentare delle frequenze da produrre, dei difetti quali il rapido smorzamento del suono e la difficile ‘accordatura’ del suono prodotto. Altro limite non indifferente nell’ipotesi di implementare l’algoritmo con un PIC è la quantità di memoria RAM richiesta, se questo non è un limite per un Personal Computer, dotato di memoria in abbondanza, lo è sicuramente per un PIC.

Un tipico sistema Karplus-Strong può essere schematizzato come segue:

karplus-strong

karplus-strong

L’algoritmo prevede la generazione di un segnale ad ampio spettro di armoniche (ad esempio rumore bianco) quale sistema di eccitazione della corda, questo rumore viene mandato in uscita per essere riprodotto e contemporaneamente inserito in una linea di ritardo di lunghezza L. L’uscita della linea di ritardo viene filtrata mediante un filtro passa-basso e quindi aggiunta al segnale di ingresso per essere re-immesso in uscita. Contemporaneamente al reinserimento in uscita il segnale ritardato e filtrato viene ancora immesso nella linea di ritardo producendo quindi un loop infinito del segnale stesso.

Il filtro in uscita alla linea di ritardo consente di emulare il più rapido abbattimento delle frequenze alte rispetto alle frequenze basse, il loop simula la vibrazione della corda ed il rumore bianco generato all’inizio contiene l’alto numero di armoniche tipico del suono generato dalla chitarra.

La dimensione L della linea di ritardo determina la frequenza di ‘oscillazione’ del sistema e quindi la frequenza della nota prodotta. In particolare si può scrivere:

L=\frac{F_c}{F_n}

Dove Fn è la frequenza della nota da riprodurre e Fc la frequenza di campionamento del segnale prodotto.

Come si può quindi vedere il cuore del sistema è la dimensione della linea di ritardo ed il filtro passa-basso in uscita dalla linea stessa. La risposta in frequenza di questo filtro ed il guadagno alle basse frequenze determinano sia il timbro che l’inviluppo del suono prodotto. Variando la frequenza di taglio del filtro si possono simulare suoni prodotti da corde di diverso materiale (nylon, metallo), una risposta inferiore ad 1 anche alle basse frequenze consente di attenuare nel tempo il suono, generando quindi la fase di release dell’inviluppo, diverso guadagno = diverso inviluppo = diverso strumento.

In realtà per simulare diversi strumenti non sarà sufficiente modificare il guadagno del filtro ma saranno necessari anche altri accorgimenti che in questa sede non tratterò.

Filtri digitali

Una trattazione esaustiva dei filtri digitali, oltre a non esserne io probabilmente in grado, richiederebbe diversi articoli. Per un appofondimento vi consiglio gli articoli pubblicati su questo stesso portale da g.schgor:

Filtri

Strutture


Io mi limiterò ad un breve richiamo sui filtri di tipo FIR (Finite Impulse Response) e IIR (Infinite Impulse Response).

Filtri

Filtri

Una precisazione sulla forma con cui i segnali digitalizzati vengono trattati matematicamente: il segnale digitale (detto segnale a tempo discreto) in ingresso al filtro deve essere visto come un vettore di valori ed ogni elemento del vettore rappresenta il valore del segnale in un preciso instante di tempo: detto x() il vettore che contiene i dati del segnale in ingresso, x(0) rappresenta il segnale al tempo t=0, x(1) il segnale al tempo t=1 e x(n) il segnale al tempo t=n.

Allo stesso modo il segnale in uscita al filtro viene visto come un vettore di valori: detto y() il vettore che contiene il segnale in uscita al filtro, y(0) rappresenta il segnale al tempo t=0, y(1) il segnale al tempo t=1 e y(n) il segnale al tempo t=n.


L'elaborazione del segnale in ingresso (quindi del vettore x()) per produrre il segnale in uscita (quindi il vettore y()) che i filtri di tipo FIR effettuano è esprimibile nella seguente forma:

Filtro_FIR

Filtro_FIR

I filtri di tipo IIR effettuano una elaborazione del segnale di ingresso x() e contestualmente del segnale presente all'uscita y(), fino all’istante precedente l’elaborazione, per produrre il nuovo segnale di uscita all’istante di elaborazione con la forma seguente:

Filtro_IIR

Filtro_IIR

Per entrambi i tipi di filtro i coefficienti bi ed aj rappresentano le diverse amplificazioni/attenuazioni da applicare ai segnali, amplificazioni/attenuazioni che possono essere diverse per ogni elemento del vettore sia di ingresso che di uscita.

Il diverso valore dei coefficienti bi ed aj ed i diversi valori di N, P e Q determinano il tipo di filtro (passa basso, passa alto, passa banda, ecc..), l’ordine del filtro e la frequenza di taglio.


Il coefficiente a0, presente solo nei filtri IIR, serve ad imporre un guadagno inferiore ad 1 per evitare che il sistema diventi instabile: essendo, per questi filtri, il segnale in uscita riportato in ingresso se il guadagno del filtro fosse maggiore o uguale ad 1 il sistema andrebbe presto in saturazione.

I filtri IIR richiedono più memoria dei filtri FIR, dovendo riportare in ingresso anche i precedenti segnali di uscita, ed impegnano maggiormente il microprocessore in termini di elaborazione dei dati.

Per il nostro scopo si utilizza un filtro FIR passa basso di primo ordine, ossia:

Filtro utilizzato

Filtro utilizzato

Ponendo per semplicità b0 = b1 = 1 il filtro appena esposto presenta una risposta in frequenza pari a:

Risposta in frequenza

Risposta in frequenza

Da cui si vede che il guadagno alle basse frequenze sarebbe pari a 2, dovendo il nostro filtro presentare un guadagno non superiore ad 1, si modifica la formula precedente in:

Filtro finale

Filtro finale

La cui risposta in frequenza è rappresentabile come segue:

Grafico risposta

Grafico risposta

Una facile verifica del comportamento del filtro è quella mostrata dalle seguenti immagini dove ad un segnale a bassa frequenza:

Bassa Frequenza

Bassa Frequenza

Viene aggiunto un segnale ad alta frequenza:

Bassa Frequenza con disturbo

Bassa Frequenza con disturbo

E quindi applicato il filtro appena discusso:

Segnale filtrato

Segnale filtrato

Come si vede il segnale a frequenza più alta viene notevolmente ridimensionato in ampiezza.

Inviluppo

A questo punto non rimane che da realizzare il corretto inviluppo.

Come detto in precedenza l’inviluppo è una modulazione in ampiezza del segnale in uscita al filtro, una modulazione di ampiezza si ottiene mediante moltiplicazione tra due segnali. Una parte dell’inviluppo è già stata realizzata dal filtro stesso: esso infatti presenta guadagno 1 solo alla frequenza 0 (corrente continua), presentando guadagno inferiore ad uno per tutte le altre frequenze.

Questa attenuazione è comunque risultata insufficiente ed è stato necessario aggiungere ulteriore decadimento, dopo alcuni tentativi il migliore risultato si è ottenuto moltiplicando il segnale in uscita al filtro per il valore 0,99609375.


DAC

Ed ora abbiamo tutto il software necessario per generare il suono della nostra chitarra all’interno del PIC, per tradurre questi dati, digitali, in segnali analogici è necessario un convertitore digitale analogico. Per semplicità di realizzazione circuitale si utilizza la tecnica del PWM (Pulse Width Modulation) più filtro RC in uscita.

Il PWM è un segnale ad onda quadra con periodo costante e Duty Cycle, ossia rapporto tra tempo in cui l’onda quadra rimane a livello alto ed il tempo del periodo dell’onda, variabile nel tempo. :

PWM

PWM

Da questo segnale è possibile ottenere una tensione continua proporzionale al Duty Cycle applicando il segnale ad un filtro passa-basso.

Il filtro passa-basso consente inoltre di eliminare la frequenza del PWM stesso, frequenza che risulterebbe essere un disturbo.

Il filtro è un comunissimo circuito RC.

Con questa tecnica si ottiene un DAC mediante l’utilizzo di un solo pin del PIC.

Realizzazione

Questo lo schema elettrico del circuito.

Schema

Schema

Come si può vedere il tutto si riduce a pochissimi componenti.

L’uscita del filtro RC che funge da DAC dovrà essere collegata ad un qualsiasi amplificatore audio o, dopo opportuna limitazione, potrà essere applicata all’ingresso audio del PC per essere registrata.

I 4 pulsanti collegati ai pin RB4, RB5, RB6 ed RB7 servono a selezionare il brano da ascoltare (si veda la sessione del firmware).

Si è utilizzato il PIC16F88 con clock interno a 8MHz.

Il tutto può essere alimentato con una tensione di 4,5V.

Firmware

Il firmware è stato scritto in assembler per avere il massimo controllo sui tempi (molto critici) di esecuzione in ogni sua parte. Nella EEPROM vengono memorizzati fino a 4 brani (in realtà piccole sequenze di brano) che vengono eseguiti premendo il relativo pulsante.

Il firmware genera il suono di massimo 2 corde contemporaneamente, ogni corda è stata costruita in modo da poter riprodurre 2 ottave (24 note), è quindi possibile eseguire contemporaneamente 2 note selezionate da 2 ottave.

Come archiviare sequenze da suonare nella EEPROM è documentato all’interno dei sorgenti (disponibili per chi lo desidera, basta mandare un MP), ma per chiarezza lo riporto anche qui:

ogni brano inizia con un byte che rappresenta la base dei tempi, a seguire il brano vero e proprio che si rappresenta con uno o più gruppi di 2 note, ogni gruppo è rappresentato da 2 byte con il seguente significato:

primo byte:

bit 7 – Ottava della corda 1 (0=Ottava bassa, 1=Ottava alta)

bit 6 – Ottava della corda 2 (0=Ottava bassa, 1=Ottava alta)

bit 0-3 – Durata della nota da suonare, indicare la minore durata tra la durata della nota prodotta dalla corda 1 e la durata della nota prodotta dalla corda 2. Questo valore viene moltiplicato per la base tempi espressa nel primo byte del brano.

Secondo byte

bit 4-7 – Nota della prima corda

bit 0-3 – Nota della seconda corda


Allegati

E per finire due esempi:

Smoke on the water

Per Elisa


Fabio Bicciato

3

Commenti e note

Inserisci un commento

di ,

Complimenti per il lavoro! Davvero ben fatto! Jon

Rispondi

di ,

Grazie.

Rispondi

di Anonimo,

molto interessante! complimenti per i risultati ottenuti.

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.