MIDI是電子樂器的語言,隨著MIDI的誕生,數(shù)字化電子樂器已經(jīng)越來越多,MIDI的應用也越來越普遍,在電子樂隊演奏,電子音樂制作等各個領域,發(fā)揮著越來越大的作用。隨著計算機技術(shù)的發(fā)展,聲卡已經(jīng)成為普通計算機的標準設備,通過聲卡的MIDI接口,可以連接各種各樣的MIDI設備。連上專供輸入的MIDI鍵盤,再配上相應的軟件,計算機就可以完成電子琴的功能,甚至可以進行電子音樂的制作。由于 MIDI自身的特點,它形成的音樂易于進行后期制作,越來越為廣大音樂工作者所喜愛,而MIDI鍵盤作為輸入最有效的工具,也越來越普及。
有些計算機音序軟件支持用電腦鍵盤模擬琴鍵,可通過計算機鍵盤將音符輸入計算機,有愛好者就用電腦鍵盤的控制芯片改裝玩具電子琴,將其并接在計算機鍵盤上,稱之為電腦琴,但這種控制芯片本身并不是為演奏音樂開發(fā)的,單音演奏還可以,在多個按鍵壓下時會出錯。本文將介紹如何用通用單片機實現(xiàn)MIDI鍵盤功能,并改裝各種電子琴,與計算機連接,從而實現(xiàn)通過MIDI接口,把電腦變成真正的,可支持復音的電子琴。
一、MIDI信號及聲卡的MIDI接口
MIDI 是一種異步串行通訊協(xié)議,其傳輸速率為31.25 K baud (每秒31250位),每個字節(jié)包括10 位,1個起始位,8個數(shù)據(jù)位,1個停止位,每個音符的開(或關)命令有3個字節(jié),經(jīng)計算,不到1mS即可傳輸一個音符的開關命令。MIDI的數(shù)據(jù)流是單向的,不進行應答,設備發(fā)送音樂信息時,不管接收設備的狀態(tài),而接收設備收到的信息,經(jīng)校驗正確的則執(zhí)行,錯誤的就忽略——這樣規(guī)定是由音樂本身的特點決定的,可以丟掉音符,但不能搞錯節(jié)拍,實時性最優(yōu)先。從物理層面上看,MIDI信號是電流傳輸?shù)模?mA代表邏輯“0”,0mA代表邏輯“1”。MIDI設備連接時,必須將輸出與另一設備的輸入連接。
圖1 典型的多個MIDI設備連接方式
計算機聲卡的MIDI/GAME接口是15針的D型連接器,其中與MIDI相關的有:
1 +5V +5 VDC
4 GND 地
12 MIDITXD MIDI 輸出
15 MIDIRXD MIDI 輸入
圖 2 聲卡上的 MIDI/GAME接口
二、 單片機如何產(chǎn)生MIDI信號
本節(jié)介紹如何用目前在國內(nèi)處于最主流地位的51系列單片機產(chǎn)生MIDI信號。實際上,這包含了兩層意思:1.如何產(chǎn)生符合MIDI協(xié)議的串行數(shù)據(jù)。2.接口電路。
絕大多數(shù)51系列單片機都有串行通訊控制器(UART),配合合適的晶振,正確地設置UART的工作參數(shù),就能夠自動產(chǎn)生所需的串行數(shù)據(jù)。使用定時/計數(shù)器1(T/C1)作為波特率發(fā)生器。將串行口設置為方式1工作狀態(tài)(10位異步收發(fā),波特率由定時器控制),使用6MHz晶振,T/C1設為自動裝入8位計數(shù)器狀態(tài)(TMOD置為2xH),SMOD=1,TH=FFH,此時正好發(fā)生31.25K的串行通訊數(shù)據(jù),適用于MIDI協(xié)議。
串口及定時/計數(shù)器初始化如下:(C語言例程,下同)
void format();
{TMOD=0x21;//T/C1工作于8位自動裝入狀態(tài)//
TL1=0xff; TH1=0xff ; // T/C1常數(shù),確定波特率//
SCON=0x50 ; //設串口工作于方式1,//
PCON=0x80 ; //相當于SMOD=1;//
TR1=1; //T/C1開始計數(shù)//
}
MIDI協(xié)議中,每一次音符操作,命令包含3個字節(jié),連續(xù)發(fā)送,依次為“命令+通道號”,“音符”,“力度”。命令的第一個字節(jié)的最高位為1,通道為0-16,第二字節(jié)最高為位0,音符號為0-127,第三字節(jié)最高位為0,力度0-127。
發(fā)送一個音符命令:(參數(shù)cc,kk,vv分別為“命令+通道號”,“音符號”,“力度”)
void send(uchar cc,kk,vv)
{ TR1=1; //開計數(shù)器//
SBUF=cc; //寫入寄存器//
while(TI==0); //等待發(fā)送結(jié)束//
TI=0; //清發(fā)送標志//
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+ 通道號關閉音符 對應的MIDI音符0-127關閉音符的速度值
9+ 通道號 開啟音符對應的MIDI音符0-127 壓下琴鍵的速度值(力度)
A+ 通道號觸后壓力 對應的MIDI音符0-127 對應音符的觸后壓力值
B+ 通道號控制器 控制器號0-77
77-7F為通道模式信息 控制器值
C+ 通道號音色切換 音色號 0-127 無該字節(jié)數(shù)據(jù)
D+ 通道號通道壓力 該通道全部鍵盤的觸后壓力 無該字節(jié)數(shù)據(jù)
E+ 通道號彎音輪 彎音輪低位數(shù)據(jù)彎音輪高位數(shù)據(jù)
F系統(tǒng)普通信息、實時信息、及高級信息代碼忽略忽略
前面已經(jīng)介紹過,MIDI信號是單向的數(shù)據(jù)流,輸出設備不管接收設備的狀態(tài),只是連續(xù)發(fā)出命令, 因此,MIDI鍵盤作為發(fā)送設備,只需輸出,對于51單片機,其TXD即可作為MIDI信號的輸出口,若不用轉(zhuǎn)發(fā)別的MIDI設備信號,RXD實際上就沒必要使用了。用51單片機的TXD腳,與聲卡的MIDI-IN腳(15腳)相連,就可以很好的產(chǎn)生所需的MIDI信號,驅(qū)動聲卡。這種連接方式并不是MIDI協(xié)議中規(guī)定的標準的驅(qū)動方式,在MIDI協(xié)議中,采用了隔離傳輸?shù)姆绞剑瑑蓚€設備不是共地的,本文介紹的電路,由于要從MIDI接口取電,必然形成共地的連接方式,這樣,直接用單片機的高電平輸出 5mA電流,低電平電流接近0,就能工作,但由于不是隔離傳輸,傳輸距離不能太長。
三、控制板電路
電路原理圖如3所示。采用51系列單片機最小系統(tǒng)的標準電路,聲卡 MIDI接口的1,4腳為供電輸出,分別為 VCC、GND ; 15腳為MIDI-IN,接單片機串行輸出腳TXD。單片機的P0,P2口用來掃描鍵盤,可提供8x8的鍵盤掃描能力。絕大多數(shù)的電子琴的鍵數(shù)小于64,這樣的安排夠用了。其他剩余的各腳,可用作工作參數(shù)預置,用來設置鍵值初值及所占MIDI通道號等。單片機采用89c51或其他兼容單片機,包括89s51,89f51,8751,97c51等。上拉電阻排選10kΩ, MIDI接口插頭是15針的D型連接器,一般都標出了其引腳標號,按標號連接即可。給出的原理圖及印制版圖,都是完整的,可直接使用。
圖3 單片機MIDI控制器電路圖
圖 4 控制部分印制板圖 采用89c51或兼容單片機
四、用玩具琴鍵盤改裝MIDI鍵盤
要分辨數(shù)十個按鍵的狀態(tài),最簡單經(jīng)濟的方式就是采用矩陣式掃描鍵盤,其電路原理圖如圖5所示
圖5 鍵盤的電路原理圖
鍵盤以掃描方式工作,具體過程:
先由P0口發(fā)出段選通,每次選通一段,相應段選線被置為低電平,讀P2口,被壓下的鍵因與段選線接通,相應的端口輸入為低電平,這樣就完成了一段鍵盤(8個鍵)的狀態(tài)讀入過程,做8次循環(huán),每次P0口的段掃移位一次,就完成了64個鍵的狀態(tài)讀入。由于樂器演奏時經(jīng)常會有多個鍵同時壓下的狀態(tài),若不加處理, 則可能出現(xiàn)幾個段選通過按鍵短接在一起的情況,從而互相干擾導致邏輯不清,因此,在每個按鍵上串接二極管,用來阻隔無效的段選信號(高電平),使其不起作用, 這樣就可完全分辨出每個鍵的狀態(tài), 而不會產(chǎn)生混亂。
樂器鍵盤的掃描與響應方式也有自己的特點,在掃描到鍵盤值后,與前一次的鍵盤狀態(tài)比較,如不變,則不響應,有變化,則判斷是被壓下還是抬起,發(fā)出相應的MIDI命令,并紀錄新的狀態(tài)。
掃描8X8鍵盤的程序如下,程序中的key_number[i]是全局數(shù)組, 用來存貯按鍵狀態(tài),addition是全局變量,是設定該鍵盤第一個按鍵對應的MIDI音符的鍵值,全局數(shù)組和全局變量要在主程序中定義,程序中調(diào)用了前面給出的send(cc,kk,vv)函數(shù):
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,為下一循環(huán)準備
mmm=0x01; // 設按鍵查詢指針初值
r=P2; // 讀入鍵值
P0=0xff; //關閉段選輸出
xu=r^key_number[i]; //查詢鍵值是否改變,xu 為1的位為產(chǎn)生變化的按鍵
key_number[i]=r; //新的鍵值存入數(shù)組
for (j=0;j《8;j++) //作8次循環(huán), 判斷具體產(chǎn)生變化的鍵
{ 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);} //開始發(fā)聲
}
mmm=mmm《《1; //指針左移, 判斷下個鍵
}
}
}
MIDI協(xié)議中規(guī)定,全部的音符共128個,中央C音符對應的鍵值為60,為適合不同鍵數(shù)的鍵盤,必須為掃描到的鍵值加上相應的初值,使得第一個鍵正是所需的音符,程序中的變量addition 就是這個初值。
主程序的工作過程是上電復位后初始化,隨后循環(huán)調(diào)用鍵盤掃描程序,在本人提供的程序中還加進了諸如移調(diào),通道號設置,初始值設定等功能,全部用單片機剩余的I/O口對地短路來設定,以適合各種不同的鍵盤,詳見程序文件。將程序用C51編譯軟件編譯成執(zhí)行代碼,燒錄至51單片機芯片,和外圍器件一起裝到印制板上,就制成了MIDI鍵盤控制板。
本人利用上述控制板,分別用玩具琴和低檔電子琴的鍵盤,改裝了多個MIDI鍵盤,均獲成功,受到好評,現(xiàn)一一介紹:
1.鋼片琴:老式的阻容震蕩式電子琴,等效電路如圖6,它是用按鍵選通不同阻值的電阻, 改變振蕩器的頻率來產(chǎn)生音符的,當兩鍵同時壓下,將導致電阻并聯(lián),參數(shù)混亂,還有的采用串聯(lián)電阻網(wǎng)絡,多鍵壓下時,只有與振蕩電路最近的一個電阻有效, 而其他的被短路, 因此都不能支持復音,只能單鍵演奏,不能直接改成掃描式鍵盤,須作較大改動。
改裝時,去除所有的振蕩電阻,將鋼片電極剪為數(shù)段,每8個鍵為一段,每段接一位段掃,從左至右對應單片機P0口,從低到高。每段按鍵都由8個鍵組成,經(jīng)二極管(1n4148)按順序?qū)⒚慷蜗鄳陌存I連在一起,接入一路位掃(P2),最后一段不足8個可空著,共8路,最終電路參考圖7。
圖6 鋼片琴改裝示意
圖7 改裝后的玩具琴鍵盤電路圖 ,P0與P2接在控制板相應的連線上
2.掃描式電子琴:這類電子琴已經(jīng)做好了鍵盤的電路板,多數(shù)的琴線路與圖7類似,只是鍵數(shù)不等,斷開原來的電路,按照圖7 將P0,P2連接到控制板上即可。
注意有些型號的電子琴掃描電路的工作邏輯不一樣,為充分利用其線路板,可通過修改掃描程序來實現(xiàn)硬件最少的改變,這需要能充分分析原琴的電路,并弄懂鍵盤掃描原理,有編程能力的人做,否則,須對原板的線路按照圖7 電路改裝,用本人的程序來實現(xiàn)。有能力編程的讀者,對原程序稍加修改,把鍵值換算正確,就可以適合各種掃描式鍵盤,直接與控制板連上,而不需要對鍵盤硬件做改動。這些琴大致有兩種情況:
一種情況是每段的按鍵少于8個,這種情況下,在換算鍵值時,按照具體情況,把算式中的常數(shù)改一下即可;
鍵值=段號x常數(shù)+鍵號+addition
另一種是二極管的方向相反, 這種情況下,掃描方式可不變, 但按鍵的排列會產(chǎn)生變化,連接控制板的段選和位選接線對調(diào),把計算鍵值的算式改變,同樣可不用改動鍵盤硬件。
鍵值=鍵號x常數(shù)+段號+addition
上兩個算式中的“段號”“鍵號”分別是掃描程序中規(guī)定的變量i 和j 。
改裝好的MIDI鍵盤,直接插到計算機聲卡的 MIDI/GAME接口即可,安裝好支持MIDI鍵盤輸入的音序軟件,你的電腦就變成了一臺集演奏,制作于一身的MIDI音樂制作設備了。使用模擬電子琴軟件,就是一臺電子琴,而且可以直接利用電腦的強大功能進行錄音,重放,或生成MIDI格式文件, 這是普通電子琴做不到的功能。如果使用音樂制作軟件, 還可以進行后期制作,在不同的MIDI通道中用不同的音色演奏,編輯合成后可達到小型樂隊的效果。
在這里,列出一些MIDI軟件及其官方網(wǎng)站,可去下載軟件的演示版,利用搜索引擎也可以找到其他的下載站點,它們都是本人試用過的,支持 MIDI 鍵盤的音序軟件。
MidiRunner 英文軟件,模擬電子琴
http://web.tiscali.it/midirunner/midirunner.htm
HappyEO 國產(chǎn)軟件,模擬電子琴,有自動伴奏風格組,界面漂亮
http://www.happyeo.com
Cakewalk 音樂編輯制作軟件,功能強大
http://www.cakewalk.com
BBW 自動伴奏,功能強大
http://www.pgmusic.com/
還有其他一些電子琴模擬軟件,從互聯(lián)網(wǎng)上可以查到, 只要支持MIDI口輸入,都可以使用。軟件安裝沒有特別要求,需注意的是,電腦聲卡的驅(qū)動程序要裝好,軟件使用時, 要設置允許外部MIDI設備輸入,輸入口選擇為 “MPU401”,輸出口要選擇能讓聲卡演奏MIDI的選項,因聲卡不同,名稱各異,如果在使用軟波表時有延遲,可選擇頻率合成輸出。
在本文中給出了MIDI命令簡表,表中所列的控制器(cc=B+通道號,kk,vv),音色切換和彎音輪命令,也是MIDI中也很常用的命令,其中有開關量, 也有模擬量,有興趣的讀者, 可以利用芯片的剩余接口,擴展測量能力,給你的MIDI鍵盤增加更多的功能。
本文給出的程序,沒有MIDI轉(zhuǎn)發(fā)功能,所以只能發(fā)出在本鍵盤上演奏的MIDI命令,有興趣的讀者可以自編程序,加入轉(zhuǎn)發(fā)部分,就可以把幾個鍵盤串接在一起,利用不同的MIDI通道 共用一臺電腦演奏。給本控制器單獨提供5V電源后,還可以接入其他的MIDI設備,比如具有MIDI輸入口的電子琴或合成器,變成雙鍵盤,使其發(fā)揮更大的效能。
配合本文電路的單片機源程序和已編譯的16進制代碼文件,隨本刊光盤提供,也可到d-originality.51.net 網(wǎng)站的資料區(qū)免費下載,如果有燒寫51系列芯片的設備,就可以自行編程。
-
單片機
+關注
關注
6022文章
44375瀏覽量
628282 -
電子琴
+關注
關注
4文章
150瀏覽量
30328 -
MIDI
+關注
關注
0文章
75瀏覽量
15555
發(fā)布評論請先 登錄
相關推薦
評論