Introducere

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.

Descriere generala

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:

  • do = 262 Hz
  • do# = 277 Hz
  • re = 293 Hz
  • re# = 311 Hz
  • mi = 330 Hz
  • fa = 349 Hz
  • fa# = 370 Hz
  • sol = 392 Hz
  • sol# = 415 Hz
  • la = 440 Hz
  • la# = 466 Hz
  • si = 494 Hz
  • do = 523 Hz

Schema bloc:


Durata fiecărei note depinde de timpul în care tasta este apăsata.

Hardware Design

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.

Diagrama de semnal:


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.

Software Design

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.

Rezultate Obţinute (etapa 3)

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.

Concluzii (etapa 3)

Este scalabil:

  • Soluţia aleasă poate fi extinsă pentru o gamă mai largă de note deoarece a fost folosită doar o parte din butoanele tastaturii.
  • Se poate mări numărul de taste apăsate simultan dacă se foloseşte o formulă de mediere.
  • Se pot adăuga eşantioane pentru alte instrumente.

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.

Download

Bibliografie/Resurse

pm/pm/prj2009/ca/pian-pe-tastatura.txt · Last modified: 2020/02/14 10:01 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0