欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 33228|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

用通用單片機(jī)制作MIDI鍵盤

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99624 發(fā)表于 2015-12-25 03:29 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  MIDI是電子樂器的語言,隨著MIDI的誕生,數(shù)字化電子樂器已經(jīng)越來越多,MIDI的應(yīng)用也越來越普遍,在電子樂隊(duì)演奏,電子音樂制作等各個(gè)領(lǐng)域,發(fā)揮著越來越大的作用。隨著計(jì)算機(jī)技術(shù)的發(fā)展,聲卡已經(jīng)成為普通計(jì)算機(jī)的標(biāo)準(zhǔn)設(shè)備,通過聲卡的MIDI接口,可以連接各種各樣的MIDI設(shè)備。連上專供輸入的MIDI鍵盤,再配上相應(yīng)的軟件,計(jì)算機(jī)就可以完成電子琴的功能,甚至可以進(jìn)行電子音樂的制作。由于                MIDI自身的特點(diǎn),它形成的音樂易于進(jìn)行后期制作,越來越為廣大音樂工作者所喜愛,而MIDI鍵盤作為輸入最有效的工具,也越來越普及。
               
                                有些計(jì)算機(jī)音序軟件支持用電腦鍵盤模擬琴鍵,可通過計(jì)算機(jī)鍵盤將音符輸入計(jì)算機(jī),有愛好者就用電腦鍵盤的控制芯片改裝玩具電子琴,將其并接在計(jì)算機(jī)鍵盤上,稱之為電腦琴,但這種控制芯片本身并不是為演奏音樂開發(fā)的,單音演奏還可以,在多個(gè)按鍵壓下時(shí)會(huì)出錯(cuò)。本文將介紹如何用通用單片機(jī)實(shí)現(xiàn)MIDI鍵盤功能,并改裝各種電子琴,與計(jì)算機(jī)連接,從而實(shí)現(xiàn)通過MIDI接口,把電腦變成真正的,可支持復(fù)音的電子琴。
               
、MIDI信號(hào)及聲卡的MIDI接口
               
MIDI                是一種異步串行通訊協(xié)議,其傳輸速率為31.25                 K baud (每秒31250位),每個(gè)字節(jié)包括10                位,1個(gè)起始位,8個(gè)數(shù)據(jù)位,1個(gè)停止位,每個(gè)音符的開(或關(guān))命令有3個(gè)字節(jié),經(jīng)計(jì)算,不到1mS即可傳輸一個(gè)音符的開關(guān)命令。MIDI的數(shù)據(jù)流是單向的,不進(jìn)行應(yīng)答,設(shè)備發(fā)送音樂信息時(shí),不管接收設(shè)備的狀態(tài),而接收設(shè)備收到的信息,經(jīng)校驗(yàn)正確的則執(zhí)行,錯(cuò)誤的就忽略——這樣規(guī)定是由音樂本身的特點(diǎn)決定的,可以丟掉音符,但不能搞錯(cuò)節(jié)拍,實(shí)時(shí)性最優(yōu)先。從物理層面上看,MIDI信號(hào)是電流傳輸?shù)模?mA代表邏輯“0”,0mA代表邏輯“1”。MIDI設(shè)備連接時(shí),必須將輸出與另一設(shè)備的輸入連接。
               
               
               
1                 典型的多個(gè)MIDI設(shè)備連接方式
               
               
  計(jì)算機(jī)聲卡的MIDIGAME接口是15針的D型連接器,其中與MIDI相關(guān)的有:
               
1                     +5V               +5 VDC
               
4                     GND                 地
               
12                    MIDITXD             MIDI 輸出                    
               
15                    MIDIRXD             MIDI 輸入                  
               
               
               
                圖                 2 聲卡上的                 MIDI/GAME接口
               
                二、                 單片機(jī)如何產(chǎn)生MIDI信號(hào)
               
                本節(jié)介紹如何用目前在國內(nèi)處于最主流地位的51系列單片機(jī)產(chǎn)生MIDI信號(hào)。實(shí)際上,這包含了兩層意思 :1.如何產(chǎn)生符合 MIDI協(xié)議的串行數(shù)據(jù)。2.接口電路。
               
                絕大多數(shù)51系列單片機(jī)都有串行通訊控制器(UART),配合合適的晶振,正確地設(shè)置UART的工作參數(shù),就能夠自動(dòng)產(chǎn)生所需的串行數(shù)據(jù)。使用定時(shí)/計(jì)數(shù)器1(T/C1)作為波特率發(fā)生器。將串行口設(shè)置為方式1工作狀態(tài)(10位異步收發(fā),波特率由定時(shí)器控制),使用6MHz晶振,T/C1設(shè)為自動(dòng)裝入8位計(jì)數(shù)器狀態(tài)(TMOD置為2xH),SMOD=1,TH=FFH,此時(shí)正好發(fā)生31.25K的串行通訊數(shù)據(jù),適用于MIDI協(xié)議。
               
                串口及定時(shí)/計(jì)數(shù)器初始化如下:(C語言例程,下同)
               
void                 format();
               
                   { TMOD=0x21;    //T/C1工作于8位自動(dòng)裝入狀態(tài)//
               
                           TL1=0xff; TH1=0xff ;  // T/C1常數(shù),確定波特率//
               
                            SCON=0x50 ;       //設(shè)串口工作于方式1,//
               
                         PCON=0x80 ;         //相當(dāng)于SMOD=1;//
               
                         TR1=1;            //T/C1開始計(jì)數(shù)//
               
                }
               
               
MIDI協(xié)議中,每一次音符操作,命令包含3個(gè)字節(jié),連續(xù)發(fā)送,依次為 “命令+通道號(hào)”,“音符”,“力度”。命令的第一個(gè)字節(jié)的最高位為1,通道為0-16,第二字節(jié)最高為位0,音符號(hào)為0-127,第三字節(jié)最高位為0,力度0-127。
               
                發(fā)送一個(gè)音符命令:(參數(shù) cc,kk,vv分別為“命令+通道號(hào)”,“音符號(hào)”,“力度”)
               
               
void                 send(uchar cc,kk,vv)
               
{                   TR1=1;      //開計(jì)數(shù)器//
               
                 SBUF=cc;    //寫入寄存器//
               
                 while(TI==0); //等待發(fā)送結(jié)束//
               
                 TI=0;        //清發(fā)送標(biāo)志//
               
   SBUF=kk;
               
                 while(TI==0);
               
   TI=0;
               
   SBUF=vv;
               
                 while(TI==0);
               
                   TI=0;
               
                TR1=0;
               
}
               
               
MIDI命令簡表
               
                                
命令代碼
                                
cc
命令說明
                                數(shù)據(jù)kk含義及說明
                                數(shù)據(jù)vv含義及說明
8+                                 通道號(hào)
關(guān)閉音符
                                  對(duì)應(yīng)的MIDI音符0127
                                關(guān)閉音符的速度值
9+                                 通道號(hào)     
開啟音符
                                對(duì)應(yīng)的MIDI音符0-127
                                    壓下琴鍵的速度值(力度)
A+                                 通道號(hào)
觸后壓力
                                  對(duì)應(yīng)的MIDI音符0127
                                    對(duì)應(yīng)音符的觸后壓力值
B+                                 通道號(hào)
控制器
                                  控制器號(hào)077
                                
  777F為通道模式信息
                                    控制器值
C+                                 通道號(hào)
音色切換
                                  音色號(hào) 0127
                                    無該字節(jié)數(shù)據(jù)
D+                                 通道號(hào)
通道壓力
該通道全部鍵盤的觸后壓力                                
                                    無該字節(jié)數(shù)據(jù)
E+                                 通道號(hào)
彎音輪
彎音輪低位數(shù)據(jù)
                                彎音輪高位數(shù)據(jù)
F
                                系統(tǒng)普通信息、實(shí)時(shí)信息、及高級(jí)信息代碼
                                忽略
                                忽略
               
               
                前面已經(jīng)介紹過,MIDI信號(hào)是單向的數(shù)據(jù)流,輸出設(shè)備不管接收設(shè)備的狀態(tài),只是連續(xù)發(fā)出命令,                因此,MIDI鍵盤作為發(fā)送設(shè)備,只需輸出,對(duì)于51單片機(jī),其TXD即可作為MIDI信號(hào)的輸出口,若不用轉(zhuǎn)發(fā)別的MIDI設(shè)備信號(hào),RXD實(shí)際上就沒必要使用了。用51單片機(jī)的TXD腳,與聲卡的MIDI-IN腳(15腳)相連,就可以很好的產(chǎn)生所需的MIDI信號(hào),驅(qū)動(dòng)聲卡。這種連接方式并不是 MIDI協(xié)議中規(guī)定的標(biāo)準(zhǔn)的驅(qū)動(dòng)方式,在MIDI協(xié)議中,采用了隔離傳輸?shù)姆绞剑瑑蓚(gè)設(shè)備不是共地的,本文介紹的電路,由于要從MIDI接口取電,必然形成共地的連接方式,這樣,直接用單片機(jī)的高電平輸出                 5mA電流,低電平電流接近0,就能工作,但由于不是隔離傳輸,傳輸距離不能太長。
               
                三、控制板電路                     
               
                電路原理圖如3所示。采用51系列單片機(jī)最小系統(tǒng)的標(biāo)準(zhǔn)電路,聲卡                MIDI接口的1,4腳為供電輸出,分別為                VCC、                 GND ; 15腳為MIDI-IN,接單片機(jī)串行輸出腳 TXD。單片機(jī)的P0,P2口用來掃描鍵盤,可提供8x8的鍵盤掃描能力。絕大多數(shù)的電子琴的鍵數(shù)小于64,這樣的安排夠用了。其他剩余的各腳,可用作工作參數(shù)預(yù)置,用來設(shè)置鍵值初值及所占MIDI通道號(hào)等。單片機(jī)采用89c51或其他兼容單片機(jī),包括89s51,89f51,8751,97c51等。上拉電阻排選10kΩ,                 MIDI接口插頭是15針的D型連接器,一般都標(biāo)出了其引腳標(biāo)號(hào),按標(biāo)號(hào)連接即可。給出的原理圖及印制版圖,都是完整的,可直接使用。
               
               
                 
               
3  單片機(jī)MIDI控制器電路圖
               
               
                    
               
                圖                 4  控制部分印制板圖                  采用89c51或兼容單片機(jī)
               
                四、用玩具琴鍵盤改裝MIDI鍵盤
               
                                 要分辨數(shù)十個(gè)按鍵的狀態(tài),最簡單經(jīng)濟(jì)的方式就是采用矩陣式掃描鍵盤,其電路原理圖如圖5所示
               
               
               
                圖5 鍵盤的電路原理圖
               
               
                鍵盤以掃描方式工作,具體過程:
               
                先由P0口發(fā)出段選通,每次選通一段,相應(yīng)段選線被置為低電平,讀P2口,被壓下的鍵因與段選線接通,相應(yīng)的端口輸入為低電平,這樣就完成了一段鍵盤(8個(gè)鍵)的狀態(tài)讀入過程,做8次循環(huán),每次P0口的段掃移位一次,就完成了64個(gè)鍵的狀態(tài)讀入。由于樂器演奏時(shí)經(jīng)常會(huì)有多個(gè)鍵同時(shí)壓下的狀態(tài),若不加處理,                                則可能出現(xiàn)幾個(gè)段選通過按鍵短接在一起的情況,從而互相干擾導(dǎo)致邏輯不清,因此,在每個(gè)按鍵上串接二極管,用來阻隔無效的段選信號(hào)(高電平),使其不起作用,                這樣就可完全分辨出每個(gè)鍵的狀態(tài),                而不會(huì)產(chǎn)生混亂。
               
                                樂器鍵盤的掃描與響應(yīng)方式也有自己的特點(diǎn),在掃描到鍵盤值后,與前一次的鍵盤狀態(tài)比較,如不變,則不響應(yīng),有變化,則判斷是被壓下還是抬起,發(fā)出相應(yīng)的MIDI命令,并紀(jì)錄新的狀態(tài)。
               
                掃描8X8鍵盤的程序如下,程序中的key_number[ i]是全局?jǐn)?shù)組,                用來存貯按鍵狀態(tài),addition是全局變量,是設(shè)定該鍵盤第一個(gè)按鍵對(duì)應(yīng)的MIDI音符的鍵值,全局?jǐn)?shù)組和全局變量要在主程序中定義,程序中調(diào)用了前面給出的send(cc,kk,vv)函數(shù):        
  1.       void scan_key()

  2.       { uchar i,j,k,r,mmm,xu;  

  3. k=0xfe;             // k值為段選輸出初值,第一位為0

  4.        for (i=0;i<8;i++)

  5. {  P2=0xff;

  6.           P0=k;             //輸出段選值

  7.            k=(k<<1)+1;        //段選標(biāo)志左移,末位補(bǔ)1,為下一循環(huán)準(zhǔn)備

  8.           mmm=0x01;        // 設(shè)按鍵查詢指針初值

  9.            r=P2;             // 讀入鍵值

  10.          P0=0xff;             //關(guān)閉段選輸出

  11.            xu=r^key_number[i];         //查詢鍵值是否改變,xu 為1的位為產(chǎn)生變化的按鍵

  12.            key_number[i]=r;        //新的鍵值存入數(shù)組

  13.       for (j=0;j<8;j++)           //作8次循環(huán), 判斷具體產(chǎn)生變化的鍵

  14. { if((xu&mmm)!=0)           //用指針選擇被測的鍵

  15.         {  if ((r&mmm)!=0)   //判斷最終情況,以確定是被壓下還是釋放

  16.               {send(0x80+chnal,i*8+j+addition,40);}  //關(guān)閉聲音,鍵值=i*8+j+addition

  17.              else{send(0x90+chnal,i*8+j+addition,127);}  //開始發(fā)聲

  18.                }

  19.     mmm=mmm<<1;            //指針左移, 判斷下個(gè)鍵

  20.    }

  21. }

  22. }
復(fù)制代碼

MIDI協(xié)議中規(guī)定,全部的音符共128個(gè),中央C音符對(duì)應(yīng)的鍵值為60,為適合不同鍵數(shù)的鍵盤,必須為掃描到的鍵值加上相應(yīng)的初值,使得第一個(gè)鍵正是所需的音符,程序中的變量addition                就是這個(gè)初值。
               
                                主程序的工作過程是上電復(fù)位后初始化,隨后循環(huán)調(diào)用鍵盤掃描程序,在本人提供的程序中還加進(jìn)了諸如移調(diào),通道號(hào)設(shè)置,初始值設(shè)定等功能,全部用單片機(jī)剩余的I/O口對(duì)地短路來設(shè)定,以適合各種不同的鍵盤,詳見程序文件。將程序用C51編譯軟件編譯成執(zhí)行代碼,燒錄至51單片機(jī)芯片,和外圍器件一起裝到印制板上,就制成了MIDI鍵盤控制板。
               
                本人利用上述控制板,分別用玩具琴和低檔電子琴的鍵盤,改裝了多個(gè)MIDI鍵盤,均獲成功,受到好評(píng),現(xiàn)一一介紹:
               
1.鋼片琴:老式的阻容震蕩式電子琴,等效電路如圖6,它是用按鍵選通不同阻值的電阻,                                改變振蕩器的頻率來產(chǎn)生音符的,當(dāng)兩鍵同時(shí)壓下,將導(dǎo)致電阻并聯(lián),參數(shù)混亂,還有的采用串聯(lián)電阻網(wǎng)絡(luò),多鍵壓下時(shí),只有與振蕩電路最近的一個(gè)電阻有效,                而其他的被短路,                                因此都不能支持復(fù)音,只能單鍵演奏,不能直接改成掃描式鍵盤,須作較大改動(dòng)。
               
                改裝時(shí),去除所有的振蕩電阻,將鋼片電極剪為數(shù)段,每8個(gè)鍵為一段,每段接一位段掃,從左至右對(duì)應(yīng)單片機(jī)P0口,從低到高。每段按鍵都由8個(gè)鍵組成,經(jīng)二極管(1n4148)按順序?qū)⒚慷蜗鄳?yīng)的按鍵連在一起,接入一路位掃(P2),最后一段不足8個(gè)可空著,共8路,最終電路參考圖7。
               
               
6                 鋼片琴改裝示意
               
               

               
                  7                  改裝后的玩具琴鍵盤電路圖                P0P2接在控制板相應(yīng)的連線上
               
               
2.掃描式電子琴:這類電子琴已經(jīng)做好了鍵盤的電路板,多數(shù)的琴線路與圖7類似,只是鍵數(shù)不等,斷開原來的電路,按照?qǐng)D7                將P0,P2連接到控制板上即可。               
               
                                注意有些型號(hào)的電子琴掃描電路的工作邏輯不一樣,為充分利用其線路板,可通過修改掃描程序來實(shí)現(xiàn)硬件最少的改變,這需要能充分分析原琴的電路,并弄懂鍵盤掃描原理,有編程能力的人做,否則,須對(duì)原板的線路按照?qǐng)D7                                電路改裝,用本人的程序來實(shí)現(xiàn)。有能力編程的讀者,對(duì)原程序稍加修改,把鍵值換算正確,就可以適合各種掃描式鍵盤,直接與控制板連上,而不需要對(duì)鍵盤硬件做改動(dòng)。這些琴大致有兩種情況:
               
                一種情況是每段的按鍵少于8個(gè),這種情況下,在換算鍵值時(shí),按照具體情況,把算式中的常數(shù)改一下即可;
               
                鍵值=段號(hào)x常數(shù)+鍵號(hào)+addition
               
                另一種是二極管的方向相反,                這種情況下,掃描方式可不變,                                但按鍵的排列會(huì)產(chǎn)生變化,連接控制板的段選和位選接線對(duì)調(diào),把計(jì)算鍵值的算式改變,同樣可不用改動(dòng)鍵盤硬件。
               
                鍵值=鍵號(hào)x常數(shù)+段號(hào)+addition
               
                上兩個(gè)算式中的“段號(hào)”“鍵號(hào)”分別是掃描程序中規(guī)定的變量i                和j                 。
               
                改裝好的MIDI鍵盤,直接插到計(jì)算機(jī)聲卡的                MIDI/GAME接口即可,安裝好支持MIDI鍵盤輸入的音序軟件,你的電腦就變成了一臺(tái)集演奏,制作于一身的MIDI音樂制作設(shè)備了。使用模擬電子琴軟件,就是一臺(tái)電子琴,而且可以直接利用電腦的強(qiáng)大功能進(jìn)行錄音,重放,或生成MIDI格式文件,                這是普通電子琴做不到的功能。如果使用音樂制作軟件,                還可以進(jìn)行后期制作,在不同的MIDI通道中用不同的音色演奏,編輯合成后可達(dá)到小型樂隊(duì)的效果。
               
                在這里,列出一些MIDI軟件及其官方網(wǎng)站,可去下載軟件的演示版,利用搜索引擎也可以找到其他的下載站點(diǎn),它們都是本人試用過的,支持                 MIDI 鍵盤的音序軟件。
               
                MidiRunner    英文軟件,模擬電子琴
                               
                HappyEO                      國產(chǎn)軟件,模擬電子琴,有自動(dòng)伴奏風(fēng)格組,界面漂亮
               
                              http://www.happyeo.com
               
                Cakewalk     音樂編輯制作軟件,功能強(qiáng)大
               
                http://www.cakewalk.com
               
BBW                      自動(dòng)伴奏,功能強(qiáng)大
               
                http://www.pgmusic.com/
               
                還有其他一些電子琴模擬軟件,從互聯(lián)網(wǎng)上可以查到,                只要支持MIDI口輸入,都可以使用。軟件安裝沒有特別要求,需注意的是,電腦聲卡的驅(qū)動(dòng)程序要裝好,軟件使用時(shí),                要設(shè)置允許外部MIDI設(shè)備輸入,輸入口選擇為                “MPU401”,                輸出口要選擇能讓聲卡演奏MIDI的選項(xiàng),因聲卡不同,名稱各異,如果在使用軟波表時(shí)有延遲,可選擇頻率合成輸出。
               
                在本文中給出了MIDI命令簡表,表中所列的控制器(cc=B+通道號(hào),kk,vv),音色切換和彎音輪命令,也是MIDI中也很常用的命令,其中有開關(guān)量,                也有模擬量,有興趣的讀者,                可以利用芯片的剩余接口,擴(kuò)展測量能力,給你的MIDI鍵盤增加更多的功能。
               
                本文給出的程序,沒有MIDI轉(zhuǎn)發(fā)功能,所以只能發(fā)出在本鍵盤上演奏的MIDI命令,有興趣的讀者可以自編程序,加入轉(zhuǎn)發(fā)部分,就可以把幾個(gè)鍵盤串接在一起,利用不同的MIDI通道                共用一臺(tái)電腦演奏。給本控制器單獨(dú)提供5V電源后,還可以接入其他的MIDI設(shè)備,比如具有MIDI輸入口的電子琴或合成器,變成雙鍵盤,使其發(fā)揮更大的效能。
                                配合本文電路的單片機(jī)源程序和已編譯的16進(jìn)制代碼文件,隨本刊光盤提供,也可到d-originality.51.net                網(wǎng)站的資料區(qū)免費(fèi)下載,如果有燒寫51系列芯片的設(shè)備,就可以自行編程。
        
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:111581 發(fā)表于 2016-3-31 13:45 | 只看該作者
樓主可以留下聯(lián)系方式嗎  我最近在做基于單片機(jī)的MIDI鍵盤控制器的設(shè)計(jì),有些問題想咨詢一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:160690 發(fā)表于 2018-1-5 16:13 | 只看該作者
樓主好厲害。一直再找midi相關(guān)的資料,你這篇文章寫得非常詳細(xì),感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:485956 發(fā)表于 2019-3-8 00:24 | 只看該作者
樓主厲害,收藏了,慢慢消化
回復(fù)

使用道具 舉報(bào)

5#
ID:611710 發(fā)表于 2019-9-15 16:25 來自觸屏版 | 只看該作者
實(shí)在麻煩啦 謝謝
回復(fù)

使用道具 舉報(bào)

6#
ID:703199 發(fā)表于 2020-3-5 22:23 | 只看該作者
難得好貼
回復(fù)

使用道具 舉報(bào)

7#
ID:881862 發(fā)表于 2021-1-31 15:22 | 只看該作者
好貼,就是要有源代碼就更好了
回復(fù)

使用道具 舉報(bào)

8#
ID:1039438 發(fā)表于 2022-11-15 15:45 | 只看該作者
如果能提供鍵值碼,就不用去其它地方下載了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表