This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.diaconu1410 [2025/05/18 12:20] andrei.diaconu1410 [Hardware Design] |
pm:prj2025:avaduva:andrei.diaconu1410 [2025/05/28 14:22] (current) andrei.diaconu1410 [Software Design] |
||
---|---|---|---|
Line 78: | Line 78: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Am folosit Arduino IDE pentru mediul de dezvoltare. | ||
+ | Biblioteci folosite: | ||
+ | - **SdFat.h**,** MD_MIDIFile.h**: | ||
+ | |||
+ | Pentru a citi si procesa fisiere MIDI de pe cardul SD. | ||
+ | |||
+ | - **SSD1306Ascii.h**, **SSD1306AsciiWire.h**: | ||
+ | |||
+ | Pentru a afisa informatii pe ecranul OLED. | ||
+ | |||
+ | **Structura cod**: | ||
+ | |||
+ | Sistemul are 3 stari: | ||
+ | |||
+ | - **MANUAL** - sintetizatorul primeste comenzi MIDI de la claviatura si ecranul OLED afiseaza informatii despre notele primite. | ||
+ | - **LOADING** - sintetizatorul citeste fisierul MIDI de pe cardul SD si il incarca in memorie. | ||
+ | - **PLAYING_SD** - sintetizatorul reda fisierul MIDI incarcate de pe card. | ||
+ | |||
+ | **Initialiare**: | ||
+ | In Setup() se initializeaza timerul pentru PWM, interuptul de pe pinul 2, cardul SD, obiectul MIDI (pentru redare din fisier MIDI) si ecranul. De asemenea, se seteaza starea initiala a sistemului la MANUAL. | ||
+ | |||
+ | **Loop**: | ||
+ | |||
+ | - **MANUAL**: se citesc 3 bytes pe usart si functia handleMidi() seteaza frecventa timerul si afiseaza informatiile pe ecran. | ||
+ | - **LOADING**: se citeste fisierul MIDI de pe cardul SD si se incarca in obiectul MIDI, dupa programul trece in starea PLAYING_SD automat. | ||
+ | - **PLAYING_SD**: se apeleaza functia getNextEvent() pentru a reda urmatorul eveniment MIDI din fisierul incarcat. Astfel se simuleaza primirea de comenzi MIDI de la claviatura. | ||
+ | |||
+ | Trecerea intre stari se face prin apasarea butonului de pe pinul 2, care declanseaza un interupt. | ||
+ | Aceasta trece de la starea MANUAL la LOADING sau de la starea LOADING, PLAYING_SD la MANUAL. | ||
+ | Este implementata si debouncing pentru a evita treceri multiple intre stari la o singura apasare a butonului. | ||
+ | Totodata la apasarea de 2 ori a butonului sistemul trece in **teaching mode** atunci cand reda fisiere, reducand viteza de redare a fisierului si afisand informatii despre note pe ecran. | ||
+ | |||
+ | Functia **showNoteName()** calculeaza numele si octava notei primite si le afiseaza pe ecran. | ||
+ | |||
+ | Notiuni din laborator aplicate: | ||
+ | * PWM: pentru a genera semnalul audio. | ||
+ | * Interupt: pentru a schimba starea sistemului la apasarea butonului. | ||
+ | * USART: pentru a primi comenzi de la clapa. | ||
+ | |||
+ | |||
+ | {{:pm:prj2025:avaduva:diaconuandrei_synth1.zip| cod sursa}} | ||
+ | [[https://www.youtube.com/watch?v=0_4VnZYQpdc|demo]] | ||
<note tip> | <note tip> | ||
Descrierea codului aplicaţiei (firmware): | Descrierea codului aplicaţiei (firmware): | ||
Line 89: | Line 131: | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | |||
<note tip> | <note tip> | ||
Line 95: | Line 138: | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Desi nu am putut implementa de la 0 citirea fisierelor midi, proiectul m-a ajutat sa invat mai mult despre acest protocol si despre cum functioneaza clapa digitala. Am învatat cum sunt interpretate comenzile MIDI și cum acestea pot fi folosite pentru a genera sunete în timp real. De asemenea, am avut ocazia sa experimentez cu un filtru trece-jos RC si sa reusesc sa trec peste bug-uri hardware. | ||
===== Download ===== | ===== Download ===== | ||