CoreMIDIの勉強

なんか去年末からごにょごにょやってたんだけど、いろいろあって遅々として進まず。
勉強するには手を動かしてコード書くのがイチバンですよねやっぱ。

CoreMIDIはぱっとみデバイス(Device,Entity,Endpoint)の関係性がいまいちわからずもやもやしてたんですが
自分なりに関係性を図に書いてみました。

CoreMIDIの図(修正)

App側からはClientオブジェクトを作成し、これを通してMIDIデバイスとやりとりするわけですが
デバイス内のEntityがいまいちわからず。
Entity内には実際のMIDI入出力ポート(Endpoint)のSource(MIDI IN) Destination(MIDI OUT)が入っています。

よくあるMIDI IN 2 /MIDI OUT 2 みたいなMIDIインターフェースで手持ちのEDIROL UM-2Gなんかだと
Entity内にそれぞれIN 2コ/OUT 2コなんて構成になってると思いきや
IN 1/OUT 2の入ったEntityが2つ という構成になってました。

MIDI Device(UM-2G)
 |
 ◆-Entity 1 –IN 1 (Source) / OUT 1 (Destination)
 |
 ◆-Entity 2 –IN 1 (Source) / OUT 1 (Destination)

また、Device,Entity,Endpoint はそれぞれユニークなIDが振られているため、永続化に使えるのか?と想像してます。

OSXでは一度接続したMIDI機器の情報は保存される模様で、つなげていなくても全デバイス取得すると取得できちゃったりします。
ただ、Entityプロパティのオフライン情報で実際の接続の有無が確認できる模様。
iPadではこんなことはなく、MIDI機器外すと全デバイス情報もクリアされちゃうみたいです。

CoreMIDIイニシャライズの流れとしては

1 Clientオブジェクトの作成
2 Inportオブジェクト、Outportオブジェクトを作成
3 MIDI受信コールバック関数をInportオブジェクトへ登録(送信のみはいらない)
4 NotificationコールバックをClientへ登録(これは適宜)
5 受信したいEndpoint(Source)とInportオブジェクトをコネクト

これでMIDI受信すると受信コールバックが呼ばれます。
送信はMIDIパケットリストを作成し、Endpoint(Destination)を指定して送信します。

受信したいEndpoint、送信先のEndpointは総じて全部まるっこ指定してるようです。
細かく制御することも可能だと思います。

とりあえずの勉強の成果としてちょっとCoreMIDI Objective-Cラッパーを作ってみました。
ちょとアプリに組み込もうとして作ったものですけど。

受信したMIDIメッセージに対応したデリゲートと
送信用のメソッド組み込んでます。
自分の使いそうなのだけですけど。(つかうってもNote ON/OFF と CCくらい)

初めてGitHub使ってみたけどうまくいけてるんだろか。。。

RTCMidiLib

それにしてもiPadだとCoreMIDIでバッグはほんとやりにくい!
ビルド/デバッグのたびにMacかMIDIインターフェースにつなぎ変えないといけないし
そもそもデバッガ使えない!
プリントデバッグではなく実機でのUITextViewデバッグ!

激しく参考にさせていただいてます
Objective-Audio
http://objective-audio.jp/cat54/core-midi-mac/

Share on Facebook

2 Comments

  1. 返信
    tokentoken 2012/4/4 水曜日

    はじめまして、自作アプリをCoreMIDI対応にして、Line6のMobile Keysに対応しようとしています。
    RCTMidiLib のおかげでさくっと動作したのですが、キーボードで3和音を入力すると、一部同じ音が2回入力されてしまい、結果として2和音や1音になり、正しい和音にならないことがあることが分かりました。
    再現確率は50%くらいです。

    原因を調査中ですが何か思いつくことがありましたら教えていただけるとうれしいです。
    それではよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>