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設備連接時,必須將輸出與另一設備的輸入連接。
midi_01.JPG (10.54 KB, 下載次數: 238)
下載附件
2015-12-25 03:29 上傳
圖1 典型的多個MIDI設備連接方式
計算機聲卡的MIDI/GAME接口是15針的D型連接器,其中與MIDI相關的有: 1 +5V +5 VDC 4 GND 地 12 MIDITXD MIDI 輸出 15 MIDIRXD MIDI 輸入
midi_02.JPG (20.57 KB, 下載次數: 216)
下載附件
2015-12-25 03:29 上傳
圖 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命令簡表
前面已經介紹過,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型連接器,一般都標出了其引腳標號,按標號連接即可。給出的原理圖及印制版圖,都是完整的,可直接使用。
midi_03.JPG (19.01 KB, 下載次數: 218)
下載附件
2015-12-25 03:29 上傳
圖3 單片機MIDI控制器電路圖
midi_04.JPG (40.28 KB, 下載次數: 225)
下載附件
2015-12-25 03:29 上傳
圖 4 控制部分印制板圖 采用89c51或兼容單片機 四、用玩具琴鍵盤改裝MIDI鍵盤 要分辨數十個按鍵的狀態,最簡單經濟的方式就是采用矩陣式掃描鍵盤,其電路原理圖如圖5所示
midi_05.JPG (49.15 KB, 下載次數: 229)
下載附件
2015-12-25 03:29 上傳
圖5 鍵盤的電路原理圖
鍵盤以掃描方式工作,具體過程: 先由P0口發出段選通,每次選通一段,相應段選線被置為低電平,讀P2口,被壓下的鍵因與段選線接通,相應的端口輸入為低電平,這樣就完成了一段鍵盤(8個鍵)的狀態讀入過程,做8次循環,每次P0口的段掃移位一次,就完成了64個鍵的狀態讀入。由于樂器演奏時經常會有多個鍵同時壓下的狀態,若不加處理, 則可能出現幾個段選通過按鍵短接在一起的情況,從而互相干擾導致邏輯不清,因此,在每個按鍵上串接二極管,用來阻隔無效的段選信號(高電平),使其不起作用, 這樣就可完全分辨出每個鍵的狀態, 而不會產生混亂。 樂器鍵盤的掃描與響應方式也有自己的特點,在掃描到鍵盤值后,與前一次的鍵盤狀態比較,如不變,則不響應,有變化,則判斷是被壓下還是抬起,發出相應的MIDI命令,并紀錄新的狀態。 掃描8X8鍵盤的程序如下,程序中的key_number[ i]是全局數組, 用來存貯按鍵狀態,addition是全局變量,是設定該鍵盤第一個按鍵對應的MIDI音符的鍵值,全局數組和全局變量要在主程序中定義,程序中調用了前面給出的send(cc,kk,vv)函數:
- void scan_key()
- { uchar i,j,k,r,mmm,xu;
- k=0xfe; // k值為段選輸出初值,第一位為0
- for (i=0;i<8;i++)
- { P2=0xff;
- P0=k; //輸出段選值
- k=(k<<1)+1; //段選標志左移,末位補1,為下一循環準備
- mmm=0x01; // 設按鍵查詢指針初值
- r=P2; // 讀入鍵值
- P0=0xff; //關閉段選輸出
- xu=r^key_number[i]; //查詢鍵值是否改變,xu 為1的位為產生變化的按鍵
- key_number[i]=r; //新的鍵值存入數組
- for (j=0;j<8;j++) //作8次循環, 判斷具體產生變化的鍵
- { if((xu&mmm)!=0) //用指針選擇被測的鍵
- { if ((r&mmm)!=0) //判斷最終情況,以確定是被壓下還是釋放
- {send(0x80+chnal,i*8+j+addition,40);} //關閉聲音,鍵值=i*8+j+addition
- else{send(0x90+chnal,i*8+j+addition,127);} //開始發聲
- }
- mmm=mmm<<1; //指針左移, 判斷下個鍵
- }
- }
- }
復制代碼
MIDI協議中規定,全部的音符共128個,中央C音符對應的鍵值為60,為適合不同鍵數的鍵盤,必須為掃描到的鍵值加上相應的初值,使得第一個鍵正是所需的音符,程序中的變量addition 就是這個初值。 主程序的工作過程是上電復位后初始化,隨后循環調用鍵盤掃描程序,在本人提供的程序中還加進了諸如移調,通道號設置,初始值設定等功能,全部用單片機剩余的I/O口對地短路來設定,以適合各種不同的鍵盤,詳見程序文件。將程序用C51編譯軟件編譯成執行代碼,燒錄至51單片機芯片,和外圍器件一起裝到印制板上,就制成了MIDI鍵盤控制板。 本人利用上述控制板,分別用玩具琴和低檔電子琴的鍵盤,改裝了多個MIDI鍵盤,均獲成功,受到好評,現一一介紹: 1.鋼片琴:老式的阻容震蕩式電子琴,等效電路如圖6,它是用按鍵選通不同阻值的電阻, 改變振蕩器的頻率來產生音符的,當兩鍵同時壓下,將導致電阻并聯,參數混亂,還有的采用串聯電阻網絡,多鍵壓下時,只有與振蕩電路最近的一個電阻有效, 而其他的被短路, 因此都不能支持復音,只能單鍵演奏,不能直接改成掃描式鍵盤,須作較大改動。 改裝時,去除所有的振蕩電阻,將鋼片電極剪為數段,每8個鍵為一段,每段接一位段掃,從左至右對應單片機P0口,從低到高。每段按鍵都由8個鍵組成,經二極管(1n4148)按順序將每段相應的按鍵連在一起,接入一路位掃(P2),最后一段不足8個可空著,共8路,最終電路參考圖7。
midi_06.JPG (18.22 KB, 下載次數: 226)
下載附件
2015-12-25 03:29 上傳
圖6 鋼片琴改裝示意
midi_07.JPG (18.56 KB, 下載次數: 229)
下載附件
2015-12-25 03:29 上傳
圖7 改裝后的玩具琴鍵盤電路圖 ,P0與P2接在控制板相應的連線上
2.掃描式電子琴:這類電子琴已經做好了鍵盤的電路板,多數的琴線路與圖7類似,只是鍵數不等,斷開原來的電路,按照圖7 將P0,P2連接到控制板上即可。 注意有些型號的電子琴掃描電路的工作邏輯不一樣,為充分利用其線路板,可通過修改掃描程序來實現硬件最少的改變,這需要能充分分析原琴的電路,并弄懂鍵盤掃描原理,有編程能力的人做,否則,須對原板的線路按照圖7 電路改裝,用本人的程序來實現。有能力編程的讀者,對原程序稍加修改,把鍵值換算正確,就可以適合各種掃描式鍵盤,直接與控制板連上,而不需要對鍵盤硬件做改動。這些琴大致有兩種情況: 一種情況是每段的按鍵少于8個,這種情況下,在換算鍵值時,按照具體情況,把算式中的常數改一下即可; 鍵值=段號x常數+鍵號+addition 另一種是二極管的方向相反, 這種情況下,掃描方式可不變, 但按鍵的排列會產生變化,連接控制板的段選和位選接線對調,把計算鍵值的算式改變,同樣可不用改動鍵盤硬件。 鍵值=鍵號x常數+段號+addition 上兩個算式中的“段號”“鍵號”分別是掃描程序中規定的變量i 和j 。 改裝好的MIDI鍵盤,直接插到計算機聲卡的 MIDI/GAME接口即可,安裝好支持MIDI鍵盤輸入的音序軟件,你的電腦就變成了一臺集演奏,制作于一身的MIDI音樂制作設備了。使用模擬電子琴軟件,就是一臺電子琴,而且可以直接利用電腦的強大功能進行錄音,重放,或生成MIDI格式文件, 這是普通電子琴做不到的功能。如果使用音樂制作軟件, 還可以進行后期制作,在不同的MIDI通道中用不同的音色演奏,編輯合成后可達到小型樂隊的效果。 在這里,列出一些MIDI軟件及其官方網站,可去下載軟件的演示版,利用搜索引擎也可以找到其他的下載站點,它們都是本人試用過的,支持 MIDI 鍵盤的音序軟件。 MidiRunner 英文軟件,模擬電子琴 HappyEO 國產軟件,模擬電子琴,有自動伴奏風格組,界面漂亮 Cakewalk 音樂編輯制作軟件,功能強大 BBW 自動伴奏,功能強大 還有其他一些電子琴模擬軟件,從互聯網上可以查到, 只要支持MIDI口輸入,都可以使用。軟件安裝沒有特別要求,需注意的是,電腦聲卡的驅動程序要裝好,軟件使用時, 要設置允許外部MIDI設備輸入,輸入口選擇為 “MPU401”, 輸出口要選擇能讓聲卡演奏MIDI的選項,因聲卡不同,名稱各異,如果在使用軟波表時有延遲,可選擇頻率合成輸出。 在本文中給出了MIDI命令簡表,表中所列的控制器(cc=B+通道號,kk,vv),音色切換和彎音輪命令,也是MIDI中也很常用的命令,其中有開關量, 也有模擬量,有興趣的讀者, 可以利用芯片的剩余接口,擴展測量能力,給你的MIDI鍵盤增加更多的功能。 本文給出的程序,沒有MIDI轉發功能,所以只能發出在本鍵盤上演奏的MIDI命令,有興趣的讀者可以自編程序,加入轉發部分,就可以把幾個鍵盤串接在一起,利用不同的MIDI通道 共用一臺電腦演奏。給本控制器單獨提供5V電源后,還可以接入其他的MIDI設備,比如具有MIDI輸入口的電子琴或合成器,變成雙鍵盤,使其發揮更大的效能。 配合本文電路的單片機源程序和已編譯的16 進制代碼文件,隨本刊光盤提供,也可到d-originality.51.net 網站的資料區免費下載,如果有燒寫51 系列芯片的設備,就可以自行編程。
|