5

現在、MIDI ファイルでいくつかのタスクを実行するアプリケーションを実装しています。現在の問題は、読み取ったメモを LilyPond ファイルに出力することです。

note_on イベントと note_off イベントを、絶対開始点と絶対持続時間を持つ単一のノート オブジェクトにマージしましたが、その持続時間を実際の楽譜に変換する方法がよくわかりません。私はその曲を知っているので、376 の長さは私が読んでいるファイルの 4 分音符であり、明らかに 188 は 8 分音符であると推測しましたが、これは確かにすべての MIDI ファイルに一般化されるわけではありません。

何か案は?

4

1 に答える 1

9

デフォルトでは、MIDI ファイルは 120 bpm のテンポに設定されており、ファイル内の MThd チャンクは「4 分音符あたりのパルス数」(ppqn) で解像度を示します。

たとえば、ppqn が 96 の場合、96 ティックのデルタは 4 分音符です。

各サウンドの実際の長さ (秒単位) に関心がある場合は、イベント "FF 51 03 tt tt tt" によって変更できる "テンポ" も考慮する必要があります。3 バイトは 4 分音符のマイクロ秒です。

これら 2 つの値を使用して、必要なものを見つける必要があります。特にその MIDI ファイルが人間のプレーヤーの録音である場合は、MIDI ファイルの長さが概算である可能性があることに注意してください。

私はずっと前に midifiles を読み書きするための C ライブラリをまとめました: https://github.com/rdentato/middl 参考になるかもしれません不明な点があればお問い合わせください)。

このアプローチに従うことをお勧めします。

  1. あなたの部門と互換性のある「最小限の音符」(例えば 1/128) を選択し、一種のグリッドとして使用します。
  2. 各ノートを最も近いグリッド ラインに揃えます (つまり、最小ノードの最も近い整数倍に)。
  3. それを標準の記譜法 (例: 4 分音符、付点 8 分音符など) に変換します。

あなたの場合、最小音符として 1/32、分割として 384 を使用します (つまり、48 ティックになります)。376 ティックのメモでは、376/48=7.8 になり、これを 8 (最も近い整数) に丸め、8/32 = 1/4 になります。

デュレーションが 193 ティックの音符を見つけた場合、193/48 は 4.02 (4 に丸めることができます) であり、4/32 = 1/8 であるため、1/8 音符であることがわかります。

この推論を続けると、デュレーションが 671 ティックの音符は二重付点 4 分音符でなければならないことがわかります。

実際、671 は 672 (48 の最も近い倍数) に近似する必要があり、これは 14*48 です。したがって、あなたのメモは 14/32 -> 7/16 -> (1/16 + 2/16 + 4/16) -> 1/16 + 1/8 + 1/4 です。

2 進数の使用に慣れている場合は、14 が 14 であることに気づき、1110そこから 1/16、1/4、1/8 の存在を直接導き出すことができます。

さらなる例として、デュレーションが 480 ティックの音符は、480=48*10 で 10 が10102 進数であるため、1/16 音符と結び付けられた 4 分音符です。

トリプレットやその他のグループは、物事をもう少し複雑にします. 最も一般的な除算値が 96 (3*2^5)、192 (3*2^6)、384 (3*2^7) であることは偶然ではありません。このようにして、トリプレットを整数のティック数で表すことができます。

状況によっては、推測または単純化する必要がある場合があります。そのため、「midi から標準表記へ」プログラムは 100% 正確ではありません。

于 2010-03-18T15:29:05.620 に答える