midiomのMTCフレーム送信部にフレーム落ちする可能性のあることが判明したため、次回アップデートで修正します。その際MMCコマンドの実装も追加されます。
MTCに対応するソフトウェアをいくつか試してみたのですが、いくつかのソフトウェアでは、対応し切れていないものがありました。
ロック時刻を指定し、その時刻のタイムコードが来たときにしか再生を開始しないもの(任意位置からの再生に対応してくれません)や、ロックに異常に時間がかかるものなど、市販ソフトウェアでも中途半端な実装が多いようです……。
そもそも、オーディオソフトウェアなどは、時間情報がずれても出力の圧縮や伸長をするべきではなく(ピッチが変わってしまうし、そんな重たい処理を許容すると大変なことになる)、一旦ロックされてしまえば、あとはMTCが来ているかを監視しつつ、内部のクロックで再生を進めてしまうという処理が適切なのですが、無駄にstrictにロックを試みようとして処理が遅れたりするのは、間違っていると思います。時間軸は一定で進むのですから、8フレームもあれば精度の高い同期は可能なはずです。
midiom以外のMTCマスターで同期を試みてみたのですが、結果は同じでした。
数あるソフトすべてで試すことはできませんが、
Cubase,Nuendoはシームレスな同期をしてくれます。
以下ぼやき。
MMCの資料が少ない。ネットを探しても用語解説ばかり。
MIDIバイブルII(リットーミュージック社刊)が本当にバイブルに。
現状のMTCで他ソフトウェアとの同期はできるのだが、Cubase上で編集作業を行っているときに再生ボタンを押して、midiomも再生してくれて、さらに、midiom上での再生ボタンにもCubaseが追従するような動作をしたい場合、midiomがMMCスレーブに対応していれば真にシームレスな編集が行えるため実装を検討する。
我が家のCubaseSX2はMMCコマンドの送信はするのだが、スレーブとしてMMCコマンドを受け付けてはくれないので(あれだけ高額なソフトなので、少々驚き。需要がないのかなぁ。今はReweireがあるからソフトウェア上の動作はそっちまかせなのかも)、midiomをスレーブ対応する必要がある。
MTC: midom マスター > CubaseSX2 スレーブ
MMC: CubaseSX2 マスター > midiomスレーブ
この構成で、シームレスにmidiomがCubaseの外部エディタになったような感覚で使用できる。Cubase上で再生カーソルの移動を行うと、リアルタイムにロケーション情報が送られるので、midiomも同位置にカーソルをシーク。結構気持ち良いです。
再生命令を受けたmidiomは再生を開始し、MTCフレーム情報をCubaseに送信、MTC時間情報にロックされて、Cubaseの再生が開始します。
最初は、DefferdPlayとStop、Locateの三つに対応できれば、ほぼ問題ないため、簡単だろう・・・と思いきや。
開発機に接続している KORG U1が、エクスクルーシヴメッセージを取りこぼす。おそらくドライバの実装のバグ。 しかも、受信バッファの開放時に書き込みポインタをリセットしないらしく、エクスクルーシヴを受信するたびにバッファの後ろに追加されていき、使い物にならない始末。 オーディオもジッターノイズ見たいのがたまに入るし、困ったもんだ・・・。 書き込みポインタはバッファ受理後に自分でリセットすることで対応できるのだが(本来このような処理をする必要などない。ドライバのバグ…)、データの取りこぼしには対応のしようが無いので、音楽機内部でMIDI Yokeによる結線をする。
ところが、MIDI Yokeにも不具合が見つかる。受信バッファを複数確保しても、スイッチングしないので、一つのバッファを受信後、その処理中にエクスクルーシヴ受信が起こると、そのバッファを上書きしてしまうため、不正なデータが受信される場合がある。規格どおりに考えれば、エクスクルーシヴの送信に適度な間を挟まなければいけないので、その辺はさほど問題ではないが。
PCのMIDIドライバは、エクスクルーシヴを受信する機会は多く無いため、十分な検証がされないままリリースされていることが多いようです・・・。
音楽機のRokandUM-4はその辺完璧でした。さすがです。(KORGの名誉の為に書いておくと、U1は中身がONKYOの製品のOEMです。)
MIDIバイブルを開いて、
Locateコマンド (F0 7F devID 06 44 06 01 hr mn sc fr ff F7) に応答するように機能追加を考える。
ff : 標準時刻(ffタイプ)
意味がわからないので、SMPTEのフレームタイプだと信じてコーディング。しかし、受信をモニタすると、どうもフレームタイプはhrの6,7ビットに設定されていることが判明。その際ffは0がセットされている。
検索してみると、
ttp://www.cakewalk.com/Support/Docs/MMCandSYSX.asp
ff はsubframes(1/100フレーム)と書いているじゃないか…。
フレームタイプも案の定hrに合成されている。
昨日は間違った処理、間違った記述に悩まされた一日だった…。