ホワイトノイズで音程を作る
ホワイトノイズを使った音色でメロディーを奏でると独特な雰囲気を出せるので、その手法について、僕なりの2種類のやり方を紹介します。
完成形はこんな感じです。(タイトルにはホワイトノイズと書いておきながら、ブラウンノイズを使っています・・・)
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = BrownNoise.ar(0.5)!2;
sig = BPF.ar(sig, freq, 0.02);
Out.ar(0, sig * env);
}).add;
Pbind(
\instrument, \noisetone,
\midinote, Pseq([66, 73, 71, 64], inf),
\dur, 2,
\sustain, 1
).play;
)
command + B
でブートサーバしたとに、このコードを実行(SuperColliderにコピペしてコード内のどこかをクリックしてcommand + return)してみてください。
見ての通り、ノイズをバンドパスフィルターに通しているだけなので、ここでわざわざ書かなくても一般的なDAWやソフトシンセでも使える手法です。ですが、SuperColliderのいいところは、フィルターの周波数を外から(Pbindから)コントロールできるところです。
何をやっているのか、簡単に順を追って書いておきます。
ex1は、単にホワイトノイズを再生するコードです。
//ex1 ホワイトノイズをプレイ。
{WhiteNoise.ar(0.1)!2}.play;
FreqScopeで周波数を見えるようにしておくと視覚的にもよく見ることができますが、低い帯域から高い帯域までまんべんなく音が詰まっています。
FreqScope.new;
このあとフィルターを通したいので、コードの見た目をシンプルにしたく、変数を使ってかきなおしておきます。(内容的にはex1と全く同じです。)
//ex2 変数(var)を使って書き換え。(意味はex1と同じ。)
(
{
var sig;
sig = WhiteNoise.ar(0.1)!2;
}.play;
)
さて、バンドパスフィルターは、特定の周波数近辺だけを通すフィルターです。
SuperColliderではBPFというクラスで実現できますので、ex2のホワイトノイズをBPFに通します。
それがex3です。
//ex3 ホワイトノイズをバンドパスフィルターに通す。
(
{
var sig;
sig = WhiteNoise.ar(0.3)!2;
sig = BPF.ar(sig, 880, 0.1);
}.play;
)
Ex3を実行してみると、音色が変わってますね。
FreqScopeで周波数を見てもわかります。
BPFクラスのパラメータを確認しておきます。
BPF.ar(880, 0.1)の、880はフィルターを通す中心周波数です。
※880はおおよそ、ドレミファソラの「ラ」の音程のあたりです。
BPF.ar(880, 0.1)の、0.1は、フィルターを「きつくかけるか、ゆるくかけるか」の数値です。
0に近いほどきつく、1に近づくほど"かかり"がゆるくなります。
//ex4 バンドパスフィルターをきつめにかける。(0.01にした。)
(
{
var sig;
sig = WhiteNoise.ar(0.5)!2;
sig = BPF.ar(sig, 880, 0.01);
}.play;
)
ホワイトノイズはサイン波の集合体なので、バンドパスフィルターをきつめにかければかけるほど、音色がサイン波に近づいていきます。(中心周波数近辺のサイン波以外がフィルターされる)
この音をPbindでコントロールしたい(メロディーを奏でたい)ので、SynthDefにそのまま入れます。
※フィルターのかかり具合は、僕の好みで0.02にしてみました。
//ex5 SynthDefで書き直して、エンベロープを加えた。
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = WhiteNoise.ar(0.6)!2;
sig = BPF.ar(sig, freq, 0.02);
Out.ar(0, sig * env);
}).add;
)
このとき、BPFの中心周波数をargに登録しておくのがポイントです。
Pbindから音程の指示を受けて、指示を受けるたびに中心周波数を変えてくれます。
また、ゲートで音符をオン/オフしたいので、エンベロープも書き加えています。
これを実行したあと、ex6のPbindを実行すれば、Pbindに書かれたmidinoteに沿ってメロディーを奏でます。
//ex6
(
Pbind(
\instrument, \noisetone,
\midinote, Pseq([66, 73, 71, 64], inf),
\dur, 2,
\sustain, 1
).play;
)
WhiteNoiseの部分をいろんなノイズに書き換えることも可能です。
僕はBrownNoiseが綺麗に聴こえるとおもったので、最終的にBrownNoiseに落ち着きました。
それがex7のSynthDefであり、一番最初に紹介したコードと同じ状態です。
//ex7 BrownNoiseに変更
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = BrownNoise.ar(0.6)!2;
sig = BPF.ar(sig, freq, 0.02);
Out.ar(0, sig * env);
}).add;
)
ノイズと音源の掛け算
ノイズと音源を掛け算することでも、似たような効果を得ることができますので、紹介します。
この企画のとき、僕はその手法を使いました。
フィルターは使わないので、こちらのやり方だとノイズのキャラクターが色濃く出ます。
//ex8 掛け算する方法。フィルターしないので音量が大きいためノイズ音量を小さくしてます。(0.1)
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = BrownNoise.ar(0.1)!2;
sig = sig * SinOsc.ar(freq);
Out.ar(0, sig * env);
}).add;
)
ex6のPbindで再生できますが、オクターブ上げたほうが良さそうなので、音源側でオクターブ上げます。
//ex9 オクターブ上げ
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = BrownNoise.ar(0.1)!2;
sig = sig * SinOsc.ar(freq * 2);
Out.ar(0, sig * env);
}).add;
)
※参考:Freqを2倍するとオクターブ上になります。4倍すると2オクターブ上に。(逆に0.5掛けるとオクターブ下がります。)
ちょっとノイジーすぎるように思えますが、リバーブをかけると結構それが味になったり、この方法の良いところは掛け算する音源によってキャラが変わるところです。
ex9ではSinOscを使っていますが、LFTriなどもぜひ試してみてください。
ただ、Sawのような倍音が多いものより、倍音少なめのもののほうが良い効果が出やすいのではないかと思います。
この企画のときはFormantという音源を掛け算しました。
これもなかなか味がある音色だと思います。
//ex10 掛け算する音源にFormantを使用
(
SynthDef(\noisetone, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.adsr(0.5, 0.6, 0.4, 1), gate, doneAction:2);
sig = BrownNoise.ar(0.1)!2;
sig = sig * Formant.ar(freq * 2, freq * 2, freq * 2);
Out.ar(0, sig * env);
}).add;
)
今日は以上です。
<目次へ>
https://note.com/sc3/n/nb08177c4c011