ならば

音とかで遊んでいたログ

LFOとblackhole

PDFのマニュアルにある「ChucK Tutorials LFOs and Blackhole」を読めば変調のやり方が分かる。下手に再構成するよりそのままのほうが多分分かりやすいから、適当な訳を載せる。文中のUgenはユニットジェネレータのこと。

LFOとblackhole
by Adam Tindale
音響合成に変化を加える一般的なテクニックのひとつに変調というのがある。変調とは、周波数のような信号のパラメータなんかを変える処理である。低周波オシレータ(LFO)は変化のスピードが速すぎず遅すぎずちょうどいい感じだから変調にはよく使われる。速いスピード、たとえば20Hz以上で信号を変調すると変化を加えるというよりは音色を変えた感じになってしまう。

それじゃオシレータを二個用意して、片方でもう一方のパラメータを変調してみる。ChucKではUgenの信号出力をパラメータの入力につなぐことはできない。下のコードだとダメ。

SinOsc s => dac;
SinOsc lfo => s.freq;

だから適当な頻度でlfoから出力されるデータを取ってこなきゃいけない。とりあえず今回は20ミリ秒ごとにsの周波数を変える。SinOscは-1から1の間で振動するから、これを直接sの周波数に突っ込んでも何も聴こえない。というわけでlfoの出力を十倍してそれに440を足すことにする。つまり周波数は430から450の間で振動する。

SinOsc s => dac;
SinOsc lfo;

// lfoの周波数をセット
5 => lfo.freq;

while (20::ms => now){
    ( lfo.last() * 10 ) + 440 => s.freq;
}

ChucKこのやろ、動かねーよ。なぜか?
Ugenはいろいろと接続されて、普通はdacまで行き着く。コードがコンパイルされるとChucKは何がdacまでつながってるのか確かめる。そしてサンプリングごとにUgenの全体のつながりを調べて次のデータをつかまえてくる。今の場合、lfodacにつなぎたくないけど、でもlfoの出力するデータは欲しい。こういうときはサンプリングデータを吸い取るblackholeを使えばいい。lfoをblackholeにつないでやればうまくいく。

SinOsc lfo => blackhole;

このコードをいじって、lfoの出力データを取ってくる頻度やlfoの周波数、変化の量を変えてみると面白い。Ugenを変えてみるのもいい。

実行するとわうわういう音が鳴る。短い文章でも内容は詰まってるし、音の変化があってしかも簡単に改変できるから実行して楽しめる良いチュートリアルだ。なのになんでこれをLearningに載せてないんだー。せめて続きはPDFの方も見ろよ、とか書いておいて欲しい。もったいないよ。
PDFに気付くのが遅れた愚痴はこの辺にしてちょっと補足を。lfoから出力されるデータを取ってくるのに使っているlastは読み取り専用のfloat型パラメータで、そのユニットジェネレータで最後に計算されたサンプリングデータを取得できる。lastはgainやopと同じように全てのユニットジェネレータにある。

何を変調するかによって、周波数変調(Frequency Modulation)、振幅変調Amplitude Modulation)、位相変調(Phase Modulation)と呼ぶ。だから上のコードでやってるのはFM。変化のスピードが速すぎると音色が変わるということだけど、これはこれで音色を作り出すのに使われているらしい。FM音源。ChucKにもFM音源を基にしたユニットジェネレータが何種類か用意されている。

ちなみに変調は音に変化を加える用途だけでなく、情報を伝送させることなどにも使われている。FMラジオやAMラジオはその応用例。