久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30572|回復: 7
打印 上一主題 下一主題
收起左側

用通用單片機制作MIDI鍵盤

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

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

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

  10.          P0=0xff;             //關閉段選輸出

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

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

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

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

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

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

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

  18.                }

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

  20.    }

  21. }

  22. }
復制代碼

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:611710 發表于 2019-9-15 16:25 來自手機 | 只看該作者
實在麻煩啦 謝謝
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品黄色 | 欧美激情一区二区三级高清视频 | 国产欧美日韩一区 | 久久福利网站 | 亚洲三级av | 91久久国产综合久久 | 久久久久久久久99 | 中文字幕精品一区二区三区精品 | 91亚洲精华国产 | 中文字幕精品一区二区三区精品 | 欧美日韩一区二区三区四区 | 国产精品视频在线免费观看 | 日韩免费1区二区电影 | 久久美女网 | 黄色大片视频 | 久久精品99| av先锋资源 | 成人毛片网站 | 欧美一级久久 | 成人免费视频一区二区 | 一区二区三区欧美 | 国产精品久久久久久久一区探花 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 中文字幕久久精品 | 久久精品免费观看 | 高清国产午夜精品久久久久久 | 国产精品亚洲综合 | 麻豆视频国产在线观看 | 国产一区二区久久 | www.亚洲.com | 国产在线拍偷自揄拍视频 | 影音先锋成人资源 | 久久久精品网 | 成年人网站在线观看视频 | 性色av一区 | 我爱操 | 久久伊| 日韩一区二区在线免费观看 | 日韩av一区二区在线观看 | 亚洲精品一区二区在线观看 | 亚洲经典一区 |