この記事は、環境が Mac OSX El Catain、
OSX版 SuperCollider Versioni 3.7 がインストールされていて、
さらにこちらのYoppa先生の記事を元に
Jack 及び GHC の環境が準備できていて、
Tidal と Dirt のインストールが済んでいる状態を前提としています。
SuperDirt は Dirt サンプラーの SuperCollider バージョンと考えていいと思います。
https://github.com/musikinformatik/SuperDirt
Tidal で生成したパターンによって SuperCollider のシンセを鳴らすことができます。
SC3.7より正式に動くようになったようで早速試してみました。
Dirt のようにサンプラーのように音源ファイルの再生はもちろん、
自分で定義したシンセを鳴らしたり、エフェクターを自分でデザインしたり、Dirt からの信号にさらにポストプロセスを加えたりなど自由度の高い使い方ができそうです(その代わりシステム自体が複雑になりそう)
##インストール
リポジトリの Readme.md にある手順通りに進めていきます。設定などは若干手をくわてありますが、基本コードをコピペしました。
SuperCollider のパッケージマネージャー 'Quarks' よりインストール可能です。
SuperCollider IDE よりコマンドを実行しましょう。
Quarks.install("SuperDirt");
また、プレーンDirt と同じサンプルのセットも配布されていましたのでそちらも一緒にインストールしておきます。そうすることで Dirt の時とほぼ同じ Tidal のコードで演奏を始められるでしょう。
Quarks.install("Dirt-Samples");
##エディタの設定
Taidal用のエディタは自分の場合 vim-tidal という tmux プラグインをインストールしました。
エディタにはだいたい、起動時にTidalのコンテキストを初期化するコードがあるので、vim-tidalの場合
~/.vim/bundle/vim-tidal/BootTidal.hss
というファイルに書いてあるので、こちらを SuperDirt用に書き換えます。
Atomの場合はパッケージのソースコードに lib/BootTidal.hs というファイルがあると思うので
(おそらく~/.atom/packages/tidal/lib/BootTidal.hs というファイルがあるはず)
そちらを編集していきます。
自分の場合、以下のようになりました。
:set prompt ""
:module Sound.Tidal.Context
(cps, getNow) <- bpsUtils
-- (d1,t1) <- dirtSetters getNow
-- (d2,t2) <- dirtSetters getNow
-- (d3,t3) <- dirtSetters getNow
-- (d4,t4) <- dirtSetters getNow
-- (d5,t5) <- dirtSetters getNow
-- (d6,t6) <- dirtSetters getNow
-- (d7,t7) <- dirtSetters getNow
-- (d8,t8) <- dirtSetters getNow
-- (d9,t9) <- dirtSetters getNow
-- (d10,t10) <- dirtSetters getNow
-- SuperDirt settings
(d1, t1) <- superDirtSetters getNow
(d2, t2) <- superDirtSetters getNow
(d3, t3) <- superDirtSetters getNow
(d4, t4) <- superDirtSetters getNow
(d5, t5) <- superDirtSetters getNow
(d6, t6) <- superDirtSetters getNow
(d7, t7) <- superDirtSetters getNow
(d8, t8) <- superDirtSetters getNow
(d9, t9) <- superDirtSetters getNow
(d10,t10) <- superDirtSetters getNow
let bps x = cps (x/2)
let hush = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9,d10]
let solo = (>>) hush
:set prompt "tidal> "
-- でコメントアウトしてあるのが編集前のコードの部分。d1/t1 ~ d10/t10 までのサイクルの割り当てを superDirtSetters に置き換えています。
##SuperColliderの設定
SuperCollider側では SCSynth サーバ 起動前に設定をして SuperDirt オブジェクトをインスタンス化してスタートさせ、サンプルの読み込みなどを行います。
StartSuperDirt.sc のようなファイルに書いておいてロードするのもいいでしょう。
自分の場合以下のようになりました。
(
// サーバの設定: ハードウエアの設定などある場合ここでします。
// http://doc.sccode.org/Classes/ServerOptions.html を参照。
s.options.numBuffers = 1024 * 128; // 読み込むサンプルの数が多い場合はここを増やします。多めにしました。
s.options.memSize = 8192 * 32; // "alloc failed"メッセージがよく出るならここを増やします。ここも多めにしました。
s.options.maxNodes = 1024 * 64; // 処理落ちや"too many nodes"メッセージが出るようであればここを増やします。多めにしました。
s.options.numOutputBusChannels = 2; // ハードウエアのアウトプットチャンネルが多い場合はここで設定します。
s.options.numInputBusChannels = 2; // ハードウエアのインプットチャンネルが多い場合はここで設定します。
// サーバをブートしSuperDirtをスタートします。
s.latency_(0.3); // グレイン時に処理が追いつかないことが割と発生したのでレイテンシ遅めにしてみた
s.waitForBoot {
~dirt = SuperDirt(2, s); // 2アウトプットチャンネル、もしそれ以上のチャンネルパンニングが必要であればここを増やします。
~dirt.loadSoundFiles; // サンプルのロード (パスが設定できます。 エディタにフォルダをドロップして入力できます)
s.sync; // サンプルの読み込みを待ちます。
~dirt.start(57120, [0, 0]); // 57120ポートをリッスンします、2つのバスを作りそれぞれオーディオ信号を0チャンネルに送ります。
}
)
もし音のサンプルセットをカスタムで追加したい場合、 ~dirt オブジェクトに loadSoundFiles メソッドに引数が用意されているので、自分のパスを読み込むことができます。一度読み込んでおけば samples 関数から同じように文字列で呼び出すことができるようになります。
~dirt.loadSoundFiles(Platform.resourceDir++"/sounds/superdirt", "wav"); //カスタムサンプルのロードパスを設定します。リソースパスのsoundsにサンプルセットを置いてみました。
これで準備は完了です。
あとは Jackd を起動後エディタ側で Tidal を起動しコードをインラインで実行していきましょう。
(ちなみに Jackd は手元のスピーカーで鳴らす必要がないので -d coreaudio オプションではなく -d netone オプションで起動しました。こちらでも問題なく Tidal 起動すると思います)
$ jackd -d netone
今回はここまでです。
後々SynthDefの追加やエフェクターの拡張などについて書いて行ければと思います。