找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6092|回复: 2
收起左侧

DIY MIDI脚踏控制器(4按键笔记)附单片机程序

[复制链接]
ID:380469 发表于 2019-4-2 17:19 | 显示全部楼层 |阅读模式
DIY制作MIDI脚踏控制器
        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函数写两遍并修改对应的发送代码即可获得更多的按键。
制作出来的实物图如下:
152507njojwwutjv9ju1t1.jpg

电路原理图如下:
152438qwxxy8ttc8dz0dcr.jpg
152503ub1e191b4asyh8fa.jpg
#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();
}
}




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:881862 发表于 2021-1-31 19:11 | 显示全部楼层
这么好的贴子,怎么没有人顶呢。学习了
回复

使用道具 举报

ID:1039438 发表于 2022-11-15 15:27 | 显示全部楼层
写的太好了。可以直接拿来用的一个方案。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表