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、多数のカーネル」アプローチにより、帯域ごとに個別のDFTを計算したり、再帰フィルタバンクを用いたりすることなく、高分解能の対数間隔スペクトルを得られる。現在のinstrument runtimeは55 Hzから8 kHzまでを1オクターブ96ビンで解析する。Log2Space自体は、実験やtestで別の正の上下限も扱える。
3.1.2 リアルタイム時間平滑化
瞬時帯域power $p_k=|C_k|^2$ は、オーディオ入力の確率的性質(特にノイズベースのエージェント)により高い分散を示す。エージェントが読む安定したフィールドを作るため、RtNsgtKernelLog2 構造体はNSGTを時間平滑化層でラップする。
帯域ごとのリーキー積分器(指数平滑化)が実装される。重要なのは、時定数 $\tau$ が周波数依存であることだ。緩やかに変化する低周波はより長い $\tau$ で平滑化され、過渡的な詳細を含む高周波はより短い $\tau$ を持つ。
$$ y_k[t] = (1 - \alpha_k) \cdot p_k[t] + \alpha_k \cdot y_k[t-1] $$
ここで平滑化係数 $\alpha_k$ はフレーム間隔 $\Delta t$ から導出される。
$$ \alpha_k = e^{-\Delta t / \tau(f_k)} $$
これは耳の「積分時間」をモデル化する。ただし、この出力がそのままroughnessとharmonicityへ入るわけではない。平滑化されたpowerは、次の知覚前処理で疎なsubjective-intensity densityへ変換される。
3.1.3 NSGT powerからsubjective intensityへ
SpectralFrontEnd(core/landscape_spectral.rs)は、平滑化されたNSGT powerをそのままLandscape kernelへ渡さない。各hopで次の処理を行う。
- Log2Spaceに対応するERB cell幅を使い、ビンごとのpowerをpower densityへ変換する。
- 有意なスペクトルpeakを抽出する。各解析ビンを独立したpartialとはみなさず、peakの積分massを保存する。
- 各peak massへA-weightingのpower gainと圧縮指数
loudness_expを適用する。 - 変換後のmassを、Log2Spaceに揃った疎なsubjective-intensity densityへ戻し、
analysis.tau_msを時定数とする二段目のleaky normalizationを施す。
以下のroughnessとharmonicityが共通して読むのは、生の$|C_k|$でもNSGT powerでもなく、このsubjective_intensity scanである。その積分値はloudness_massとして別に保持される。
3.2 粗さ($R$)計算:Plomp-Levelt モデル
粗さとは、同一臨界帯域内にあるが単一の音として知覚されるほど近接していないスペクトル成分の干渉によって引き起こされる「荒々しさ」や「うなり」の感覚(ビーティング)である。Conchordal はERB領域での畳み込みを通じた Plomp-Levelt モデルの変形を実装する。
3.2.1 干渉カーネル
計算の核心はcore/roughness_kernel.rsで定義されるroughness kernelである。$K_{rough}(\Delta z)$は、ERB-rate上で$\Delta z$だけ離れた2つのpartialの干渉曲線を表す。デフォルトのSethares coreは約4分の1 ERB-rate付近にpeakを持ち、参照正規化用の刺激は0.25 ERB間隔を使う。
実装は、Setharesの指数差core、小さな方向性masking asymmetry、中心抑制dip、任意のneural Gaussian成分を組み合わせる。$u=|\Delta z|/\kappa$とすると、
$$ S(\Delta z) = G,\max(0, e^{-bu} - e^{-cu}),A(\Delta z) $$
$$ M(\Delta z) = \left(1-e^{-\Delta z^2/(2\sigma_{sup}^2)}\right)^p, \qquad N(\Delta z)=e^{-\Delta z^2/(2\sigma_n^2)} $$
$$ K_{rough}(\Delta z)=(1-w_n),S(\Delta z)M(\Delta z)+w_nN(\Delta z) $$
$A(\Delta z)$はmix_tailとtau_erbが制御する正負方向の非対称項である。デフォルトの$w_n=0$ではcochlear Sethares pathだけを用いる。$M(0)=0$が純音の自己roughnessを抑え、$w_n$を上げた場合にはneural成分が意図的にそのdipを埋める。
3.2.2 畳み込みアプローチ
すべてのスペクトルビンに対するペアワイズの粗さ計算($N^2$ の計算量)はリアルタイム応用には計算上不可能である。Conchordal は粗さの計算を線形畳み込みとして扱うことでこれを解決する。
- マッピング: 3.1.3節のLog2Space-aligned subjective-intensity densityを線形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.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]$ | 馴化のdriveと非浸食viewに使うbase level |
| $C_{density_mass}$ | $\max(0,;H_{01}(1 - \rho R_{01}))$ | $[0,+\infty)$ | 浸食前のbase density mass |
| $C_{density_pmf}$ | $\text{normalize}(C_{density_mass}^{eff})$ | $[0,1],;\Sigma=1$ | Landscapeに残る全域正規化view |
| $C_{energy}$ | $-C_{score}$ | $(-\infty,+\infty)$ | 最小化用エネルギー |
| $C_{score}^{eff}$ | $\theta+(C_{score}-\theta)(1-h)$ | $(-\infty,+\infty)$ | 移動と予測が読む馴化浸食後のscore |
| $C_{level01}^{eff}$ | $\sigma(\beta(C_{score}^{eff}-\theta))$ | $[0,1]$ | behaviorとlistenerが読む浸食後のlevel |
| $C_{density_mass}^{eff}$ | $(1-h)C_{density_mass}$ | $[0,+\infty)$ | density placementが読む浸食後のmass |
ここで$\sigma(x) = 1/(1+e^{-x})$、$\beta$はシグモイドの急峻度(デフォルト2.0)、$\theta$はその閾値(デフォルト0.0)である。density massには係数$a{=}1, b{=}0, c{=}{-}\rho, d{=}0$の別個の$\rho$-kernelを用いる。$\rho$(consonance_density_roughness_gain、デフォルト1.0)は、roughnessがdensity placementをどれだけ抑えるかを決める。
spawnは全域の$C_{density_pmf}$を直接サンプルしない。SpawnStrategy::Fieldは、まず指定された周波数範囲だけを切り出し、effective viewから対象別のlocal massを作る。そこへ占有maskをかけ、その局所vectorだけを正規化する。massが全て0なら未占有ビン上の一様分布へ、全ビン占有なら範囲全体の一様分布へfallbackする。peak placementは$C_{score}^{eff}$を決定論的に読む。全域PMFは正規化されたLandscape表現として残るが、現在これを直接使うのはcore testだけである。
この共有地形とは別に、Voiceごとの適応もある。AdaptationContextは共有された基音占有場に対する速いboredomと遅いfamiliarityを追跡し、pitch candidateごとのscoreを補正する。これは次節のLandscape-level habituationと併存する。adaptationはエージェント固有の記憶であり、habituationは共有された知覚地形の浸食である。
3.5 Landscape-level habituation
協和は無尽蔵な場所ではない。[psychoacoustics.habituation]を有効にすると、HabituationFieldが各ビンの状態$h_i\in[0,1]$を保持する。ecologyのhabitat解析と、ListenerTwinのpresentation解析には、それぞれ独立した状態がある。raw driveはbase consonance level $L_i$と新たに計算したcommon-root projection $P_i$を組み合わせる。
$$ d_i^{raw}=L_iP_i, \qquad d_i=\frac{d_i^{raw}}{d_i^{raw}+r_{ref}} $$
状態はこのdriveへ非対称に緩和する。
$$ h_i(t+\Delta t)=a h_i(t)+(1-a)d_i, \qquad a=e^{-\Delta t/\tau} $$
driveが上昇するときは$\tau=\tau_e$、下降するときは$\tau=\tau_r$を使う。satiation_secは90%浸食まで、recovery_secは90%回復までの時間として定義されるため、実装は$\tau_e=T_s/\ln 10$、$\tau_r=T_r/\ln 10$とする。effective scoreはsigmoidの中立閾値$\theta$へ近づき、density massは上表のとおり乗算的に浸食される。
デフォルトはenabled=false、satiation_sec=5.0、recovery_sec=8.0、ref_drive=0.25である。無効時のhabituationは完全な恒等写像で、全effective viewはbase viewとbit単位で一致する。有効時には、移動、予測、代謝、respawn、density placement、listenerがeffective viewを読む。一方、UIのterrainとdiagnosticsは意図的に非浸食のbase viewを表示する。
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節)に同期する「呼吸」振動子。0–1に正規化されたエネルギー/活力モデルを内蔵し、rhythm_coupling(TemporalOnly/TemporalTimesVitality)、rhythm_reward(リズム同期による代謝報酬)、autonomous_attack(自律的アタックトリガ)を備える。作曲側の値としてendurance_secと任意のrecovery_secを保持し、実行時rateはVoice生成時に一度だけ導出される。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: 設定された半減期でエンベロープが減衰する一過性のアーティキュレーション。冗長なエネルギースケールを公開せず、プラックやパーカッションをモデル化する。
- Sustain: エネルギーを $[0,1]$ に正規化した生きたアーティキュレーション。
- endurance:
endurance_secは、場への適合が0、アタックと回復がない条件での公称エネルギー枯渇時間である。基礎消費rateは $1/(T_e(1+p_d))$ として導出され、dissonance_penaltyを変えてもゼロ適合時のenduranceは変わらず、良好な適合だけが寿命を延ばす。 - 連続回復: 任意の
recovery_secは、生存可能性信号が1、消費とアタックがない条件でエネルギーを0から1へ戻す時間であり、rateは $1/T_r$ である。 - アタック経済:
attack_cost_fractionとattack_recharge_fractionは、最大強度のアタック1回に適用する正規化容量の割合であり、回復項は協和性でスケールされる。 - rhythm_reward: 位相の合ったアタックに対し、
MetabolismRhythmRewardが回復項だけを増幅する。
- endurance:
エネルギー枯渇は再トリガを止め、エンベロープの余韻を開始する。このためレポートは設定endurance、エネルギー枯渇時刻、可聴上の寿命を分けて記録する。
このメカニクスはダーウィン的圧力を生み出す:協和なるものの生存(Survival of the Consonant)。不協和な場所、すなわち$C_{level01}^{eff}$が低い場所ではenergyが減り、Voiceは衰えて死ぬ。高い場所ではenergyを保ち、または回復できる。Landscape habituationを有効にすると、かつて支えとなった場所も、活動が続けばeffective valueを失い、音が退いた後に回復する。生存は音響的な適合だけでなく、直近の知覚履歴にも左右される。
5.3 ピッチリターゲティングとクラウディング
エージェントは静的ではない。適応度を改善するために周波数空間を移動する。candidate評価はhabituationで浸食されたscoreを読む。exact leave-self-outでは、自己成分を除いたraw scoreを計算し直した後、比較前に同じlocal erosionを適用する。ピッチ選択には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知覚パイプラインを実行する。 - 責務: 独立したhabituation fieldと知覚メーターのビート確信度を含め、聴衆が知覚するものをモデル化し、UI、ヘッドレスレポート、DCC圧力カプラに供給する。
- プレゼンテーションバスのホップに対して
-
ワーカースレッド(シミュレーションループ):
app.rsで"worker"と命名される。- 責務: メインシミュレーションループを実行する。各イテレーション:解析結果を地形にマージ → Conductorイベントのディスパッチ → Population の進行(ピッチリターゲティング、アーティキュレーション、代謝) →
PhonationEngineがToneCmdを生成 →ScheduleRendererでオーディオをレンダリング → ハビタットフラックスと集団自身のオンセットから生成MeterNetworkを駆動 → リングバッファにモノサンプルをプッシュ。
-
App/GUI スレッド(メイン):
eframe/eguiビジュアライザを実行する。- 責務: ユーザー入力の処理、ランドスケープの可視化、シミュレーションメタデータの表示。ワーカースレッドから
UiFrameスナップショットを受信する。
6.2 データフロー
オーディオスレッドをロックせずにデータの一貫性を保つため、Conchordal はランドスケープを複数チャネル経由で更新する。レンダリングされたオーディオは二つのバスに分かれる。ハビタットバスはエコシステムが感じ取る環境であり、プレゼンテーションバスは聴衆が実際に聴く音である。ドローンをハビタットバスだけに送れば、聴かせることなく地形だけを形づくることもできる。
- ワーカースレッドがバスごとにオーディオをレンダリングし、ハビタットホップを解析スレッドへ、プレゼンテーションホップをリスナー解析スレッドへ送信する。
- 解析スレッドがNSGT + subjective intensity + roughness + harmonicityパイプラインを実行し、raw
Landscapeスナップショットを返送する。 - ワーカースレッドが解析結果を
LandscapeFrameへマージし、base consonance表現を再計算する。次にecology側のHabituationFieldを進め、effective viewを書き込む。listener解析結果には別のhabituation stateを適用する。 - ワーカースレッドがハビタットのオンセットフラックス(
DorsalStream)と集団自身の発声オンセット強度で生成MeterNetworkを駆動し、結果のMeterStateをNeuralRhythms::from_meter_state経由でlandscape.rhythmへ射影する。 Communityがeffective Landscapeを、ピッチ選択、代謝、spawn、respawn、Voiceのライフサイクルに使う。- DCC couplingが有効なら、
ListenerTwinのtensionとresolvabilityから上限つきのtemperature bonusを作り、Voiceのpitch searchへ戻す。デフォルトのcoupling strengthは0であり、明示的に有効化しない限り挙動は変わらない。 PhonationEngineがToneCmdbatchを生成し、ScheduleRendererがToneの生成・更新・releaseを実行する。- レンダリングされたpresentation audioを、オーディオスレッドが消費するロックフリーring bufferへpushする。
この疎結合アーキテクチャにより、解析スレッドがリアルタイムからわずかに遅延しても、オーディオスレッドは常に一貫したサンプルストリームを参照できる。
6.3 Conductor:Rhai によるスクリプティング
Conductor モジュールは人間のアーティストとエコシステムの間のインターフェースとして機能する。Rhai スクリプト言語を組み込み、シミュレーション制御のための階層化された API を公開する。API は四つの明示的な寿命に従う。PopulationSpec は再利用可能な配置前定義、Population は place() が生成する安定した集団同一性、Voice は一個の生きた構成員、実行時の Community は同じ Landscape を共有する全 Population の集約である。常に最新の網羅的リファレンスは日本語版 Script Reference ブック(docs/rhai_book_ja、/ja/docs/rhai/ で公開)にあり、本節は概念的な階層のみを要約する。Species は設定オブジェクトの別名にはせず、将来、遺伝と種分化の不変条件が実装された時のために予約する。
PopulationSpec の構築: プリセット sine(), harmonic(), saw(), square(), noise(), modal() から開始し、variant(parent) で複製・派生する。PopulationSpec は創始 Voice の既定値と、集団全体のライフサイクル・生存可能性・リスポーン方針を併せ持つ。
- ボディ:
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")。 - ライフサイクル/生存可能性:
endurance(sec), 任意のrecovery(sec),attack_cost_fraction(v),attack_recharge_fraction(v),consonance_viability(low, high),dissonance_penalty(v),phonate_when_viable()(viability windowが開くまで最初のonsetを保留)。 - リスポーン:
respawn_random(),respawn_hereditary(sigma_oct),respawn_consonance(),respawn_capacity(n)(生存構成員数の上限。未指定時は創始Voice数で、それより小さくはできない),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)。
プレースメント(PopulationSpec 投入時の創始 Voice の周波数配置)。場相対のプレースメントは対象を名指す。既定は 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(),.density(),.range(min_mul, max_mul),.spacing(d)(最小ERB距離)。Consonance placementだけは.tension(degree)で、範囲内の最強peakより一段低いfield-scoreを狙える。
Population の配置とライブ操作:
place(population_spec, placement): 現在のカーソルで創始 Voice を即座にスケジュールし、安定した Population を返す。release(population): Population を終端的に閉じ、現在の構成員をフェードアウトさせる。以後のパッチは無視される。
place() が定義と実行時を分ける唯一の境界であり、公開ドラフト Population は存在しない。初期のボディ・挙動・ライフサイクル・リスポーンは PopulationSpec だけに、ピッチ・振幅・音色などのライブパッチと release は Population だけに属する。死とリスポーンで voice_id と世代が変わっても、Population の population_id は変わらない。
制御フロー:
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()を宣言し、ダウンビート担当のボイスがアクセントロールを持つ。そのオンセットが共有の生成メーターを駆動してメーターの確信度が上がり、高い結合が全員のオンセットを深くなったアトラクタへ引き込む。こうして聴き取れるパルスが立ち上がる。外部のmaster clockはなく、あるのはVoiceごとのcoupling clockと、テンポの落ち着き先を地形に告げるtemporal_basinだけである。 - Entrained(
08_murmuration.rhai): 中程度の結合に、活力結合とアタック報酬を加えたもの。同期は即座には起こらず、確信度が積み上がるにつれて数十秒かけて創発し、コロニーが弱れば崩れていく。リズムのまとまりが、生態系の健康と結びついているのである。 - Flow(
09_rain.rhai): 結合をほぼゼロにし、flow_depthを高くしたもの。オンセットはクラスタ化された更新過程に従う。屋根を打つ雨のように、作りからして非拍節でありながら、ピッチの挙動は協和性フィールドに乗り続ける。
7.2 ケーススタディ:漂流と流れ(samples/research/drift_flow.rhai)
このファイルは、初期の短い歴史的fixtureとして残してある。現在は自律的なhop-based driftを検証するものではない。
- 明示的patch: 持続anchorをC2(65.41 Hz)へ、もう一つの持続VoiceをC#3(138.59 Hz)へ置く。後者は
population.freq(220.0)で直接220 Hzへ変更し、その後releaseする。 - Field query:
consonance(130.0).peak().range(1.0, 4.0)を使い、一つのVoiceからなるswarmを5回続けて配置する。live fieldに対する決定論的なqueryを反復するfixtureである。 - Terrain change: 最後にanchorをF2(87.31 Hz)へpatchし、配置後のfieldを変える。
したがって、このfixtureが示すのはPopulationへのlive patchとfield-relative placementの反復である。自律的なsettlingはsamples/05_settling.rhaiが担う。drift_flow.rhai自体がboredomによる終わりのないhopを生むという旧記述は、現行scriptと一致しないため削除した。
7.3 ケーススタディ:Emergence and Resolution(samples/12_emergence_and_resolution.rhai)
最後の統合サンプルは、スタック全体をひとつの有向アークとして組み合わせる。scenarioが操作するのは温度のアーク——コロニーの探索を熱して協和から外れて彷徨わせ、やがて冷まして落ち着かせる(探索温度としての調的緊張)——と、レジスタの移調ひとつである。残りは創発に委ねられる。深いビートアトラクタを駆動するメトリックな鼓動(アクセントロールのボイス)、協和へ登りながら同じ創発ビートにロックする生きたコロニー、緊張の頂点でだけ現れる非拍節のフローのきらめきである。コロニーが不協和の頂点を生き延びること(協和性でゲートされた生存可能性と、協和性に偏ったリスポーン)により、音符を一つずつ指定せずにエコシステムが解決を作る例を示す。
8. 結論
Conchordal は生体模倣的計算音響のプルーフオブコンセプトを成功裏に確立する。音楽理論の剛直な抽象化(音符、グリッド、BPM)を連続的な生理学モデル(Log2Space、ERB帯域、神経振動)に置き換えることで、音楽が構成されるのではなく、成長するシステムを実現する。本テクニカルノートで記述した手法の理論的基盤と実験的検証は arXiv:2603.25637 に詳述されている。
Log2Space 座標系と「シブリング投影」アルゴリズムに支えられた技術アーキテクチャは、この新しいパラダイムに堅牢な数学的基盤を提供する。Rust の採用により、これらの複雑な生物学的シミュレーションがリアルタイムで実行可能となり、ALife研究と演奏的楽器の間の溝を橋渡しする。
v0.4.0は論文の知見を楽器そのものに統合し、アーキテクチャの時間軸側を完成させた。固定のリズムフィルタバンクは、ヘッブ的なテンポ学習とPLV確信度を備えた強制リミットサイクル振動子——創発メーター——に置き換わった。ボイスのタイミングは、metric / entrained / flowの三族を張る単一のカップリング連続体に統一された。そして作曲家による時間の制御は、パルスをスケジュールすることなくその形成場所だけを形づくる地形事前分布(meter_stability、temporal_basin)へと還元された。デュアルバス設計は、ハビタット(エコシステムが感じるもの)とプレゼンテーション(聴衆が聴くもの)を分離する。このreleaseには、任意で有効化するLandscape habituationと、pitch-search temperatureを上げられるListenerTwinの模擬feedback pathも含まれる。どちらもデフォルトでは挙動を変えない。
第9章は、Manifesto の公約とこの実装の距離——果たされたもの、未解決のもの、そして実装が逆に教えたもの——を監査して本書を閉じる。
9. Manifesto との対応と未解決問題
Manifesto は公約を宣言する。本章はその公約を監査する。台帳の各行は、公約と、それを果たしている機構(あるいは、まだ何も果たしていないというギャップ)を対応づけ、宣言と実装の距離をつねに見えるところに置く。逆向きに流れた知見——実装の結果が Manifesto の機構レベルのスケッチを書き換えた事例——は 9.3節に分けて記録する。原理は立ち続けるが、スケッチは誤りうる。
9.1 台帳
| Manifesto の公約 | 機構 | 節 | 状態 |
|---|---|---|---|
| 記号媒介なしの生成 | Log2Space+ランドスケープ。音名・音階・拍子記号はエンジンのどこにも存在しない | §2–4 | 実装済み |
| 周波数軸の地形(蝸牛/脳幹モデル) | 粗さ・調波性・協和性カーネル | §3 | 実装済み |
| 時間軸の地形(神経振動) | 創発メーター:強制リミットサイクル、ヘッブ的テンポ学習、PLV 確信度 | §4 | 実装済み。機構スケッチは改訂(9.3)。小節レベルのアクセント生成は未解決 |
| 地形の可変性(文化・個人・未知の原理) | roughness_k、協和性カーネル係数、任意のhabituation erosion | §3.4–3.5, §6.3.6 | 部分——文化的音律体系は未取込 |
| 順応と期待 | VoiceごとのAdaptationContext + ecology/listenerのHabituationField | §3.5, §5 | 部分——順応は実装済み。phrase/sceneの明示的な期待モデルは未解決(9.2) |
| 音響生命:知覚・代謝・自律 | Voice:異なるアーティキュレーション生命コア、正規化エネルギー、時間領域のendurance/recovery、生存可能性 | §5 | 実装済み |
| 集団:ニッチ・共生・地形変形 | クラウディング、リスポーン、閉ループ | §5 | 実装済み |
| 中央指揮者の不在 | ローカルな知覚のみ。メーターは集団自身のオンセットから創発する | §4–5 | 実装済み(temporal scaffolding は明示的な実験として残存) |
| シナリオ=マクロの演出 | ディレクターの地形操作 | §6.3.6 | 実装済み。シーン窓(9.2)が基礎づける |
| DCC 第2段階:生体信号閉ループ | [dcc] coupling有効時、ListenerTwin圧力をpitch-search temperatureへ戻す | §4.1, §6.2 | 模擬loopは実装済み・デフォルト無効。実生体信号loopは未解決 |
| 役割の溶解・空間ランドスケープ・音色の遺伝・他領域 | 遺伝的リスポーンはアッセイとして存在 | — | 地平 |
9.2 実装された順応と、残る期待のギャップ
人間の時間認知は、経験を三つの窓に階層化して処理する。知覚的現在(約3秒、上限およそ8秒)の内側では変化は要らない。テクスチャそのものが「いま」を満たす。音楽のフレーズが住まう予測窓(3–8秒)では、退屈とは「更新する対象を失った予測エンジン」の動作状態である。知覚できる変化のないまま8秒ほどを過ぎると、注意は手を離す。さらにシーン窓(15–30秒)では、このスケールで分節の境界が訪れなければ心はさまよい始める。そして三つの窓すべての下に馴化がある。聴覚野は繰り返されるスペクトルに順応し(刺激特異的順応)、変化しない知覚対象は文字通り顕著性から色あせ、取り去られれば回復する。
地形が知覚のモデルそのものであるシステムにとって、この帰結は構造的である。すなわち、協和は場所ではなく食事である。現在の実装は、この命題を二つの水準で実現している。各VoiceのAdaptationContextは基音占有場の速いtraceと遅いtraceを持ち、pitch選択へboredomとfamiliarityの補正を加える。共有環境の側では、任意のHabituationFieldが、持続するperceived-consonance activityを減価し、音が退いた後に回復する(3.5節)。habitat busとpresentation busの内容は一致するとは限らないため、ecologyとListenerTwinは別々の状態を持つ。
残るギャップは、順応の不在ではなく期待である。次にどのeventが起きるはずかを表すphrase-level predictorはまだなく、scene境界を自律的に作り、評価する機構もない。したがって分業は残る。ミクロ層(jitter、呼吸、うなり)はbodyが、メソ層(順応に駆動される移動、生と死)はecologyが、マクロ層はscenarioが受け持つ。ListenerTwinのtensionとresolvabilityは、[dcc].coupling_strength > 0ならpitch-search temperatureを加算し、模擬feedback loopをすでに閉じられる。デフォルトは0であり、実際の聴き手の生体信号との接続は今後の課題である。habituation無効時には、「知覚できる変化なしに約8秒を超えない」は依然として有用なsample診断であり、システムの不変条件ではない。
9.3 上流への改訂
実装の結果は、Manifesto の原理を裏づけながら、その機構レベルのスケッチを更新してきた。
- 固定4帯域のテーブルから、創発するメトリカル階層へ。 Manifesto は delta/theta/alpha/beta の固定帯域に音楽的役割を割り当てるスケッチを描いていた。実際に作ってみて分かったのは逆で、固定フィルタバンクは姿を変えた「課されたグリッド」だった。知覚研究に照らして生き残るのは原理の方——神経振動が音楽的時間を構造化する——であり、それは確信度を備え自己組織化する、拍・サブディビジョン・小節の階層として実現された(第4章)。
- 知覚上の対称性から、生成loopの不動点要件へ。 地形操作が生態学的に意味を持つには、知覚機構が実在し、そこへ引き寄せられたエージェントの放射スペクトルがその地形を強め返さなければならない。現在の緊張制御は地形を歪めず、ecologyが作った地形を読む。運動の緊張はpitch-search temperature、配置の緊張は相対的なconsonance levelである。
docs/design-notes/tension.mdを参照。 - rateの考古学から、観測可能な時間契約へ。 生のエネルギープールと毎秒rateを公開すると、エコロジーが導出できる次元まで作曲家に手計算させることになる。実装アッセイにより、独立した契約は
initial_energyやenergy_capではなく公称enduranceだと分かった。エネルギーは $[0,1]$ に正規化でき、ゼロ適合時の消費rateはenduranceと不協和形状から導出できる。一方、毎秒の連続回復とアタックごとの回復は次元が異なるため、回復時間と離散割合として分離した。同じアッセイはEntrain・Seq・Droneの統合も退けた。オンセット時のリセット、死亡規則、telemetry、render modulatorが観測可能に異なり、単一コア化はenumをフラグの背後へ隠すだけだからである。 - 曖昧なオブジェクト名から、寿命を担うオントロジーへ。
Material、Participant、公開ドラフト Population は、どれも自分が表す寿命を名指さないため、説明に例外を必要とした。現在の遷移はPopulationSpec + Placement --place()--> Populationと明示され、その生きた構成員が Voice、Landscape を共有する全 Population の集約が Community である。集団方針は PopulationSpec に、ライブ操作は Population に属し、place()は創始 Voice を即座にスケジュールする。Speciesは遺伝と種分化が実在する不変条件を与えるまで予約する。命名は観測可能な同一性に支えられる。Population は構成員の死とリスポーンをまたいで残るが、Voice とその世代は残らない。
付録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)。 |
habituation.enabled | HabituationParams | Bool | Landscape erosionを有効化。デフォルトはfalseで、effective viewはbase viewと同一。 |
habituation.satiation_sec | HabituationParams | 秒 | 単位driveが持続したとき90% erosionへ達する時間(デフォルト 5.0)。 |
habituation.recovery_sec | HabituationParams | 秒 | driveがなくなってから90%回復する時間(デフォルト 8.0)。 |
habituation.ref_drive | HabituationParams | Float | habituationの伝達関数における半飽和drive(デフォルト 0.25)。 |
loudness_exp | LandscapeParams | Float | subjective-intensity front endでA-weighted peak powerに適用する圧縮指数(デフォルト 0.23)。 |
tau_ms | LandscapeParams | ミリ秒 | peak抽出後のleaky normalization時定数([analysis].tau_ms)。 |
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 | 自己排除モードの有効/無効。 |
endurance_sec | LifecycleConfig::Sustain | 秒 | アタックと回復がないゼロ適合時の公称エネルギー枯渇時間。 |
recovery_sec | LifecycleConfig::Sustain | 任意の秒 | 生存可能性信号1で正規化エネルギーを0から1へ戻す時間。 |
attack_cost_fraction | LifecycleConfig::Sustain | 正規化エネルギー / attack | 最大強度アタックが消費する容量。 |
attack_recharge_fraction | LifecycleConfig::Sustain | 正規化エネルギー / attack | 完全に協和したアタックが回復する最大容量。 |
dissonance_penalty | LifecycleConfig::Sustain | Float ≥ 0 | ゼロ適合enduranceを保ったまま、良好な適合による寿命延長を形づくる。 |
dcc.coupling_strength | DccConfig | 0.0-1.0 | ListenerTwinのtension feedback強度。デフォルトは0.0(挙動上は無効)。 |
dcc.max_temperature_bonus | DccConfig | Float ≥ 0 | listener pressureがpitch-search temperatureへ加える最大値(デフォルト 0.10)。 |
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})) $$
Landscape habituationとeffective view:
$$ d_i=\frac{L_iP_i}{L_iP_i+r_{ref}}, \qquad h_i(t+\Delta t)=a h_i(t)+(1-a)d_i, \quad a=e^{-\Delta t/\tau_{rise/fall}} $$
$$ C_{score,i}^{eff}=\theta+(C_{score,i}-\theta)(1-h_i), \qquad C_{density_mass,i}^{eff}=C_{density_mass,i}(1-h_i) $$
$$ C_{level01,i}^{eff}=\frac{1}{1+e^{-\beta(C_{score,i}^{eff}-\theta)}} $$
粗さ飽和マッピング(参照正規化された比 $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に飽和する。
時間領域ライフサイクル(正規化エネルギー $E\in[0,1]$):
$$ b = \frac{1}{T_e(1+p_d)}, \qquad \Delta E_{basal} = -b,[1+p_d(1-C_{level01}^{eff})],\Delta t $$
$$ \Delta E_{recovery} = \frac{V(C^{eff})}{T_r},\Delta t, \qquad \Delta E_{attack} = -f_c + f_r C_{level01}^{eff}m_r $$
$T_e$ はendurance、$T_r$ はrecovery、$p_d$ は不協和penalty、$V(C^{eff})$ は生存可能性window信号、$f_c/f_r$ はアタックcost/recharge割合、$m_r$ は上限つきリズム報酬乗数である。
調波性投影(単一路のシブリングアルゴリズム):
$$ Roots[i]=\left(\sum_k k^{-\rho}A[i+\log_2(k)]\right)^{\gamma} $$
$$ H[i]=\max\left(0,;\sum_m m^{-\rho}Roots[i-\log_2(m)] -(1-w_{diag})\left(\sum_{k=1}^{K}k^{-2\rho}\right)A[i]\right) $$
実装はこの後、任意の絶対周波数TFS gateを適用し、デフォルトではscanをpeak normalizeする。
粗さ畳み込み: $$ R_{shape}(z) = \int A(\tau) \cdot K_{rough}(z-\tau) d\tau $$