波の合成

前回のエントリで書いたユーティリティをちょっといじって新しいルールを追加してサイン波を合成させた。

  • Waveクラスは加算をオーバーロードする。2つのWaveクラスa,bの加算はオーディオフレームの添字をiとしてc_i = (a_i + b_i) / 2とする。1/2しているのは加算結果がwavデータで扱える数値を超えないようにするため。
  • SilentInitクラスはWaveInitクラスの派生クラスで、全てのオーディオフレームを無音(ビット深度が8bitなら128,16bitなら0)で初期化する。

この新しいルールによって、Waveクラスのシーケンスに対してsum関数で合成波が得られる。

info = WaveInfo(1, 16, 44100, 44100)
wavs = (Wave(info, SinWaveInit(hz)) for hz in lst)
comp = sum(wavs, Wave(info, SilentInit())) # 合成波

2つの波の合成

周波数1000Hz,2000Hzの2つの波を合成した。

3つの波の合成

周波数262,330,392Hzの3つの波を合成した。ドミソの3つの音の和音。

サイン波のうねり

周波数1000と1100のサイン波を合成した。近い周波数の合成だと波がうねる。 

サイン波と矩形波の合成

周波数100のサイン波と1000の矩形波を合成した。