This shows you the differences between two versions of the page.
|
pm:prj2026:florin.stancu:ianis.opritescu [2026/05/18 14:42] 127.0.0.1 external edit |
pm:prj2026:florin.stancu:ianis.opritescu [2026/05/24 14:32] (current) ianis.opritescu [Jurnal] |
||
|---|---|---|---|
| Line 75: | Line 75: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | ==== Motorul de Sinteza (synth.c / synth.h) ==== | ||
| + | Nucleul audio foloseste **Direct Digital Synthesis (DDS)** cu un tabel sinus de 256 esantioane stocat in **PROGMEM** (Flash), economisind cei 2 KB de SRAM disponibili. Fiecare din cele 4 voci polifonice utilizeaza un acumulator de faza pe 16 biti, al carui byte superior indexeaza direct tabelul — eliminand orice calcul trigonometric la runtime. | ||
| + | Generarea esantioanelor se face in **ISR(TIMER1_OVF_vect)** la 31250 Hz (Fast PWM 9-bit), avand un buget strict de ~512 cicluri CPU. Toata aritmetica foloseste **fixed-point Q8.8** si operatii pe intregi — fara virgula mobila. Mixarea vocilor, aplicarea envelope-ului ADSR si scalarea volumului se reduc la inmultiri si shift-uri pe 16/32 biti, mentinand ISR-ul sub 200 cicluri (~39% din buget). | ||
| + | Envelope-ul ADSR este avansat separat la 1 kHz prin **ISR(TIMER2_COMPA_vect)** via ''adsr_tick_voice()'', decupland rata lenta a modulatiei de amplitudine de rata rapida de esantionare. | ||
| + | Alocarea vocilor foloseste o strategie in trei pasi: re-trigger daca nota este deja activa, alocare voce libera (IDLE), sau **voice stealing** bazat pe varsta relativa (scadere modulara ''uint8_t''). | ||
| + | Semnalul PWM porneste centrat la 50% duty (''PWM_CENTER=255''), generand 0V DC prin condensatorul de cuplaj si eliminand pocniturile la pornire. | ||
| + | ==== Comunicatia USART (usart.c / usart.h) ==== | ||
| + | Receptia este **polling non-blocant** (''USART0_available()'' + ''USART0_read()''), evitand overhead-ul unui ISR suplimentar care ar concura cu ISR-urile audio. Transmisia este blocanta per-caracter. | ||
| + | ==== ADC si Parametri (adc.c / main.c) ==== | ||
| + | Citirea celor 5 potentiometre (Attack, Decay, Sustain, Release, Volume) se face prin polling la intervale rare, folosind un contor uint8_t cu overflow natural la 256 iteratii — evitand un timer dedicat. Valorile ADC sunt convertite in rate Q8.8 prin ''calc_rate()'' si aplicate atomic (cu ''cli()/sei()''). | ||
| + | ==== Interfata Python (piano.py) ==== | ||
| + | Scriptul ''PianoController'' ruleaza pe Linux fara dependinte grafice, folosind **termios raw mode** pentru detectia tastelor cu latenta minima. Un mecanism de **auto-release cu timere per-nota** (''_schedule_release()'') simuleaza key-up din terminal, care nu ofera nativ acest eveniment. Comunicatia seriala este protejata de un ''threading.Lock'', iar un thread daemon dedicat (''serial_reader_thread()'') citeste asincron raspunsurile de la ATmega. | ||
| - | <note tip> | + | <html><a href="https://github.com/ianisopritescu/PM_Soft_Synth">Repo Github cod</a></html> |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| Line 100: | Line 105: | ||
| </note> | </note> | ||
| - | ===== Jurnal ===== | ||
| - | |||
| - | <note tip> | ||
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
| - | </note> | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||