2010-11-21 12 views
1

私は学校の卒業プロジェクトにデジタルシンセをプログラムしなければなりません。一般的にシンセサイザーに関する理論の大部分を知っていますが、プログラミングの初心者であることを告白する必要があります。 タイトルに記載されているように、私はC言語でそれを行う必要があります。 これを行う最も簡単な方法はウェーブテーブルオシレータを使用しているようですが、ADSRエンベロープの基礎としてランプ波を使用することもできます。 しかし、私はそれが正しいピッチであることを確認する方法がわかりません。インクリメント・カウンタを変更することによって、オシレータの相対ピッチを変更するのは簡単ですが、オシレータの絶対ピッチをどのように決定するのですか?Cの簡易ウェーブテーブルオシレーター

J.Midtgaard

答えて

4

は、あなたが生産しているオーディオストリームのsample rateを知っておく必要があります。あなたのサンプルレートがFSあり、そしてあなたがFの周波数とトーンを生成しようとしている場合は、サンプルfのすべてのFS/を完全なサイクル(周期)を生成する必要があります。また、すべてのオーディオサンプルで、f/fsを1サイクル進める必要があります。あなたのウェーブテーブルは完全なサイクルを表現するためにNのエントリを持っているのであれば、あなたはnで進める必要がある * /F FS音声サンプルあたりエントリー。例えば

は、 = 44.1kHzの、 = 1kHz時、N = 1024 F FSのために、あなたの増分は×1000 44100分の1024 =サンプルあたり23.22エントリでなければなりません。

通常、整数以外の増分値を取得することに注意してください。正しい音程を得るために、この値を丸めることはできません。代わりに、アキュムレータ値をテーブルインデックス値に変換するときにのみ丸めます。 (より複雑なアプローチは、エントリ間の補間の一種です。)