PyCodeDJ マニュアル

Python コードを書く。保存する。音が変わる。

1. PyCodeDJ とは

PyCodeDJ は Python のソースコードをライブ演奏に変換するツールです。ファイルを AST 解析し、@loop が付いた関数の構造と dj.* のメタ情報を読み取って SuperCollider に OSC を送ります。

from pycodedj import dj, loop

@loop(interval=2.0)
def bass():
    dj.volume = 0.4
    for i in range(8):
        if i % 2 == 0:
            pass

@loop(synth="kick_floor", beat=0.25)
def kick():
    dj.volume = 0.8
    dj.pattern = "x . x ."

関数名がループ名になります。pycodedj eval demo.py::bass のように指定します。

2. インストールと起動

pip install 'pycodedj[watch]'

[watch] を付けると、保存時に自動更新する pycodedj watch が使えます。

SuperCollider IDE で sc/synths.scd を実行し、次の表示を確認します。

PyCodeDJ synths loaded. Ready. OSC port: 57120
pycodedj eval examples/demo.py::bass

低いベース音が鳴れば、Python から SuperCollider へメッセージが届いています。止めるときは pycodedj panic を使います。

3. ループの基本構文

from pycodedj import dj, loop

@loop(interval=1.0)
def loop_name():
    dj.volume = 0.3
    dj.eq = "flat"
    pass
設定意味デフォルト
dj.volume音量。0.0〜1.00.3
dj.cutoffフィルター cutoff の直接指定。200〜4000 HzAST マッピング
dj.reverbリバーブ量の直接指定。0.0〜0.8AST マッピング
dj.eqEQ プリセット"flat"
dj.low/mid/high帯域別 EQ 上書き。0.0〜2.0プリセット値
dj.patternリズムと音程のパターンなし
@loop(interval=0.25)
def hats():
    dj.volume = 0.08
    dj.eq = "edm"
    dj.low = 0.5
    dj.high = 1.25
プリセット傾向
"flat"補正なし
"classic" / "classical"低域と高域を控えめにして中域を少し出す
"jazz"暖かい低域、中域の存在感、少し柔らかい高域
"rock" / "pop"低域と高域を少し上げる
"edm" / "hiphop"低域を強める
"acoustic"低域を控えめにして中高域を少し上げる

4. コード構造マッピング

dj.pattern がないループでは、関数本体の形が音になります。

読み取るもの音楽パラメーター効果
ブロックの最大ネスト深度フィルター cutoff深いほど明るい
if / for / while の数LFO レート多いほど速い
ネストした def の数声部数多いほど厚い
コメント率リバーブコメントが多いほど空間が広い
dj.cutoff / dj.reverbフィルター/リバーブ書いた場合だけ直接上書き

5. dj.pattern でリズムと音程を指定する

@loop(synth="bass_acid", root="A1", scale="minor", beat=0.25)
def bass():
    dj.volume = 0.35
    dj.pattern = "0 . [0 3] ~ 5 . 3 ."
トークン意味
xルート音で鳴らす
.休符
0, 1, ...スケール度数
[0 3]コード
~タイ

dj.pattern = p1 のような変数参照は読み取りません。パターン文字列はループ本体に直接書いてください。

6. 複数ループ

@loop(synth="kick_floor", beat=0.25)
def kick():
    dj.volume = 0.8
    dj.pattern = "x . x ."

@loop(interval=4.0)
def pad():
    dj.volume = 0.08
    # 広い空間
    pass
pycodedj watch examples/demo.py

7. 音色リファレンス

synth= に SuperCollider の音色名を指定します。関数名はループ名のままで、synth= は鳴らす音色だけを選びます。

@loop(synth="bass_acid", root="A1", scale="minor", beat=0.25)
def acid():
    dj.volume = 0.25
    dj.pattern = "0 . 3 . 5 ."

全音色を 1 つずつ試聴:

pycodedj eval examples/sound_showcase.py::kick_floor
pycodedj eval examples/sound_showcase.py::bass_acid
pycodedj eval examples/sound_showcase.py::lead_acid

Kick

音色キャラクター向いている用途
kick_hardタイトでパンチのある短いキック強い頭拍、ミニマルなパターン
kick_floor太い four-on-the-floor キックダンス/テクノ系の主キック
kick_pulse軽めのパルスキック補助的な拍、柔らかいリズム支え
kick_softクリックを抑えた丸いキック柔らかいグルーヴ、静かな展開
kick_909長めの電子的なキックテールハウス/テクノの土台
kick_click立ち上がりが明確な短いキック速いパターン、輪郭が欲しい場面

Bass

音色キャラクター向いている用途
bass_rumble深くゆるい低域の圧力キック下のランブル層
bass_reese横に広がる Reese 系ベース暗いベースライン、持続する動き
bass_subクリーンなサブ低域ルート低音、床を支える音
bass_acidレゾナンスのある 303 風ベースアシッドベースライン、細かいシーケンス
bass_pluck短いプラック系ベースシンコペーションのある低域フック
bass_fm金属感のある FM ベース打楽器的なベースライン
bass_mono素直なモノシンセベース安定したベースフレーズ
bass_wobbleフィルターが揺れるベースダブステップ風の動き、ブレイク

Percussion

音色キャラクター向いている用途
hat_engine短いクローズ/オープンハット感16分グリッド、前に進むノリ
hat_ride長めのオープンハット/ライド感裏拍、持続する高域エネルギー
clap_snap鋭く乾いたクラップ短いアクセント
clap_snareスネア寄りの広いクラップ2拍4拍のバックビート
tom_drumピッチが動くタムフィル、展開、低めの打楽器
snare_roll連打系スネアロール、ビルドアップ
crash_noise長いノイズクラッシュセクション切替、インパクト
rim_shot乾いたリムのアタック隙間のあるシンコペーション
cowbell金属的な2音のヒットクラシックなマシンパーカッション
perc_blip小さな音程付きブリップミニマルな打楽器、細かい返し
shaker_loop連続するシェイカー感高域のグルーヴ、前に進む動き
tick_metal小さな金属クリックグリッチグリッド、高域アクセント
wood_block木質のノック音乾いたパーカッションパターン

Chords / Stabs

音色キャラクター向いている用途
chord_rave明るいレイヴスタブ短いコードヒット、フック
stab_neon艶のあるシンセスタブメロディックなアクセント
chord_dub柔らかい dub techno 風コード空間のあるコードパルス
stab_sawデチューンした saw スタブ強めの和声アクセント
chord_organオルガン風コード暖かい和声の土台
bell_rave金属的な FM ベル明るいメロディックスタブ
pad_minor暗いマイナーパッド不穏さ、暗めの和声ベッド
chord_deep低くフィルターされたコードディープハウス/dub techno のパルス
chord_glass透明感のあるコード明るくきれいな和声アクセント
pad_warmなめらかなアナログ風パッド柔らかい背景の和声
pad_stringストリングス風シンセパッド長く伸びる情緒的なレイヤー
pad_choir声のフォルマントを持つパッドリードボーカルなしの合唱感

Leads / Notes

音色キャラクター向いている用途
lead_acidアシッド風リードメロディックなシーケンス
lead_hooverHoover 系リード大きく伸びるフレーズ
pluck_soft柔らかいプラック隙間のあるメロディ
arp_synthアルペジオ向きシンセ速いメロディの動き
lead_square空洞感のある矩形波リードレトロなメロディックフック
lead_fmベル寄りの FM リード明るいデジタルメロディ
lead_chip短いチップチューン風リード速いゲーム音楽風フレーズ
lead_sawデチューンした saw リード大きめのメロディライン
lead_whistle細いサイン波風ホイッスル高域の対旋律
noteニュートラルな音程シンセdj.pattern の音程確認、コード確認

Atmosphere / FX

音色キャラクター向いている用途
pad_shimmer広くゆっくりしたシマーパッド背景のパッド
air_warehouse工業的な部屋鳴り空気感、ノイズベッド
vox_ahh声のフォルマント風パッドブレス、合唱風レイヤー
fx_drop低いインパクト音ドロップ、展開
fx_riser上昇するノイズビルドアップ
fx_glitch小さなグリッチクリック細かい打楽器テクスチャ
drone_space低く変化するドローン長いアンビエントの土台
fx_down下降するノイズスイープドロップ、セクション終わり
fx_zap短く落ちるレーザー風ヒット小さな FX の句読点
fx_noiseフィルターされたノイズバーストインパクト、展開
fx_laserピッチが曲がるレーザー FXSF 風アクセント
fx_vinylクラックルとヒスの背景質感、ローファイな背景

8. CLI リファレンス

pycodedj eval FILE::LOOP
pycodedj watch examples/demo.py
pycodedj panic
pycodedj stop bass
pycodedj mute bass
pycodedj unmute bass
pycodedj bpm 128
pycodedj list-synths

9. トラブルシューティング

困ったときは、SuperCollider のサーバーが boot 済みか、sc/synths.scd を実行済みか、Post window に Ready. OSC port: 57120 が出ているかを最初に確認します。

音が出ない

  1. SuperCollider IDE を開き、サーバーを boot します。
  2. sc/synths.scd を全選択して実行します。
  3. Post window に PyCodeDJ synths loaded. Ready. OSC port: 57120 が出ているか確認します。
  4. pycodedj eval examples/demo.py::bass を実行します。

それでも鳴らない場合は、本体やオーディオインターフェイスのミュート、Post window の赤いエラー、別音色の確認を順番に見ます。

pycodedj eval examples/sound_showcase.py::kick_floor

OSC error

Python から SuperCollider にメッセージを送れない状態です。SuperCollider が起動しているか、サーバーが boot 済みか、OSC ポート番号が合っているかを確認します。

pycodedj eval examples/demo.py::bass --sc-port 57120
pycodedj watch examples/demo.py --sc-port 57120

loop not found

:: の後ろに書いた名前が、Python ファイル内の def の関数名と一致していません。synth="kick_floor" は音色名で、ループ名ではありません。

@loop(interval=2.0)
def bass():
    pass

pycodedj eval demo.py::bass

SyntaxError

: の付け忘れ、インデントのずれ、文字列の閉じ忘れを確認してください。watch モードでは、修正して保存すると再読み込みされ、直前に正常だったループは鳴り続けます。

pycodedj: command not found

pycodedj が未インストールか、別の Python 環境に入っています。再インストールし、必要なら Python 経由で実行します。

pip install 'pycodedj[watch]'
python -m pycodedj eval examples/demo.py::bass

音が大きすぎる、または小さすぎる

各ループの dj.volume を調整します。最初は 0.1 から 0.4 くらいが扱いやすいです。

10. 内部構成

PyCodeDJ は Python ソースを ast で解析します。loop, dj, pattern は実行時には no-op に近いヘルパーで、通常の Python ファイルとして import できます。

主なモジュール:

pycodedj/
├── _loop.py          # loop デコレータと dj 名前空間
├── block_parser.py   # @loop ブロックと dj メタ情報の抽出
├── analyzer.py       # コード特徴量抽出
├── mapper.py         # 特徴量から音楽パラメーターへの変換
├── pattern.py        # pattern 文字列パーサー
├── engine.py         # 評価パイプライン
├── osc_bridge.py     # OSC 通信
├── watcher.py        # ファイル監視
└── __main__.py       # CLI