
2026/08/04 2:34
ペトリネットによる音楽シーケンサー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
beats.bitwrap.io は、従来のデジタル・オーディオ・ワークステーション(DAW)または不透明な AI モデルではなく、Petri 網を用いて techno、jazz、ambient、drum & bass を含む 19 のジャンルにわたる完全な音楽トラックを生成するオープンソースプロジェクトです。システムは、トークンがネットワーク図内で移動することによって音楽制作をシミュレートします:「場所」は状態を表し、「遷移」はキック、スネアドラムの打撃、メロディ、または楽器のミュートといった構造コマンドなどのイベントをトリガーします。複合リズムは、異なる速度で同期して漂う並列な網環から自然に発生し、tresillo や four-on-the-floor といった特定のパターンは Bjorklund アルゴリズムを用いて数学的に導出されます。楽曲構造は、音声を生成せずに論理コマンドを実行する専用「制御網」によって管理され、トラック切り替え時の競合状態を排除するために fire-macro バインディングを用いた同期された単一遷移制御網による堅牢な自動 DJ 転換が実現されています。大きなプロジェクトファイル(当初 22 MB)を代替し、 inhibitor arcs を含む簡潔な論理に置換する重要な最適化により、ステップを単一の円に複数のトークンを配置することで集約し、ファイルサイズをわずか 242 KB に削減しました。バニラ JavaScript と Tone.js を用いて音声合成を実装し、コア実行部は外部依存関係なしの約 1,100 行で構成され、機械アーキテクチャに関係なく同じシードが常に同一のトラックを生成するという決定論的な出力を保証します。プロジェクトには停止したトークンを確認するための視覚デバッグツールを含み、透明性と再現性を設計された最小限な技術スタックを備えています。
本文
ピトリネット(PitriNet)による自律的音楽生成システム「beats.bitwrap.io」
概要と基本操作
- アクセス先: beats.bitwrap.io
- インストール不要のブラウザベースデモ版です。
- 操作方法:
- 好みの音楽ジャンル(テクノ、ジャズ、アンビエントなど)から19 種の中から 1 つ選択します。
- 「Generate」ボタンを押下し、フルトラックの再生を開始します。
- 出力内容:
- ドラム、ベース、メロディ、アルペジオがすべて含まれた楽曲です。
- 再現性:
- シード(Seed)を変更すると異なる楽曲が生成されます。
- 特定のシードを固定すれば、毎回完全に同一の楽曲が再生・再現されます。
核心:トークンとピトリネットの仕組み
このシステムにはピアノロールやタイムライングリッド、DAW は一切使用されません。すべては以下の「ピトリネット」という図式で動作します。
- 基本概念:
- 円(場所)と矢印(遷移)で構成されたネットワーク。
- 点をトークンと呼び、これが図式内を移動します。
- 音符そのものがトークンであり、ステップごとに位置を変化させます。
- 仕組み:
- トークンは指定されたループ内で一定の規則に従って移動し、着地した時点で音が発生(または無音)します。
トークンからなるドラムマシン
8 つの円が環状につながった構造で動作します。
- 動作原理:
- トークンが環を回ると、各ステップにおいて一部の円のみがキックドラムなど鳴動し、他の円は無音になります。
- これによりビートパターンが形成されます。
- 生成アルゴリズム:
- Bjorklund アルゴリズムを採用しており、K 回の打点を N ステップにわたって均等な間隔に配置します。
- 例:8 ステップのうち 3 回の打点設定は、「トレシルロ」というリズム(アフロ・キューバンからリハナまで幅広く使用)を生成します。
- パラメータ変更による多様性:
- 構造自体を変えずに数字を変えるだけで、フォーオンザフロアテクノなどの異なるジャンルが得られます。
- 例:16 ステップで 4 回の打点配置など。
- ポリリズムの実現:
- 各楽器(キック、スネア、ハイハットなど)には独立した環があり、並列して動作します。
- 環の長さを変えれば(例:6 ステップ vs 16 ステップ)、自動でクロスリズム(西アフリカ音楽やアフロ・キューバンに見られる構造)が作れます。
すべての要素は「環」である
メロディ、ベースライン、アルペジオ、ハーモニーパッドに至るまで、すべて環状の図式として表現されます。
- メロディ:
- 各ステップにピッチ、力度、長さ(休符を含む)が配置され、音楽理論に基づいて和音内音や経過音が決定されます。
- 生成プロセス:
- ジャンル選択時にプリセット(スケール、和弦、ドラムパターン、スウィング量、ヒューマナイズ量等)が自動設定されます。
- 外部の AI やサンプリングは使用せず、音楽理論とシード付き乱数だけで動作します。
ソング構造への拡張:制御ネットの導入
ループ生成に加え、イントロやドロップなどを持つ「ソング」を構築するために「制御ネット」を追加しました。
- 機能:
- 音自体は発生させず、「ハイハットをミュートする」「ベースを投入する」といったコマンドを発行します。
- 音の演出を指揮する小さな監督のような役割を果たします。
- 最適化の経緯:
- 課題: 当初、コマンドチェーンが非効率でプロジェクトファイルが膨大(3 分間のトラックに対し22 MB)になる傾向がありました。
- 解決策: ダウンカウントタイマーの実装により構造を劇的に簡素化しました。
- 1,536 ステップのチェーンを、単一の円に多数トークンを配置する方式に変更。
- 抑制アーク(Downcount ゼロになるまでイベントを保留)を使用。
- 効果:
項目 修正前 修正後 場所数 37,148 800 遷移数 37,120 800 ファイルサイズ 22 MB 242 KB
境界処理と Auto-DJ の実装
トラック間の切り替え(Auto-DJ)において、カッティングフィルターやライザーなどのダウンビート同期を正確に行うために特殊な構造を用いています。
- 課題: メインスレッドとの競走(Race Condition)やマクロの丢弃(Discard)を防止する必要がありました。
- 解決策:
- 遷移をサイドチャネルとして扱い、**「発火マクロ結合」**機構を導入。
で新規トラック起動時に発火し、ワーカーからイベントをメインスレッドに通知して安全に実行します。t0- これにより、プロジェクト切り替え競走とマクロキュー丢弃の二つのバグを一元的に解決しました。
システムの利点と特徴
この構造がもたらした重要な特性です。
- 完全な再現性: トークン状態のみがステートであり、隠れたカウンターやドリフトはありません。同じシードで同じマシンなら常に同じトラックが生成されます。
- 可視性とデバッグ容易性:
- 図式(画面)に直接描画されるため、位相ズレた環や誤った位置のトークンを視覚的に確認できます。
- モジュール性と独立性:
- 各楽器は独立したネットであり、ソング構造は別層として管理されます。
- 要素の抽出や追加が他の部分に影響を与えず、柔軟な編集が可能です。
- すべては一つの原語: 並行性、状態管理、スケジューリングをすべてピトリネットという単一の言語(図式)で実現しています。
技術スタックとアクセス方法
- デモ版: beats.bitwrap.io で動作。
- 19 のジャンルを備え、すべてクライアントサイドで動作します。
- 音源・エフェクト:
を使用し、ポリフォニックシンセサイザー、リバーブ、コンプレッションなどを実現しています。Tone.js
- コード構成:
- ピトリネットエグゼカトル:約 400 行(純粋な JavaScript)
- シーケンサーワーカー:約 700 行
- npm やバンドラー不要。CDN から Tone.js を読み込み、静的ファイルを配信する Go サーバーで構成されます。
注記: 音楽理論と「円と矢印による配列」という 60 年前のアイデアが、現代に優れたシーケンサーとして再評価されました。
出典: github.com/stackdump/beats-bitwrap-io 形式的理論の詳細は「Declarative Differential Models」を参照してください。