Proiectul constă în construirea unui sintetizator muzical care reproduce sunetele produse de un pian. Utilizatorul foloseşte tastatura în loc de claviatură. Studiez posibilitatea de a avea mai multe taste apasate simultan.
Ideea mi s-a părut interesantă întrucât oferă oricui posibilitatea de a-şi încerca abilităţile de pianist fără a necesita un pian adevărat.
Sintetizatorul acoperă octava C4 şi include toate cele 11 note dintre acestea, inclusiv diezii şi bemolii. Frecvenţa de eşantionare a sintetizatorului este de 20kHz, care este mai mare decât frecvenţa Nyquist a celei mai înalte note (523 Hz) . Valorile eşantinoanelor sunt memorate în tabele din memorie şi sunt trimise la unul din porturile paralele cu frecvenţa de eşantionare. Ieşirea acestui port paralel comandă intrarea unui convertor digital-analog a cărui ieşire va comanda un amplificator audio care va comanda un difuzor.
Frecvenţele:
Schema bloc:
Durata fiecărei note depinde de timpul în care tasta este apăsata.
1. Schema plăcuţei:
2. Interfaţa cu tastatura:
Interfaţa cu tastatura este directă. Ceasul se leaga direct la INT0 (PD2) şi rutina de tratare a acestei întreruperi citeşte data de pe pinul 3 al portului D (PD3). Datele vor ieşi pe portul C. Eşantioanele sunt codificate pe 6 biţi pentru a permite mai multe taste apăsate simultan (maxim 3). Prin apăsarea a mai mult de o tastă se trimite la portul C suma eşantioanelor.
3. Diagrama converorului digital-analog:
Există posibilitatea ca semnalul de la ieşirea convertorului digital-analog să fie prea mare şi se poate folosi un rezistor semi-reglabil de 100k înseriat la ieşirea convertorului.
Mediul de dezvoltare va fi CodeVisionAVR.
În rutina de tratare a întreruperii venite de la tastatură, se preia codul tastei apăsate şi eventual se verifică eliberarea tastei sau apăsarea alteia noi. Se modifică indicatorul tabelului de unde se preiau eşantioanele pentru nota corespunzătoare tastei.
Pentru transmiterea valorilor eşantioanelor din tabelul curent se implementează un counter cu frecvenţa de 20kHz, care generează o întrerupere, folosindu-se timer1 pe 16 biţi (generează o întrerupere când ajunge la valoarea 800 (ceasul controller-ului este de 16MHz), apoi se resetează counter-ul). În rutina de tratare a acestei întreruperi, se transmite la unul din porturile paralele conţinutul adresei curente din tabelul selectat cu ajutorul tastei.
Nota | Frecvenţa | Numar de eşantioane | Tastă | Scancode |
---|---|---|---|---|
do | 262 Hz | 77 | a | 0x1C |
do# | 277 Hz | 73 | w | 0x1d |
re | 293 Hz | 69 | s | 0x1b |
re# | 311 Hz | 65 | e | 0x24 |
mi | 330 Hz | 62 | d | 0x23 |
fa | 349 Hz | 58 | f | 0x2b |
fa# | 370 Hz | 55 | t | 0x2c |
sol | 392 Hz | 52 | g | 0x34 |
sol# | 415 Hz | 49 | y | 0x35 |
la | 440 Hz | 46 | h | 0x33 |
la# | 466 Hz | 44 | u | 0x3c |
si | 494 Hz | 41 | j | 0x3b |
do | 523 Hz | 39 | k | 0x42 |
Nu se transmite nimic către tastatură şi nu se ia în considerare posibilitatea apăsării unor taste de control (Shift). Eliberarea unei taste este identificată prin faptul că scancode-ul tastei respective este precedat de codul 0x0f.
Deoarece rutina de tratare a întreruperii generată de timer1 nu poate fi întreruptă până la terminare exista pericolul ca în cazul în care aceasta durează suficient de mult, valoarea eşantionata pe pinul D3 (datele de la tastatură) să nu mai fie actuală. Din această cauză s-a ales soluţia ca datele pentru ieşirea către dac(portul A) să fie pregătite într-o bucla while în main() şi făcute disponibile sub forma unei variabile globale a. Variabila globală b semnalizează faptul că se pot incrementa indecşii tabelelor cu eşantioanele celor 3 note.
Din cauză că semnalul la ieşirea dac-ului era prea mare, au fost introduse o rezistenţă de 100ohm şi un semireglabil de 100kohm astfel:
Din cauză că rezistenţa de ieşire a convertorului este de 75ohm se obţine o atenuare a tensiunii de ieşire a dac-ului de aproximativ 20 de ori.
Dispozitivul este de sine stătător şi foloseşte o tastatură standard de pc şi o singură sursă de alimentare de 7,5V/1A. Dac-ul şi amplificatorul sunt montate pe o placuţă separată care este conectată de extensiile aflate pe placuţa microcontroller-ului cu un cablu.
Sunetul nu are claritatea unei note scoase de un pian ci mai degraba sună ca un sintetizator electronic, ceea ce de fapt şi este. Se pot apăsa până la 3 taste simultan.
Este scalabil:
Dacă se adaugă un modul software pentru interfaţa serială se poate obţine un terminal (care a şi fost folosit pentru depanare) fără adăugare de hardware suplimentar.