見出し画像

非プログラマーなトラックメーカー向けライブコーディング講座#4 - Superdirtの詳細設定

前回#3

今回はTidalcyclesをさらに効率よく効果的に使えるように、SupercolliderとSuperdirtを細かく設定して環境を整えます。

Supercolliderのスタートアップファイル

Supercolliderを起動するたびに毎回SuperDirt.start;するのはめんどくさいです。Supercolliderにはstartup.scdという起動時に自動で読み込むファイルがあり、そこにスクリプトを書き込むことで起動時設定を自動化できます。

startup.scdはSupercolliderのファイルメニューからFile - Open startup fileで開けます。ここにSuperDirt.start; を書き込んで保存すると、Supercolliderを立ち上げたときに自動的にSuperdirtが読み込まれます。

Superdirtの詳細設定

SuperDirt.start;は全てのオーディオパラメータが初期状態で起動します。Tidalcyclesを更に効果的に使うには、PCの性能やオーディオインターフェースの仕様といった環境に合わせた詳細な設定が必要です。

以下にコンフィギュレーション用初期スクリプトを用意しました。ダブルスラッシュ(//)はコメントアウト。 

(
s.options.device = "device name here";
// 1. オーディオハードウェアの選択。"device name here"にハードウェア名を入力。

s.options.sampleRate = 44100;
// 2. サンプリング周波数。ハイレゾ音源を取り込むなどの特殊な作業以外は44100Hzをおすすめします。

// 以下メモリ量の場合は全てキロバイト単位。

s.options.numBuffers = 1024 * 128;
// 3. グローバルサンプルバッファ用のメモリ領域。

s.options.memSize = 8192 * 32;
// 4. サーバーのメモリの割り当て容量。'exception in real time: alloc failed'エラーが出る場合は増やす。

s.options.numWireBufs = 64;
// 5.連結バッファサイズ。'exceeded number of interconnect buffers'メッセージが出る場合は増やす。

s.options.maxNodes = 1024 * 32;
// 6. サーバー内の最大ノード数。ドロップアウトや 'to many node'エラーが出る場合は増やす。

s.options.numOutputBusChannels = 2;
// 7. ハードウェアのアウトプットチャンネル数。

s.options.numInputBusChannels = 2;
// 7. ハードウェアのインプットチャンネル数。

s.latency_(0.3);
// 8. lateメッセージが出る場合は増やす。

s.waitForBoot {
 ~dirt = SuperDirt(2, s);
 // 9. 1つのチャンネルののアウトプット数。通常のステレオ/チャンネル仕様は2のままで。

 ~dirt.loadSoundFiles;
 // 10. サンプルのロードコマンド。ここでカスタムサンプルフォルダを追加設定できる。

 s.sync;
// サンプルの読み込み待ち。

 ~dirt.start(57120, [00]);
 // 11. superdirtを57120ポート開放で起動。[a1,a2,..,an]でチャンネルをアウトプットに割り当てます。
}
)

まずこのコードをそのままカラのstartup.scdにコピペしてください。ここから詳細を詰めていきます。

Supercolliderのヘルプ、Superdirtのドキュメントの2つを基に解説していきますが、結構難解なので自分の説明が間違っているかもしれません。自分はこれで問題なく使えているので、各自の環境に応じて数字を変えてトライしてみてください。

1. オーディオデバイスの選択

Supercolliderは起動時にPCに接続されたオーディオデバイスを自動でリストアップして、初期状態ではプライマリデバイスに勝手に接続します。postウインドウに表示される起動ログに、下記の例のような部分があると思います。

Number of Devices: 2
  0 : "Device name 1"
  1 : "Device name 2"
  
"Device name 1" Input Device
  Streams: 1
     0  channels 2

"Device name 1" Output Device
  Streams: 1
     0  channels 2

この例では"Device name 1"が接続されています。オーディオデバイスに"Device name 2"を使いたい場合は、startup.scd

s.options.device = "Device name 2";
// 1.オーディオハードウェアの選択。"device name here"にハードウェア名を入力。

と書けば、起動時に"Device name 2"が選択されます。

2. サンプリングレート

s.options.sampleRate = 44100;
// 2. サンプリング周波数。ハイレゾ音源を取り込むなどの特殊な作業以外は44100Hzをおすすめします。

​上記の通りで特に面倒なことはありません。オーディオデバイスによっては48kHzが安定することもあるかもしれません。

3. サーバーのバッファ用メモリ領域

s.options.numBuffers = 1024 * 128;
// 3. グローバルサンプルバッファ用のメモリ領域。

Supercolliderのグローバルサンプルバッファと説明があります。メモリサイズを指定することで、superdirtに読み込むwavファイルの容量に合わせて割り当てられます。

4. サーバーのメモリの割り当て容量

s.options.memSize = 8192 * 32;
// 4. サーバーのメモリの割り当て容量。'exception in real time: alloc failed'エラーが出る場合は増やす。

とりあえず初期値のままで試します。もし使っていて'exception in real time: alloc failed'エラーが出るようでしたら、"* 32"の側をエラーが出なくなるまで少しずつ増やしてみます。

5.  連結バッファサイズ

s.options.numWireBufs = 64;
// 5. 連結バッファサイズ。'exceeded number of interconnect buffers'メッセージが出る場合は増やす。

シンセ関数やジェネレータ関数を連結する配線のバッファサイズのようです。Superdirt側の解説では'exception in real time: alloc failed'エラーが出る場合は増やす、と書いてありますが、自分はこのエラーを見たことがないです。ひとまずデフォルトのままで。

6. サーバー内の最大ノード数

s.options.maxNodes = 1024 * 32;
// 6. サーバー内の最大ノード数。ドロップアウトや'to many node'エラーが出る場合は増やす。

ノード数と言われてもピンときませんが、'to many node'エラーが出ない限りは初期値のままでいいと思います。64チャンネルで動かしても出たことがないので、よほどのことがないと出ないとは思います。ドロップアウトが出る場合は増やしてみます。

7. ハードウェアのアウトプット、インプットチャンネル数

s.options.numOutputBusChannels = 2;
// 7. ハードウェアのアウトプットチャンネル数。

s.options.numInputBusChannels = 2;
// 7. ハードウェアのインプットチャンネル数。

一番重要な設定。使ってるオーディオデバイスの入出力チャンネル数に合わせます。当たり前ですがステレオ1系統につき2チャンネルです。例えば8イン8アウトのオーディオIFの場合は値はどちらも8です。(余談ですがTidalcylesはインプットも使えます)

8.  レイテンシー

s.latency_(0.3);
// 8. lateメッセージが出る場合は増やす。

Superdirtのプログラム側のレイテンシーのようです。単位がよくわからん…。混み入ったコードを演奏するとlateメッセージは結構出ます。lateメッセージが出ても出音にあまり変化がなければ無視してもいいです。自分は0.5くらいにしてます。

9. チャンネル毎のアウトプット数

 ~dirt = SuperDirt(2, s);
 // 9. 1つのチャンネルののアウトプット数。通常のステレオ/チャンネル仕様は2のままで。

ここはわかりづらいです。先に書いたハードウェアのアウトプット数とは違います。Superdirtの1チャンネル内のアウトプットの数なので、殆どの場合はステレオトラック、デフォルトの(2, s)で変えません。たとえば5chのマルチチャンネル環境で作業する場合は(5, s)にすると、1つのチャンネル内で#panを使って5系統のアウトに連続的にパンを振れます。

10. サンプルのロード

~dirt.loadSoundFiles;
 // 10. サンプルのロードコマンド。ここでカスタムサンプルフォルダを追加設定できる。

デフォルトではDirtSamplesフォルダ内のwavを読み込みます。それ以外のサンプルフォルダを追加で指定したい場合は、

~dirt.loadSoundFile("/Users/myUserName/Dirt/samples/*");

のようにパスを指定します。DirtSamplesの管理については別の回で詳しく書く予定ですが、自分はDirtSamplesフォルダ内に直接カスタムフォルダを作って管理してて、ここは変えていません。

11. 起動コマンド

 ~dirt.start(57120, [00]);
 // 11f. superdirtを57120ポート開放で起動。[a1,a2,..,an]でチャンネルをアウトプットに割り当てます。

dirt.start;でSuperDirtの起動ですが、引数でSuperdirt内のチャンネルをハードウェアのアウトプットチャンネルに割り当てます。チャンネル番号がゼロ始まりなので気をつけてください。

Tidalcyclesのコードではチャンネルの割当を#orbitで書くんですが、[a1,a2,..,an]の引数の数nがSuperdirt内で用意する#orbit バス数です。引数a1,a2,..,anそれぞれに代入する数字が、割り当て先オーディオデバイスのアウトプットチャンネルの番号です。

例えばTidalcyclesで内部バス4チャンネル(#orbit 0 〜 #orbit 3)を用意して8アウト(4ステレオ)のハードウェアに割り当てたい場合は

~dirt.start(57120, [0, 2, 4, 6]);

と書きます。数字が一つ飛ばしなのは、ステレオのペアで自動的に割り当てられるからです。

自分は64チャンネル(ステレオ32チャンネル)扱ってますが

~dirt.start(57120, [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62]);

こんな状態…一応今は短縮記法があるっぽいんですが、書き直すのも面倒なのでこのままです。

Superdirt内とハードウェアアウトプットがどういう環境かによって引数は全然変わるので、上記を参考に色々試してみてください。

引数の中にある57120はサーバーの受信ポート番号です。特別な場合を除いて変えません。変えると音が出なくなります。

オーディオ環境の切り替え

例えば自宅ではオーディオIF、出先では内蔵など、使うオーディオデバイスを変える場合、毎回s.options.device = ~ を書き換えるのはめんどくさいので、

// s.options.device = "Lynx Hilo";
s.options.device = "Soundflower (64ch)";

両方書いておいて、使わない側のデバイスをコメントアウトすることで切り替えられます。このときアウトプット割当も必要に応じた引数を書いておき、一緒に切り替えます。

// ~dirt.start(57120, [0,2,4,6,8,10,12,14]); // Hilo用チャンネル
~dirt.start(57120, [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62]); // Soundflower用チャンネル

おわりに

パラアウトが出来るようになると格段に音作りが面白くなります。マルチチャンネルのオーディオIFとオーディオミキサーがあれば、パートや帯域別などのステムで分けて出力して、フェーダーを使った直感的なバランス調整ができるし、個別にハードウェアのエフェクターを挟むことも出来ます。

今後解説する予定のDAWとの連携でも、DAWに合わせた設定をすれば16ch.や32ch.といったかなり多チャンネルの情報を、DAWで個別に加工することができます。

MIDIの設定もstartup.scdで行うんですが、それはまた別の回に。

この記事が気に入ったらサポートをしてみませんか?