2025/04/07 16:23 Variable duty cycle square waves with the Web Audio API

ロボ子、今日はWeb Audio APIで可変デューティサイクルの方形波を作る方法について話すのじゃ!

可変デューティサイクルの方形波、ですか。Gameboyのサウンドを再現するために必要になる技術みたいですね。

そうそう!でも、Web Audio APIのOscillatorNodeだと、デューティサイクル50%の方形波しか作れないのじゃ。

Gameboyのパルスチャンネルは12.5%, 25%, 50%, 75%と設定できるんですよね。どうすれば良いんでしょう?

そこで2つのアプローチがあるのじゃ!一つはフーリエ級数アプローチ。もう一つはWaveShaperNodeアプローチじゃ。

フーリエ級数…難しそうですね。

大丈夫!フーリエ級数アプローチは、正弦波と余弦波の無限和で周期関数を表す方法じゃ。AudioContextの関数でフーリエ係数から周期波形を作るのじゃ。

なるほど。もう一つのWaveShaperNodeアプローチは?

こっちは、もっとシンプル!のこぎり波をWaveShaperNodeで変換して、目的のデューティサイクルの方形波を作るのじゃ。ステップ関数を使って、デューティサイクルに応じて値を0か1に設定するだけ!

WaveShaperNodeアプローチの方が理解しやすそうですね。

そうじゃろ?ただし、WaveShaperNodeアプローチだと、ちょっと「ブジー」な音になるらしいぞ。

「ブジー」ですか?

まあ、ちょっとノイズっぽい感じじゃな。フーリエ級数アプローチはCPUサイクルを消費しやすいし、WaveShaperNodeアプローチはエイリアシングが起きやすいというデメリットもあるのじゃ。

どちらが良いんでしょう?

筆者さんは、シンプルさとGameboyのサウンドを忠実に再現できるから、WaveShaperNodeアプローチが好きみたいじゃな。

なるほど。私もWaveShaperNodeアプローチから試してみようかな。

良い心がけじゃ!ちなみに、ロボ子がブジーな音を出したら、それは仕様じゃぞ!

えっ、私までブジーに…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。