前言
在开发与平台移植了3个版本的钢琴游戏,教育app之后得到的各类技术总结。
很多调用的底层一些平台接口,很多处理方法其实是桥接其底层链接库,然后在unity里面使用。
之前其实大抵是写过类似的东西,但代码的反复重构与革新导致很多思路的推翻,遂最后写总结性的一些东西来避免后者入坑。
经过多人研究后才有的成熟解决方案,所以不敢开源。望体谅。只提供核心思路,相信也能帮助很多同行了。
这个东西到底是什么?
我们在想实现软件与硬件相连的过程中,除了硬件所支持的一些采集设备还需要驱动去把采集信息转化到软件中,当然,这个midi通信所干的工作就是这个。
midi通信的底层原理
每个平台都有对midi通信的链接库,但是这个底层库没有被封装所以我们大概是不会直接去调用里面的函数。
但是每个平台都有别人写好的链接库,只需要适当修改即可。
win: winmm
ios :coremidi
android:这个暂时没搞清楚,不过有库能直接用,而且库最多
测试可用的链接库
win: rtmidi ,这个链接库其实是跨平台的链接库,有win,os,unix等,如果在win上测试的时候,记得把预编译头加上去。
ios : rtmidi (我在git上下载的rtmidi只支持os,经过我修改之后才移植到ios上,其实也不复杂,他不支持ios只是因为在记录按键时间哪里调用的是os平台下的代码,把这块改成ios或者删掉就能解决,其底层都是用的coremidi.framework)
MIKMIDI(一套ios原生链接库)
这套库的封装程度要比rtmidi好太多,具体在,连接回调,断开回调,以及不需要为管理指针发愁的好处。
但是坑也蛮多,后面说。
MIKMIDI git:https://github.com/mixedinkey-opensource/MIKMIDI
rtmidi git:https://github.com/thestk/rtmidi
你可能遇到的坑
如果你用的rtmidi,那么恭喜你,在后面的开发过程可能会更轻松方便,一套很简单的demo,仔细看个半个小时就能懂用法,C++开发的库在使用的过程中一定要注意指针的处理,否则很容易引起崩溃。特别是在win下开发打包成dll,如果第一次跑demo可行但是移植到自己项目不行,请注意是否加入了预编译,具体的参数看case平台参数
在ios下的话,嗯这个地方的库你需要细心的查,那个地方报错的代码是和时间相关,我是直接删掉,然后键值按下抬起的时间是由自己计算出来的。
rtmidi回调的写法是一个mycall的函数指针,在dll里面对于unity是一个异步线程,什么意思呢。就是说你想用委托的方式把这个东西给unity是行不通的(我们知道在线程之间是不能调用其他线程的UI,譬如主线程)所以在IOS我们只能用unitySendMessage去传。
但是在win下,我们只能用update去获取,唯一的方法。
如果你使用的是MIKMIDI,那么恭喜你,功能上你是不用封装太多了,但是在IOS的代理模式下,你需要做大量的处理,如何通过代理回调发送unitySendMessage是你需要做的,如果成功则比rtmidi更加简单。
至于你写好.mm交互文件之后,请参考我之前的一篇文章,unity与各个平台交互。