見出し画像

03.フィルター(SuperCollider)

信号の流れ


今回はノコギリ波にフィルターをかけます。
一般的なシンセでいうと、こんな感じの信号の流れをイメージしますよね。

音源をフィルターに通す

SuperColliderも同じで、フィルターしたい音をフィルターのインプットに入れ込みます。

Class(クラス)


その前にちょっと前置きです。
前回、「大文字で始まっているものは、SuperColliderが扱う”部品”」と書きました。
この”部品”のことを、SuperColliderでは”Class(クラス)”と呼びます。

クラスは、何かの機能を持った部品です。指示を受けることでその機能通りの働きをします。
Sawというクラス(部品)はar(オーディオレイト)という指示を受けることでノコギリ波を生成する機能を持っているので、これまで以下のようにしてノコギリ波を生成していました。

Saw.ar(音程, 音量)

さて本題です。
今日は音をフィルターする機能を持ったクラスを紹介します。
LPF
BPF
HPF
RLPF
などです。(他にもたくさん種類があります。)
大文字で始まっているので、これらはクラスです。

※SuperColliderにコードを書くと自動的に色が変わる部分がありますね。クラスは青文字で入力されます。これまで紹介したSawやSinOscやLFPulseも青文字になっていたはずです。

シンセをいじったことがある人なら、このクラス名を見ただけで大体の機能を予想できますよね。(予想できなくても全然問題はありません。)

今日はRLPFを使っていくつか実験をしたいと思います。
RLPFはレゾナンス付きローパスフィルターです。
頭のRはResonanceのRです。

method(メソッド)


フィルターを使う前に、もうひとつ書いておきたい用語があります。
前回、「ドットに続いて小文字で始まるものは”部品”に送る”指示”」と書きました。
この”指示”を”method(メソッド)”と呼びます。

arやplayがそれです。

arメソッドは、Sawクラスなどにオーディオ信号を生成させる指示ができ
playメソッドは、{波カッコ}に対して再生させる指示ができました。

今日は新しいメソッドを紹介します。

dupです。

このメソッドはduplicateの略で「複製せよ」と指示します。
(日常で何かコピーするとき「データをデュプる」とか言いません?・・・そのデュプです。・・・言わない?)

Saw.ar(220, 0.3).dup(2)

↑生成したノコギリ波を複製。
(カッコ)内の2は「2個に複製」ってことです。

これを{波カッコ}に入れてplayさせてみます。

{ Saw.ar(220, 0.3).dup(2) }.play;

今まで左スピーカーからしか出ていなかった音が右スピーカーにも複製されました。

plotでも確認できます。

{ Saw.ar(220, 0.3).dup(2) }.plot;

このメソッドはよく使うので、もっとシンプルな書き方が用意されています。

{ Saw.ar(220, 0.3)!2 }.play;

!2で.dup(2)と同じ働きをします。僕はいつも!2の書き方を使っています。

RLPF


さて話をフィルターに戻します。
SuperColliderに
RLPF
と書いてcommand+dしてみましょう。ヘルプブラウザを見ます。

少しスクロールダウンしてClass Methodsの項目を確認します。

RLPF

RLPF.arは、5個のパラメータを持っていることがわかります。

in:ここにフィルターかけたい信号を入れます。(今日はノコギリ波)
freq:カットオフ周波数(どのくらい高い成分をカットするかの値)
rq:レゾナンス(0〜1で、0に近くほどレゾナンスが強い)
mul:音量
add:振幅に加算する値(そんなパラメータがあるんだな、くらいで今はよいです)

早速コードを書いてみます。

{ RLPF.ar(in, 1000, 0.1, 0.3) }.play;

こんな形です。サイン波やノコギリ波を鳴らしたときとなんら形は変わりません。
カットオフ周波数を1kHz、レゾナンスを0.1、音量を0.3にしてみました。
このインプットのところに今日はノコギリ波を入れます。
入れるノコギリ波は、いつものこれ。

Saw.ar(220, 0.3)

あ、今日からこれ。
Saw.ar(220, 0.3)!2

入れ方は、上記{ RLPF.ar(in, 1000, 0.1, 0.3 )}.play;の、inのところにそのままノコギリ波を入れればOKです。

{ RLPF.ar(Saw.ar(220, 0.3)!2, 1000, 0.1, 0.3 )}.play;

実行してみてください。(この行にカーソルを持ってきてcommand+enter)フィルターされた音が鳴りました。

一度音を止めて(コマンド&ピリオド)、
カットオフ周波数を800とか400、2000とかに変えて実験してみましょう。音が変化します。(上限はたぶん20000くらいです。数値が小さいほど、こもった音になるのではないでしょうか。ただ、2桁くらいの小さい値にするとレゾナンスが効いたクセのある音になると思います。)

時間経過とともに変化


これだけだとすぐに飽きてきそうなので、もうひとつ別のクラスを試します。

Line

です。
このクラスは「数値を時間変化させる機能」を持っています。これを使うと、フィルターのカットオフ周波数を「○秒間かけて20から2000に変化させる」みたいなことができます。

SuperColliderにLineと書いてcommand+dします。
ヘルプのClass Methodsを確認。

Line

今日はmull, add, doneActionのパラメータはデフォルトのままにしておいて、start, end, durだけを使って実験します。

start:開始時の数値
end:終了時の数値
dur:経過させる時間です。

Line.ar(20, 2000, 3.0)
↑こう書くと「3秒間かけて20から2000に変化」という設定になります。
これを、さきほどのコードのカットオフ周波数のパラメータにあてがいます。

{ RLPF.ar(Saw.ar(220, 0.3)!2, 1000, 0.1, 0.3 )}.play;
※このコードの1000のところをLine.ar(20, 2000, 3.0)に変更

{ RLPF.ar(Saw.ar(220, 0.3)!2, Line.ar(20, 2000, 3.0), 0.1, 0.3 )}.play;

どうでしょう。僕個人的にはシンセらしい音色になってきた印象があります。

ところで今はLineクラスをカットオフ周波数に使いましたが、どこにでも使うことができます。例えばノコギリ波のピッチにも。

上記コードだと、ノコギリ波のピッチは220Hzで固定ですね。
それを、3秒かけて440Hzまで上げてみます。
Lineのパラメータは↓このとおり。
Line.ar(220, 440, 3.0)
これをSaw.ar(220, 0.3)の、220のところにあてがうと、

{ RLPF.ar(Saw.ar(Line.ar(220, 440, 3.0), 0.3)!2, Line.ar(20, 2000, 3.0), 0.1, 0.3 )}.play;

フィルターが開くのと同時にピッチも上がります。
ピッチを逆に下げるには?
Line.ar(440, 220, 3.0)
こんなパラメータにすればOKです。もちろん3.0秒にこだわる必要はありません。0.5秒でも、10秒でも、設定可能です。

スペースと改行とtab、コメント


ちょっと話はそれるのですが、SuperColliderは「スペース」と「改行」と「tab」をスルーします。
どういうことかというと、下記のようにコード内に改行を入れてもこの3行を選択して実行すれば音は鳴りますし、

{ Saw
.ar(220, 0.3)!2 }
.play;

また、下記のようにいくらスペースを入れても

{     Saw.ar(220,     0.3)     }    .play;

やはり音を鳴らしてくれます。

これは、「僕たちコードを書く人間が、視認性を高めるためにスペースや改行を使える」という、親切な仕様です。

さっき書いたコードがめちゃめちゃ長くなってきたので、ちょっとこの親切仕様の力を借りてコードを見やすくしたいと思います。
最初のRLPFのコードはこうでした。

{ RLPF.ar(Saw.ar(220, 0.3)!2, 1000, 0.1, 0.3 )}.play;

この時点で結構長いコードなので、見やすくなりそうなところに改行を入れます。

{ RLPF.ar(
	Saw.ar(220, 0.3)!2,
	1000,
	0.1,
	0.3 )}.play;

パラメータごとに改行を入れてみました。あとtabも入れてます。
これだと、Sawがインプットで1000がカットオフ周波数、のように見た目にわかりやすいです。

さっきの実験ではカットオフ周波数とSawのピッチにLineクラスを使ったので、それらを書き込んでみます。

{ RLPF.ar(
	Saw.ar(Line.ar(220, 440, 3.0), 0.3)!2,
	Line.ar(20, 2000, 3.0),
	0.1,
	0.3 )}.play;

これでずいぶん見やすくなった、、、ですよね。
これを実行するときは、5行全部を選択してcommand+enterします。


マウスでコントロール


コードが見やすくなったところで、クラスをもうひとつ紹介します。
こちらのコードを実行してみてください。(全部の行を選択してcommand+enter)

{ RLPF.ar(
	Saw.ar(220, 0.3)!2,
	MouseY.kr(20, 2000),
	0.1,
	0.3 )}.play;

Lineクラスの代わりにMouseYクラスを使っています。
音の再生中にマウスを(クリックしない状態で)自由に動かすと、カットオフ周波数が変化して音質が変わります。

これはMouseYクラスの機能です。このクラスを使うと、マウス位置によって出力する数値を変化させることができます。(正確には、マウスカーソルがmacのディスプレイの"縦位置"のどこにあるかを数値に変換する機能。)

書き方はこんな感じです。

MouseY.kr(最小値, 最大値)

最小と最大は便宜的にそう書いてはありますが、MouseY.kr(1000, 50)とかのように大小の値を逆転してもかまいません。

それと、メソッドがarではなくkrであるところに注意です。
MouseYはarの指示を受けず、そのかわりkrの指示を受けます。
krはコントロールレイトの略ですが、詳細の説明は次回することにします。

**[追記]**
すみません!次回krの説明をしませんでした。
06.エンベロープの回で触れています。
*******


縦位置があるってことは横位置もあります。

MouseX

です。

同じ感じで、ノコギリ波のピッチにMouseX使ってみたのが次のコードです。
実行してみてください。

{ RLPF.ar(
	Saw.ar(MouseX.kr(110, 880), 0.3)!2,
	MouseY.kr(20, 2000),
	0.1,
	0.3 )}.play;

マウスを(クリックしない状態で)グルグル自由に動かすとピッチとフィルターが変化して面白いです。

今日はこんなところで終わります。
数値を変えてみたり、他の実験もやってみてください。

今日のまとめ

・大文字で始まっているものはクラス
・ドット+小文字、の小文字部分はメソッド
・RLPFはレゾナンス付きLowPassFilter
・Lineは数値の時間変化を作るクラス
・MouseX(MouseY)はマウス位置を数値に変換するクラス
・MouseX(MouseY)はkrメソッドの指示を受ける
・SuperColliderはスペース、改行、tabをスルーする

<目次へ>
https://note.com/sc3/n/nb08177c4c011


いいなと思ったら応援しよう!