vladutz2000 Postat Noiembrie 2, 2009 Partajează Postat Noiembrie 2, 2009 Salutam vazut ca multi oameni au reusit sa genereze sunet cu PWM ... stiu si eu ca daca fac un canal de pwm sa mearga la frecventa de 1000 Hz si cu un dutycycle the 50% o sa faca un sunet la o frecventa de 500 Hz , dar ce am vazut eu era mult mai complex , de exemplu volumul sunetului putea sa fie ajustat ,la fel si frecventa.stie careva cum se poate face asa ceva ? Link spre comentariu
fratello Postat Noiembrie 2, 2009 Partajează Postat Noiembrie 2, 2009 Simplu si... complex ! http://www.picbasic.co.uk/forum/showthread.php?t=12055 Link spre comentariu
vladutz2000 Postat Noiembrie 2, 2009 Autor Partajează Postat Noiembrie 2, 2009 dar nu e ceea ce caut!...eu vreau sa stiu cum generez tonuri cu volume ajustabile Link spre comentariu
Stefan Postat Noiembrie 2, 2009 Partajează Postat Noiembrie 2, 2009 sincer nici eu nu stiu cum se face treaba asta (din soft) dar exemplul asta din proteus "suna bine" hexul si simularea le gasesti in sampls-uri Link spre comentariu
cirip Postat Noiembrie 2, 2009 Partajează Postat Noiembrie 2, 2009 de exemplu volumul sunetului putea sa fie ajustat ,la fel si frecventa.stie careva cum se poate face asa ceva ? Da. Va trebui sa generezi PWM in jurul lui 50% al carui factor de umplere sa se modifice dupa o lege de variatie care urmareste semnalul pe care vrei sa il generezi. De exemplu, daca vrei sa generezi un sinus, factorul de umplere va avea valoarea 50*(1+A*sin(omega*t))[%]. "A" este amplitudinea semnalului generat, "omega" este frecventa unghiulara pe care vrei sa o generezi. Modificand A se modifica amplitudinea. Modificand omega, se schimba frecventa.Am facut chestia asta pe post de convertor D/A la un filtru digital facut cu PIC.Probabil ca nu ai inteles mare lucru, dar mai intreaba ce e neclar. Iti sugerez ca inainte de a te apuca de scris softul pr zis, sa faci niste simulari cu excelul, ca sa intelegi matematica. Este esential.Cirip Link spre comentariu
vladutz2000 Postat Noiembrie 3, 2009 Autor Partajează Postat Noiembrie 3, 2009 Mda , mi s-a parut cam complicat cum ati zis voi p-aici ca s-ar face ce vreau eu .. asa ca pana la urma am folosit un DAC in loc de pwm si pentru faza cu volumul am folosit un fel de wavetable ... si merge ! Link spre comentariu
vladutz2000 Postat Noiembrie 4, 2009 Autor Partajează Postat Noiembrie 4, 2009 Am renuntat la faza cu wavetable... prea putine sample-uri , prea multa memorie folosita degeaba...in schimb mi-a venit alta idee ! .. l-am pus la 20 Mhz si am setat ISR-ul la 10 Khz , am facut un array cu toate frecventele notelor MIDI care pentru fiecare byte are 10Khz/2/frecventa , si in felul asta pot sa fac sunete pe frecventa notelor midi folosindu-le numarul (21-108 , primele 20 de byte-uri din array sunt 0). Am scris niste functii pentru 2 canale de sunet , care la frecventa data de byte-ul ales din array-ul MIDI schimba un variabil numit OCh1 (output channel 1) sau OCh2 ba in 0 , ba in Vol1 sau Vol2 (volumele canalelor , de la 0 la 255) ... totul merge perfect dar am o problema. nu pot decat sa fac output la un canal o data (exemplu : PORTD=OCh1; ) ... dar eu vreau sa le mixez pe amandoua intr-unul singur , deci sa le fac output-ul tot pe PORTD ... cum fac asta ? Pentru cine vrea sa ma ajute , am pus mai jos codul meu. //MIDI pitchesunsigned const MIDI[108] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,172,162,153,144,136,129,121,115,108,102,96,91,86,81,76,72,68,64,61,57,54,51,48,45,43,40,38,36,34,32,30,29,27,26,24,23,21,20,19,18,17,16,15,14,14,13,12,11,11,10,10,9,9,8,8,7,7,6,6,6,5,5,5,5,4,4,4,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1};//Sound engine variablesunsigned short Ch1;unsigned short SCh1;unsigned short Vol1;unsigned short OCh1;unsigned short Ch2;unsigned short SCh2;unsigned short Vol2;unsigned short OCh2;void interrupt() {//Channel 1if (Ch1 < SCh1) {Ch1+=1;}else {Ch1=0;if (OCh1 > 0) {OCh1=0;} else {OCh1=Vol1;}}//Channel 2if (Ch2 < SCh2) {Ch2+=1;}else {Ch2=0;if (OCh2 > 0) {OCh2=0;} else {OCh2=Vol2;}}//Mix the channels and output the soundPORTD=OCh1; // ???//Prepare for the next interrupt service routineINTCON.TMR0IF=0;}void main() {//StartupADCON1 = 0x07;CMCON = 0x07;TRISD = 0x00;INTCON=0xA0;T0CON=0xC0;//Sound engine startupVol1=255;Ch1=0;SCh1=MIDI[69];Vol2=255;Ch2=0;SCh2=MIDI[50];while(1) {vdelay_ms(10); Vol1-=1; //Decrement Channel 1 volume , keep Channel 2 volume}; //endless loop} Link spre comentariu
Cristiano Postat Noiembrie 4, 2009 Partajează Postat Noiembrie 4, 2009 Arunca o privire si aici: http://www.romanblack.com/BTc_alg.htm Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum