第一键盘 - 电子琴在线论坛

 找回密码
 现在注册

QQ登录

只需一步,快速开始

查看: 3239|回复: 9

[维修指南] 如何通过UART串口向MIDI芯片发送数据?

[复制链接]
发表于 2017-3-1 10:59:45 | 显示全部楼层 |阅读模式
我有一块Dream SAM5000 midi开发板,如果接上USB,电脑上认成一个声卡,用Cakewalk把Midi Out设置为这个声卡时,可以发出声音来.用Bus hound工具把发送到USB的数据捕获来和开发板收到Midi事件数据比较,值是一模一样,这说明我如果直接向开发板发送midi event事件,开发板是可以发出声音的。
我直接通过Uart串口向开发板发送midi event事件,但发送的数据要么被滤了,要么变换成别的值了。
于是我在开发板上接了MIDI键盘,按下MIDI键盘可以发出一个声音来,把MIDI键盘发出这个声音的数据截获下来通过UART口传送到开发板上,开发板上就可以发出声音来了。
奇怪在于MIDI键盘发出的数据不是标准的midi event事件(比如: D084B5),开发板接收到这个数据后转化为midi event事件(09900475)了。

想知道通过UART串口向MIDI芯片到底发送什么样的数据,转换规则是什么?

另外如果我要向串口发送Midi文件,不至于还要我来把Midi文件解析成事件吧,是不是应该有什么现成的库或源代码之类东西?
回复

使用道具 举报

发表于 2017-3-1 17:13:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2017-3-1 17:26:49 | 显示全部楼层
首先,请楼主帮忙确认两件事:
    1、UART口,如单片机的TTL UART口或PC的RS232或USB转成的TTL UART口,常规来讲是不能直接驱动MIDI口的。因为五针MIDI输入口内部是有一个光耦的,走的是电流信号,0mA相当于TTL高电平,5mA相当于TTL低电平。普通UART口的驱动能力有可能不够,无法驱动MIDI口内部的光耦。
    2、确认UART口的波特率是31250Baud/s吗?
    以上这两条可能导致出现离奇的结果。

“想知道通过UART串口向MIDI芯片到底发送什么样的数据,转换规则是什么?”
    这个没有什么转换规则,传送的数据就是MIDI事件,比如90 3C 6B之类的。但端口在电路上稍有不同,原因就是上边提到的那个。

“另外如果我要向串口发送Midi文件,不至于还要我来把Midi文件解析成事件吧,是不是应该有什么现成的库或源代码之类东西?”
    这个还真的得把MIDI文件解析成事件,相当于您在板子上做了一个MIDI播放器或者音序器之类的东西。现成的话……因为我不是做软件的,这一块不太清楚。您板子用的是什么CPU?跑linux吗?跑linux的话,倒是有不少linux上用的MIDI播放器。这个帮您at个高手@rgwan ,请他来帮忙解答~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-1 17:56:08 | 显示全部楼层
感谢楼上各位。

第一问题找到原因了,电脑UART波特率和程序波特率还都不能用31250,只能用38400。折腾了两个星期今天终于有收获了。各位能不能分析一下是什么原因。

第二个问题向串口传送 MIDI 文件是在android上使用,CPU是Arm的.该怎么做?
回复 支持 反对

使用道具 举报

发表于 2017-3-1 19:47:21 | 显示全部楼层
oukm 发表于 2017-3-1 17:56
感谢楼上各位。

第一问题找到原因了,电脑UART波特率和程序波特率还都不能用31250,只能用38400。折腾了两 ...

这个不清楚了,电脑上的UART是不是被操作系统管得太严了,没办法自定义波特率?至于如何在安卓下用ARM的UART发MIDI数据,这个俺也不清楚。因为俺一直是做硬件的,对PC和嵌入式操作系统都不熟……所以期待rgwan童鞋的回答了……
说起安卓,楼主可以调查一下关于使用蓝牙BLE的无线MIDI方案,现在很流行做这个,也许有现成的方案可以用~雅马哈,KORG,CME,等等一大票厂商,都已经有蓝牙BLE的无线MIDI产品了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 09:39:04 | 显示全部楼层
波特率为38400估计是因为晶振是38400倍数,而不是31250的倍数.
回复 支持 反对

使用道具 举报

发表于 2017-3-6 14:54:40 | 显示全部楼层
最简单的就是发送90 3c 40 和80 3c 00按下和弹起中央c,如果是用电脑串口发送,恐怕是需要自己编程自定义波特率了
回复 支持 反对

使用道具 举报

发表于 2019-7-12 14:02:05 | 显示全部楼层
STM32  可以自定义串口的波特率,就连速度仅有16MHz的STM8S也可以直接驱动MIDI芯片
回复 支持 反对

使用道具 举报

发表于 2020-3-30 14:57:20 | 显示全部楼层
华北kingsky 发表于 2017-3-1 17:26
首先,请楼主帮忙确认两件事:
    1、UART口,如单片机的TTL UART口或PC的RS232或USB转成的TTL UART口, ...

我以前用arduino nano做过midi推子控制器就没问题……arduino用的那个atmega328,所有输入输出口都能耐受20毫安电流的,由于arduino不支持usb直接通讯,我就把波特率调到31250然后就用网上串电阻那个转接法,接上一条usb-midi转接线怼的电脑,跑得飞起……(忘拍图了,那个控制器我在面包板上接的,用了几天就卸了
回复 支持 反对

使用道具 举报

发表于 2020-4-3 23:51:10 | 显示全部楼层
2637987828 发表于 2020-3-30 14:57
我以前用arduino nano做过midi推子控制器就没问题……arduino用的那个atmega328,所有输入输出口都能耐受 ...

是的哇,不出bug就是最好咧,但出了bug就要有怀疑一切的精神~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 现在注册

本版积分规则

关闭

新闻头条上一条 /1 下一条

【重要通知】|申请友链|Archiver|手机版|第一键盘 - 电子琴信息网 - 电子琴在线论坛 ( 粤ICP备14036084号 )

GMT+8, 2024-3-28 19:03 , Processed in 0.118524 second(s), 29 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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