🎵

SuperColliderでLive Coding!- オシレーター編 -

に公開

前回の記事ではSuperColliderの基本的な構文を学びました。
今回は、音作りの根幹となるオシレーターに焦点を当て、コードを通してその魅力的な世界を探求していきましょう。

オシレーターとは?

オシレーターは、電気的な振動を生成し、シンセサイザーの音の源となる重要な要素です。SuperColliderには様々な種類のオシレーターがあり、シンプルなサイン波から複雑な波形まで、多様なサウンドを生み出すことができます。

コードの実行と停止方法

この記事のコード例はSuperCollider IDE上で実行できます。
コードを選択し Shift + Enter (Windows/Linux) または Cmd + Return (Mac) で実行します。音を停止するには Ctrl + . (Windows/Linux) または Cmd + . (Mac) を押します。

基本的なオシレーター

シンプルなオシレーター

まずは、SuperColliderでよく使われる基本的なオシレーターを見てみましょう。

  • SinOsc: 純粋なサイン波を生成します。
{ SinOsc.ar(440, 0, 0.2) }.play;
  • Saw: 鋸歯状波を生成します。
{ Saw.ar(220, 0.1) }.play;
  • Pulse: 矩形波を生成します。
{ Pulse.ar(880, 0.5, 0.15) }.play;

ステレオ出力の方法

コードを実行すると、スピーカーの片方(モノラル)でしか音が出力されていなかったと思いますが、ステレオにするには以下の方法があります。

!複製演算子使用

{ SinOsc.ar(440, 0, 0.1) ! 2 }.play;

モノラル出力を左右のチャンネルに複製します。

Pan2使用

{ Pan2.ar(SinOsc.ar(440, 0, 0.1), 0) }.play;

信号をステレオ空間の任意の位置に配置します。

配列によるチャンネル指定

{ SinOsc.ar(440, 0, [0.1, 0.15]) }.play;

振幅を左右チャンネルで異なる値に設定してステレオ出力します。

チャンネルについて

SuperCollider におけるオーディオ信号は、一つ以上のチャンネルを持つことができます。
一般的なステレオ再生では、左チャンネルと右チャンネルの2つのチャンネルを使用します。

SinOsc.ar(440, 0, 0.1) のように.ar で作成された多くの UGen は、デフォルトではモノラル、つまり1つのチャンネルの信号を出力します。
!2という記述は、このモノラル信号を2つのチャンネルに複製し、ステレオとして出力する簡単な方法です。

ノイズ・オシレーター

ランダムな信号を生成するオシレーターです。

  • WhiteNoise: 全周波数帯域で均一なエネルギーを持つノイズ。
{ WhiteNoise.ar(0.1) }.play;
  • PinkNoise: 低域にエネルギーが多いノイズ。
{ PinkNoise.ar(0.1) }.play;
  • BrownNoise: さらに低域にエネルギーが多いノイズ。
{ BrownNoise.ar(0.1) }.play;
  • LFNoise (LFNoise0, LFNoise1, LFNoise2): コントロールレートで動作する低周波ノイズジェネレーター。主に他の UGen のパラメーターをランダムに変化させるために使用します。
(
{
    var baseFreq = 440;
    var freqMod = LFNoise1.kr(5, 200);
    var finalFreq = baseFreq + freqMod;
    SinOsc.ar(finalFreq, 0, 0.1);
}.play;
)

ウェーブテーブル・オシレーター

波形テーブル(配列)をバッファから読み出し音を生成します。

(
{
    var size = 256;
    var bfs = Buffer.alloc(s, size);
    var sig = Signal.newClear(size);
    var wave = sig.waveFill({ |x, old, i| sin(2pi * i / size) });
    bfs.loadCollection(wave);
    Osc.ar(bfs, 440, mul: 0.2);
}.play;
)

他にもこんな変わったオシレーターが

SuperColliderには、これまで紹介した基本的なオシレーター以外にも、ユニークなサウンドを生み出すための様々なオシレーターが用意されています。

  • Formant:
    フォルマント合成を行うための UGen です。人間の声のようなサウンドや、共鳴感のあるサウンドを作り出すのに適しています。周波数だけでなく、フォルマントの中心周波数や帯域幅などを制御できます。
{ Formant.ar(freq: 220, formantFreq: 800, formantWidth: 100, amp: 0.1) }.play;
  • Klang:
    複数のサイン波の周波数、振幅、位相を個別に制御することで、複雑なサウンドを作り出すための UGen です。共鳴音やベルのような音色、あるいはより複雑なスペクトルを持つサウンドを合成するのに適しています。
{ Klang.ar(`[ [800, 1000, 1200], [0.3, 0.3, 0.3], [pi, pi, pi]], 1, 0) * 0.4}.play
  • SyncSaw:
    鋸歯状波でのオシレーターシングを行うための UGen です。特徴的な歪みのサウンドを生み出すことができます。
{ SyncSaw.ar([220, 222], MouseX.kr(60, 1800), 0.2) }.play;

UGenとは

UGen(ユニットジェネレーター)はSuperColliderにおける音響処理の基本要素です。
オシレーター、フィルター、エンベロープ、エフェクトなど、音作りと加工に必要な機能を提供します。UGenを組み合わせることで複雑な音響システムを構築できます。
.playを実行するまで、UGenの組み合わせは音として出力されません。

ar(オーディオレート)と kr(コントロールレート)の違い

UGenには処理速度を示すレートがあります。

  • ar オーディオレート: オーディオ信号を処理する速度。可聴域の周波数に対応。音そのものの生成や直接的な音響処理に使用。
  • kr コントロールレート: オーディオレートより低い速度。主に音のパラメーターを時間的に変化させるために使用。

音声合成の世界

基本的なオシレーターと UGen の概念を理解したところで、より複雑な音声合成のテクニックを見ていきましょう。

FMシンセシス

あるオシレーター(モジュレーター)の出力で別のオシレーター(キャリア)の周波数を変調させ、複雑な倍音成分を持つサウンドを生み出します。

(
{
    var carrierFreq = 440;
    var modulatorFreq = 1440;
    var modulatorIndex = 1000;
    var modulator = SinOsc.ar(modulatorFreq) * modulatorIndex;
    var carrier = SinOsc.ar(carrierFreq + modulator, 0, 0.1);
    carrier;
}.play;
)

リングモジュレーション

2つの入力信号を掛け合わせることで、元の信号にはなかった新たな周波数成分を生み出します。

(
{
    var carrierFreq = 80;
    var modulatorFreq = 440;
    var carrier = SinOsc.ar(carrierFreq, 0);
    var modulator = SinOsc.ar(modulatorFreq, 0, 0.2);
    var ring = carrier * modulator;
    ring;
}.play;
)

グラニュラーシンセシス

短いオーディオの断片(グレイン)を大量に重ね合わせ、テクスチャのようなサウンドを生み出します。

(
{
    var trig = Impulse.kr(4);
    var freq = Rand(10, 800);
    var modFreq = Rand(100, 1200);
    var index = Rand(1, 20);
    var dur = 0.2;
    GrainFM.ar(2, trig, dur, freq, modFreq, index, 0.2);
}.play;
)

まとめ

今回はSuperColliderにおけるオシレーターの基礎から応用までを解説しました。SuperColliderには他にも様々なオシレーターや音声合成手法が用意されています。これらの知識を足がかりに、様々なオシレーターやテクニックをお試しください!

というか、解説することが多いのでLiveCodingまで道は長いです...

Discussion