Table of Contents
1. 導入:バイオアコースティック・パラダイム
Conchordal は、生成音楽および計算機音響の従来の常識から根本的に逸脱するシステムである。従来のシステムが記号操作——量子化された音高のグリッド(MIDI、平均律)と離散化された時間(BPM、小節)——に依拠するのに対し、Conchordal は聴覚知覚の連続的かつ生物学的基盤に立つシミュレーションとして機能する。本システムは、音楽構造が抽象的な作曲の産物ではなく、音響的生存の創発特性であるという立場をとる。
本テクニカルノートは、システムのアーキテクチャ、信号処理アルゴリズム、および人工生命戦略に関する包括的なリファレンスである。Conchordal が心理音響学の原理——特に臨界帯域理論、仮想ピッチ知覚、および神経同期——を自律的エコシステムのダイナミクスとどのように統合するかを詳述する。この環境において、音は生体——代謝、感覚処理能力、および敵対的なスペクトル空間を自律的に移動する能力を持つ「ボイス(Voice)」——として扱われる。
システムの創発的挙動は統一適応度関数、すなわち協和性(Consonance)の追求によって駆動される。Conchordal エコシステム内のエージェントは事前に書かれたスコアに従わない。代わりに、環境を継続的に分析し「スペクトル快適性」——感覚的粗さの最小化として定義される——と「調波安定性」すなわち仮想基音強度の最大化を追求する。結果として、決定論的シーケンシングではなく物理法則の相互作用を通じて和声、リズム、音色が有機的に進化する自己組織化サウンドスケープが生まれる。
本ドキュメントでは、Manifesto の2つの知覚軸を鏡映する、Conchordal アーキテクチャの4つの基盤的柱を探求する。
- 心理音響座標系: 線形ヘルツおよび整数MIDIノートに代わる
Log2SpaceとERBスケールの数学的フレームワーク。 - 周波数軸 — 聴覚ランドスケープ: 生のオーディオストリームから粗さ($R$)と調波性($H$)のフィールドを計算するリアルタイムDSPパイプライン。
- 時間軸 — 創発するメーター: エコシステム自身のオンセットからメトリカルな知覚を形成する結合振動子モデル。
- ライフエンジン: 両方の地形に住まう音響エンティティの代謝、移動、および同期を統治するエージェントベースモデル。
2. 心理音響座標系
Conchordal における重要な革新は、内部処理における線形周波数スケール($f$)の棄却である。人間の聴覚知覚は本質的に対数的であり、音高間隔の知覚は周波数の差ではなく比に基づいている。これを正確かつ効率的にモデル化するため、Conchordal は蝸牛のトノトピックマップに計算グリッドを整合させるカスタム座標系 Log2Space を確立する。
2.1 Log2 Space の基盤
Log2Space 構造体は、システム内のすべてのスペクトル解析、カーネル畳み込み、およびエージェント配置のバックボーンとして機能する。物理的な周波数領域(Hz単位の $f$)を知覚的な対数領域($l$)にマッピングする。
2.1.1 数学的定義
ヘルツから内部対数座標への変換は、周波数の底2対数として定義される。この選択は意図的であり、底2では1.0の増分がちょうど1オクターブ——音高知覚における最も基本的な音程——に対応する。
$$ l(f) = \log_2(f) $$
オーディオスレッドの合成パラメータを導出するために使用される逆変換は以下の通りである。
$$ f(l) = 2^l $$
座標空間は分解能パラメータ bins_per_oct($B$)によってグリッドに離散化される。このパラメータはシミュレーションの粒度を決定する。$B=48$ または $B=96$ の一般的な値は、連続的なピッチグライドや微分音の抑揚に十分な半音以下の分解能を提供する。ステップサイズ $\Delta l$ はスペクトル全域で一定である。
$$ \Delta l = \frac{1}{B} $$
2.1.2 グリッド構成とインデクシング
Log2Space 構造体は、設定された範囲 $[f_{min}, f_{max}]$ をカバーするすべてのビンの中心周波数を事前計算する。ビン数 $N$ は完全なカバレッジを保証するように決定される。
$$ N = \lfloor \frac{\log_2(f_{max}) - \log_2(f_{min})}{\Delta l} \rfloor + 1 $$
DSP処理の内部ループで $O(1)$ アクセスを実現するため、2つの並列ベクタが保持される。
centers_log2: 対数座標 $l_i = \log_2(f_{min}) + i \cdot \Delta l$。centers_hz: 事前計算された線形周波数 $f_i = 2^{l_i}$。
この事前計算はリアルタイム性能において不可欠であり、スペクトルカーネルの内部ループ内でコストの高い log2 および pow 呼び出しを排除する。メソッド index_of_freq(hz) は量子化ロジックを提供し、任意の浮動小数点周波数を最近傍のビンインデックスにマッピングする。
2.2 定Q帯域幅特性
Log2Space はスペクトル全体にわたって定Q(Constant Quality Factor)特性を本質的に実現する。信号処理の用語では、$Q$ は中心周波数と帯域幅の比として定義される:$Q = f / \Delta f$。
線形システム(標準的なFFTなど)では $\Delta f$ が一定であるため、$Q$ は周波数とともに増加する。Log2Space では、$i$ 番目のビンの帯域幅 $\Delta f_i$ は中心周波数 $f_i$ に比例してスケーリングする。この特性は人間の聴覚系の周波数選択性を模倣している——耳の周波数分解能は(絶対Hz値で見ると)周波数が高くなるにつれて低下する。この整合により、Conchordal は高い周波数では高い時間分解能を、低い周波数では高いスペクトル分解能を——手動のマルチレート処理なしに——効率的に計算資源を配分できる。
2.3 等価矩形帯域幅(ERB)スケール
Log2Space は音高関係(オクターブ、倍音)を扱うが、耳の臨界帯域を完全にはモデル化しない。臨界帯域は低周波で純粋な対数マッピングが示すよりも広い。感覚的粗さ(不協和)を正確に計算するため、Conchordal は Glasberg & Moore(1990)モデルに基づく等価矩形帯域幅(ERB)スケールを実装する。
core/erb.rs モジュールは、粗さカーネルが使用する変換関数を提供する。周波数 $f$(Hz)からERBレート単位 $E$ への変換は以下で与えられる。
$$ E(f) = 21.4 \log_{10}(0.00437f + 1) $$
周波数 $f$ における臨界帯域の帯域幅は以下の通りである。
$$ BW_{ERB}(f) = 24.7(0.00437f + 1) $$
このスケールは Log2Space とは異なるものである。Log2Space がピッチと調波性の領域(関係がオクターブ不変である)であるのに対し、粗さの計算では干渉を評価するためにスペクトルエネルギーをERB領域にマッピングする必要がある。システムは事実上、スペクトルの二重ビューを維持している:一つは調波テンプレート用の厳密な対数ビュー、もう一つは不協和評価用の心理音響ビューである。
3. 周波数軸:聴覚ランドスケープ
音楽認知では、協和は記譜上の属性ではなく、二つの異なる成分からなる知覚である。一つは感覚的不協和。基底膜上の同じ臨界帯域に二つの部分音が入ると、その干渉はうなり・粗さとして聴こえる。これはボトムアップの感覚であり、音楽的訓練の有無を問わず誰にでも生じる。もう一つは音的融合。調波関係にある部分音の群れは、聴覚系によって一つの音へと束ねられ、単一の(ときに仮想的な)ピッチを持つ一つの声として聴こえる。音楽家が協和と呼ぶのは、粗さが小さく、かつ融合が強いという、この二つの統合にほかならない。ピタゴラス以来讃えられてきた単純な整数比は刺激の側の属性であり、和声そのものは聴き手の中で構築される。
どちらの成分にも定量モデルがある。Helmholtz は不協和の正体をうなりに求め、Plomp と Levelt はその臨界帯域幅への依存を測定して、臨界帯域の約4分の1で最大となり、それを超えると消えていく粗さ曲線を得た。融合の系譜は Stumpf の*音融合(Tonverschmelzung)*から Terhardt の仮想ピッチへと続く。時間微細構造に位相ロックした聴覚脳幹は、入力された部分音を調波テンプレートと照合し、それらを最もよく説明する基音を推定する——その基音が物理的に存在しなくても、である。なお二つの機構は独立に動く。滑らかなのに融合しない音もあれば、融合しているのに粗い音もある。
Conchordal はこの知見をそのまま実装する。システムは自らの出す音に蝸牛モデルのフロントエンドを通し、周波数軸全体にわたる粗さフィールドと調波性フィールドを計算して、両者を協和性へと統合する。それは、新しい音が溶け込む場所が峰となり、軋む場所が谷となる地形である。音程の名前や周波数比を知る部分はシステムのどこにもない。エージェントが感じるのはこの地形だけである。第4章では同じ方法を時間に適用する。和声が押し付けられるのではなく蝸牛のモデルから計算されるのとまったく同じように、メーターもスケジュールされるのではなくビート知覚のモデルから計算される。
「ランドスケープ(Landscape)」は Conchordal における中心的なデータ構造である。すべてのエージェントの共有環境として機能し、各周波数ビンの心理音響的「ポテンシャル」を表す動的スカラー場である。エージェントは互いに直接相互作用しない。ランドスケープと相互作用し、ランドスケープが全集団のスペクトルエネルギーを集約する。これによりシミュレーションの計算量がエージェント数から切り離される($O(N^2)$ ではなく $O(N)$)。
ランドスケープはオーディオフレーム(またはブロック)ごとに解析ワーカーによって更新される。2つの主要メトリクスが合成される。
- 粗さ($R$): 近接する部分音間の急速なうなりによって引き起こされる感覚的不協和。
- 調波性($H$): 仮想ピッチの強度およびスペクトル周期性の測度。
どちらのメトリクスも $[0, 1]$ に正規化される。本章はこのあと解析パイプラインの順に進む。3.1節で対数周波数スペクトルを構築し(NSGT)、3.2節と3.3節でそこから粗さと調波性の各フィールドを導出し、3.4節で両者を、エージェントが実際に登る協和性の地形へと統合する。
3.1 非定常ガボール変換(NSGT)
Log2Space をスペクトルデータで満たすために、Conchordal は非定常ガボール変換(NSGT)のカスタム実装を使用する。固定窓サイズを使用する短時間フーリエ変換(STFT)とは異なり、NSGT は2.2節で導出された定Q特性を維持するために窓長 $L$ を周波数に反比例させて変化させる。
3.1.1 カーネルベースのスペクトル解析
core/nsgt_kernel.rs の実装は、この変換を効率的に行うためにスパースカーネルアプローチを採用している。各対数周波数帯域 $k$ について、時間領域カーネル $h_k$ が事前計算される。このカーネルは、帯域の中心周波数 $f_k$ における複素正弦波と長さ $L_k \approx Q \cdot f_s / f_k$ の周期的ハン窓 $w_k$ を結合する。
$$ h_k[n] = w_k[n] \cdot e^{-j 2\pi f_k n / f_s} $$
これらのカーネルは初期化時に周波数領域($K_k[\nu]$)に変換される。性能を最適化するため、システムはこれらの周波数カーネルをスパース化し、有意なエネルギーを持つビンのみを保持する。
実行時には、入力オーディオバッファに対して単一のFFTを実行してスペクトル $X[\nu]$ を取得する。帯域 $k$ の複素係数 $C_k$ は周波数領域での内積により計算される。
$$ C_k = \frac{1}{N_{fft}} \sum_{\nu} X[\nu] \cdot K_k^*[\nu] $$
この「1回のFFT、多数のカーネル」アプローチにより、Conchordal は各帯域ごとに個別のDFTを計算したり再帰フィルタバンクを使用したりする計算コストなしに、20Hzから20kHzまでをカバーする高分解能の対数間隔スペクトルを生成できる。
3.1.2 リアルタイム時間平滑化
NSGTから得られる生のスペクトル係数 $C_k$ は、オーディオ入力の確率的性質(特にノイズベースのエージェント)により高い分散を示す。エージェントがサンプリングする安定したフィールドを作るため、RtNsgtKernelLog2 構造体はNSGTを時間平滑化層でラップする。
帯域ごとのリーキー積分器(指数平滑化)が実装される。重要なのは、時定数 $\tau$ が周波数依存であることだ。緩やかに変化する低周波はより長い $\tau$ で平滑化され、過渡的な詳細を含む高周波はより短い $\tau$ を持つ。
$$ y_k[t] = (1 - \alpha_k) \cdot |C_k[t]| + \alpha_k \cdot y_k[t-1] $$
ここで平滑化係数 $\alpha_k$ はフレーム間隔 $\Delta t$ から導出される。
$$ \alpha_k = e^{-\Delta t / \tau(f_k)} $$
これは耳の「積分時間」をモデル化し、ランドスケープが瞬時の信号パワーではなく心理音響的な知覚を反映することを保証する。
3.2 粗さ($R$)計算:Plomp-Levelt モデル
粗さとは、同一臨界帯域内にあるが単一の音として知覚されるほど近接していないスペクトル成分の干渉によって引き起こされる「荒々しさ」や「うなり」の感覚(ビーティング)である。Conchordal はERB領域での畳み込みを通じた Plomp-Levelt モデルの変形を実装する。
3.2.1 干渉カーネル
計算の核心は core/roughness_kernel.rs で定義される粗さカーネルである。このカーネル $K_{rough}(\Delta z)$ は、$\Delta z$ ERB離れた2つの部分音間の干渉曲線をモデル化する。この曲線は、部分音が離れるにつれて急速に上昇するペナルティを作り出し、約0.25 ERB(最大粗さ)でピークに達し、さらに離れると減衰する。
実装では、パラメータ化された関数 eval_kernel_delta_erb を使用してこの形状を生成する。
$$ g(\Delta z) = e^{-\frac{\Delta z^2}{2\sigma^2}} \cdot (1 - e^{-(\frac{\Delta z}{\sigma_{suppress}})^p}) $$
第2項は抑制因子であり、$\Delta z \to 0$ でカーネルがゼロに向かうことを保証し、単一の純音が自己粗さを生成することを防ぐ。
3.2.2 畳み込みアプローチ
すべてのスペクトルビンに対するペアワイズの粗さ計算($N^2$ の計算量)はリアルタイム応用には計算上不可能である。Conchordal は粗さの計算を線形畳み込みとして扱うことでこれを解決する。
- マッピング: NSGTからの対数間隔振幅スペクトルを線形ERBグリッドにマッピング(または補間)する。
- 畳み込み: この密度 $A(z)$ を事前計算された粗さカーネル $K_{rough}$ と畳み込む。
$$ R_{shape}(z) = (A * K_{rough})(z) = \int A(z-\tau) K_{rough}(\tau) d\tau $$
結果の $R_{shape}(z)$ は周波数 $z$ における生の「粗さ形状」を表す。これを正規化された適応度信号に変換するため、Conchordal は生理学的飽和マッピングを適用する。
3.2.3 生理学的飽和マッピング
畳み込みからの生の粗さ値は無制限の範囲を持つ。ハードクランプの代わりに、Conchordal は聴覚知覚の圧縮非線形性をモデル化する飽和曲線を使用する。このマッピングは参照正規化された粗さ比を $[0, 1]$ 範囲に変換する。
参照正規化: システムは「典型的な」粗さレベルを表す参照値 $r_{ref,peak}$ と $r_{ref,total}$ を保持する。参照正規化された比は以下の通り。
$$ x_{peak}(u) = \frac{R_{shape}(u)}{r_{ref,peak}} $$
$$ x_{total} = \frac{R_{shape,total}}{r_{ref,total}} $$
飽和パラメータ: パラメータ roughness_k($k > 0$)は飽和曲線のショルダーを制御する。参照比 $x = 1$ は以下にマッピングされる。
$$ R_{ref} = \frac{1}{1+k} $$
$k$ が大きいほど同じ入力比に対する $R_{01}$ が減少し、システムの粗さ耐性が高まる。
区分的飽和マッピング: 正規化された粗さ $R_{01}$ は参照正規化された比 $x$ から以下のように計算される。
$$ R_{01}(x; k) = \begin{cases} 0 & \text{if } x \leq 0 \ x \cdot \frac{1}{1+k} & \text{if } 0 < x < 1 \ 1 - \frac{k}{x+k} & \text{if } x \geq 1 \end{cases} $$
この関数は $x = 1$ で連続(両分岐とも $\frac{1}{1+k}$ を返す)であり、$x \to \infty$ で漸近的に1に飽和する。区分構造により、低い粗さでは線形応答(感度の維持)を、極端な値では圧縮(飽和の防止)を保証する。
数値安全性: 実装はエッジケースを堅牢に処理する。
- $x = \text{NaN} \to 0$
- $x = +\infty \to 1$
- $x = -\infty \to 0$
- 非有限の $k$ は $10^{-6}$ として扱う
協和性を追求するエージェントは $R_{01}$ フィールドのピークを積極的に回避する。
3.3 調波性($H$):シブリング投影アルゴリズム
粗さがエージェントを不協和から遠ざける(分離)のに対し、調波性($H$)はエージェントを融合——一貫した和音と音色の創出——へと駆動する。Conchordal はこのフィールドを計算するために「シブリング投影(Sibling Projection)」と呼ばれる新規アルゴリズムを導入する。このアルゴリズムは、脳の「共通基音」検出(仮想ピッチ)メカニズムを周波数領域で完全に近似する。
3.3.1 概念:仮想基音
このアルゴリズムは、周波数 $f$ のスペクトルピークがその下倍音($f/2, f/3, f/4 \dots$)における基本周波数(基音)の潜在的存在を示唆するという前提に立つ。複数のスペクトルピークが共通の下倍音を共有する場合、その下倍音は強い「仮想基音」を表す。
3.3.2 2パス投影
アルゴリズムは Log2Space スペクトル上で2パスで動作し、対数グリッドの整数特性を利用する。
-
下方投影(基音探索): 現在のスペクトル包絡を「下方にぼかす」。散布(scatter)の見方をすれば、エネルギーを持つ各ビン $i$ が、整数 $k \in {1, 2, \dots, N}$ ごとに、その候補基音にあたるビン $i - \log_2(k)$ へ証拠を配る。実装ではこれと等価な収集(gather)の形——各ビンが、自分の倍音があるはずの位置から証拠を集めてくる——を用いる:
$$ Roots[i] = \sum_k A[i + \log_2(k)] \cdot w_k $$
対数周波数グリッド上では $\log_2(k)$ は定数のビンオフセットである(非整数オフセットは補間される)。$w_k$ は倍音次数 $k$ とともに減衰する重み係数(例:$k^{-\rho}$)であり、低次の倍音が高次の倍音よりも強く基音を示唆することを反映している。結果の
Rootsはすべての周波数における仮想ピッチの強度を記述する。 -
上方投影(倍音共鳴): 次に、
Rootsスペクトルを上方に再投影する。$f_r$ に強い基音が存在すれば、そのすべての自然倍音($f_r, 2f_r, 3f_r \dots$)に安定性を示唆する。$$ H[i] = \sum_m Roots[i - \log_2(m)] \cdot w_m $$
創発的調性安定性: 200 Hz の単一の音がある環境を考える。
- ステップ1(下方): 100 Hz($f/2$)、66.6 Hz($f/3$)、50 Hz($f/4$)等に基音を投影する。
- ステップ2(上方): 100 Hz の基音は 100, 200, 300, 400, 500... Hz に安定性を投影する。
- 300 Hz は 100 Hz 基音の完全5度である。
- 500 Hz は 100 Hz 基音の長3度である。
したがって、西洋音楽理論のハードコードされた知識なしに、システムは倍音列の物理法則の帰結として、長3度および完全5度の関係に自然に安定性ピークを生成する。200 Hz のエージェントは 300 Hz と 500 Hz に「重力井戸」を作り出し、他のエージェントを長三和音の形成へと誘引する。
3.3.3 単一の倍音パス(と、撤去されたミラー)
調波地形は単一の「下方→上方」投影から構築される。各スペクトル成分を候補となる仮想基音へ下方投影し、その倍音へと上方投影し直す(3.3.2節)。これは仮想ピッチを周波数領域で実現したものにあたる。下倍音側の対応物は持たない。それは意図した選択である。
かつての実装は、これを反転した第二のパス「上方→下方」を mirror_weight($\alpha$)で重み付けしてブレンドしていた——$H = (1-\alpha)H_{overtone} + \alpha H_{undertone}$、短調を長調の鏡像とみなす Riemann の和声二元論である。これは二つの独立した理由から撤去された。
二元論は構造的に誤っている。 三点ある。第一に物理。下倍音列は自然界に存在せず(振動体が放射するのは倍音である)、下倍音地形には刺激側の対応物がない。第二に知覚。「共通倍音による束縛」に相当する知覚機構は、仮想ピッチに比肩するものとして知られていない。現代の心理音響学は短三和音を「仮想基音が弱く曖昧な和音」と説明し、長三和音の鏡像とは説明しない。第三に、最も決定的な生態学。この系は閉ループであり、二元論は生成側で破れる。倍音位置に引き寄せられたエージェントは、自分を引き寄せた基音構造を放射スペクトルでさらに強める(アトラクタの自己安定化)。ところが下倍音位置のエージェントが放射するのもやはり倍音であって、自分を引き寄せた共通倍音構造を強めはせず、帰還ループが閉じない。論文の統制実験でも、倍音側のクラスタリングは再現されたが、下倍音(短調)側の再組織化は再現されなかった。
そして第二のパスは数学的に冗長だった。 log2 周波数上の畳み込みとして書くと、各パスは同一の偶カーネル $h_\rho(s) = \sum_{\log_2(k/m)=s} (mk)^{-\rho}$ による $\text{env} \circledast h_\rho$ である($m \leftrightarrow k$ を入れ替えるとシフト $\log_2(k/m)$ は符号が反転するが重み $(mk)^{-\rho}$ は不変なので、このカーネルは偶関数になる)。パスAは $\rho = \rho_{root}$、パスBは $\rho = \rho_{overtone}$ を使う。両者は指数が一致すれば同一であり、異なっても単一の偶カーネルの減衰指数が二つあるにすぎない。偶カーネルには倍音/下倍音の方向が存在しないため、パスBはパスAにない情報を何も担っておらず、ブレンド $(1-\alpha)h_{\rho_{root}} + \alpha,h_{\rho_{overtone}}$ は単一の実効カーネルに潰れる。$\alpha$ を動かすだけの harmonic_tension ダイアルは、可聴な緊張を制御しないことも確認された。エコシステムが実際に読む協和ピークを、全音域にわたって動かさなかったのである。第二のパスもダイアルも撤去された(第7章の台帳を参照)。残るのは単一の倍音パスである。
3.4 協和性:フィールドの統合
$R_{01}$ と $H_{01}$ が揃えば、協和性は二段階で導出できる。まず協和性カーネルが二つの観測量を単一の適応度スコアへ融合し、次に表現変換の組がそのスコアを、ライフエンジン(第5章)の各利用先に合わせた形へ変形する。
第1層 — 協和性カーネル(双線形族):
$$ C_{score} = a \cdot H_{01} + b \cdot R_{01} + c \cdot H_{01} R_{01} + d $$
デフォルト係数:$a = 1.0$、$b = -1.35$、$c = 1.0$、$d = 0.0$。$b < 0$ であるため粗さはペナルティとして作用し、$c > 0$ であるため高い調波性がそのペナルティを減衰させる(相互作用項 $c \cdot H_{01} R_{01}$ は $H_{01}$ が大きいとき $b \cdot R_{01}$ を部分的に相殺する)。双線形族は以前の $\alpha H - wR$ 定式化を $c = 0$ の特殊ケースとして包含する。
第2層 — 表現:
| 名前 | 式 | 範囲 | 意味 |
|---|---|---|---|
| $C_{score}$ | $aH + bR + cHR + d$ | $(-\infty,+\infty)$ | カーネルからの生の適応度 |
| $C_{level01}$ | $\sigma(\beta(C_{score} - \theta))$ | $[0,1]$ | 代謝ゲート(シグモイド) |
| $C_{density_mass}$ | $\max(0,;H_{01}(1 - \rho R_{01}))$ | $[0,+\infty)$ | 生の密度質量($\rho$-カーネル) |
| $C_{density_pmf}$ | $\text{normalize}(C_{density_mass})$ | $[0,1],;\Sigma=1$ | ピッチ選択PMF |
| $C_{energy}$ | $-C_{score}$ | $(-\infty,+\infty)$ | 最小化用エネルギー |
ここで $\sigma(x) = 1/(1+e^{-x})$、$\beta$ はシグモイドの急峻度(デフォルト 2.0)、$\theta$ はその閾値(デフォルト 0.0)である。各表現にはそれぞれ決まった利用先がある。$C_{level01}$ はエージェントの代謝をゲートし(5.2節)、$C_{density_pmf}$ はスポーン時に新しいエージェントの周波数を引くための確率分布となる。密度質量には係数 $a{=}1, b{=}0, c{=}{-}\rho, d{=}0$ の別個の $\rho$-カーネルを用い、$C_{density_mass} = H_{01}(1 - \rho R_{01})$ を $\geq 0$ にクランプする。パラメータ $\rho$(consonance_density_roughness_gain、デフォルト 1.0)は、粗さがスポーン確率をどれだけ抑えるかを決める。
最後に、この地形はすべてのエージェントにとって同一というわけではない。各 Voice は固有の知覚コンテキスト(PerceptualContext)を持ち、自分自身の飽き(boredom)と馴化(familiarity)を追跡して、ピッチ選択時のスコアに補正を加える(知覚的適応)。
4. 時間軸:創発するメーター
音楽認知は、音楽的時間を三つの層に分けて捉える。リズムは表層であり、実際に鳴るオンセットのパターンそのものを指す。パルス(タクトゥス)は、聴き手が思わず合わせて手を叩く規則的な拍である。表層にパルスがそのまま含まれていることはむしろ稀であり、これはすでに一つの推論である。**メーター(拍節)**は、そのパルスをさらに階層化したもの——サブディビジョン・拍・小節という入れ子の周期性が、強拍と弱拍を交替させながら積み重なった構造——を指す。ここで決定的に重要なのは、この意味でのメーターが記譜ではなく知覚だという点である。拍子記号は指示にすぎない。メーターは聴き手の脳が音から組み立てるものであり、記譜されたことのない音からさえ組み立てられる。
この知覚の振る舞いはよく研究されている。確立には数サイクル分の証拠が要る(ビート誘導)。いったん確立されると、シンコペーションや休止、無音をまたいで持続し、個々のイベントは誘導されたグリッドを壊すのではなく、グリッドを背景に聴かれる。さらに可塑的でもあり、入力のテンポがずれていけば追従して掛かり直す。神経共鳴理論(Large ら)はこれらの性質を機構として説明する。神経振動子の集団が音響オンセットに同調し、パルスを中断の向こうへ運ぶのは刺激そのものではなく、振動の自己持続的なダイナミクスだ、というのがその骨子である。
Conchordal はこの知見をそのまま実装する。マスタークロックもメトロノームも持たず、時間を構造化するのは創発メーターである。神経共鳴モデルを実装した結合リミットサイクル振動子のネットワークが、エコシステム自身のオンセットを聴き、そこからメトリカルな知覚を組み立てる。今度はボイスの側が、知覚されたそのパルスに、ボイスごとの結合強度でオンセットのタイミングを同調させる(5.4節)。リズムはこうして閉じた知覚–行為ループになる。ビートをスケジュールするものは何もない。ビートは集団の振る舞いから凝縮し、凝縮したビートが今度は集団を引き込む。これは調波ランドスケープ(第3章)と対をなす構図である。協和性が押し付けられるのではなく蝸牛のモデルから計算されるように、メーターも押し付けられるのではなくビート知覚のモデルから計算される。
4.1 メーターコア:強制リミットサイクル振動子
MeterNetwork(core/meter.rs)はビート振動子を強制 Hopf 標準形——自励振動の発生閾値にある系の正準方程式——として保持し、極座標 $(r, \varphi)$ で積分する:
$$ \dot{r} = \alpha r + \beta r^3 + F_a, s(t) \cos\varphi $$ $$ \dot{\varphi} = \omega - F_p \frac{s(t)}{r} \sin\varphi $$
$\alpha > 0$、$\beta < 0$ のとき、強制項のない系は半径 $\sqrt{-\alpha/\beta} = 1$ の安定リミットサイクルを持つ。つまりビートは自己持続的で、入力が途切れても惰性で回り続ける(ビート誘導の持続レジームに相当)。駆動 $s(t)$ は整流されたオンセット信号であり、二つの源を併せたものである。一つは DorsalStream(core/stream/dorsal.rs、3帯域クロスオーバーのフラックス検出器)が抽出するスペクトルフラックス(フレーム間のスペクトルエネルギー増分。汎用のオンセット検出量)。もう一つは集団自身の発声オンセット強度で、こちらは低遅延の聴覚–運動強化経路にあたる。
振動子の固有周波数は可塑的である。ヘッブ学習則が刺激への位相誤差を減らす方向に $\omega$ をシフトする:
$$ \dot{\omega} = -\eta, s(t) \sin\varphi $$
ランダムな入力(オンセット間隔が独立に引かれ、特定の位相を好まない更新過程)では、シフトが平均して打ち消し合うため、ビートはノイズを追いかけない。周期的な入力であれば、ビート帯域(0.5–4 Hz)の中で $\omega$ が刺激のレートへと引き込まれる。ビートの上では、ネットワークが同期したサブディビジョンと、遅い小節のサブハーモニック(アンラップしたビートカウントに対する比 2, 3, 4)を追跡し、三階層のメトリカル状態(MeterState)が得られる。
知覚と生成。 ランタイムはメーターを二つ持つ。生成メーターはワーカースレッド内でハビタットバスを聴き、全ボイスの振る舞いを駆動する。知覚メーターは ListenerTwin(listener_twin/)の中にあり、聴衆が聴くのと同じプレゼンテーション音声を解析する。後者のビート確信度は、UI とヘッドレスレポート、そして Direct Cognitive Coupling(DCC)の圧力経路へ供給される。
4.2 ビート確信度:位相ロック値
メーターは単にビートを追跡するだけでなく、ビートがどれだけ確かに存在するかも知っている。検出された各オンセットは、現在のビート位相を向く単位フェーザ(単位複素ベクトル)としてリーキー積算器に積まれ、その合成ベクトルの長さが位相ロック値(PLV)になる。全オンセットが同じ位相に揃えば 1.0、位相がばらばらならほぼ 0 である。確信度はこの PLV を presence 項でゲートしたものだ。presence の飽和にはおよそ4オンセット分の証拠が必要で(ビート誘導に数サイクルかかるという心理学的観察に対応する)、無音が続けば減衰する。位相がばらけたオンセットは合成ベクトルを伸ばせないので、音の密度だけで確信度を水増しすることはできない。
4.3 メーターから変調へ:NeuralRhythms
NeuralRhythms::from_meter_state(core/modulation.rs)はメトリカル状態を、ボイスの振る舞いが消費する変調帯域に射影する。
- Delta ← ビート(タクトゥス)。パルスの位相とテンポを運ぶ。この位相がコサインゲート
env_openを駆動する。確信度が上がるほどアーティキュレーションのエンベロープはダウンビートに向けて尖り、ビートが不確かなうちはゲートが開いたままになる。 - Theta ← サブディビジョン。呼吸振動子(5.5節)が掛かる、音符レートの帯域。
- 帯域の精度(
alpha)はビート確信度に等しく、予測誤差(beta)はその補数とする。
4.4 作曲家の事前分布:時間地形のシェイピング
ディレクターは MeterShaping(Rhai から設定)を通じて、パルスが形成される地形を曲げることができる。ただし、スケジュールすることは決してできない。
meter_stability(v)— $[0,1]$ のアトラクタ深度。エントレインメントの強制力と周波数学習をスケールし、presence の閾値を下げる。より少ない証拠で確信に踏み切らせるトップダウンの事前分布だが、強制力は刺激の方向にしか働かないため、ランダムな入力は相変わらず打ち消し合う。つまり stability にビートは捏造できない。temporal_basin(min_hz, max_hz)— テンポの事前分布。ビート周波数は盆地の中心に初期化され、弱い復元力で中心へ引かれ、ヘッブ学習もこの帯域内に制限される。盆地が決めるのはパルスがどこに落ち着くかであって、仕事をするのはあくまで盆地内でのオンセットへの同調である。
これらは consonance field 操作の時間軸版にあたる。創発する過程に与えるソフトな事前分布であり、課されたグリッドを拒む Manifesto と矛盾しない。
5. ライフエンジン:エージェントと自律性
「ライフエンジン」は、ここまでに確立した2つの地形——協和性ランドスケープ(第3章)と創発メーター(第4章)——に住まうエージェントベースのシミュレーション層である。「ボイス(Voice)」の集団を管理し、そのライフサイクル、感覚処理、およびアクチュエーション(オーディオ合成)を処理する。
5.1 ボイス(Voice)アーキテクチャ
Voice 構造体(life/voice.rs)はエコシステムの原子単位である。AnySoundBody アクチュエータ、ArticulationWrapper(ArticulationCore をラップ)、PitchController(PitchCore をラップ)、そしてノートレベルのタイミングを管理する PhonationEngine の複数のコンポーネントで構成される。Voice 自体は統合層として機能し、ライフサイクル(代謝、エネルギー)、知覚コンテキスト、およびコンポーネント間を直接結合せずに協調する制御プレーン信号を管理する。
5.1.1 SoundBody(アクチュエータ)
SoundBody トレイトはエージェントの音声生成能力を定義する。3種類のボディタイプが利用可能であり、内部的には AnyBackend 列挙型が Oscillator(OscillatorBank) と Resonator(ModalEngine) の2つのバックエンドを切り替える。
- Sine: 純粋な正弦波を合成する。
AnyBackend::Oscillatorを使用し、単一パーシャルのOscillatorBankとして実装される。 - Harmonic: 基音と一連の部分音からなる複合音を合成する。
TimbreGenotypeが以下のパラメータをエンコードする。stiffness: 非調波性係数(部分音列の伸長)。brightness: スペクトル傾斜(高次部分音の減衰)。comb: 偶数倍音の減衰。damping: エネルギー依存の上部倍音の減衰。緩やかなスペクトルエネルギー包絡が励起を追従し(速いアタック、約0.5秒のリリース、鳴り続ける音が沈黙しないよう床値つき)、励起が弱まるにつれて音色を暗くする。vibrato_rate/vibrato_depth: LFOベースのピッチ変調。jitter: 有機的なゆらぎのための 1/f ピンクノイズFM強度。unison: コーラス的な厚みのためのデチューンコピー量。mode: Harmonic(整数倍)vs. Metallic(非整数比)。
- Modal: 減衰共振器バンクによるモーダル合成。
AnyBackend::Resonator(ModalEngine)を使用する。ModeShapeが各モードの周波数比、T60減衰時間、ゲインを定義し、ResonatorBankが物理的な減衰振動子として実装される。ノイズ駆動により、打楽器的・金属的な音色や物理モデル的な質感を実現する。
OscillatorBank はキャッシュ効率のためにストラクト・オブ・アレイ(struct-of-arrays)レイアウトを採用している。ModalEngine は内部で ResonatorBank を保持し、周期的にピッチパラメータを更新する。
5.1.2 コアスタック(Articulation, Pitch, Phonation)
振る舞いは焦点を絞ったコアに分割され、新しい戦略で容易に拡張できるよう各々が個別のファイルに定義される。
ArticulationCore(いつ/ゲート) — life/articulation_core.rs: リズム、ゲーティング、エンベロープダイナミクスを管理する。3つのバリアントが存在する。
KuramotoCore: メーター由来のリズム帯域(4.3節)に同期する「呼吸」振動子。エネルギー/活力モデルを内蔵し、rhythm_coupling(TemporalOnly/TemporalTimesVitality)、rhythm_reward(リズム同期による代謝報酬)、autonomous_attack(自律的アタックトリガ)を備える。実効結合強度 $k_{eff}$ は活力と結合モードから計算される。SequencedCore: 固定長エンベロープのシーケンス駆動。DroneCore: 緩やかな揺らぎの持続音。
PitchCore(どこ) — life/pitch_core.rs: 協和性、距離ペナルティ、音域重力、およびエージェントごとの知覚調整に基づいて、対数周波数空間での次の目標を提案する。
PitchHillClimbPitchCore: 現在の目標周辺の離散的な候補セットを評価する。クラウディング、leave-self-out、アニーリングを備える(4.3節で詳述)。PitchPeakSamplerCore: ランドスケープの協和性ピークからサンプリングし、より探索的な戦略を提供する。
PitchController は PitchCore をリターゲティングロジックと積分ウィンドウ管理でラップする。
PhonationEngine(発声制御) — life/phonation_engine.rs: ノートレベルのタイミングと発声パターンを管理する。ToneCmd プロトコル(On, Off, Update)を通じて ScheduleRenderer に指示を送る。タイミング指定は PhonationSpec を介して行われ、Once(単発)、Pulse(適応ゲートクロック上の反復)、そして Coupled(CoupledTimingSpec)——ボイスごとの位相振動子が共有された創発メーターに同期するリズム族連続体(5.4節)——の3系統がある。持続は WhileAlive / Gates(n) / Field で指定する。
5.1.3 サウンドパイプライン
ScheduleRenderer(life/schedule_renderer.rs)はワーカースレッド内で動作する集中的なオーディオレンダリングエンジンである。HashMap<ToneKey, RoutedTone> によるトーンプールを管理し、各 PhonationBatch(Voice が生成する ToneCmd の集合)を受け取ってトーンの生成・更新・リリースを行う。各トーンは2つのバスのいずれかにルーティングされる:ハビタットバス(エコシステムが環境として解析する音)とプレゼンテーションバス(聴衆が聴く音)である(6.2節)。
Tone(life/sound/tone.rs)は個別の発音単位であり、ADSRエンベロープ(attack → decay → sustain → release)を実装する。ToneAdsr 構造体が4つの時間パラメータを保持し、ティックベースで正確なエンベロープ遷移を実現する。ピッチと振幅の変化は指数平滑化により滑らかに補間され、不連続なクリックを防止する。
5.1.4 制御プレーン信号:Planned と Error
Voice は直接結合ではなく2つの直交する信号を通じてコアを協調させる。
- Planned: PitchCore がターゲット(
TargetProposal)を提案し、Voice が「計画」状態——次の目標周波数、予測跳躍距離、顕著性——を維持する。これはエージェントの意図を表す。 - Error: Voice は SoundBody の現在のピッチと計画目標との間の不一致(符号付きセント、絶対セント)を計算する。これは以前の行動の結果を表し、観測や将来の拡張に利用可能である。PitchCore はエラー信号を読み取らない——探索はフィードバックから切り離されたままである。
5.2 ライフサイクルと代謝
エージェントは生物学的代謝をモデル化したエネルギーダイナミクスによって統治される。LifecycleConfig は2つの存在モードを定義する。
- Decay: エージェントは固定の
initial_energyプールを持って生まれる。時間経過(半減期)とともにこのエネルギーを消費し、ゼロに達すると死亡する。これはプラックやパーカッションのような一過性の音をモデル化する。 - Sustain: エージェントは
metabolism_rate(1秒あたりのエネルギー損失)を持ち、協和性依存のリチャージによってエネルギーを獲得できる。- リチャージ: フォネーションアタックごとに獲得されるエネルギーは、
MetabolismPolicyを通じてエージェントの $C_{level01}$(シグモイドマッピングされた協和性)によってスケーリングされる。 - rhythm_reward: リズム同期の精度に基づく追加の代謝報酬。
RhythmRewardMetricで報酬の計算方法を選択する。 - action_cost: アタックごとに消費されるエネルギーコスト。
- 生存: 不協和な領域のエージェントは「飢餓」状態になり、協和的な領域のエージェントは「栄養」を得る。
- リチャージ: フォネーションアタックごとに獲得されるエネルギーは、
このメカニクスはダーウィン的圧力を生み出す:協和なるものの生存(Survival of the Consonant)。
5.3 ピッチリターゲティングとクラウディング
エージェントは静的ではない。適応度を改善するために周波数空間を移動する。ピッチ選択には2つの移動モードとクラウディングメカニズムがある。
GateSnap vs. Glide: ピッチ移動は PitchApplyMode が決める。GateSnap はノートの境界でピッチを離散的に切り替え(各ノートは一つの安定した周波数で鳴る)、Glide は連続的なポルタメントで移る。seek_consonance() を使うボイスでは、スクリプトが明示しない限りモードは発声タイミングから自動的に決まる。持続するボイス(once())はグライドし、打ち直すボイス(pulse / coupled)はオンセットで切り替わる。
クラウディング: クラウディング(相互排斥)とピッチ適応は、単一の共有された占有場(occupancy field)を参照する。各占有基音(生 f0)を中心とするガウシアンペナルティで、その幅は crowding_sigma_cents(デフォルト 60)が定め、強度は crowding_strength が制御する。これにより、エージェント同士が同一周波数に収束して「団子」状態になるのを防ぐ。(オクターブ等価=クロマ項 octave_avoidance は試作後に撤去した。協和ポテンシャルから切り離された平坦なペナルティのため安定動作点がなく、オクターブ融合から強制テンションへ崖状に飛ぶだけだった。場から導かれる回避は occupancy-unified-drive 再設計に委ねる。配置/voice-movement の設計ノートを参照。)
Leave-Self-Out: 自己のスペクトルフットプリントを地形評価から除外する機構。2つのモードが存在する。
ApproxHarmonics: 自身の倍音列を近似的に差し引く。ボディが倍音比を明示的に持つ場合は自身の実際の倍音セットを、持たない場合は整数倍音列を差し引く。高速で近似的。ExactScan: 粗さカーネルを使用してERBグリッド上で正確な自己排除を行う。精密だが計算コストが高い。
探索温度: 単一の temperature パラメータが確率的な探索の強さを制御し、両方のピッチコアで共有される。0 では貪欲に落ち着き(ヒルクライムは明確な改善があるときだけ動き、ピークサンプラーは最尤候補を選ぶ)、値を上げるとヒルクライムは Metropolis 規則で下り方向の移動も受け入れ、ピークサンプラーの候補選択はソフトマックスで和らぐ。これにより局所最適からの脱出が可能になる。これは同時に運動の緊張のノブでもある。温度の高いボイスは協和から外れて彷徨い、温度を下げれば協和へ落ち着く——緊張と解決が探索温度そのものとして現れる。
5.4 オンセットタイミング:カップリング連続体
反復発声のオンセットタイミングは CouplingClock(life/phonation_engine.rs)が生成する。これはボイスごとの位相振動子で、位相が整数を横切るたびにオンセットを放つ。その実効レートは、固有の更新レートと共有ビートとのブレンドになる:
$$ f_{eff} = (1 - \ell), f_{int} + \ell, f_{beat}, \qquad \ell = \kappa \cdot c $$
ここで $\kappa$ はボイスの結合強度(entrainment、0–1)、$c$ はメーターのビート確信度(4.2節)である。つまりボイスがロックできる強さには、メーターがどれだけ信じられているかという上限がかかる。さらに位相プルが、振動子の交差点をビート位相(microtiming でずらせる)へと引き寄せる:
$$ \dot{\phi} = f_{eff} \left(1 + \ell K ,\mathrm{err}(\phi_{beat} - \phi)\right) $$
$\mathrm{err}(\cdot)$ はサイクル単位に折り返した位相誤差($[-0.5, 0.5]$)、$K$ はレート係数が正に保たれるように選ばれた固定のプルゲインである。位相は決して止まらず、速まるか遅れるかしかない。
この一つの機構が、Rhai プリセットで選ばれるリズム族の連続体を張る。
- $\kappa \to 0$(flow):自由な更新過程。オンセット間隔はクラスタ化された分布(
flow_depthがクラスタとギャップの出やすさを決める)から引かれ、雨のような非拍節のテクスチャになる。 - 中間の $\kappa$(entrained):ボイスは緩くロックする。しかもロックが効き始めるのはメーターが確信度を得てからであり、同期は時間をかけて創発する。
- $\kappa \to 1$(metric):共有ビートが深いアトラクタとなり、ボイスは安定したパルスとして聴こえる。
各オンセットは、ボイスの rhythm_role が定める強度(beat 1.0、subdivision 0.7、accent 2.5、texture 0.85)を持ち、この強度がそのまま生成メーターの駆動に還流する。反復するアクセントはメーターをより強く駆動するから、ダウンビートは——やがては小節も——宣言されるのではなく、集団によって誘導されうる。このループのどこにも、外から課されるグリッドは存在しない。
5.5 呼吸振動子:蔵本アーティキュレーション
オンセットのスケジューリングとは別に、KuramotoCore ArticulationCore は各ボイスのエンベロープ——いわば呼吸——を、平均場の蔵本位相ステップでメーター由来のシータ帯域に同調させる:
$$ K_{eff} = \omega_{target} \cdot K_{global} \cdot s_\theta \cdot |\theta_{mag}| \cdot \theta_\alpha \cdot g_{env} \cdot a_{env} $$
$\omega_{target}$ はシータ帯域の角周波数、$K_{global}$ はシーン全体の結合ゲイン(set_global_coupling)、$s_\theta$ はボイスのシータ感度である。$|\theta_{mag}|$ と $\theta_\alpha$ はビート確信度に由来し、$g_{env}$ と $a_{env}$ はエンベロープのゲートと振幅を表す。ヘルパー関数 kuramoto_k_eff() と kuramoto_phase_step() は外部シミュレーション(論文実験)向けに公開してある。この結合には、エネルギー/活力のサブシステムが絡む。
- 結合モード:
TemporalOnly(純粋な位相結合)またはTemporalTimesVitality { lambda_v, v_floor }(健康なエージェントほど強く同期する)。 - rhythm_reward: オプションの
MetabolismRhythmReward(rho_t、AttackPhaseMatch)が位相の合ったオンセットに代謝ボーナスを与え、リズム的同調を生存に結びつける。 - autonomous_attack: エンベロープゲートと確信度の閾値が整合した際の自律的アタック。
6. システムアーキテクチャと実装詳細
Conchordal はリアルタイムオーディオの厳格な要件(レイテンシ < 10ms)と重い数値解析(NSGT/畳み込み)を両立するため、Rust で実装されている。アーキテクチャは並行・ロックフリーの設計パターンを採用する。
6.1 スレッディングモデル
アプリケーションは4つの主要なスレッドコンテキストとGUIイベントループを生成する。
-
オーディオスレッド(リアルタイム優先度):
audio/output.rsでcpalにより管理される。- 制約: 絶対にブロックしてはならない。Mutexもメモリ確保も禁止。
- 責務: ロックフリーリングバッファからモノサンプルをポップし、すべての出力チャンネルにコピーする。
Limiterがインターリーブされた出力にインプレースで適用される。
-
解析スレッド(バックグラウンド優先度):
core/analysis_worker.rsで定義され、core/stream/analysis.rsのAnalysisStreamを実行する。- 責務: ハビタットバスのホップを受信し、NSGTを実行してlog2パワースペクトルを生成し、調波性フィールドと粗さフィールドの両方を単一のパイプラインで計算する。
- 更新サイクル: 完了した地形スナップショットをバウンドSPSCチャンネル経由でワーカースレッドに送信する。
-
リスナー解析スレッド:
- プレゼンテーションバスのホップに対して
ListenerTwin知覚パイプラインを実行する。 - 責務: 聴衆が知覚するもの——知覚メーターのビート確信度を含む——をモデル化し、UI、ヘッドレスレポート、DCC 圧力カプラに供給する。
- プレゼンテーションバスのホップに対して
-
ワーカースレッド(シミュレーションループ):
app.rsで"worker"と命名される。- 責務: メインシミュレーションループを実行する。各イテレーション:解析結果を地形にマージ → Conductorイベントのディスパッチ → Population の進行(ピッチリターゲティング、アーティキュレーション、代謝) →
PhonationEngineがToneCmdを生成 →ScheduleRendererでオーディオをレンダリング → ハビタットフラックスと集団自身のオンセットから生成MeterNetworkを駆動 → リングバッファにモノサンプルをプッシュ。
-
App/GUI スレッド(メイン):
eframe/eguiビジュアライザを実行する。- 責務: ユーザー入力の処理、ランドスケープの可視化、シミュレーションメタデータの表示。ワーカースレッドから
UiFrameスナップショットを受信する。
6.2 データフロー
オーディオスレッドをロックせずにデータの一貫性を保つため、Conchordal はランドスケープを複数チャネル経由で更新する。レンダリングされたオーディオは二つのバスに分かれる。ハビタットバスはエコシステムが感じ取る環境であり、プレゼンテーションバスは聴衆が実際に聴く音である。ドローンをハビタットバスだけに送れば、聴かせることなく地形だけを形づくることもできる。
- ワーカースレッドがバスごとにオーディオをレンダリングし、ハビタットホップを解析スレッドへ、プレゼンテーションホップをリスナー解析スレッドへ送信する。
- 解析スレッドがNSGT + 粗さ + 調波性パイプラインを実行し、
Landscapeスナップショットを返送する。 - ワーカースレッドが解析結果を
LandscapeFrameにマージし、協和性フィールドを再計算する。 - ワーカースレッドがハビタットのオンセットフラックス(
DorsalStream)と集団自身の発声オンセット強度で生成MeterNetworkを駆動し、結果のMeterStateをNeuralRhythms::from_meter_state経由でlandscape.rhythmに射影する。 Populationが地形をピッチ選択、代謝、エージェントライフサイクルのために評価する。PhonationEngineがToneCmdバッチを生成し、ScheduleRendererがトーンの生成・更新・リリースを実行する。- レンダリングされたプレゼンテーションオーディオがオーディオスレッドが消費するロックフリーリングバッファにプッシュされる。
この疎結合アーキテクチャにより、解析スレッドがリアルタイムからわずかに遅延しても、オーディオスレッドは常に一貫したサンプルストリームを参照できる。
6.3 Conductor:Rhai によるスクリプティング
Conductor モジュールは人間のアーティストとエコシステムの間のインターフェースとして機能する。Rhai スクリプト言語を組み込み、シミュレーション制御のための階層化された API を公開する。API は2種類のオブジェクトを軸に構成される:Material(プリセットにメソッドをチェーンして構築する種のレシピ)と Participant(エコシステムに配置された Material)である。常に最新の網羅的リファレンスは Script Reference ブック(docs/rhai_book、/docs/rhai/ で公開)にあり、本節は概念的な階層のみを要約する。
Material の構築: プリセット sine(), harmonic(), saw(), square(), noise(), modal() から開始し、variant(parent) で複製・派生する。
- ボディ:
amp(v),freq(v),brightness(v),spread(v),unison(n),modes(pattern),adsr(a,d,s,r),send(bus)(ハビタット/プレゼンテーションのルーティング)。 - ピッチ:
anchor()(ピッチを保持。freq(hz)はアンカーを含意),seek_consonance()(協和地形を登る。適用モードは自動解決される——持続ボイスはグライド、再アタックするボイスはオンセットでスナップ——pitch_apply_mode("gate_snap"|"glide")で明示上書き可),pitch_core("hill_climb"|"peak_sampler"),glide(v),landscape_weight(v),tessitura_gravity(v),temperature(v)(両コア共有の探索ノブ。0 で貪欲に落ち着く——音楽的にはこれが運動の緊張のノブで、高温ではボイスが協和から外れて彷徨い、冷ますと解決する)ほか。 - クラウディング:
avoid_neighbors(strength)(デフォルトのシグマ)/avoid_neighbors(strength, sigma_cents),crowding_target(same, other),leave_self_out(bool),leave_self_out_mode("approx"|"exact")。 - 発声:
brain("entrain"|"seq"|"drone"),sustain(),repeat(),once(),pulse(rate),pulse_lock(depth),social(v);持続はwhile_alive(),cycles(n),adaptive_duration(),duration_range(min,max),duration_curve(k,x0),shorten_on_drop(gain)。 - リズム(カップリング連続体、5.4節): プリセット
metric(),entrained(),flow()が連続体上の領域を選択する——Hz 引数はない。テンポはディレクターのtemporal_basinの管轄である。微調整はentrainment(v)(ロック強度 0–1),rhythm_role("beat"|"subdivision"|"accent"|"texture"),microtiming(v)。呼吸レベルの結合はrhythm_freq(v),rhythm_coupling_vitality(lambda_v, v_floor),rhythm_reward(rho_t, "attack_phase_match")。 - ライフサイクル/生存可能性:
metabolism(rate),initial_energy(v),energy_cap(v),recharge_rate(v),action_cost(v),viability_rate(v),consonance_viability(low, high),dissonance_cost(v)。 - リスポーン:
respawn_random(),respawn_hereditary(sigma_oct),respawn_consonance(),respawn_capacity(n),respawn_settle(placement),respawn_min_c_level(v),respawn_background_death_rate(v)。
モードパターン: モーダル合成のためのモード比率生成関数。
harmonic_modes(),odd_modes(),power_modes(beta),stiff_string_modes(stiffness),custom_modes(ratios),modal_table(name),landscape_density_modes(),landscape_peaks_modes()。- 修飾子:
.count(n),.range(min, max),.spacing(d),.gamma(g),.jitter(cents),.seed(s)。
プレースメント(Material 投入時の周波数配置)。場相対のプレースメントは対象を名指す。既定は density クラウド、.peak() で決定論的な極値になる:
consonance(...): 協和性最大。consonance(root)は root 相対の倍音窓、consonance(min, max)は絶対範囲。dissonance(min, max): 協和性最小(緊張・クラスター)。edge(min, max): 協和/不協和の境界(準安定な中点)。gap(min, max): 空き帯域(低 subjective intensity)。- 場非依存:
random(min, max)(対数一様), 幾何のat(freq)/line(start, end)。 - 修飾子:
.count(n),.peak(),.range(min_mul, max_mul),.spacing(d)(最小ERB距離)。
Participant とグループ操作:
place(material, placement): ボイスを生成し Participant を返す。create(material, count): 段階的設定のためのドラフトグループを生成。release(participant): グループをフェードアウトリリース。ライブグループはピッチ・振幅・音色のパッチに対応する。
制御フロー:
wait(seconds): 保留グループをコミットし、タイムラインカーソルを進める。flush(): タイムラインを進めずにコミット。seed(value): ランダムシード設定。section(name, callback): スコープ付きシーン——終了時に自動リリース。play(callback)/parallel([callbacks]): スコープ付き/並行ブロック実行。
ディレクター操作(両軸のシーングローバルな地形シェイピング):
- 調波地形:
set_roughness_k(v),set_pitch_objective("consonance"|"dissonance")。 - 時間地形:
meter_stability(v),temporal_basin(min_hz, max_hz)(4.4節)。 - 相互作用:
set_global_coupling(v)。
7. ケーススタディ:創発的挙動の分析
以下の事例は samples/ ディレクトリに由来し、特定のパラメータ設定がどのように複雑な音楽的挙動につながるかを示す。
7.1 ケーススタディ:リズム族連続体(samples/07_heartbeat.rhai, 08_murmuration.rhai, 09_rain.rhai)
三つの姉妹エチュードは、同じ一つの結合機構(5.4節)から質的に異なる時間性が生まれることを示す。
- Metric(
07_heartbeat.rhai): ボイスたちはmetric()を宣言し、ダウンビート担当のボイスがアクセントロールを持つ。そのオンセットが共有の生成メーターを駆動してメーターの確信度が上がり、高い結合が全員のオンセットを深くなったアトラクタへ引き込む。こうして聴き取れるパルスが立ち上がるが、クロックはどこにも存在しない。あるのは、テンポの落ち着き先を地形に告げるtemporal_basinだけである。 - Entrained(
08_murmuration.rhai): 中程度の結合に、活力結合とアタック報酬を加えたもの。同期は即座には起こらず、確信度が積み上がるにつれて数十秒かけて創発し、コロニーが弱れば崩れていく。リズムのまとまりが、生態系の健康と結びついているのである。 - Flow(
09_rain.rhai): 結合をほぼゼロにし、flow_depthを高くしたもの。オンセットはクラスタ化された更新過程に従う。屋根を打つ雨のように、作りからして非拍節でありながら、ピッチの挙動は協和性フィールドに乗り続ける。
7.2 ケーススタディ:漂流と流れ(samples/research/drift_flow.rhai)
このスクリプトはホップベースの移動ロジックを検証する。
- 操作: 強い不協和のエージェント(C#3)が強力なアンカー(C2)の隣に配置される。
- 観察: C#3 エージェントはピッチの離散的なホップを行う。調波性フィールドに「引かれ」、フェードアウトして近傍の調波的「安定井戸」(おそらく E3 または G3)にスナップする。
- ダイナミクス: エージェントごとの飽きが有効な場合、エージェントは E3 に数秒間留まった後「飽きて」(知覚的適応によりローカル協和性が低下し)、再び別の安定音程を見つけるためにホップする。これにより、引力と斥力の単純な物理法則によって生成される、終わりのない非反復のメロディが生じる。
7.3 ケーススタディ:Emergence and Resolution(samples/12_emergence_and_resolution.rhai)
エチュード集を締めくくるこの一曲は、スタック全体をひとつの有向アークとして構成する。作曲家が触れるのは温度のアークである——コロニーの探索を熱して協和から外れて彷徨わせ、やがて冷まして落ち着かせる(探索温度としての調的緊張)。これにレジスタの移調がひとつ加わるだけで、残りはすべて創発に委ねられる——深いビートアトラクタを駆動するメトリックな鼓動(アクセントロールのボイス)、協和へ登りながら同じ創発ビートにロックする生きたコロニー、緊張の頂点でだけ現れる非拍節のフローのきらめき。そして解決とは、コロニーが不協和の頂点を生き延びること(協和性でゲートされた生存可能性と、協和性に偏ったリスポーン)にほかならない。調的重力の回帰はスコアに書かれているのではなく、エコシステムによって演じられる。
8. 結論
Conchordal は生体模倣的計算音響のプルーフオブコンセプトを成功裏に確立する。音楽理論の剛直な抽象化(音符、グリッド、BPM)を連続的な生理学モデル(Log2Space、ERB帯域、神経振動)に置き換えることで、音楽が構成されるのではなく、成長するシステムを実現する。本テクニカルノートで記述した手法の理論的基盤と実験的検証は arXiv:2603.25637 に詳述されている。
Log2Space 座標系と「シブリング投影」アルゴリズムに支えられた技術アーキテクチャは、この新しいパラダイムに堅牢な数学的基盤を提供する。Rust の採用により、これらの複雑な生物学的シミュレーションがリアルタイムで実行可能となり、ALife研究と演奏的楽器の間の溝を橋渡しする。
v0.4.0 は論文の知見を楽器そのものに統合し、アーキテクチャの時間軸側を完成させた。固定のリズムフィルタバンクは、ヘッブ的なテンポ学習と PLV 確信度を備えた強制リミットサイクル振動子——創発メーター——に置き換わった。ボイスのタイミングは、metric / entrained / flow の三族を張る単一のカップリング連続体に統一された。そして作曲家による時間の制御は、パルスをスケジュールすることなくその形成場所だけを形づくる地形事前分布(meter_stability、temporal_basin)へと還元された。さらにデュアルバス設計がハビタット(エコシステムが感じるもの)とプレゼンテーション(聴衆が聴くもの)を分離し、ListenerTwin の知覚モデルが Direct Cognitive Coupling の最初のループを閉じる。
第9章は、Manifesto の公約とこの実装の距離——果たされたもの、未解決のもの、そして実装が逆に教えたもの——を監査して本書を閉じる。
9. Manifesto との対応と未解決問題
Manifesto は公約を宣言する。本章はその公約を監査する。台帳の各行は、公約と、それを果たしている機構(あるいは、まだ何も果たしていないというギャップ)を対応づけ、宣言と実装の距離をつねに見えるところに置く。逆向きに流れた知見——実装の結果が Manifesto の機構レベルのスケッチを書き換えた事例——は 9.3節に分けて記録する。原理は立ち続けるが、スケッチは誤りうる。
9.1 台帳
| Manifesto の公約 | 機構 | 節 | 状態 |
|---|---|---|---|
| 記号媒介なしの生成 | Log2Space+ランドスケープ。音名・音階・拍子記号はエンジンのどこにも存在しない | §2–4 | 実装済み |
| 周波数軸の地形(蝸牛/脳幹モデル) | 粗さ・調波性・協和性カーネル | §3 | 実装済み |
| 時間軸の地形(神経振動) | 創発メーター:強制リミットサイクル、ヘッブ的テンポ学習、PLV 確信度 | §4 | 実装済み。機構スケッチは改訂(9.3)。小節レベルのアクセント生成は未解決 |
| 地形の可変性(文化・個人・未知の原理) | roughness_k、協和性カーネル係数 | §3.4, §6.3.6 | 部分——文化的音律体系は未取込 |
| 順応と期待 | ボイスごとの PerceptualContext のみ | — | 未解決——最大のギャップ(9.2) |
| 音響生命:知覚・代謝・自律 | Voice:コア群、エネルギー、生存可能性 | §5 | 実装済み |
| 集団:ニッチ・共生・地形変形 | クラウディング、リスポーン、閉ループ | §5 | 実装済み |
| 中央指揮者の不在 | ローカルな知覚のみ。メーターは集団自身のオンセットから創発する | §4–5 | 実装済み(temporal scaffolding は明示的な実験として残存) |
| シナリオ=マクロの演出 | ディレクターの地形操作 | §6.3.6 | 実装済み。シーン窓(9.2)が基礎づける |
| DCC 第2段階:生体信号閉ループ | ListenerTwin+report-only の DCC 圧力がシミュレートされた前駆体 | §4.1 | 未解決——方向のみ |
| 役割の溶解・空間ランドスケープ・音色の遺伝・他領域 | 遺伝的リスポーンはアッセイとして存在 | — | 地平 |
9.2 欠けている機構:順応
人間の時間認知は、経験を三つの窓に階層化して処理する。知覚的現在(約3秒、上限およそ8秒)の内側では変化は要らない。テクスチャそのものが「いま」を満たす。音楽のフレーズが住まう予測窓(3–8秒)では、退屈とは「更新する対象を失った予測エンジン」の動作状態である。知覚できる変化のないまま8秒ほどを過ぎると、注意は手を離す。さらにシーン窓(15–30秒)では、このスケールで分節の境界が訪れなければ心はさまよい始める。そして三つの窓すべての下に馴化がある。聴覚野は繰り返されるスペクトルに順応し(刺激特異的順応)、変化しない知覚対象は文字通り顕著性から色あせ、取り去られれば回復する。
地形が知覚のモデルそのものであるシステムにとって、この帰結は構造的である。すなわち、協和は場所ではなく食事である。聴き手をモデル化するランドスケープは、鳴り続けてきたものを減価させ(予測窓程度の時定数を持つ、馴化としての地形浸食)、鳴り止んだ後には回復させなければならない。そうなれば停滞の回避は、演出で作る「間」ではなく生態系自身の性質になる。三つの窓は明確な分業を与える。ミクロ層(ジッター、呼吸、うなり)は身体が、メソ層(順応に駆動される移動、生と死)は生態系が、そしてマクロ層はシナリオが受け持つ。マクロ層は Manifesto が人間のディレクターに明示的に割り当てた唯一の窓であり、ディレクターはこのスケールの境界を聴き手に対して負っている。これは委譲できない。
断片はすでにある。PerceptualContext が持つボイスごとの飽きと馴化はエージェント側での予告編であり、ListenerTwin の緊張・注意レポート(現在は report-only の DCC 圧力経路を含む)は、いずれループを閉じることになるフィードバックチャネルである。ランドスケープレベルの馴化フィールドは今後の課題として残る。それが実現するまでは、「知覚できる変化なしに8秒を超えない」はエチュード路の診断基準であって、システムの性質ではない。
9.3 上流への改訂
実装の結果は、Manifesto の原理を裏づけながら、その機構レベルのスケッチをこれまでに二度書き換えた。
- 固定4帯域のテーブルから、創発するメトリカル階層へ。 Manifesto は delta/theta/alpha/beta の固定帯域に音楽的役割を割り当てるスケッチを描いていた。実際に作ってみて分かったのは逆で、固定フィルタバンクは姿を変えた「課されたグリッド」だった。知覚研究に照らして生き残るのは原理の方——神経振動が音楽的時間を構造化する——であり、それは確信度を備え自己組織化する、拍・サブディビジョン・小節の階層として実現された(第4章)。
- 鏡像双対性から、生成ループの不動点要件へ。 下倍音地形は計算できるのに、短調の調性は創発しなかった。この分析は一般化できる。知覚的な対称性が音楽として実在するのは、それに引き寄せられたエージェントの放射スペクトルが、その対称性を強め返す場合に限られる。知覚は鏡像化できても、生成はできない。あらゆる身体は倍音を放射するからである(3.3.3節)。したがって今後のあらゆる地形操作は、二つの試験に合格しなければならない——知覚機構が実在すること、そして生成側でループが閉じること。緊張ノブとして一時的に生き残った
harmonic_tensionダイアルも撤去された(v0.4)。二試験のいずれも満たさず、エコシステムが読む協和ピークを動かさないことが確認され、そもそも数学的に冗長だったからである——二つの投影パスは、減衰指数が二つある単一の偶畳み込みカーネルにすぎない(3.3.3節)。両試験を満たす緊張軸は、その後構築された(v0.5)——運動の緊張はピッチ探索の温度(実ポテンシャル上の Boltzmann 探索。熱い探索は協和から外れ、冷たい探索は落ち着く)であり、配置の緊張は相対的な協和レベル(最強ピークより一段下の準安定点へ配置する)である。いずれもエコシステムが築いた実地形を歪めずに読むため、両試験を満たす。docs/design-notes/tension.mdを参照。
付録A:主要システムパラメータ
| パラメータ | モジュール | 単位 | 説明 |
|---|---|---|---|
bins_per_oct | Log2Space | Int | 周波数グリッドの分解能(典型値 48-96)。 |
sigma_cents | HarmonicityParams | Cents | 調波ピークの幅。低いほどイントネーションが厳格。 |
roughness_k | LandscapeParams | Float | 粗さマッピングの飽和パラメータ。デフォルト:$(1/0.7) - 1 \approx 0.4286$。 |
kernel.a | ConsonanceKernel | Float | 調波性係数(デフォルト 1.0)。 |
kernel.b | ConsonanceKernel | Float | 粗さ係数(デフォルト −1.35)。 |
kernel.c | ConsonanceKernel | Float | 相互作用係数(デフォルト 1.0)。 |
kernel.d | ConsonanceKernel | Float | バイアス項(デフォルト 0.0)。 |
beta | ConsonanceRepresentationParams | Float | $C_{level01}$ のシグモイド急峻度(デフォルト 2.0)。 |
theta | ConsonanceRepresentationParams | Float | $C_{level01}$ のシグモイド閾値(デフォルト 0.0)。 |
consonance_density_roughness_gain | LandscapeParams | Float | 密度カーネルにおける $\rho$(デフォルト 1.0)。 |
stability | MeterShaping | 0.0-1.0 | ビートアトラクタ深度(meter_stability):強制力とテンポ学習をスケール。 |
basin_hz | MeterShaping | Hz ペア | テンポ事前領域(temporal_basin):ビート周波数学習のシードと制限。 |
coupling | CoupledTimingSpec | 0.0-1.0 | 共有ビートへのボイスごとのロック強度(entrainment)。 |
flow_depth | CoupledTimingSpec | 0.0-1.0 | 自由走行オンセットの更新クラスタリング(0 = 規則的)。 |
microtiming | CoupledTimingSpec | cycles | ロック目標への符号付きビート位相オフセット。 |
temperature | PitchHillClimbPitchCore / PitchPeakSamplerCore | Float ≥ 0 | 両ピッチコア共有の探索ノブ。0 で貪欲に落ち着き、値を上げるほど探索的。音楽的には運動の緊張のノブ(高温=協和から外れて彷徨う、0=落ち着く)。 |
crowding_strength | PitchHillClimbPitchCore | Float | クラウディングペナルティの強度(デフォルト 0.0)。 |
crowding_sigma_cents | PitchHillClimbPitchCore | Cents | クラウディングの空間幅(デフォルト 60.0)。 |
leave_self_out | PitchHillClimbPitchCore | Bool | 自己排除モードの有効/無効。 |
attack_step | KuramotoCore | Float | アタックエンベロープのステップサイズ。 |
decay_rate | KuramotoCore | Float | ディケイエンベロープのレート。 |
付録B:数学的要約
協和性カーネル(双線形):
$$ C_{score} = a \cdot H_{01} + b \cdot R_{01} + c \cdot H_{01} R_{01} + d $$
協和性レベル(シグモイド表現):
$$ C_{level01} = \frac{1}{1 + e^{-\beta(C_{score} - \theta)}} $$
協和性密度質量($\rho$-カーネル):
$$ C_{density_mass} = \max(0,; H_{01}(1 - \rho R_{01})) $$
粗さ飽和マッピング(参照正規化された比 $x$ から $R_{01} \in [0,1]$):
$$ R_{01}(x; k) = \begin{cases} 0 & \text{if } x \leq 0 \ x \cdot \frac{1}{1+k} & \text{if } 0 < x < 1 \ 1 - \frac{k}{x+k} & \text{if } x \geq 1 \end{cases} $$
ここで $k$ は roughness_k(デフォルト $\approx 0.4286$)。関数は $x=1$ で連続であり、$x \to \infty$ で1に飽和する。
調波性投影(シブリングアルゴリズム): $$ H[i] = (1-\alpha)\sum_m \left( \sum_k A[i+\log_2(k)] \right)[i-\log_2(m)] + \alpha \sum_m \left( \sum_k A[i-\log_2(k)] \right)[i+\log_2(m)] $$
粗さ畳み込み: $$ R_{shape}(z) = \int A(\tau) \cdot K_{plomp}(|z-\tau|_{ERB}) d\tau $$