LFOを使用してオシレーターピッチを変調するアルゴリズムのヘルプ


8

アナログシンセサイザーのソフトウェアエミュレーションを開発しています。LFOを使用してオシレーターのピッチを変調しようとしています。コンピューターのサウンドシステムに供給される各サンプルについて、メインオシレーターに入力する周波数を次のように計算しています(擬似コード)。

osc_frequency = note_frequency * (1 + tuning) * (1 + lfo_y * lfo_mod_depth)

このステートメントの変数は次のとおりです。

  • note_frequency =再生する音の周波数(Hz)
  • チューニング=オシレーターの再生ピッチのパーセントでの微調整(例:-0.02 = 2%離調)
  • lfo_y = lfo波形の現在のy値(範囲は-1から1)
  • lfo_mod_depth =オシレーターに適用する効果の深さ/強度(パーセント)

ただし、この計算では望ましい結果は得られません。中心周波数を中心にロックされたピッチが上下に変化するのが聞こえると思います(演奏中のノート)。私が得ているのは、ピッチを「逃がす」モジュレーションエフェクトです。何が起こっているのか正確にはわかりませんが、次のように聞こえます。

  1. 変調強度は時間とともに増加します(変調が到達する高/低周波数マークは、ノートが長く保持されるほど高く/低くなります)
  2. 変調強度は時間とともに一定のままですが、中心周波数は増加しますが、変調はその周囲で振動します

私は正しいアプローチを使用していますか?そうでない場合、正しいアプローチはどうあるべきですか?これでどんな助けでも大歓迎です。


2
最も重要なことは、目的の発振器周波数で何をするかです。あなたはこの質問に似た問題に遭遇しているかもしれません。各タイムステップで出力信号の位相を追跡し、各出力サンプルで必要な周波数に従って更新する位相アキュムレータが必要です。詳細については、こちらをご覧ください
Jason R

位相アキュムレータへの参照により、オシレーターで使用していたより単純なアプローチの代わりにウェーブテーブル合成の使用を検討するようになりました。設計をやり直したら(@pichenettesの回答で概説されているヒントも組み込まれている)、探していた結果が得られました。ありがとう!
Gary DeReese

回答:


7

Jasonが言ったように、これは単に発振器を正しく実装していない可能性があります。たとえば、周波数を積分するのではなく、時間で乗算します。

また、これはトピックとは無関係ですが、実際に観察する価値があります。周波数変調の式は、ほとんどのシンセサイザーとは非常に異なる動作を実装し、ミュージシャンには不思議に聞こえることに注意してください。

たとえば、lfo_yが-1と1の間で振動する場合。lfo_mod_depthは0.5です。また、note_frequencyが220 Hzの場合、osc_frequencyは110から330の間でスイープします。つまり、ノートの周囲で-1オクターブから+1オクターブの間になります。したがって、ピッチ変調はヘルツスケールの中心にあるように見えますが、知覚的な音楽スケールの中心にはありません。

正しい動作は次のようなものを持つことです:

osc_frequency = note_frequency * 2 ** (tuning / 1200.0 + lfo_y * lfo_mod_depth)

次に:

  • チューニングは、音楽的に適切な単位であるセントで表されます(100セント= 1半音)。
  • ピッチ変調は「音楽的に中央揃え」され、lfo_mod_depthはオクターブで表されます

これは「指数関数FM」と呼ばれ、シンセサイザーの標準です。アナログシンセサイザーでは、これは、VFOの指数変換器に到達するCVへのLFO信号を合計することによって実装されます。デジタルシンセサイザーでは、これは、まだ音階にあるピッチの高解像度内部表現に変調を適用することによって実装されます-周波数または位相増分に変換する前に。


ありがとう。これは私の問題の核心ではありませんでしたが、これは確かに私のアプリケーションの発振器周波数を表現および計算するためのより賢明な方法であり、それを実装した後、正常に動作するようです。
Gary DeReese
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.