Skip to content

Instantly share code, notes, and snippets.

@tado
Created February 27, 2026 01:16
Show Gist options
  • Select an option

  • Save tado/66b507e0555cd237ea5939c7dffa2eba to your computer and use it in GitHub Desktop.

Select an option

Save tado/66b507e0555cd237ea5939c7dffa2eba to your computer and use it in GitHub Desktop.

SuperCollider ライブコーディング作業記録

ファイル: Desktop/test.scd 作業日: 2026-02-27 使用ツール: Claude Code (claude-sonnet-4-6)


作業の概要

SuperCollider の既存シーケンスに対して、以下の作業を順に行った。

  1. SuperSaw ベース SynthDef の追加
  2. ベースシーケンスの追加・音量調整
  3. JITLib による差し替え可能なライブコーディング構成への改造
  4. パーカッション SynthDef とリズムシーケンスの追加
  5. 手動転調への変更

作業ログ

Step 1 — SuperSaw ベースの追加

要求: 減算合成を使用した SuperSaw 的な SynthDef と低音ベースパートを追加する

実装内容:

\superSawBass SynthDef を新規作成。

要素 実装
音源 Array.fill(7, ...) で ±0.9% デチューンした Saw.ar を 7 本生成
ステレオ拡散 Splay.ar で 7ch → 2ch に展開(SuperSaw 的な広がり)
フィルター RLPF(共鳴付きローパスフィルター)
フィルター Env アタック時にカットオフが開いて高域が出る → 減算合成の核心部分
振幅 ADSR エンベロープ

~pBass として Pbind を作成し、マイナースケールの低音域(オクターブ 1〜3)でグルーヴを演奏。


Step 2 — ベース音量の調整

要求: ベースの音量を上げる

変更内容:

// 変更前
\amp, Pseq([0.65, 0.35, 0.3, 0.4, 0.3, 0.65, 0.4, 0.25, 0.3, 0.3], inf)
      * Pwhite(0.85, 1.0)

// 変更後
\amp, Pseq([1.0, 0.65, 0.55, 0.7, 0.55, 1.0, 0.75, 0.5, 0.6, 0.6], inf)
      * Pwhite(0.9, 1.2)

各ステップの amp 値を約 1.5〜2 倍に増加。Pwhite 上限も 1.0 → 1.2 に引き上げた。


Step 3 — JITLib ライブコーディング化

要求: JITLib ドキュメント(https://doc.sccode.org/Overviews/JITLib.html)を参考に、ライブコーディング可能な構成に改造する

調査・設計

JITLib の主要クラスをドキュメントから確認:

  • ProxySpace~ 変数を NodeProxy として管理する環境
  • Ndef — サーバー側シンセの差し替え可能なプロキシ(fadeTime でクロスフェード)
  • Pdef — イベントパターンの差し替え可能なプロキシ(defaultQuant で小節単位同期)
  • Tdef — ルーティンの差し替え可能なプロキシ

設計上の重要な判断

~transposeKey を ProxySpace に push すると NodeProxy 化してしまい整数として使えなくなる問題を発見。解決策として:

  • 転調量を t(SC グローバル変数)として ProxySpace の外に置く
  • ルーティングバスも b(SC グローバル変数)として管理
  • Pfunc({ t }) で各パターンから t を参照

構造の変更

変更前 変更後 効果
Pbind(...).play Pdef(\name, Pbind(...)).play 再評価で差し替え可能
Synth.tail(s, \reverb, ...) Ndef(\reverb, {...}).play 再評価でクロスフェード差し替え
単一の大きなブロック 独立した [0]〜[5] のブロック 個別に再評価可能
Pdef.defaultQuant = 4 4 拍(1 小節)単位で同期切り替え
Ndef(\reverb).fadeTime = 2 2 秒クロスフェードで差し替え

s.sync エラーの修正

[1] ブロックを独立させたことで s.sync が Routine コンテキストを失いエラーが発生:

ERROR: Primitive '_RoutineYield' failed.
RECEIVER: hang

(fork { ... }) でブロックを Routine として実行することで解決した。

// 変更前
(
  SynthDef(...).add;
  s.sync;  // ← Routine 外なのでエラー
  ...
)

// 変更後
(fork {
  SynthDef(...).add;
  s.sync;  // ← fork = Routine なので OK
  ...
})

Step 4 — パーカッションシーケンスの追加

要求: リズムを演奏するシーケンスを追加する

\perc SynthDef:

WhiteNoise → BPF(ピッチ成型)
                  ↘
              XFade2 → Env.perc → Out
                  ↗
           SinOsc(トーン成分)
パラメータ 役割
freq BPF と SinOsc の周波数。高域 = ハイハット、中域 = スネア、低域 = トム
tone -1 = ノイズのみ、+1 = サイン波のみ(XFade2 でミックス)
decay 打の長さ。短い → カッ、長い → ドスン

Pdef(\pRhythm) のリズムパターン:

小節ごとに 3 種のパターンをランダム選択。既存の p3(E(9,16))・p4(E(7,12))とは異なる周期でポリリズム的な絡み合いを生む。

パターン 打数 / 4拍 dur 列
A 6打 [0.75, 0.75, 0.5, 0.75, 0.75, 0.5]
B 5打 [0.5, 0.75, 1.0, 1.0, 0.75]
C 7打 [0.25, 0.5, 0.75, 0.25, 0.5, 0.75, 1.0]

Step 5 — 自動転調から手動転調への変更

要求: 自動転調をやめ、コードを評価することで転調するようにする

変更内容:

Tdef(\mod) による 32 拍ごとの自動転調を削除。代わりに、転調コマンドの一覧を追加した。

t = 0;    // ルートに戻す
t = 2;    // 長2度上(D)
t = 5;    // 完全4度上(F)
t = 7;    // 完全5度上(G)
t = rrand(-12, 12).postln;  // ランダム転調

t を書き換えて評価するだけで、Pfunc({ t }) を使っている全パターンの次のノートから即時反映される。


最終的なコードの構造

ファイル構成

[Server.killAll]  ← 必要に応じて個別評価

[0] ProxySpace 初期化   ← 最初に一度だけ評価
[1] SynthDef・バス・Ndef ← [0] の後に一度評価(fork で Routine 実行)
[2] Pdef(\p3)           ← 演奏中に何度でも再評価可能
[3] Pdef(\p4)           ← 演奏中に何度でも再評価可能
[4] Pdef(\pBass)        ← 演奏中に何度でも再評価可能
[5] Pdef(\pRhythm)      ← 演奏中に何度でも再評価可能

[転調コマンド]          ← 1行ずつ選択して評価
[停止コマンド]          ← 1行ずつ選択して評価

シグナルフロー

\myFM ──────────────┐
\superSawBass ───────┤→ Bus b → Ndef(\reverb) → ハードウェア出力
\perc ───────────────┘

SynthDef 一覧

名前 合成方式 主な特徴
\myFM FM 合成 modIndex エンベロープで倍音が時間変化
\superSawBass 減算合成 7本デチューンノコギリ波 + RLPF
\perc ノイズ合成 BPF + XFade2 で音域・音色を制御
\reverb (Ndef) エフェクト FreeVerb2 ステレオリバーブ(差し替え可能)

Pdef 一覧

名前 音源 リズム スケール
\p3 \myFM E(9,16) ユークリッドリズム クロマチック
\p4 \myFM E(7,12) ユークリッドリズム マイナー
\pBass \superSawBass 6拍グルーヴ マイナー(低音域)
\pRhythm \perc A/B/C パターンをランダム切替

グローバル変数

変数 役割
p ProxySpace JITLib の環境管理
b Bus 楽器 → リバーブへのルーティングバス
t Integer 転調量(半音単位、Pfunc({ t }) で参照)

学んだこと・ハマりポイント

s.sync は Routine 内でしか動作しない

独立したブロック ( ... ) では Routine コンテキストがないため s.sync がエラーになる。(fork { ... }) で解決。

ProxySpace と通常変数の共存

ProxySpace.push 後は ~ 変数が NodeProxy になる。整数を保持したい変数(転調量 t、バス b)はシングルレター SC グローバルに置き、ProxySpace に混入させない。

NdefPdef の使い分け

  • Ndef → オーディオレートの UGen チェーン(リバーブなど)。fadeTime でクロスフェード。
  • Pdef → イベントパターン(Pbind)。defaultQuant で小節単位の差し替え。

Prand([Pseq([...], 1), ...], inf) パターン

Prand の各要素を Pseq(..., 1)(1回使い切り)にすると、小節単位でランダムにパターンを選んで使い切る構造を作れる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment