by cyclone » 10 Aug 2012, 15:53
posto anche qui i miei replay dal forum arduino.
------------------------------------------------------------------------------------
hei, il progettino mi sembra interessante... volendo ti posso dare qualche dritta.
Come nei vecchi synth anni 70/80, parlo dei synth analogici monofonici, stile moog, devi iniziare con il crearti attraverso l'uso dei timer e dei pwm i vari moduli hardware che lo compongono:
VCO : voltage controlled oscillator
VCA : voltage controlled amplifier
VCF : voltage controlled filter
ADSR : attack, decay, sustain e relaise
questi sono i moduli essenziali per realizzare con un micro un synth-analogico.
chiaramente nel nostro caso non parleremo di "Voltage controlled" ma di "Digital controlled" e quindi gli acronimi diventeranno:
DCO, DCA, DCF, ADSR, LFO, Ring-modulator etc.
Ti consiglio di iniziare con la realizzazione della parte DCO (oscillatore) che deve essere in grado di produrre un pò di forme d'onda:
quadra, triangolare, sinusoidale, a rampa e perchè no, anche forme d'onda generate attraverso una wave-table (DDS) inserita sulla flash del micro o su sd-card esterna (tipo campionatore).
Inoltre vorrai pilotare il tuo synth attraverso una tastiera midi e quindi dovrai interpretare i segnali seriali (MIDI) a loop di corrente che arrivano attraverso un opto-isolatore all'ingresso seriale del micro.
corrispondentemente devi modificare la frequenza di riproduzione in base alla nota (tasto) premuta sulla tastiera etc etc .... creandoti una tabella di riferimento.
L'implementazione di alcuni di questi moduli risulta essere molto complicata se affidata solo ed esclusivamente al uC, perciò risulta convenevole realizzare almeno il VCF in modo analogico magari con un chip tipo SSM2044. Questo perchè una volta generato il segnale DCO 8/16 bit in PWM o con un DAC esterno non si ha abbastanza potenza di calcolo (programmando in C) per affidare al uC il compito di filtrare in cut-off il segnale di uscita. Avresti qualche speranza di fare tutto con il uC programmandolo in assembly.
continuerò.............. se la cosa interessa.
----------------------------------------------------------------------------------------------------
ciao ragazzi,
considerando un AVR lavori a 16Mhz, impostando il pwm con risoluzione di 8 bit (il minimo) , pre-scaler=1 si ottiena una freq di pwm pari a 31250 Hz.
adesso volendo realizzare un segnale a rampa-up tramite un generatore di inviluppo o una wave-table abbastanza risoluta (256 valori) otteniamo
31250 / 256 = 122,07 Hz che sarebbe la freq più alta (all'uscita del lowpass filter) in termini di nota musicale che possiamo ascoltare con questa risoluzione.
per generare una forma d'onda con freq musicale sulla armonica fondamentale pari a 440Hz (LA4) dobbiamo ridurre la risoluzione della rampa portandola a 71 livelli
31250 / 71 = 440,14 Hz
per avere la freq del LA6 pari a 1760 Hz dovviamo generare la rampa con soli 17 step senza considerare i cicli macchina che occorrono per prelevare i dati dalla tabella
ed assegnarli al registro pwm.
dico bene? e allora vi chiederete...........ma è possibile realizzare il synth sfruttando come uscita audio l'OC del PWM?
-------------------------------------------------------------------------------------------------------------
hai letto sopra?
se vuoi realizzare un sintetizzatore con tanto di filtri digitali controllati digitalmente (DCF) ti consiglio di passare all' Arduino2560 (almeno) e gestire attraverso le porte parallele un DAC a 16 bit che potresti realizzare facilmente con dei registri e una rete resistiva di precisione + operazionale.
Un consiglio personale ! lascia perdere il PWM per questa applicazione, avresti solo una grande delusione in termini di qualità del suono,
hai presente i giocattolini cinesi che emettono suoni? sono fatti così, non avresti quello che in gergo musicale si chiama "calore" del suono analogico.
cmq, abbassando la risoluzione della wave portandola a 4 bit (16 livelli) forse ti potresti accontentare.... dipende dalla qualità che desideri e da come configuri il DDS.
altra soluzione sarebbe quella di utilizzare la modulazione ad un bit o sigma-delta che potrebbe aumentare la qualità.
iniziamo intanto con il calcolare la freq della nota che deve essere generata in base al tasto premuto sulla tastiera midi:
Freq = 440Hz * 2^((n-69+d)/12)
dove
n = MIDI note number
d = transpose/detune (in halftones)
considerando es:
LA6 midi-note = 96
e transpose=0
abbiamo
(93-69+0)/12=24/12=2
frq=440 * 2^2 = 1760Hz .... esatto
fate la prova con altre note
a questo punto considerando di voler generare una forma d'onda costituita da 16 livelli (4bit di risoluzione)
per ottenere un suono con una forma a rampa con questa risoluzione dobbiamo moltiplicare 1760 x 16 ed otteniamo 28160 Hz.
Questa è la freq con cui dobbiamo prelevare i dati dalla wave-table ed inviarli in uscita per ottenere una nota LA6 con forma d'onda a rampa.
chiaro?
ciao
-------------------------------------------------------------------------------------------