前言
在開發與平臺移植了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與各個平臺交互。