チケット #22652

55MCMDL1.MID(渡辺宙明メドレー)を開くとエラー発生

登録: 2010-07-29 01:43 最終更新: 2010-08-05 23:53

報告者:
担当者:
チケットの種類:
状況:
完了
コンポーネント:
マイルストーン:
優先度:
7
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

55MCMDL1.MID(渡辺宙明メドレー)を開くと、次のエラーが発生して読み込みに失敗する。

---------------------------
ERROR
---------------------------
Invalid data found.

FUNC: SMIDILib::SMFileReader::_ReadEvent
LINE: 465
INFO: 00000063 00000000
---------------------------

チケットの履歴 (6 件中 3 件表示)

2010-07-29 01:43 更新者: yknk
  • 新しいチケット "55MCMDL1.MID(渡辺宙明メドレー)を開くとエラー発生" が作成されました
2010-07-29 01:45 更新者: yknk
2010-08-04 00:54 更新者: yknk
コメント

原因

標準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音源には送信されないデータであるため、 ランニングステータスの省略を判定する際に、「直前のイベント」として扱うのは誤りである。

2010-08-04 01:14 更新者: yknk
コメント

対策

SMFileReader::_ReadEvent

ランニングステータスの省略判定において、メタイベントを「直前のイベント」として扱わずに無視する。

残課題

では、MIDIイベントの間にシステムエクスクルーシブが割り込んでいたら、ランニングステータスの省略は適用されるのか? システムエクスクルーシブそのものに、ランニングステータスの省略は適用されない(F0,F7の省略はない)ことは、SMFの仕様に明記されている。 しかし、システムエクスクルーシブをまたいでMIDIイベントのランニングステータス省略が許されるのかについては、 仕様から判断できなかった(読み方が悪い??)。

システムエクスクルーシブをまたいでMIDIイベントのランニングステータス省略がありうるとしても、 プログラムとしては解析処理を続行できる(解析ロジックは破綻しない)。 というわけで、このようなケースもエラーとしない処理にしておく。

メモ

55MCMDL1.MIDは、あるトラックに複数のチャンネルに対するイベントが含まれている。 標準MIDIファイルとしては、かなりグレイなデータにみえる。 たとえばdominoは、データ異常ありとして本データの読み込みを拒否する。

2010-08-05 23:48 更新者: yknk
コメント

対策2

MIDITrail起動時のコマンドライン引数で、デバッグモード"-d"を指定できるようにする。 デバッグモードが指定されているときは、MIDIファイル読み込み時に解析結果のテキストファイルを出力する。 解析結果を出力する処理は、初版リリース時点で実装済み。 なお、本機能はデバッグ用のため、ドキュメントに記載しない。

MTCmdLineParser::_AnalyzeCmdLine

デバッグモードの引数"-d"を確認する処理を追加する。

MIDITrailApp::_LoadMIDIFile

デバッグモードが指定されている場合は、標準MIDIファイル読み込みクラスのインスタンスに、 解析結果ファイルの出力先パスを指定する。 出力先パスは、読み込みファイルパスの末尾に".dump.txt"を追加して作成する。 上書き確認はしない。

2010-08-05 23:53 更新者: yknk
  • 解決法なし から 修正済み に更新されました
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2010-08-05 23:53 に更新されました

添付ファイルリスト

添付ファイルはありません

編集

このチケットにコメントを追加するには、ログインが必要です » ログインする