Generare suoni con Arduino e Bascom

Sezione dedicata al sistema di sviluppo BASCOM-AVR per i micro AVR
At90s, Attiny, Atmega e Xmega

Generare suoni con Arduino e Bascom

Postby Micos » 04 Aug 2012, 07:44

salve ragazzi,
secondo voi sarebbe possibile generare dei suoni sintetizzati (tipo moog) anche monofonici
con un Arduino usando il Bascom?
Vorrei realizzare un piccolo sintetizzatore monofonico comandato da una tastiera MIDI o anche non, e mi era venuto in mente questo progetto.
Sarebbe bello poterlo gestire comandando il VCO, il VCA, il VCF e l'ADSR con dei potenziometri applicati all'ADC del micro.

non è una sciocchezzuola ma sarebbe interessante poter fare qualcosa del genere, che ne pensate?

ciao
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: Generare suoni con Arduino e Bascom

Postby filosofo » 06 Aug 2012, 15:49

ma se tu vuoi realizzare il tutto con un solo micro penso dovresti parlare non di Voltage control ma di Digital Control Oscillator etc.
quindi DCO, DCA, DCF giusto?
tempo fa avevo visto un sintetizzatore realizzato con un solo at90x8535 che aveva pure un ingresso midi.
l'uscita audio era ottenuta con un dac fatto con delle resistenza collegate ad una porta a 8 bit.
il fatto è che non riesco più a trovare il link.

ah! il codice però era scritto in asm .... se lo trovo lo linko

Domanda... ma tu suoni ? sei un tastierista o lo vuoi costruire a scopo didattico?
filosofo
 
Posts: 74
Joined: 23 Oct 2011, 09:52
Location: Dintorni di Roma

Re: Generare suoni con Arduino e Bascom

Postby Micos » 07 Aug 2012, 09:29

io non sono un vero e proprio tastierista cmq me la cavicchio e sono un autodidatta,
in base alla musica che suono,
i suoni che mi piacciono sono quelli analogici tipo moog e per questo mi diletto a costruire moduli vari, i cosiddetti VCO, ADSR etc.

infatti per questo mi era venuta questa idea , cioe reliazzare un piccolo sint con l'arduino, ma sto vedendo che non è banale.
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: Generare suoni con Arduino e Bascom

Postby cyclone » 10 Aug 2012, 15:41

micos, filosofo,
se vi può interessare sul forum di arduino all'indirizzo

http://arduino.cc/forum/index.php/topic,117287.0.html

sto seguendo un topic proprio su un progetto synth con arduino aperto da RISIL.

A quanto pare l'idea fa gola a molti

ciao
User avatar
cyclone
 
Posts: 38
Joined: 27 Jan 2012, 11:49

Re: Generare suoni con Arduino e Bascom

Postby 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
-------------------------------------------------------------------------------------------
User avatar
cyclone
 
Posts: 38
Joined: 27 Jan 2012, 11:49


Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 3 guests