3

私は MIDI 解析の神秘的な領域を理解しようとしてきましたが、うまくいきません。私がやろうとしているのは、音価 ( 60= C4、72= C5 など) を発生順に取得することだけです。

私のコードは次のとおりです。ファイルをバイト配列として開き、すべてを 16 進数として読み取るだけです。

byte[] MIDI = File.ReadAllBytes("TestMIDI.mid");
foreach (var element in MIDI) {
    string b = Convert.ToString(element,16);
    Debug.WriteLine(b);
}

すべての TestMIDI.mid に含まれているのは、C5 の 1 つのノートです。 これが16進ダンプです。この情報を使用して、Note On (0x9または単にダンプ内)の単純な 16 進値を見つけようとしています9が、何もありません。私はいくつかの を見つけることができますが、私には72意味をなさない 3 つがあります (ノートオン、ノートオフ、そして何?)。

これは、MIDI をファイルとして解析し、16 進ダンプを使用する最初の試みです (そう呼ばれているのでしょうか?)。完全に間違った方向に向かっている場合は申し訳ありません。 必要なのは、再生される音とその順序を取得することだけです。タイミングも凝ったものも何もいらない。 この背後にある理由は、重要であれば、beep*nix のコマンドと非常によく似た、スピーカーから再生される別の言語で新しいコードを生成するためです。このため、1) プログラミングもせず、実際には何も学ばず、2) 必要以上のことを行い、フレームワークを実際のコードよりも重くするフレームワークは使用したくありません。 .

4

2 に答える 2

3

これを正しく行うには、少なくとも MIDI パーサーに似た機能が必要です。0x9 イベントを検索することは良い出発点ですが、速度フィールドが 0 の場合、0x9 はノートオフ イベントでもあります。0x9 は他のイベント (メタ イベント、MPQN イベント、デルタ タイムなど) 内にも存在する可能性があるため、偽陽性を取得します。したがって、これを正確に行うには、実際に MIDI ファイル形式を知っているものが必要です。

ライブラリを探すか、独自に作成するか、オープンソースのものを移植してください。あなたが見たいのであれば、私のものはJavaにあります。

于 2012-11-06T01:47:26.800 に答える