Q. 関数表記された音を、SynthDefに書きかえたいのですがどうしたら???
Example > Demonstrations > SC2-examples_1の”bowed string”を書きたいです。
A. 解読できれば難しくはないですよ。やってみましょう。
1. 解読:音源
まずは、一番元になっている、音源をつくっているUGenがどれかを見つけてみましょう。
* UGen … UnitGenerator, オーディオ処理を行うクラス。オシレータやフィルターなどがそれにあたる。
お題のコードでメインになっていそうなUGenは、BrownNoiseの行とKlankの行のどちらかかな、と見当がつきますね。BrownNoiseは、その名前の通りブラウンノイズを生成するクラスです(ホワイトノイズより高周波の削れた、柔らかなザッーー、というノイズを出します)。次のKlankは、名前からはどんな機能があるのかが想像しづらいですね。ヘルプを見てみると、bank of resonatorとあり、オーディオ入力を必要としています。これは入力された音のレゾナンス成分を強調したりするフィルター的なものです。そこから、BrownNoiseが基本的なオシレーターでKlankはフィルターのようなものだと解ります。
2. 解読:変数
今度は、1で見つけた音源にどのような変数があるかを調べてみましょう。BrownNoiseには変数が使われていませんが、Klankにはfreqという名前の変数が使われていますね。上の方にあるroot, scaleといった変数は、最終的にfreqの値を設定する為につかわれている変数です。
3. 仕様を考えてみる。
SynthDefをかけたときに、どのようにそれを使いたいかを考えておきます。周波数と音量を指定し、特定のトリガーがきたときに音が鳴り、再度トリガーがきたら音を止める、という至要にしましょう。なので、指定したい値(ここでは周波数と音量)をアーギュメントとすることとエンヴェロープが必要ですね。
4. ではSynthDefをかいてみましょう。
まずは、外枠を書き、
SynthDef(\bow_strings, {|freq = 440, amp = 0.5, trig = 0|
xxxxx おとをいれる
})
中心と成る音源をいれて、
SynthDef(\bow_strings, {|freq = 440, amp = 0.5, trig = 0|
var exc, sound;
exc = BrownNoise.ar([0.007,0.007]) * max(0, LFNoise1.kr(exprand(0.125,0.5), 0.6, 0.4));
sound = (Klank.ar(`[
Array.series(12, freq, freq),
Array.geom(12,1,rrand(0.7,0.9)),
Array.fill(12, {rrand(1.0,3.0)})
], exc) * 0.1).softclip;
})
アウトプットを付け加えて、
SynthDef(\bow_strings, {|freq = 440, amp = 0.5, trig = 0|
var exc, sound;
exc = BrownNoise.ar([0.007,0.007]) * max(0, LFNoise1.kr(exprand(0.125,0.5), 0.6, 0.4));
sound = (Klank.ar(`[
Array.series(12, freq, freq),
Array.geom(12,1,rrand(0.7,0.9)),
Array.fill(12, {rrand(1.0,3.0)})
], exc) * 0.1).softclip;
Out.ar(0, sound)
}).play
音が鳴る様になりました。が、
このままだと音が自動的になったり消えたりするので、
音量をコントロールしているmax(0, LFNoise1 ….. の部分を
エンベロープにおきかえよう。
SynthDef(\bow_strings, {arg freq = 440, amp = 0.5, gate = 0;
var exc, sound;
exc = BrownNoise.ar([0.007,0.007]) * EnvGen.kr(Env.adsr, gate);
sound = (Klank.ar(`[
Array.series(12, freq, freq),
Array.geom(12,1,rrand(0.7,0.9)),
Array.fill(12, {rrand(1.0,3.0)})
], exc) * 0.1).softclip;
Out.ar(0, sound)
}).store;
a = Synth(\bow_strings, [\freq, 220]);
a.set(\gate, 1); // gateオン
a.set(\gate, 0); // gateオフ
a.free;
Posted: 7月 10th, 2009 under SCしつもん箱.
Comments: 1