|
DIY制作MIDI腳踏控制器
MIDI控制器,可以用來控制支持MIDI協(xié)議的軟件效果器,如guitar rig。MIDI控制器和鍵盤一樣可以控制guitar rig,但是鍵盤無法在后臺(tái)對(duì)guitar rig 進(jìn)行控制。而midi協(xié)議的控制器不受影響 ,不管軟件是在前臺(tái)運(yùn)行還是后臺(tái)運(yùn)行都可以接受到MIDI信號(hào)的控制。
先說調(diào)試過程中遇到的問題:
1.guitar rig 軟件必須在正確連接asio聲卡的情況下才會(huì)接受MIDI信號(hào),所以調(diào)試過程中必須保證你的聲卡正常連接。
2.硬件電路中的兩個(gè)反向器可以不接但是接了也沒問題而且大多數(shù)的MIDI鍵盤電路都接了這個(gè)反相器。
3.MIDI信號(hào)的發(fā)送,剛開始我只發(fā)送了ON信號(hào)結(jié)果發(fā)現(xiàn) guitar rig軟件只能識(shí)別一次這個(gè)信號(hào),第二次就控制不了了,所以MIDI協(xié)議的信號(hào)必須發(fā)送一個(gè)ON信號(hào),再發(fā)送一個(gè)OFF 信號(hào)就正常了。
4.由于USB端口的電流比較低,所以不要接太多的無所謂的電路上去。會(huì)供電不足。
以下是一個(gè)簡(jiǎn)單的測(cè)試電路和測(cè)試程序以供大家學(xué)習(xí)和參考。
硬件:AT89S52單片機(jī),usb轉(zhuǎn)MIDI線,單片機(jī)學(xué)習(xí)開發(fā)板,74HC04,300歐電阻2個(gè)。
單片機(jī)軟件程序:軟件里有做了4個(gè)按鍵的代碼 如果需要8個(gè)按鍵可以把scankey函數(shù)寫兩遍并修改對(duì)應(yīng)的發(fā)送代碼即可獲得更多的按鍵。
制作出來的實(shí)物圖如下:
152507njojwwutjv9ju1t1.jpg (46.16 KB, 下載次數(shù): 85)
下載附件
2019-4-2 17:19 上傳
電路原理圖如下:
152438qwxxy8ttc8dz0dcr.jpg (121.2 KB, 下載次數(shù): 72)
下載附件
2019-4-2 17:19 上傳
152503ub1e191b4asyh8fa.jpg (135.79 KB, 下載次數(shù): 84)
下載附件
2019-4-2 17:19 上傳
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*****************************************************************
延遲1ms子函數(shù)
******************************************************************/
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基準(zhǔn)延時(shí)程序
{
;
}
}
}
/*************************************************************
初始化子函數(shù)
***************************************************************/
void init()
{
TMOD=0x21; //T/C1工作于8位自動(dòng)裝入狀態(tài)//
TL1=0xff; // T/C1常數(shù),確定波特率//
TH1=0xff; //波特率為 31.25k
SCON=0x50; //設(shè)串口工作于方式1,//
PCON=0x80; //相當(dāng)于SMOD=1;//
TR1=1; //T/C1開始計(jì)數(shù)//
}
/*********************************************************
串口發(fā)送子函數(shù)
*********************************************************/
void send(uchar *p)
{
uchar i;
TR1 =1;
for(i=0;i<3;i++) //當(dāng)i=1 發(fā)送CC,當(dāng)i=2 發(fā)送kk,當(dāng)i=3發(fā)送vv
{
SBUF=*p;
while(TI==0);
TI = 0;
p++;
}
TR1 =0;
}
/**********************************************************
鍵盤掃描子函數(shù)
**********************************************************/
void scankey()
{
uchar p[] = {0x90,0x30,0x64, //按鍵1的命令,在guitar rig 里顯示的是48
0x91,0x32,0x64,//按鍵2的命令,在guitar rig 里顯示的是52
0x92,0x34,0x64,//按鍵3的命令,在guitar rig 里顯示的是53
0x93,0x35,0x64,//按鍵4的命令,在guitar rig 里顯示的是50
0x80,0x30,0x40,
0x81,0x32,0x40,
0x82,0x34,0x40,
0x83,0x35,0x40,
};
uchar temp;
P1=0xfe;//給P1口11111110
temp=P1;
temp=temp&0xf0;//取出高四位值
while(temp!=0xf0)
{
delay1ms(5);
temp=P1;//此時(shí) p1口值不等于0xf0,等于按鍵按下后的值
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1; //此時(shí) p1口值不等于0xf0,等于按鍵按下后的值
while(temp==0xee)
{
send(p);
while(temp!=0xf0)//等待按鍵釋放
{
temp=P1;
temp=temp&0xf0;
}
send(p+12);
}
while(temp==0xde)
{
send(p+3);
while(temp!=0xf0)//等待按鍵釋放
{
temp=P1;
temp=temp&0xf0;
}
send(p+15);
}
while(temp==0xbe)
{
send(p+6);
while(temp!=0xf0)//等待按鍵釋放
{
temp=P1;
temp=temp&0xf0;
}
send(p+18);
}
while(temp==0x7e)
{
send(p+9);
while(temp!=0xf0)//等待按鍵釋放
{
temp=P1;
temp=temp&0xf0;
}
send(p+21);
}
}
}
}
void main()
{
init();//初始化
while(1)
{
scankey();
}
}
|
評(píng)分
-
查看全部評(píng)分
|