SuperColliderを使って(意識の高い)キックをWOMBのスピーカーで流す

先日開催されたSuperCollider Workshop at WOMB LOUNGEに参加してきました。
内容はかなり濃く、SuperColliderで出来ることを筆頭に外部アプリケーションとの連携や通信を使った講義もあり充実した内容になっていました。
音を鳴らすことから始まり、音の加工やシンセを作りループで再生、シーケンスを作ったりと駆け足ではありましたが出来ることを洗いながらお腹いっぱいな内容でした。
OSCを使ったProcessingやMax/MSPとの通信は初心者にとってはかなり踏み込んだ話しだったのではないかと感じています。
個人的にはインスタレーションやメディアアートと言った分野で非常に有効な手段であると考えているのでワクワクしながら講義をうけていました。

 

五日目最終日には受講者によるSuperColliderを使った発表がありもちろん私も参加しました。
皆さんそれぞれSuperColliderを使ったユニークな音や曲を発表し、幅の広い発表会だったと感じています。
そんな中、私は「どうやったら面白い発表が少しでも出来るだろうか?」 と考え、
せっかくなら普段鳴らすことのできないクラブのスピーカーでキックを鳴らそう!と思い立ったわけです。

 

なのでキックしか作りませんでした。


(
  SynthDef(\SinKick, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      SinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 1)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

  SynthDef(\SawKick, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      Saw.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 1)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

  SynthDef(\FSinKick, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 1)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

  SynthDef(\SquareKick, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 1, 1)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//distortion

  SynthDef(\FSinKick_dist, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 1).distort * Line.kr(2, 0, 0.9)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+noise

  SynthDef(\FSinKick_noise, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 1).distort * Line.kr(2, 0, 0.9)
      + LFNoise0.ar(freq * 6, 0.01, amp)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ saw

  SynthDef(\FSinKick_saw, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 6, 0.01, amp)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ square

  SynthDef(\FSinKick_square, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.5)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 6, 0.01, amp)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ high

  SynthDef(\FSinKick_high, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.1)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 8, 0.01, 0.05)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ high++

  SynthDef(\FSinKick_high_saw, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Saw.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.2, 2), 0.5, 0.05).distort * Line.kr(-2, 0, 0.5)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.1)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 8, 0.01, 0.05)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ release

  SynthDef(\FSinKick_release, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Saw.ar(EnvGen.kr(Env.adsr(0, 0.5, 0, 0, 1, -20), gate, freq, 0, 0.2, 2), 0.5, 0.005).distort * Line.kr(-2, 0, 0.5)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.1)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 8, 0.01, 0.05)
      * EnvGen.kr(Env.perc(0, 0.3, 1, 8));
    );
    Out.ar(0, source);
  }).store;

//+ noise

  SynthDef(\FSinKick_noise2, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.5).distort * Line.kr(2, 0, 0.9)
      + Saw.ar(EnvGen.kr(Env.adsr(0, 0.5, 0, 0, 1, -20), gate, freq, 0, 0.2, 2), 0.5, 0.005).distort * Line.kr(-2, 0, 0.5)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.1)
      + LFNoise0.ar(EnvGen.kr(Env.perc(0, 20, 1, 100)), 1, 1)
      * EnvGen.kr(Env.perc(0, 0.1, 1, 12));
    );
    Out.ar(0, source);
  }).store;

//+ Kick!!!!!!

  SynthDef(\FSinKick_last, {
    arg freq = 440, gate = 0.1, amp = 0.5, source, pan = 0.0;
    source = Pan2.ar(
      FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 1, 0.1).distort * Line.kr(2, 0, 0.9)
      + FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq / 2, 0, 0.5, 2), 1, 0.1).distort * Line.kr(2, 0, 0.9)
      + FSinOsc.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq * 2, 0, 0.5, 2), 1, 0.05).distort * Line.kr(2, 0, 0.9)
      + Saw.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.2, 2), 0.5, 0.05).distort * Line.kr(-2, 0, 0.5)
      + Pulse.ar(EnvGen.kr(Env.adsr(0, 1, 0, 0, 1, -20), gate, freq, 0, 0.5, 2), 0.5, 0.03, 0.1)
      + Saw.ar(freq * 2, 0.0025, 0.25)
      + LFNoise0.ar(freq * 8, 0.005, 0.05)
      * EnvGen.kr(Env.perc(0, 0.12, 1, 8));
    );
    Out.ar(0, source);
  }).store;
)

 

~sinKick = Synth(\SinKick);
~sawKick = Synth(\SawKick);
~fsinKick = Synth(\FSinKick);
~aquareKick = Synth(\SquareKick);
~distKick = Synth(\FSinKick_dist);
~noiseKick = Synth(\FSinKick_noise);
~saw2Kick = Synth(\FSinKick_saw);
~square2Kick = Synth(\FSinKick_square);
~highKick = Synth(\FSinKick_high);
~highSawKick = Synth(\FSinKick_high_saw);
~releaseKick = Synth(\FSinKick_release);
~noise2Kick = Synth(\FSinKick_noise2);
~lastKick = Synth(\FSinKick_last);

 

SinやSawでとりあえずそれっぽい音を作り、それに重ねていく形でコーディング。
ただSuperColliderの知識が足りないので、高音域にSawやNoiseを重ねてなんとなくで作るという形で進めました。
抜けが悪いから高音域、中音域に追加しつつ余韻が足りないからReleaseを伸ばしたりと、DAWであればサンプリングしたキックをEQで加工していくところをコードで書くことがとても難しく、どうやったら再現できるのだろうかというところはとても楽しく作ることができました。

ただ満足にいくものが出来ていないので、原理や出力、SuperColliderの機能を理解してまた挑みたいと思ってます。

※発表の最後に、参考としてみんな大好きVengeanceのキックを鳴らしましたがやっぱり良かったです。

preload preload preload