4

C++ で midi ファイルを読み込もうとしていますが、標準の midi 仕様で定義されていないイベントと思われるエラーが発生します (これを含む多くのサイトから取得: http://www.sonicspot.com/ガイド/midfiles.html )

HEX エディタで midi を開き、エラーを特定しました。これは、最初の「ノートオン」イベントの前に発生します。このファイルは Sibelius 6 ソフトウェアを使用して生成されたもので、ここにファイル セクションを投稿すれば、誰かがこの問題を解決するのを手伝ってくれるのではないかと思っていました。

3曲目の冒頭です。

4D 54 72 6B (MTrk magic number)
00 00 1F F5 (track size in bytes - 8181)
00 FF 03 04 (4 bytes follows) (track sequence name)
00 FF 04 0B (11 bytes follows) (instrument name)
00 C0 34 (program change event)
00 B0 79 00 (controller event)
00 5B <- (what the heck is that?!)

最初の値が 00 (MSB が 1 に設定されていない) であるため、デルタ ティックにすることはできず、認識可能なイベントでもありません。10 バイト後、「ノートオン」イベントを認識します。次のようになります。

00 5B 30 00 40 00 00 07 64 00 0A 10 00 90 3E 47 ←注意事項

「ノートオン」の前の 12 バイトが何を表しているのかわからないため、ファイルを読み取ることができません。一番最初の音符がかなり長いのは知っていますが、それが理由かもしれません。また、「小節」の一時停止を表すイベントが見つからないことにも気付きました。多分それはバー+長さのコードですか?それらをティックと読むべきですか?

4

1 に答える 1

6

MIDI ファイルの 1 つの複雑さは、実行中のステータスです。同じタイプとチャンネルの一連のメッセージがある場合 (たとえば、すべてのコントローラーまたはすべてのノート)、MIDI はステータス バイトを省略することで、多くのバイトを節約できます。これが実行中のステータスを使用しなかった場合、表示されるバイトは次のとおりです。

00 B0 79 00 - controller 121: controller reset
00 B0 5B 00 - controller 91: reverb
00 B0 40 00 - controller 64: sustain
00 B0 07 64 - controller 7: volume
00 B0 0A 10 - controller 10: pan
00 90 3E 47 - note message

すべてのコントローラ メッセージは連続しており、同じチャネルを対象としているため、ステータス バイトは省略できます。メッセージ タイプが変更されるとすぐに、ステータス バイトを再度追加する必要があります。

MIDI ファイルを理解しようとしている場合は、理解できない MIDI イベントがあるときはいつでも、Python-MIDIGNMidiなどの別のツールをサニティ チェッカーとして使用することをお勧めします。これらはテキストとして表示できるため、その動作を模倣できます。

編集: もう 1 つの注意すべき点は、長さまたは継続時間のパラメーター (たとえば、MIDI ファイル内のイベント間の PPQN の時間、または sysex メッセージまたはメタ イベントの長さ) を取る MIDI メッセージは可変長を使用することです。すべての長さフィールドが常に固定長であるとは限りません。

免責事項: Sibelius 6 で MIDI エクスポート コードを書きました...

于 2012-10-16T21:54:58.443 に答える