ピッチベンド(MIDI)値を「通常の」ピッチ値に変換


11

ここに記載されているrt_lpc(リアルタイムLPC)実装を使用して、オフラインLPC分析と合成を試みています。プログラム内には、オフラインLPC分析および合成プログラムに使用できるいくつかの関数があります。rt_lpcコードは、主に作曲家などを対象としています。つまり、MIDIまたは声門パルス入力を使用します。プログラムには、(自己相関から取得した)ピッチ値を値に変換するコードがいくつかありbendます。この関係は次のように与えられます。

    pitch = (int)( Stk::sampleRate() / midi2pitch[ananya.data[1]] ) /
                            pow( 1.0653f, bend/64.0f*11.0f );
                    power *= ananya.data[2] / 64.0f;
bend = ge.data[1] / 128.0f + ge.data[2] - 64;

いくつかのポイント:
a。その場で生成されるように見えるananyaタイプのオブジェクトですMidiMsg
b。geまたMidiMsg、オンザフライで生成されるように見えるタイプのオブジェクトでもあります。
c。これらの2つのオブジェクトは、プログラムがリアルタイムで実行されるときに作成されます(私のものは、自分のmain.cppでその一部を実行するオフラインバージョンです)。

私の質問:
1.ピッチベンドとは何ですか?
2.ピッチ値をベンド値に変換するにはどうすればよいですか?マッピング関係とは何ですか?

解決策を探しましたが、明確な答えは見つかりませんでした。

回答:


12

MIDIの核心は、それぞれが静的なピッチを持つ個別のノートイベントとしての音楽の表現です。これは、鍵盤楽器で演奏される音楽を表現するのに最適です。次のコマンドを使用して、和らげられたスケールのノートに対応する周波数をMIDIノート番号に変換できます。

69+12×ログ2freqあなたecy440

MIDIレシーバーがA4 = 440 Hzに調整されているという仮定のもと。

この表現はピアノ音楽では問題ありませんが、問題は、調律された音階にマッピングされていないピッチを表現する方法(非西洋音楽、非音楽音)、および音符の持続時間に対するピッチの変化を表現する方法(グリッサンド、ビブラート)。

これは、現在再生されているノートのピッチを短い間隔でシフトするようにシンセサイザに指示する「ピッチベンドメッセージ」を使用して、MIDIで行われます。ほとんどのシンセサイザは、ピッチベンドメッセージの範囲(0 .. 16383)で+/- 2セミトーンのデフォルトで調整されます。8192はピッチベンドなしに対応します-放出されるピッチは正確にノート値のピッチです。ピッチベンド値と周波数シフト比の間のマッピングは、次のように与えられます。

feメートルtted_otefote_メートルessage=2ptchbed81924096×12

したがって、次の式からシンセジアが演奏するノートの周波数を取得できます。

440×2ote6912.0+ptchbed81924096×12

ここで、ノートは、最後に受信の7ビットMIDIノートナンバーであるノートオンメッセージ。また、pitchbendは、最後に受信したピッチベンドメッセージの14ビット値です。シンセサイザは、ピッチベンドレジスタを8192に設定して開始し、この値は、「すべてのコントローラをリセット」メッセージの受信中にリセットされます。

次の例を見てみましょう。フルートトリルを500 Hz、510 Hz、500 Hzの周波数軌跡でMIDIメッセージとして表現したいとします。

基本ノート番号は次のとおりです。

roあなたd69+12×ログ2500/440=71

したがって、note#が71の「note on」メッセージを送信します。これは、次のピッチと同等です。

440×27169/12=493.88

これは、調整されたスケールで最も近いピッチです。次の係数でピッチを上げるには、ピッチベンドメッセージを送信する必要があります。

500493.88=1.0124

500 Hzを取得します。対応するピッチベンド値は次のとおりです。

roあなたd8192+4096×12×log21.0124=9065

510 Hzを取得するには、ピッチベンド値は次のようになります。

roあなたd8192+4096×12×log2510493.88=10469

したがって、500、510、500 HzのMIDIメッセージのシーケンスは次のようになります。

  • 注記71
  • ピッチベンド9065
  • ...
  • ピッチベンド10469
  • ...
  • ピッチベンド9065

MIDIノート番号は、ピッチの「積分」部分と考えることができます。ピッチは、ピッチの冗長な「小数」部分としてベンドします。


また、コードについての私の理解から、geはピッチベンドメッセージです。ge.data [2]そのMSBとge.data [1]そのLSB。ananyaはメッセージのノート、ananya.data [1]はノート番号、ananya.data [2]はベロシティです。コードの作成者間のロマンスが隠されているように見えるファンキーな変数の命名に加えて、潜在的なWTFがここにあります。1.0653fおよび11.0f定数には怪しいものがあります。読みやすい選択肢は、1.05946fと12.0fです。または1.06504fおよび11.0f。著者は、ピッチベンド範囲が+/- 1オクターブであることを想定しているようです。これは、もう1つの潜在的なWTFです。
ピシェネット2012年

「隠されたロマンス」の部分でROTFL!私はこれを適切に理解したとは思わないので、我慢してください。ピッチ値はから取得されautocorrelateます。これは、出力されているMIDIノートであるように思われます。midi2pitch数式の配列に注目してください。私が正しい場合、それは私がまだbendベンド値を推定するためのピッチの値または実際の値を持っていないことを意味し、MIDIファイルがない限り、それらを取得する方法もありません。変数が多すぎて方程式が少なすぎる単純なケース。velocityこの場合、曲げ、実際のピッチ値、およびをどのように推定しますか?
スリラム

あなたは何をしようとしているのですか?ピッチ/パワーペアをMIDIメッセージに変換しますか?または、MIDIデータを実際のピッチに変換しますか?上記のコードは、着信MIDIノート+ピッチベンドメッセージ(ananya msg、ge msg)のペアをピリオド(ピッチ変数)とパワー(パワー変数)に変換します。これは、LPCの励起をMIDIキーボードによって制御される合成の励起に置き換えるために使用されていると思います。
ピシェネット2012年

rt_lpc.cppをざっと見てみると、タイプ0xe0(PITCH BEND)の着信MIDIメッセージがピッチベンド値を更新していることが確認できます。そして、タイプ0x90(NOTE ON)の着信MIDIメッセージが「ananya」メッセージにコピーされます。そこから、変更されたピッチを使用した再合成は、これらの値を使用して行われます。そこから何をしたいのかわからない。
ピシェネット2012年

1
はい、MIDI入力はここで創造的な信号変換のための全く異なるものです。これは通常のLPC分析/合成チェーンの一部ではありません。代わりに、一部のパラメーター(ピッチとパワー)を分析モジュールで生成するのではなく、キーボードから読み取ることができます。たぶん、いくつかのオーディオファイルの例と、Hzで抽出されたピッチ軌道を含む新しい質問を投稿して、よりロバストなピッチ推定手法を紹介することができます。Aubioライブラリには、ピッチトラッカーのいくつかのバリエーションがあります。
ピシェネット2012年

6

MIDIは、(主に)シンセサイザが他のシンセサイザまたはコンピュータを制御または制御できるようにするプロトコルです。

これは、「キーC1アップ」、「キーD4ダウン」、「キーベロシティ」、「サウンドチェンジ」などのメッセージを交換できるシリアルプロトコルです。多くのコントローラーには、ジョイスティックまたは変調ホイールである「ピッチホイール」があります。プレーヤーは、現在再生中のノートのピッチをインタラクティブに変更して、ビブラートを手動で作成したり、あるノートから次のノートに連続的に「スライド」したりします。これは、ギタープレーヤーがフレットストリングを左手で曲げることによって頻繁に行われるため、ピッチベンディングとその名前。

MIDIピッチベンドメッセージは、特定の時点でどれだけのピッチシフトが発生するかを通知する方法です。ピッチベンドメッセージを受信するシンセサイザ(ソフトウェアまたはハードウェア)は、現在再生中のすべてのノートのピッチを指定された量だけ変更することになっています。

コントローラメッセージには-8192から8191までの引数があり、標準のMIDIファイルでは、これは-200セントから200セントの範囲をカバーすることになっています。ここで、1セントは半音の1/100、つまり2 ^( 1/1200)= 1.000577789506555。例:公称周波数の93%に到達するように下方向にピッチシフトを作成するには、コントローラー値は次のようになります。

c = round(log2(.93)*12*8192/2);

この場合は-5146です。0.93は希望の比率、12はオクターブあたりの半音の数、2は最大ピッチベンド範囲(この場合は200セントまたは2半音)、log2()は対数2の対数です。

ただし、ほとんどのシンセサイザでは、範囲は構成可能であり、すべてのシンセサイザが同じように動作すると想定することはおそらくお勧めできません。

こちらが役立つかもしれない換算表です。 http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.