Differences

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

Link to this comparison view

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 =====
pm/prj2026/florin.stancu/ianis.opritescu.1779104547.txt.gz · Last modified: 2026/05/24 14:20 (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