Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 =====
  
pm/prj2025/avaduva/andrei.diaconu1410.1747560021.txt.gz · Last modified: 2025/05/18 12:20 by andrei.diaconu1410
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