4

学習プロジェクトとしてアセンブリで簡単なシンセを作成しています。最新のシンセに見られるいくつかの高度な機能、つまり正弦波を使用した ADSR エンベロープとパルス幅変調を実装したいと考えています。現時点では、基本的にサンプルを手動で生成し、オーディオ出力にプッシュしています。オーディオ出力には、サンプル バッファーと、バッファーが空に近づくと生成される割り込みがあります。

私がこだわっているのは、「連続した」波形を生成する方法です。現時点では、波の 1 つのインスタンス (のこぎりであれパルスであれ) のサンプルを生成し、その 1 つの波を単純にループして連続出力を生成します。ご想像のとおり、これは PWM と ADSR エンベロープにうまく対応できません。したがって、パルス幅やピッチ(レガートなど)のモジュレーションなど、オンザフライで潜在的な調整を加えて、オンデマンドで波を生成する必要がありますが、それをメモリで効率的に表現する方法について困惑しています、バッファがいっぱいになったときに波形生成を「一時停止」し、割り込みが発生したときに「再開」する方法。

私は解決策を求めているのではなく、正しい方向へのナッジを考えています:-)

ありがとう!

4

2 に答える 2

2

オンデマンドでウェーブを生成することは、単純なウェーブの場合は機能しますが、後で追加の機能/DSP を追加する場合は、何らかのバッファーが必要になります。

振幅の ADSR はかなり単純です。波形をスケーリングするだけなので、周波数変調の場合はもう少し複雑です。これについて説明する記事はこちらです

また、 farbraush githubをチェックすることもできます。素敵なインスピレーションが得られるはずです。

于 2012-11-04T00:15:04.543 に答える
1

波を生成するあなたの方法は、減算合成に適したアプローチのようです。波形の PWM を調整したい場合は、サンプルを再生成する必要があります (または、メモリに保存されている事前に計算された波形を取得する必要があります)。

ほとんどの場合、ピッチが変更された場合は、ウェーブテーブルも再構築する必要があります。波形の基本波に対する読み取りポインターの増分を計算することで、より高速に波形を読み取ることができますが、これにはウェーブテーブル内の値間の補間が必要になり、より複雑な波形でエイリアシングが発生する可能性があります。

もちろん、ほとんどの場合、生成される波が正確に 2^n サンプルになることはほとんどありません。したがって、プロセス ルーチンの開始時に、現在のウェーブを出力バッファにコピーする前に、まず前のウェーブからサンプルをコピーします。

再生成プロセスによって DSP プロセス ルーチンが中断されるのは望ましくないため、更新された波形を別のメモリ ロケーションに作成し、準備ができたらコピーします。

ADSR エンベロープ (減算方式) は、波自体に影響を与えるのではなく、波が生成された後に移動ゲイン係数として適用する必要があります。

それが役立つことを願っています:)

于 2012-11-03T19:17:50.783 に答える