アルゴリズミック作曲
「メロディは思いつかないけど、ルールは書ける」——そんな作曲スタイルに skulpton は向いています。スケール/ユークリッドリズム/確率分布/LFO といったプリミティブを組み合わせて、コードから音楽を生成 するワークフローを作ります。
基本原則 — 「種」と「変奏」
Section titled “基本原則 — 「種」と「変奏」”アルゴリズミック作曲では、1 つの種コード を元に多数のバリエーションを派生させると効率的です。
- クリップに種となるコードを書く(例: スケール + ユークリッド + 適度な揺らぎ)
- クリップを Cmd/Ctrl + D で複製
- 複製先で シードや係数を 1 行だけ変える
- それぞれをタイムラインに並べて、構成を作る
複製は非破壊なので、ノートの差分を一切手動で書く必要がありません。
例 1 — シードで派生を作る
Section titled “例 1 — シードで派生を作る”seed() で乱数を固定すれば、毎回同じ結果が返ります。シード文字列だけ変えれば違うバリエーションが手に入ります。
seed("verse-1"); // ← ここを "verse-2" や "chorus" にconst sc = scale("dorian", 60);onBeat((b) => { if (chance(0.5) && Math.abs((b * 2) % 1) < 1e-6) { setNote({ pitch: pick(sc), startBeat: b, lengthBeats: 0.5 }); }});1 つのクリップを複製して
"verse-1"/"verse-2"/"chorus"と書き換えるだけで、整合性のある別フレーズが 3 つできます。
例 2 — ユークリッドリズムでパートを分ける
Section titled “例 2 — ユークリッドリズムでパートを分ける”3 トラック × 異なるユークリッド比で、対話的なリズムを組みます。
// Track 1(パーカッション)const pat = euclid(5, 16);onBeat((b) => { const i = Math.floor(b * 4); if (pat[i % pat.length]) noteOn(60, 0.25, 90, b);});
// Track 2(ベース) ── euclid(3, 16) に変える// Track 3(リード) ── euclid(7, 16) に変える異なる比率(5/16, 3/16, 7/16)が 互いに少しずつズレながらループ することでリズムの重なりが生まれます。
例 3 — 時間方向に密度を変える(ビルドアップ)
Section titled “例 3 — 時間方向に密度を変える(ビルドアップ)”1 クリップ内で「徐々に賑やかになる」を作るのは recipes に既出 ですが、ライブやアウトロでも便利です。
const sc = scale("pentaMinor", 60);onBeat((b) => { const density = b / CLIP_LENGTH; // 0..1 if (chance(density)) { setNote({ pitch: pick(sc), startBeat: b, lengthBeats: 0.25 }); }});例 4 — 入力ノートを「素材」として使う
Section titled “例 4 — 入力ノートを「素材」として使う”手で打ち込んだ短いリフを 素材 として、コードがそれを変形します。
// 入力: シンプルな 4 音メロディ// 出力: 各ノートを min7 コードに展開 + 5 度上のハモリonNote((n) => { chord("min7", n.pitch).forEach((p) => { setNote({ pitch: p, velocity: n.velocity, startBeat: n.startBeat, lengthBeats: n.lengthBeats, }); }); setNote({ ...n, pitch: n.pitch + 7, velocity: Math.round(n.velocity * 0.6) });});「手作業の音楽性 + コードの広がり」 を組み合わせるパターン。
自作 helper を共有する
Section titled “自作 helper を共有する”繰り返し使うパターン(4 つ打ちドラムや特定のスケール処理)は、{appData}/libs/codes/ に .js として置くと 全プロジェクト から呼べます。
- ファイルブラウザの App libs/codes で
+→myhelpers.js function houseDrums(b) { ... }と関数を書いて保存- App libs のチェックを ON
- クリップから
houseDrums(b)を直接呼べる
詳しくは ファイルブラウザ と coding Note Effect の概要 を参照。
トラックごとに役割を分ける
Section titled “トラックごとに役割を分ける”1 つのプロジェクトを「役割別の小さなジェネレータの集合」として捉えるとスケールします。
| トラック | 役割 | 使うパターン |
|---|---|---|
| Drums | 基本リズム | euclid + noteOn |
| Bass | ルート進行 | chord + transpose |
| Pad | 和声背景 | chord("maj9", root) を保持 |
| Lead | 旋律的揺らぎ | drunk または urn(scale.length) |
| Mod | 音色変化 | setCc + lfo |
各トラックを独立した小さなコードで動かし、組み合わせ全体で曲を作ります。
イテレーションのコツ
Section titled “イテレーションのコツ”- シード文字列をコメントに残す — 後で再現できる
- 同じ曲に「実験用クリップ」を 1 つ置く — 本線に影響せずに試せる
- クリップ名を「役割 + バリエーション番号」に — 「Bass A」「Bass B variant」など
- 生成結果を確認するときは Render タブ — Code タブで書いて Render タブで結果を見る、を素早く往復
- coding Note Effect の概要
- パターン集(レシピ)
- 音楽ヘルパー / 数値ヘルパー
- ライフサイクル — フックの実行順
- ファイルブラウザ — libs/codes の運用