55MCMDL1.MID(渡辺宙明メドレー)を開くとエラー発生
標準MIDIファイル読み込みクラス(SMFileReader)の不具合。
55MCMDL1.MIDの読み取りエラー発生箇所を以下に示す。 ランニングステータスが省略されていないと間違って判定したため、"63"を不正なスタータスとみなした。
63 01 : ランニングステータス BA 01 : デルタタイム 62 66 : ランニングステータス BA 01 : デルタタイム 06 37 : ランニングステータス BA 01 : デルタタイム FF 01 14 2A 2A 2A 2A 2A 20 43 75 74 6F 66 66 20 46 72 65 71 20 2A 2A 2A : メタイベント/テキスト"**** Cutoff Freq ***" 00 : デルタタイム 63 01 : ランニングステータス BA ★このイベントの読み取りでエラー発生 01 : デルタタイム 62 20 : ランニングステータス BA 01 : デルタタイム 06 40 : ランニングステータス BA 02 : デルタタイム
MIDIイベントの間にメタイベントが割り込んでいる。 SMFileReader::_ReadEventにおいて、メタイベントの次のイベントを読み取るとき、 「直前のイベント」がメタイベントのため、 「次のイベント」にはランニングステータスの省略は適用されないはず、と判定していた。
しかしメタイベントはMIDI音源には送信されないデータであるため、 ランニングステータスの省略を判定する際に、「直前のイベント」として扱うのは誤りである。
ランニングステータスの省略判定において、メタイベントを「直前のイベント」として扱わずに無視する。
では、MIDIイベントの間にシステムエクスクルーシブが割り込んでいたら、ランニングステータスの省略は適用されるのか? システムエクスクルーシブそのものに、ランニングステータスの省略は適用されない(F0,F7の省略はない)ことは、SMFの仕様に明記されている。 しかし、システムエクスクルーシブをまたいでMIDIイベントのランニングステータス省略が許されるのかについては、 仕様から判断できなかった(読み方が悪い??)。
システムエクスクルーシブをまたいでMIDIイベントのランニングステータス省略がありうるとしても、 プログラムとしては解析処理を続行できる(解析ロジックは破綻しない)。 というわけで、このようなケースもエラーとしない処理にしておく。
55MCMDL1.MIDは、あるトラックに複数のチャンネルに対するイベントが含まれている。 標準MIDIファイルとしては、かなりグレイなデータにみえる。 たとえばdominoは、データ異常ありとして本データの読み込みを拒否する。
MIDITrail起動時のコマンドライン引数で、デバッグモード"-d"を指定できるようにする。 デバッグモードが指定されているときは、MIDIファイル読み込み時に解析結果のテキストファイルを出力する。 解析結果を出力する処理は、初版リリース時点で実装済み。 なお、本機能はデバッグ用のため、ドキュメントに記載しない。
デバッグモードの引数"-d"を確認する処理を追加する。
デバッグモードが指定されている場合は、標準MIDIファイル読み込みクラスのインスタンスに、 解析結果ファイルの出力先パスを指定する。 出力先パスは、読み込みファイルパスの末尾に".dump.txt"を追加して作成する。 上書き確認はしない。
55MCMDL1.MID(渡辺宙明メドレー)を開くと、次のエラーが発生して読み込みに失敗する。