ファイル: Desktop/test.scd
作業日: 2026-02-27
使用ツール: Claude Code (claude-sonnet-4-6)
SuperCollider の既存シーケンスに対して、以下の作業を順に行った。
- SuperSaw ベース SynthDef の追加
- ベースシーケンスの追加・音量調整
- JITLib による差し替え可能なライブコーディング構成への改造
- パーカッション SynthDef とリズムシーケンスの追加
- 手動転調への変更
要求: 減算合成を使用した SuperSaw 的な SynthDef と低音ベースパートを追加する
実装内容:
\superSawBass SynthDef を新規作成。
| 要素 | 実装 |
|---|---|
| 音源 | Array.fill(7, ...) で ±0.9% デチューンした Saw.ar を 7 本生成 |
| ステレオ拡散 | Splay.ar で 7ch → 2ch に展開(SuperSaw 的な広がり) |
| フィルター | RLPF(共鳴付きローパスフィルター) |
| フィルター Env | アタック時にカットオフが開いて高域が出る → 減算合成の核心部分 |
| 振幅 | ADSR エンベロープ |
~pBass として Pbind を作成し、マイナースケールの低音域(オクターブ 1〜3)でグルーヴを演奏。
要求: ベースの音量を上げる
変更内容:
// 変更前
\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 に引き上げた。
要求: 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 秒クロスフェードで差し替え |
[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
...
})要求: リズムを演奏するシーケンスを追加する
\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] |
要求: 自動転調をやめ、コードを評価することで転調するようにする
変更内容:
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 ───────────────┘
| 名前 | 合成方式 | 主な特徴 |
|---|---|---|
\myFM |
FM 合成 | modIndex エンベロープで倍音が時間変化 |
\superSawBass |
減算合成 | 7本デチューンノコギリ波 + RLPF |
\perc |
ノイズ合成 | BPF + XFade2 で音域・音色を制御 |
\reverb (Ndef) |
エフェクト | FreeVerb2 ステレオリバーブ(差し替え可能) |
| 名前 | 音源 | リズム | スケール |
|---|---|---|---|
\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 }) で参照) |
独立したブロック ( ... ) では Routine コンテキストがないため s.sync がエラーになる。(fork { ... }) で解決。
ProxySpace.push 後は ~ 変数が NodeProxy になる。整数を保持したい変数(転調量 t、バス b)はシングルレター SC グローバルに置き、ProxySpace に混入させない。
Ndef→ オーディオレートの UGen チェーン(リバーブなど)。fadeTimeでクロスフェード。Pdef→ イベントパターン(Pbind)。defaultQuantで小節単位の差し替え。
Prand の各要素を Pseq(..., 1)(1回使い切り)にすると、小節単位でランダムにパターンを選んで使い切る構造を作れる。