長い周期の複雑な周期的なサウンドを作成しようとしています。できるだけ正確に周波数を定義したいので、ステップsampleRate*0.5/tableLen
を使用しています。しかし、大きな波テーブルにはいくつか問題があります。音が歪んで高周波が失われます。長い周期の波でカスタムオシレータを作成する
〜440Hzの正弦波を伴う最小限の例です。私は長さ8192でテーブルを使用する場合、得られる正弦波は非常に認識可能である:
https://jsfiddle.net/zxqzntf0/
var gAudioCtx = new AudioContext();
var osc = gAudioCtx.createOscillator();
var tableSize = 8192;
var real = new Float32Array(tableSize);
var imag = new Float32Array(tableSize);
var freq = 440;
var step = gAudioCtx.sampleRate*0.5/tableSize;
real[Math.floor(freq/step)] = 1;
var wave = gAudioCtx.createPeriodicWave(real, imag, {disableNormalization: true});
osc.frequency.value = step;
osc.setPeriodicWave(wave);
osc.connect(gAudioCtx.destination);
osc.start();
しかし、私は私のテーブルのサイズを大きくするとき、私は奇妙な何かを取得しています。結果はまったく正弦波ではありません!
https://jsfiddle.net/0cc75nnm/
この問題は、すべてのブラウザ(クローム、Firefoxの、エッジ)で再現するので、ブラウザのバグではないようです。しかし、私はドキュメントでこれについて何も見つかりませんでした。
を追加しました
私は、発振器の周波数が整数> = 2 Hzであるならば、私はテーブルサイズ16384と音を結果にはどのアーティファクトを持っていないことがわかった私は、それが今の私のニーズのために非常に許容可能だと思います。しかし、いつか私はもっと長い期間を作りたいかもしれません。ステップが2 Hz未満のときに音のアーティファクトを得る理由を誰かが説明してくれれば、私は彼の答えを受け入れるでしょう。
私はJavaScriptで生成する複雑な音のメロディーの例があります:あなたは間違ってあなたの定期的な波を作成している https://jsfiddle.net/h9rfzrnL/1/
範囲400-480 Hzのサイン20、レンジ800-960のサイン40などが必要です。私は440Hzのステップを持っていればできません。単一正弦波は私の問題の最小の例です。 – gammaker
作成したいウェーブの具体的な例は、問題をよりよく説明するのに役立ちます。それでも基本的な考え方は、サンプルレートが1 Hzであるかのようにウェーブを設計することです。次に、オシレーターの周波数を希望の信号のベース周波数に設定します。 –
いくつかの周波数範囲で分布する高調波が必要です。では、周波数400,401、...、480,800,801、...、960,1200,1201、...、1920、... ... ...、... 12800の周波数を持つオシレータをどのように作成できますか? 12801、...、15360?私はそれをすることができません、私はステップ440がある場合、私はステップ1 Hzと非常に大きなテーブルが必要です。少ないステップで良いです。 – gammaker