| 
吉他师傅 UID440779
好友
回帖0
主题
精华
积分1003
阅读权限255
注册时间2008-5-3
最后登录1970-1-1
在线时间 小时
 
 | 
 
| DIY MIDI脚踏控制器(4按键笔记) MIDI控制器,可以用来控制支持MIDI协议的软件效果器,如guitar rig。MIDI控制器和键盘一样可以控制guitar rig,但是键盘无法在后台对guitar rig 进行控制。而midi协议的控制器不受影响 ,不管软件是在前台运行还是后台运行都可以接受到MIDI信号的控制。
 先说调试过程中遇到的问题:
 1.guitar rig 软件必须在正确连接asio声卡的情况下才会接受MIDI信号,所以调试过程中必须保证你的声卡正常连接。
 2.硬件电路中的两个反向器可以不接但是接了也没问题而且大多数的MIDI键盘电路都接了这个反相器。
 3.MIDI信号的发送,刚开始我只发送了ON信号结果发现 guitar rig软件只能识别一次这个信号,第二次就控制不了了,所以MIDI协议的信号必须发送一个ON信号,再发送一个OFF 信号就正常了。
 4.由于USB端口的电流比较低,所以不要接太多的无所谓的电路上去。会供电不足。
 以下是一个简单的测试电路和测试程序以供大家学习和参考。
 硬件:AT89S52单片机,usb转MIDI线,单片机学习开发板,74HC04,300欧电阻2个。
 软件程序:软件里有做了4个按键的代码 如果需要8个按键可以把scankey函数写两遍并修改对应的发送代码即可获得更多的按键。
 #include<reg52.h>
 #define uchar unsigned char
 #define uint unsigned int
 /*****************************************************************
 延迟1ms子函数
 ******************************************************************/
 void delay1ms(uint i)
 {
 uchar j;
 while(i--)
 {
 for(j=0;j<115;j++)  //1ms基准延时程序
 {
 ;
 }
 }
 }
 /*************************************************************
 初始化子函数
 ***************************************************************/
 void init()
 {
 TMOD=0x21; //T/C1工作于8位自动装入状态//
 TL1=0xff;  // T/C1常数,确定波特率//
 TH1=0xff;  //波特率为 31.25k
 SCON=0x50; //设串口工作于方式1,//
 PCON=0x80; //相当于SMOD=1;//
 TR1=1; //T/C1开始计数//
 
 }
 /*********************************************************
 串口发送子函数
 *********************************************************/
 void send(uchar *p)
 {
 uchar i;
 TR1 =1;
 for(i=0;i<3;i++) //当i=1 发送CC,当i=2 发送kk,当i=3发送vv
 {
 SBUF=*p;
 while(TI==0);
 TI = 0;
 p++;
 }
 TR1 =0;
 }
 /**********************************************************
 键盘扫描子函数
 **********************************************************/
 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;//此时 p1口值不等于0xf0,等于按键按下后的值
 temp=temp&0xf0;
 while(temp!=0xf0)
 {
 temp=P1;   //此时 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();
 }
 }
 硬件测试电路图:
 硬件电路中只做了四个按键作为调试使用,还可以通过其他IO口和矩阵键盘扩展更多的按键。
 图片
 
 四个按键在guitar rig 软件上的显示
 图片
 成品实况图:
 图片
 
 以上代码和电路图均通过本人亲测并且做成实物,欢迎新手和大神来交流学习和指导,索取相关学习材料。另;一下代产品将会陆续增加如:增益,噪声门和哇音踏板等功能
 
 | 
 |