前回オシレーターの読み込みクラスに周波数変調ができるような改修をしました。今回はこれを使って音を出したいと思います。
確認内容
モジュレータによる影響度をはかるために以下のふた通りのパターンで音出しをします。
- モジュレーターの周波数は変えずに出力を少しずつ上げていく
- モジュレーターの出力を変えずに周波数を少しずつ上げていく
実装内容
タイムラインを作成します。
TimeLine tl = new TimeLine();
1番目のサンプルを作ります。まずモジュレーターを定義します。周波数は5Hz、出力は最初は0で6秒後に20になるようにします。
//modulator1 DoubleMap freqMod1 = new DoubleMap(5); DoubleMap envMod1 = new DoubleMap(0); envMod1.putSecondValue(6, 20);
1番目のモジュレーターを作成します
OscillatorReader modulator1 = new OscillatorReader(new SineOscillator(), freqMod1, envMod1, 6);
音を出すオシレーターを定義します。変調をかけるオシレーターをモジュレーターと呼ぶのに対して実際に音を出すオシレーターはキャリアと呼びます。こちらは周波数500Hzで音量は1のまま変わりません。
DoubleMap freq1 = new DoubleMap(500); DoubleMap env1 = new DoubleMap(1); tl.addReadable(0, new OscillatorReader(new SineOscillator(), freq1, env1, 6, new SoundReadable[]{modulator1}));
これで最初のサンプルができました。0秒目から6秒間音がなるようになっています。次に2番目のサンプルを作ります。こちらは周波数が1Hzから始まって6秒後に20Hzになるようにしています。出力は10のまま買えません。
//modulator2 DoubleMap freqMod2 = new DoubleMap(1); freqMod2.putSecondValue(6, 20); DoubleMap envMod2 = new DoubleMap(10);
2番目のオシレーターを作ります。
OscillatorReader modulator2 = new OscillatorReader(new SineOscillator(), freqMod2, envMod2, 6);
2番目のキャリアも1番目と全く同じです。7秒目から6秒間音を出します。
DoubleMap freq2 = new DoubleMap(500); DoubleMap env2 = new DoubleMap(1); tl.addReadable(7, new OscillatorReader(new SineOscillator(), freq2, env2, 6, new SoundReadable[]{modulator2}));
最後に書き出します。
WavFileWriter.create(tl, new File("wav/lfo.wav"));
実行結果
できた音を聞いて見ます。最初のサンプルはビブラートの速さは変わらずにより深くかかるようになっています。2番目はビブラートの深さはそのままで早くなっています。