SCしつもん箱

スケール、チューニング。

ScaleやTuningクラスには豊富なメソッドが用意されていて、簡単にスケールやチューニングを変えられるのは、SCの大きな特徴のひとつだと思っていたけれど、あまり有名な話しではないのかな…

s.boot;

(
// シンプルなサイン波の音色を定義
SynthDef(”simpleSine”,
 {arg freq=400, out=0, releaseT=0.3, amp=0.8;
 var source;
 source = SinOsc.ar(freq) * EnvGen.ar(Env.perc(0.0001, releaseT, 1, -6), doneAction:2) * amp;
 Out.ar(out, source);
}).store;
)
////////////////////////////////////////////
// スケールは、Scaleクラス
////////////////////////////////////////////

(// 通常の12平均律、長音階
Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, Scale.major,
\dur, 0.5,
\octave, 6,
\root, 0
).play;
)

(
// 通常の12平均律、普通の自然的短音階
Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, Scale.minor,
\dur, 0.5,
\octave, 6,
\root, 0
).play;
)

////////////////////////////////////////////
// チューニングは、Tunignクラス
////////////////////////////////////////////

// Tuningの違いが聞き取りづらいので、
// 2つのパターンを同時に動作させている。

(
// 同じパターン
Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, Scale.major,
\dur, 0.5,
\octave, 6,
\root, 0
).play;

Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, Scale.major,
\dur, 0.5,
\octave, 6,
\root, 0
).play;
)

////////////////////////////////////////////

(
// ひとつのパターンをヴェルクマイスターチューニングにする。
// ずれが聴こえる。
t = Tuning.werckmeister;
~scale = Scale.major(t);

Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, ~scale, 
\dur, 0.5,
\octave, 6,
\root, 0
).play;

Pbind(
\instrument,\simpleSine,
\degree, Pseq([0,1,2,3,4,5,6,7],inf),
\scale, Scale.major,
\dur, 0.5,
\octave, 6,
\root, 0
).play;
)

////////////////////////////////////////////

沢山のスケールやチューニング用のメソッドが用意されているので、
下記を参照する。

// cmd-J to see scale and tuning dictionaries in full
ScaleInfo
TuningInfo

SCしつもん箱04 : Q. こういう音楽はどうやってSCでやっているのですか?

(youtubeコメント欄より)
Q. こういう音楽はどうやってSCでやっているのですか?

A. コード(chord)とコード(code)で書いています。私はあまり作曲しないのですが、この曲の場合は、ピアノを弾きながら、和音と主旋律をつくり、それをSuperColliderのプログラミングコードで記述しています。ピアノを弾いている時点で大体の曲想はあるので、音色と音符は一緒に記述します。その後、主旋律を壊して行って(SuperColliderはそういうことが得意なのです。具体的には、Pseqで書いたものをPrandやPshufに置き換えて行きます)、副旋律などをでつくります。

以前のコードでお恥ずかしいのですが(プログラミングの参考にはしないでください!)、ここに全コードをアップロードしておきます。SCを持っていないひとのためにキャプチャしたサウンドファイルも置いておきます。

ちなみにSuperColliderのコード、というのは、こんな感じです、はい。

SynthDef(\pad_tremoro, { arg i_out, freq = 360, gate = 1, pan = 0.0, amp = 0.1, attack = 1.0, sustain = 2.0, releaseTime = 1.0;
var out, eg, fc, osc, a, b, w;
fc = LinExp.kr(LFNoise1.kr(Rand(0.25,0.3)), -1,1,500,2000);
// fc = 20000;
osc = Mix.fill(2, {SinOsc.ar(freq * [Rand(0.99,1.01),Rand(0.99,1.01)], 0, amp) }) .distort* 0.2 ;
// eg = EnvGen.kr(Env.perc(attack, releaseTime, 1, -4), gate, doneAction:2) * LFSaw.kr(Line.kr(1,10,2),0, 0.5, 0.5);
eg = EnvGen.kr(Env.perc(attack, releaseTime, 1, -4), gate, doneAction:2) * LFSaw.kr(Line.kr(1,10,2),0, 0.5, 0.5);
out = eg * RLPF.ar(osc, fc, 0.1);
#a, b = out;
Out.ar(i_out, Mix.ar(PanAz.ar(2, [a, b], [pan, pan+0.3])));
}).store;

SCしつもん箱03 :SynthDefを書く

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;

SCしつもん箱02 :メインのボリュームをコントロールする。

ひさびさに普通の記事でも書くことにしましょう。

Make magazineの日本版ブログで、CraftwifeのnewアイテムであるLEDネクタイを紹介していただきました(ありがとうございます)。Youtubeで公開しているデモビデオで、LEDはレベルメーターのように見えたり、パッパッ、と明滅したりしていますが、これはすべてSuperColliderでコントロール(プログラミング)しているものです。それぞれのLEDを独立して扱えるので(明るさもリニアに変えられます)、自由な発想でピカピカできるのです。ピカッ。

再来週末、23,24日のMakeTokyoMeeting03に出演予定なので、実際のピカピカ物をご覧になりたいみなさん、よかったら遊びに来てくださいね。会場は東京の八王子で、全イベント入場無料です。

 

ところで、SCで演奏することをかんがえると、あれこれとしたいことが増えるもの。あぁ、曲の最後はフェードアウトしたい、とか。そんなときは、Volumeクラスが便利みたいです。これでシンセ・サーバーの全体の音量にアクセスすることができます。サーバーパネルについている音量スライダーと同じですね。ヘルプファイルより:

 

v = s.volume; //変数vにヴォリュームを割り当てる

v.min; // vの範囲の最小値を求める

v.max; // 同じく最大値

v.volume = rrand(-50, 5); // ヴォリュームをセットする。単純に値を指定したい場合は次のとおり:

v.volume = -10; // ボリュームを-10dBにする

v.setVolumeRange(-90, 8); // ボリュームの範囲を変える

v.mute; // ミュート

v.unmute; // ミュート解除

SCしつもん箱01 : addとmul

きょうは、SCなみなさんからいただいた質問に答えてみたいと思います。
www.supercollider.jpのフォーラムも活用してみてね。

質問:
ヘルプをみていると、
> Saw.ar(freq, mul, add)

というのをよく見かけるのですが、mulとaddって何ですか?
mulはボリュームみたいですが、何の略ですか?
addもなんだかよく解りません。

お答え:
mul は、multiply (かけ算)、addは、addition(たし算)です。

詳しくは図参照で。

mul = 音量と考えやすいと思うんだけど、
なぜaddが重要かと言うと、たとえばSine波をピョーピョーとしたいとき、

{SinOsc.ar(800, 0, 1)}.play // 普通のサイン波

>> 音程を800Hzから1400Hzまで変化させたい

SinOsc.ar(2, 0, 600, 0)  // 波形の出力 -600から600までになる
SinOsc.ar(2, 0, 600, 800) // 波形の出力200から1400までになる、addで足し算

// その波形をサインオシレータの周波数に適応する
{SinOsc.ar(SinOsc.ar(1, 0, 600, 800), 0, 1)}.play 

と言う訳です。わかったかな?

Get Adobe Flash playerPlugin by wpburn.com wordpress themes