私はMIDIファイルリーダーをJavaで作成しています(主に、Androidプロジェクトではjavax.sound.midiライブラリが含まれていないため、練習問題として使用しています)。私はthis仕様に従っています。未知のMIDIイベントのデコード
実際の読書はイベントごとに進んでいますが、私のプロジェクトでは仕様の詳細がうまく実装されています。 InputStream
がファイル上で開かれ、同じオブジェクトが渡され、イベントが解析されたときにストリームが次のイベントに配置されるように、さまざまなイベントオブジェクトを解析します。これはすごくうまくいきます。
私の最初のテストファイルは、単にソナー8で作成された空のデータトラックを持つテンポマップです。テンポトラックは完全に解析されています。空のトラックは、そのチャンクの識別子とトラック名の後に次のデータがあります。
00 B0 07 47 00 0A 40 00 FF 2F 00
最初のバイトが正常に解析されています。 00
= 0のデルタ時間は、チャネル0上B0
=コントローラーイベント、07
=メインボリューム制御、71
の47
=ボリューム値の次のバイトは私を混乱されています。 00 0A 40
最も可能性の高いケースは、値が64のPanイベントです。0A
は、ボリュームイベントと同様に、コントローライベントの前には、B0
と予想されます。しかし、既知のイベント識別子バイトの前にはないので、読者はこのイベントを解析できません。
私の疑問は、このタイプのイベントをどのように説明できるかということですね。このような文字列のコントローライベントを単一のB0
識別子でファイル形式で受け入れることは可能ですか?さらに、ファイル内で識別できないイベントタイプが発生した場合、実際にイベントがどのようなものになるのか分からないと、どのくらいのデータをスキップできるかを知る方法がありますか?私は未知の出来事を飛ばして読者が失敗しないようにしたいと思っていますが、私がその出来事を特定できないと、私はそれをスキップする方法がわかりません。これらの特定の事例についてのいくつかの洞察が大好きです。
私は、空でないデータトラック(実際の音符のトラック)を見て、いくつかの洞察を得ました。私がノートオンイベント(0x9)の束を期待している間、私は1つのノートオンイベントの後にトラックのすべてのノートが続きます。また、ノートオフイベントがなく、ノートが終了するベロシティ0のノートオンイベントもあります。だから私は、イベント識別子が次のイベントを特定するだけでなく、別のイベント識別子が見つかるまで、そのタイプのイベントとしてイベント識別子に続くすべてのバイトを識別すると信じるようになりました。私はまだこれについての確認またはさらなる説明を感謝します。 – LeffelMania
[midiファイルの解析、認識できないイベントの種類]の複製があります(http://stackoverflow.com/questions/7719366/midi-file-parsing-unrecognised-event-type) – Arhad