Thông báo

Collapse
No announcement yet.

Giúp đỡ về cách phát nhạc dùng VDK

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp đỡ về cách phát nhạc dùng VDK

    Mình có xem một số bài trên diễn đàn dùng 8051 viết nhạc đơn âm. Theo như mọi người nói thì để tạo ra các nốt thì cần kích xung vào loa với những tần số khác nhau, mình cũng chỉ hiểu lơ mơ vậy, xem qua 1 số code thì = ASM cả đọc hẻm hiểu gì, C thì đọc tốt. Ai có kinh nghiệm về cái này hướng dẫn cho mình học hỏi cùng, dạo này cũng rảnh rảnh xíu nên lôi vài cái mạch ra chơi mà k biết làm gì, các bác ko có code C thì có thể hướng dẫn e về thuật toán viết nốt để em thử ghép
    Tks all
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

  • #2
    Bạn thử làm theo cách này nhé.Bạn lên google search tần số của các nốt nhạc sau đó dùng modul PWM đưa ra chân vi điều khiển xung điều chế với tần số tương ứng (duty có thể chọn 50%) .Tín hiệu này bạn đệm dòng rồi đưa ra loa gốm áp điện. Sau đó ghép các nốt nhạc lại là bạn sẽ có 1 bản nhạc đơn âm.

    Giải pháp điện tử của bạn

    Comment


    • #3
      mình biết là phải tạo pwm, nhưng mà việc tạo và ghép các nốt cũng là cả vấn đề
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment


      • #4
        cái này đòi hỏi sự hiểu být về âm sắc. e nghĩ cứ nắm được tần số of âm trầm bổng và 7 nút cơ bản là giải quyết được
        Nguyễn Huy Biên - 01649 802 694
        gmail :

        Comment


        • #5
          Nguyên văn bởi mast090 Xem bài viết
          mình biết là phải tạo pwm, nhưng mà việc tạo và ghép các nốt cũng là cả vấn đề
          Mình nghĩ có thể làm thế này. Mã hóa bản nhạc cần phát thành thành 1 mảng 1 chiều có số phần tử chính là số nốt nhạc cần phát, giá trị các phần tử chính là giá trị cần nạp vô thanh ghi điều khiển tần số PWM để cho ra các nốt tương ứng. Sau đó dùng 1 timer có thời gian tùy chọn (phù hợp với tốc độ phát các nốt nhạc, vd 1s hoặc 0.5s). Mỗi lần ngắt tràn timer bạn set lại tần số PWM bằng cách đưa giá trị từ mảng vô thanh ghi quy định tần số PWM. Khi phát hết bản nhạc có thể cho lặp lại quá trình phát.

          Giải pháp điện tử của bạn

          Comment


          • #6
            gửi cậu cái code này cái này đã chạy, mình coppy ở đâu cngx quên rồi. lâu nên không nhớ
            #include<reg51.h>
            unsigned char preloadTH=0xFF,preloadTL=0xFF;
            unsigned int pointer=0,ii=0,jj;
            sbit out=P2^0;
            //octa: 0
            //key : C C# D D# E F F# G G# A A# B
            code float key_octa0[]={16.35,17.32,18.35,19.45,20.6,21.83,23.12,24.5,25 .96,27.5,29.14,30.87};
            code unsigned int chuan=1000;
            code float crystal=11.0592;
            //music
            code unsigned char music[]=
            {
            "4d~,4d~,3g~,3a~,4d.,4d~,4g~,4a~,4b~,4a=,4g=,4d.,4 e~,3a~,4c~,3g~,3a~,4d~,4d ,4d=,4c=,3a~,4c~,3g~,3a~,4do"
            "4g~,4g~,4d~,3a~,4g.,4g~,4a~,4g~,4b=,4a=,4g~,4d.,4 g~,4e ,4e~,4d~,4c ,4d~,4d~,3a~,4d~,3b~,3a~,3go,4d ,4go"
            "4go,4a ,4b~,4a~,4F~,4g.,4d~,4g~,4a~,4a=,4b=,4a~,4g.,4d~,3 a ,3a ,3a~,4d ,4d~,4d ,3a=,3b=,3a~,3g.,4b=,4a="
            "4g~,4d~,4g~,4d~,3a.,4g~,4g ,4F~,4a~,5d.,4a=,4b=,4d ,3a ,4go,4d~,4d~,3g~,3a~,4do,4g~,4g~,4d~,3a~,4go,4g~"
            "4d~,4g~,4a~,4A ,4a~,5d~,4b~,4a~,4g~,4F~,4g ,4d ,4d ,4g~,4a~,4A ,4a~,5d~,4b~,4a~,4g~,4F~,4go,s"
            };
            void doitanso(float tanso)
            {
            unsigned int giatrinap;
            giatrinap=65536-(unsigned int)((1000000*crystal)/(24*tanso));
            preloadTL=(unsigned char)giatrinap;
            preloadTH=(unsigned char)(giatrinap>>8);
            }
            void key(unsigned char octa,unsigned char k)
            {
            float tanso;
            switch (k)
            {
            case 'c' : tanso=key_octa0[0]; break;
            case 'C' : tanso=key_octa0[1]; break;
            case 'd' : tanso=key_octa0[2]; break;
            case 'D' : tanso=key_octa0[3]; break;
            case 'e' : tanso=key_octa0[4]; break;
            case 'f' : tanso=key_octa0[5]; break;
            case 'F' : tanso=key_octa0[6]; break;
            case 'g' : tanso=key_octa0[7]; break;
            case 'G' : tanso=key_octa0[8]; break;
            case 'a' : tanso=key_octa0[9]; break;
            case 'A' : tanso=key_octa0[10]; break;
            case 'b' : tanso=key_octa0[11]; break;
            }
            switch (octa)
            {
            case '1' : tanso*=2; break;
            case '2' : tanso*=4; break;
            case '3' : tanso*=8; break;
            case '4' : tanso*=16; break;
            case '5' : tanso*=32; break;
            case '6' : tanso*=64; break;
            case '7' : tanso*=128; break;
            case '8' : tanso*=256; break;
            }
            doitanso(tanso);
            }
            unsigned int trave(unsigned int ms)
            {
            unsigned int a;
            a=preloadTH;
            a=a<<8|preloadTL;
            return (ms*crystal*1000)/12/(65536-a);
            }
            unsigned int tempo(unsigned char tem)
            {
            switch (tem)
            {
            case '=' : return trave(chuan); break;
            case '~' : return trave(chuan*2); break;
            case ' ' : return trave(chuan*4); break;
            case '.' : return trave(chuan*6); break;
            case 'o' : return trave(chuan*8); break;
            }
            }
            void ngattimer_0(void) interrupt 1
            {
            out=~out;
            TL0=preloadTL;
            TH0=preloadTH;
            if(ii==0)
            {
            if(music[pointer]=='s')
            TR0=0;
            key(music[pointer],music[pointer+1]);
            jj=tempo(music[pointer+2]);
            }
            ii++;
            if(ii==jj)
            {
            ii=0;
            pointer+=4;
            }
            }
            void main(void)
            {
            P0=P1=P2=P3=0;
            /*TMOD=17;
            TL0=0xff;
            TH0=0xff;
            ET0=1;
            EA=1;
            TR0=1;*/
            EA=0;
            TMOD=0x02;// 8 BIT AUTO RELOAD
            TL0=0xff;
            TH0=0xff;
            ET0=1;
            EA=1;
            TR0=1;
            while(1);
            }
            mà cậu học DT2K3 hả? thấy nick của cậu cũng có trên diễn đàn của trường.

            Comment


            • #7
              mình bên DT3, rảnh làm chơi tí, nhưng nhìn cái code này có vẻ khó hiểu @@ nhất là cái mảng music, nhìn lạ đời quá
              để bảo vệ đồ án xong ngâm cứu cái nãy kỹ lại
              Website chính thức đổi địa chỉ website thành
              Mời các bạn ghé thăm !!!

              Comment

              Về tác giả

              Collapse

              mast090 Tìm hiểu thêm về mast090

              Bài viết mới nhất

              Collapse

              Đang tải...
              X