ビブラート
音を伸ばしているときに音高を連続的に揺らすことをビブラートという。オシレータの周波数をLFOで変調するとこの効果が得られる。マニュアルにはblackholeを使った次のプログラムが載っている。
SinOsc s => dac; SinOsc lfo => blackhole; 5 => lfo.freq; while (20::ms => now){ ( lfo.last() * 10 ) + 440 => s.freq; }
でも、実はオシレータの.syncというパラメータを使うと全く同じことが別の書き方で実現できる。(12月22日追記:うっかり全く同じと書いてしまったけど、上と下のコードでは周波数が実際に変化する頻度、つまりビブラートのかかり方のなめらかさが違う。上では20ミリ秒ごとに周波数を更新するのに対して、下ではサンプリング周期ごとに変化する。下のコードの「20::ms」という周期そのものには意味がない。)
SinOsc lfo => SinOsc s => dac; 5 => lfo.freq; 10 => lfo.gain; 440 => s.freq; 2 => s.sync; // FM while(20::ms => now);
lfoとsを直接つないでいるため、lfoの出力はそのままsに入る。この入力をどう扱うか決めるのが.syncで、2に設定するとsの周波数を変調するのに使われる。
どっちの方法が良いのか知らないけど、わざわざ専用のパラメータを用意してあるくらいだから.syncの方を使えってことなのか? マニュアルは未整備で詳細が書いてない。