Table of Contents

1. 導入:バイオアコースティック・パラダイム

Conchordal は、生成音楽および計算機音響の従来の常識から根本的に逸脱するシステムである。従来のシステムが記号操作——量子化された音高のグリッド(MIDI、平均律)と離散化された時間(BPM、小節)——に依拠するのに対し、Conchordal は聴覚知覚の連続的かつ生物学的基盤に立つシミュレーションとして機能する。本システムは、音楽構造が抽象的な作曲の産物ではなく、音響的生存の創発特性であるという立場をとる。

本テクニカルノートは、システムのアーキテクチャ、信号処理アルゴリズム、および人工生命戦略に関する包括的なリファレンスである。Conchordal が心理音響学の原理——特に臨界帯域理論、仮想ピッチ知覚、および神経同期——を自律的エコシステムのダイナミクスとどのように統合するかを詳述する。この環境において、音は生体——代謝、感覚処理能力、および敵対的なスペクトル空間を自律的に移動する能力を持つ「ボイス(Voice)」——として扱われる。

システムの創発的挙動は統一適応度関数、すなわち協和性(Consonance)の追求によって駆動される。Conchordal エコシステム内のエージェントは事前に書かれたスコアに従わない。代わりに、環境を継続的に分析し「スペクトル快適性」——感覚的粗さの最小化として定義される——と「調波安定性」すなわち仮想基音強度の最大化を追求する。結果として、決定論的シーケンシングではなく物理法則の相互作用を通じて和声、リズム、音色が有機的に進化する自己組織化サウンドスケープが生まれる。

本ドキュメントでは、Manifesto の2つの知覚軸を鏡映する、Conchordal アーキテクチャの4つの基盤的柱を探求する。

  1. 心理音響座標系: 線形ヘルツおよび整数MIDIノートに代わる Log2Space とERBスケールの数学的フレームワーク。
  2. 周波数軸 — 聴覚ランドスケープ: 生のオーディオストリームから粗さ($R$)と調波性($H$)のフィールドを計算するリアルタイムDSPパイプライン。
  3. 時間軸 — 創発するメーター: エコシステム自身のオンセットからメトリカルな知覚を形成する結合振動子モデル。
  4. ライフエンジン: 両方の地形に住まう音響エンティティの代謝、移動、および同期を統治するエージェントベースモデル。

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で次の処理を行う。

  1. Log2Spaceに対応するERB cell幅を使い、ビンごとのpowerをpower densityへ変換する。
  2. 有意なスペクトルpeakを抽出する。各解析ビンを独立したpartialとはみなさず、peakの積分massを保存する。
  3. 各peak massへA-weightingのpower gainと圧縮指数loudness_expを適用する。
  4. 変換後の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 は粗さの計算を線形畳み込みとして扱うことでこれを解決する。

  1. マッピング: 3.1.3節のLog2Space-aligned subjective-intensity densityを線形ERBグリッドへ移す。
  2. 畳み込み: この密度 $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}$ が減少する。$k$ は感覚モデルに属し、設定ファイルでのみ変える。粗さをどれだけ嫌うかは評価の側の量であり、シナリオからは set_roughness_aversion で変える(3.4節)。

区分的飽和マッピング: 正規化された粗さ $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パスで動作し、対数グリッドの整数特性を利用する。

  1. 下方投影(基音探索): 現在のスペクトル包絡を「下方にぼかす」。散布(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 はすべての周波数における仮想ピッチの強度を記述する。

  2. 上方投影(倍音共鳴): 次に、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 は 200 Hz の音の完全5度上(3:2)にある。
    • 500 Hz はその長10度上(5:2)、つまり1オクターブと長3度上にある。

コードに音程名は現れない。これらのピークはHの整数比テンプレートから生じる。Hは周期性にもとづく融合のモデルであり、整数比はカーネルが発見したものではなく、あらかじめ組み込まれた前提である。200 Hz のエージェントは 300 Hz と 500 Hz に「重力井戸」を作り、他のエージェントを開離配置の長三和音(2:3:5)の形成へと誘う。

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$ の特殊ケースとして包含する。

ディレクター操作 set_roughness_aversion(w) は、粗さの項 $b$、$c$ と後述の密度の $\rho$ に $w$ を掛ける(既定値1では設定値がビット単位でそのまま使われる)。$w$ は $[0, 100]$ に制限され、有限でない値は無視される。$w = 0$ では評価が粗さを無視する。設定されたカーネルがどの調波性でも粗さを罰する場合($b \le 0$ かつ $b + c \le 0$。既定値はこれを満たす)、$w$ が大きいほど粗さをより強く嫌う。感覚され表示される $R_{01}$ 自体は変わらない。

第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をどれだけ抑えるかを決める。

出生は指定範囲内の分布から抽選する。既定のSpawnStrategy::Fieldは、その周波数範囲だけを切り出し、浸食後の地形から対象別の局所massを作る。そこへ占有maskをかけ、その範囲だけで正規化する。massが全て0なら未占有ビン上の一様分布へ、全ビンが占有されていれば範囲全体の一様分布へ戻る。peak配置は対象の極値を決定論的に選び、tensionを指定した場合は目標field-scoreに最も近い候補を選ぶ。全域の$C_{density_pmf}$は正規化されたLandscape表現として残り、core testが使う。

設定ファイルの最上位でbirth_surrogate = trueを指定すると、Field配置に身体の代理密度を使う機能が有効になる。既定は無効である。候補となる基音ごとに、選んだrendererへの適合を確認した直接モデルが、身体のsubjective-intensity densityを推定する。density配置では、この密度と浸食後の対象地形のmassをERBセル上で積分し、身体の帯域内massで割った値を出生の重みにする。peak配置では対象のscoreを積分する。全候補を同じhopで評価し、同じ身体とrecipeの準備を再利用しながら、出生ごとに占有とspacingを反映する。範囲内での正規化と零mass時の一様分布への切替は維持する。対応外の身体やrecipeは従来の地形だけによる配置を使う。対応条件は5.1.1節に示す。

出生の設定と5.2節の身体込みの代謝は独立しており、両方を同時に有効にできる。励振rendererでは、Sineと対応するHarmonicのrecipeがField配置と周波数提案に身体の代理密度を使い、Modalは従来の地形による配置を使う。旧rendererでは、この設定が対応する再出生の最終評価にも作用する。Randomは16候補を作り、非負のscene-scoreで再抽選する。Hereditaryは親を一度選び、16候補から最大levelを選ぶ。PeakBiasedは地形のpeakによる候補生成、親へのbias、局所探索の刻みを維持し、対応する身体では最終抽選の重みと局所探索に身体込みのscoreを使う。積分したscoreを地形と同じ設定のsigmoidでlevelへ変換するため、最低levelによる拒否の尺度と閾値は維持する。対応外の方式と身体の組合せでは、従来の点評価を使う。励振rendererでは最終選択分布のnative参照との適合を確認していないため、再出生の最終抽選、局所探索、最低levelによる拒否には従来の点評価を使う。

代理式による抽選分布と実音の生成・解析から得た参照分布との全変動距離は、対応する測定条件ごとの最大値を0.1以下とする作者規則である。0.1は音響モデルから導出した値ではなく、測定したSineの約0.095を含めるために作者が定めた。この上限を確認したのは、保存したConsonance/Densityの測定点に限られる。旧rendererの参照は440 Hzと1800 Hz付近の7候補からなる104群で、48 kHz、hop 512を使い、他者だけの音による無音、Sine 440 Hz、Sine 660 Hz、Harmonic 330 Hzの4環境を含む。占有、spacing、tensionはない。励振rendererのSine/Harmonicでは、同じ測定条件の64群をnativeの候補PCMと照合した。環境の地形と実現済みのmode比率は保存値に固定している。保証範囲はこの参照中で対応する身体の測定条件に限定され、任意の設定や環境、peak配置、再出生の最終分布には広げていない。旧rendererの再出生の最終選択には、以下の別の測定範囲がある。

旧rendererの再出生の最終評価にも、全変動距離を0.1以下とする同じ作者規則を使う。保存された描画由来の候補scoreを従来のRandomとHereditaryの選択則へ通し、測定済みの7周波数を順に繰り返して16候補にした。対応する測定条件での最大TVは、それぞれ0.095963と0だった。PeakBiasedは、他者だけのHarmonic 330 Hz環境、440 Hz付近で従来の生成器が地形から作る16候補を使って検査した。親へのbiasと局所探索は既定設定を使い、探索半径は0.50半音、刻みは0.05半音である。48 kHz、hop 512で身体ごとに72 hopを観測し、条件ごとに158周波数を生成・解析した。比較には局所探索後の最終分布まで含めた。対応条件での最大TVは0.025876だった。保証はこれらの保存測定と有界のPeakBiasedの検査に限り、任意の設定、環境、候補集合には広げない。作者規則を超えた条件では点評価を維持する。方式ごとの対応範囲は5.1.1節に示す。

この共有地形とは別に、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とrecovery_secは、それぞれの平衡状態までの差が90%縮む時間であり、実装は$\tau_e=T_s/\ln 10$、$\tau_r=T_r/\ln 10$とする。持続刺激の平衡状態はdriveの強さに依存し、完全に刺激を取り去った後は0となる。effective scoreはsigmoidの中立閾値$\theta$へ近づき、density massは上表のとおり乗算的に浸食される。

既定はenabled=true、satiation_sec=5.0、recovery_sec=8.0、ref_drive=0.25である。enabled=falseを明示したときは完全な恒等写像となり、全effective viewはbase viewとbit単位で一致する。有効時には、移動、予測、代謝、respawn、density placement、listenerがeffective viewを読む。一方、UIの地形表示と診断は浸食前のbase viewを使う。慣れは感覚モデルと演奏中の聴き手の状態に属し、Rhaiから切り替える語彙は設けていない。科学的な対照ではenabled=falseを明示する。

--reportでは、生成時刻の1秒ごとにhabituation_scanも出力する。 fmin_hz、bins_per_octave、n_binsと、habitatのstate_scan、raw_score_scan、 eff_score_scanを記録する。配列は共通のLog2Space座標に揃え、借用したsliceから出力する。 これにより、刺激を取り去った同じ周波数領域を追跡できる。従来のhopごとのtracked_binは、 移動するraw scoreの最大位置という意味を維持する。

4. 時間軸:創発するメーター

音楽認知は、音楽的時間を三つの層に分けて捉える。リズムは表層であり、実際に鳴るオンセットのパターンそのものを指す。パルス(タクトゥス)は、聴き手が思わず合わせて手を叩く規則的な拍である。表層にパルスがそのまま含まれていることはむしろ稀であり、これはすでに一つの推論である。**メーター(拍節)**は、そのパルスをさらに階層化したもの——サブディビジョン・拍・小節という入れ子の周期性が、強拍と弱拍を交替させながら積み重なった構造——を指す。ここで決定的に重要なのは、この意味でのメーターが記譜ではなく知覚だという点である。拍子記号は指示にすぎない。メーターは聴き手の脳が音から組み立てるものであり、記譜されたことのない音からさえ組み立てられる。

この知覚の振る舞いはよく研究されている。確立には数サイクル分の証拠が要る(ビート誘導)。いったん確立されると、シンコペーションや休止、無音をまたいで持続し、個々のイベントは誘導されたグリッドを壊すのではなく、グリッドを背景に聴かれる。さらに可塑的でもあり、入力のテンポがずれていけば追従して掛かり直す。神経共鳴理論(Large ら)はこれらの性質を機構として説明する。神経振動子の集団が音響オンセットに同調し、パルスを中断の向こうへ運ぶのは刺激そのものではなく、振動の自己持続的なダイナミクスだ、というのがその骨子である。

Conchordal はこの構造を工学則として実装する。マスタークロックもメトロノームも持たず、時間を構造化するのは創発メーターである。自励する拍と整数比の適応階層が、エコシステム自身のオンセットを聴き、そこからメトリカルな知覚を組み立てる。今度はボイスの側が、知覚されたそのパルスに、ボイスごとの結合強度でオンセットのタイミングを同調させる(5.4節)。リズムはこうして閉じた知覚–行為ループになる。ビートをスケジュールするものは何もない。ビートは集団の振る舞いから凝縮し、凝縮したビートが今度は集団を引き込む。これは調波ランドスケープ(第3章)と対をなす構図である。協和性が押し付けられるのではなく蝸牛のモデルから計算されるように、メーターも押し付けられるのではなくビート知覚のモデルから計算される。

4.1 メーターコア:適応する整数比の階層

既定のEvents入力は発音の再来を読む。生成側の既存meterだけは、TOMLのtop-level temporal_meter_t2 = trueでContinuous入力へ切り替えられる。省略とfalseは従来どおりである。 Continuousはhabitatのraw T2を直接読み、拍の状態、速いonset検出、PLV、整数層、文化層の 整形とMeterStateを共用する。第二の生成側meterを足さず、ListenerTwinのpresentation側は Eventsのままにする。

MeterNetwork(core/meter.rs)は、自励する拍の振動子と、音から得た発音の再来の確認を組み合わせる。振幅には強制Hopf方程式を保ち、発音と発音の間では位相を自由に進める。

$$ \dot r = \alpha r + \beta r^3 + F_a,g,s(t)\cos\varphi, \qquad \dot\varphi=\omega $$

$g=1+\mathrm{stability}$、$\alpha=1$、$\beta=-1$である。入力がなくても半径は1へ向かうため、音が途切れても拍は続く。生成側の駆動には、ハビタットバスのDorsalStreamが得るスペクトルフラックスと、同じバスへ送られるVoiceの発声オンセット強度を使う。プレゼンテーション専用のVoiceは直接このメーターを駆動しない。

検出した発音$j$では、予測を補正する前の位相誤差$\epsilon_j$を測る。前の発音の誤差で現在の周期$T$を更新し、今回の誤差で位相を補正する。

$$ T^+=T^-\left(1+\eta_p g\frac{\sin\epsilon_{j-1}}{2\pi}\right), \qquad \varphi^+=\varphi^- -\eta_\varphi g\sin\epsilon_j. $$

$\eta_\varphi=0.6$、$\eta_p=0.1$はLarge & Jones(1999)のsimulationに由来する。検出した発音の時刻を$H=2\times2,\mathrm{s}+60,\mathrm{ms}=4.06,\mathrm{s}$保持する。これは最大候補間隔を二回と、確認窓の末尾を含めた長さである。隣り合うとは限らない三つの発音について、二つの間隔が$w(p)=\min(0.2p,60,\mathrm{ms})$以内で一致すれば、再来の候補$p$を確認する。音響参加の既存の窓を再使用する。候補の順位は$R(p)=M(p)/N$で付ける。$M$は履歴と$p$だけずらした履歴を、時刻順に一対一で対応させた三角重みの合計、$N$は全候補に共通する履歴全体の発音数である。採用済みの周期も同じ比較に残す。隣接間隔の全てが既存の窓内で一致する履歴では、従来の隣接間隔による確認をそのまま使う。確認したrate $f_o=1/p$から、$r\in{1,1/2,1/3,1/4,2,3,4}$の$f_r=r f_o$を作り、連続した拍帯域の中の候補を読む。通常の帯域は0.5〜4 Hzである。整数比で入れ子になる理想的な発音列では、支持$S_r$を共通発音数/両列の和集合の発音数とすると、$S_r=\min(r,1/r)$となる。入力発音のすべてに位相が合うだけでは、倍速の候補を拍に選べない。

候補は$S_r W(f_r)$で順位を付ける。文化層の事前分布は$W=(1-s)+sP$であり、$s$はmeter_stabilityを$[0,1]$に制限した値である。$P$は好みの中心から帯域の端までの対数周波数距離に対して線形に下がる。中心は、明示したtemporal_basinの算術平均、帯域を置かなければ既定の2 Hzとなる。既定の深さ0では帯域内を一様に扱い、深くするほど中心に近いタクトゥスを選びやすくなる。明示したbasinの中心への追加の復元にも同じ深さを使い、前hopの拍の確信度が高いほど弱める。この機構は神経共鳴の構造に基づく工学則であり、公表された振動子ネットワークの数値をそのまま移したものではない。

最初の採用では、その発音に位相ゼロを合わせ、旧座標の証拠を消す。採用した発音を自分自身の証拠には数えない。その後の確認では位相をresetせず、上の発音ごとの補正を行ってから確認したtempoを採る。残りhopの自由走行と、アンラップした拍数にも同じ周波数差を反映する。確立した拍の2・3・4周期に合う長い間隔は、拍の欠落として元のタクトゥスを保つ。この規則では、整数倍の急な減速と、発音だけが欠けた場合を別々には同定できない。

分割の位相は$2\varphi,3\varphi,4\varphi$、小節の位相はアンラップした拍数を2・3・4で割ったものを使う。各層は位相の整合やアクセントの証拠を別々に保つ。拍帯域より速い入力は、帯域内の拍の分割として読む経路を持つ。整数比でない独立のtempoや、振動子間の結合の可塑性は実装していない。

知覚と生成。 ランタイムは同じ機構を二つのinstanceで使う。生成メーターはハビタットバスを聴き、Voiceの振る舞いを導く。ListenerTwinのメーターはプレゼンテーション音声を聴き、拍の確信度をUIとreportへ送る。DCCの圧力が直接使うのは、プレゼンテーション由来の協和性tensionである。

habitatの連続再来

Continuousはnativeの30×4の符号付きhop平均を、群への帰属や成分の重みなしで読む。 同じfilter原点に属する連続した二hopの既知の成分だけから、正の差分を作る。 既存の4.06秒の履歴でnative hopのlagを調べ、成分ごとのminimumとmaximumのmassから intersection/unionの比を求める。平坦なprofileから拍を誘導しない。内部の厳密な局所最大には 固定の二次頂点を試し、既知の端点の線形補間による実際のoverlapで読み直す。 同scoreなら採用済みのlag、次に短い格子lagを優先し、既存の整数aliasと文化priorで拍を選ぶ。

T2は再来の提案と確認、実habitatのfluxと実行Onの補助は位相と強度を担う。 hop終端で受け取った提案は、その後の速いonsetから使う。初回採用は旧座標の証拠を消し、 そのonset自身の確信度を0にする。発行した未来のsource hopの成分予測はlag・元の支持・ targetを固定する。後の観測との双方で既知の同じ座標だけを一回照合し、遅れた観測の source ageも保つ。既知の静けさは予測したmassへの不一致となり、欠測は負例にならない。

raw Frameはanalysis threadで一回作り、有界で事前確保したqueueへ送る。群の到来adapterは 同じFrameを別に読む。実時間ではT2を待たず、満杯の区間を欠測として記録する。 offline描画はfastを進めた後、固定した終端cutで現在のsource hopの完了を待ち、stateの発行と 次の未来予測へ進む。source、availability、receivedは別の時刻である。source gapでは filterを再起動して支持の切れた差分・補間を作らないが、meterの採用済み座標と期限内の 履歴は保つ。bus・設定・fs/hop・成分単位の変更は明示の座標resetであり、filter原点や 群側のcontinuity epochと同じ値にしない。

4.2 ビート確信度:位相と発音の型の再来

以下のevent数による確認は、Events入力の規則である。

間隔の仮説を初めて確認するまでは、拍・分割・小節の証拠を積まず、三層の確信度と分割・小節の比は0(未知)とする。この間も振動子の自走と発音ごとの補正は続ける。確認後の発音は、補正前の予測位相を向く単位フェーザとして積算する。リーキーな合成ベクトルの長さをリーキーな発音数で割った値が位相ロック値(PLV)である。単一位置の履歴では、従来の$\mathrm{PLV}\times\mathrm{presence}$を確信度に使う。証拠は時定数2.5秒、小節のアクセントは6秒で減衰する。stabilityはpresenceの閾値を下げるが、確信度の上限1を保つ。最初の採用発音はフェーザを足さない。分割の証拠には各倍音位相の整合と$\tfrac12(1-\mathrm{beat\ PLV})$を使い、拍だけの入力からその倍音を分割と認定しない。

初回採用後の各発音から、その時点の基本周期で次の再来$t_i+p$を予測する。発行した予測時刻は、tempoが変わっても書き換えない。窓$w(p)$内の将来の発音と予測を一対一で対応させ、誤差に三角重みを付ける。窓が閉じてから予測・観測・共通massを確定し、既存の時定数で減衰させた$J=M/(N_p+N_o-M)$を読む。最初の確認発音から予測を発行せず、確認前の履歴を確信度の証拠にしない。履歴中に$p-w(p)$より短い隣接間隔があれば複数位置の型と扱い、拍の確信度は$\max(\mathrm{PLV},J S_r)\times\mathrm{presence}$とする。発音が一つの位相に集中しなくても、確認後の型の再来が支持を作る。分割と小節の証拠は従来の位相・アクセントの規則を保つ。

確信度が表すのは、蓄積した証拠との位相の整合、または確認した発音の型の再来である。最初の確認後も、不規則な入力の偶然のまとまりが一時的な上昇を作りうる。確信度だけでtempoが一意に確定したとは扱わない。無音では振動子が続く一方、証拠とpresenceは減衰する。位相ゼロは予測した発音に保ち、発音フェーザの平均角をもう一度引いて原点を動かさない。

Continuousは後続の成分照合から共通mass $M$、予測mass $Q$、観測mass $O$を積み、既存の 時定数で減衰させる。$Q+O-M>0$の時だけ$S_R=\rho M/(Q+O-M)$を定義する。 $\rho=\min(r,1/r)$は既存の整数aliasのprofileである。確信度は $\operatorname{clamp}{[0,1]}(\max(\mathrm{PLV}{fast},S_R),\mathrm{presence}_{fast})$とし、 未同定の支持を負例の0へ置き換えない。初回seedは0を保ち、eventのmultiではなく、 後続支持が定義された資格でrecurrenceを読む。支持のmass自体は拍位相で条件付けていない。 確信度は位相の正しさを認定する確率ではない。fast自体の欠測ではonsetのbaselineと分散を 観測で更新せず、時間、振動子、既存の証拠の減衰だけを進める。

4.3 メーターから変調へ:NeuralRhythms

NeuralRhythms::from_meter_state(core/modulation.rs)はメトリカル状態を、ボイスの振る舞いが消費する変調帯域に射影する。

  • Delta ← ビート(タクトゥス)。パルスの位相とテンポを運ぶ。この位相がコサインゲート env_open を駆動する。確信度が上がるほどアーティキュレーションのエンベロープはダウンビートに向けて尖り、ビートが不確かなうちはゲートが開いたままになる。
  • Theta ← サブディビジョン。呼吸振動子(5.5節)が掛かる、音符レートの帯域。
  • Delta/Thetaの精度(alpha)はビート確信度に等しく、予測誤差(beta)はその補数とする。
  • Measureは独自の位相・周波数・確信度を持ち、measure_ratioが検出したまとまりを表す。位相原点は観測された強いオンセットのphasorに従う。まとまりが未検出ならmeasure帯域をゼロにし、任意のmeasure_accentがこの帯域から発音強度を変える。

4.4 作曲家の事前分布:時間地形のシェイピング

ディレクターは MeterShaping(Rhai から設定)を通じて、パルスが形成される地形を曲げることができる。ただし、スケジュールすることは決してできない。

  • meter_stability(v) — $[0,1]$のアトラクタ深度。振幅と発音ごとの補正を強め、既存presenceの閾値を下げる。確信に踏み切る速さを変えるが、確信度の上限は上げない。同じ深さで、好みのtempoに寄せて拍を読む強さも決める。深いほどbasinの中心、帯域を置かなければ2 Hzに近い整数比の読みを選びやすくなる。既定は0(中立)である。
  • temporal_basin(min_hz, max_hz) — 連続したtempoの事前帯域。拍を算術平均の中心から始め、候補の採用と周波数の適応を帯域内に保つ。stabilityが0なら中心への追加の好みや復元を持たず、帯域を限るだけである。高いstabilityでは、候補の好みと、確信度に依存する中心への復元が深さに比例して強まる。

basinは、metric()のVoiceが自走を始める周期にも作用する。meterと同じ整形済みの算術中心を使い、stabilityには掛けない。指定がなければ初期値は2 Hzのままである。scriptの最後のbasinを、place()とcreate()で作る全てのmetricのPopulationに適用する。wait()の後の指定もsceneの初期条件を上書きし、演奏途中の変更にはならない。entrained/steady/flowの独立した身体の尺度(intrinsic_rate(hz)の指定がなければ2 Hz)と、pulse(rate_hz)の明示した速さは変えない。各Voiceは別々の初期位相を持ち、音から拍を確認するまで共有拍への結合は0である。再生成はPopulationに保存した初期設定を読み、親の現在の時計の周期を継がない。

これらは拍を配置せず、創発する過程の初期条件と地形を与える。聴き手のtempoの適応は指定帯域内に限られる。

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秒のリリース)、励振が弱まるにつれて音色を暗くする。床値は部分音間の相対的なバランスを保つためのものであり、励振rendererで駆動停止後の鳴りを生むものではない。
    • 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 を保持し、周期的にピッチパラメータを更新する。

既定は従来のrendererである。任意で有効にする励振rendererでは、身体への入力の 整形と、身体からの放射を分けて扱う(5.1.3節、6.1節)。SineとHarmonicは 作曲者のADSRと既存のonset整形へ遅れなく応答し、実効Off後には放射しない。 Sineのonsetは利得0.2、上限1、時定数80 msで、再打撃を加算する。Harmonicは 80 msのdrive応答とonsetのspectral burstを使う。Modalはmodeごとの自由減衰、 打撃、雑音駆動を持ち、Off後も鳴りが残る。bodyに明示したmotionは有効であり、 既定値は0である。

SineとHarmonicの部分音は、旧rendererと同じf32回転kernelで計算し、毎sampleの 正規化は行わない。pitchとmotionの更新時計は64 sampleと8 sampleのままである。 浮動小数点によるdriftも旧kernelと同じである。単音の一定振幅holdでは旧PCMと bit一致する条件があるが、励振の乗算順やhandleの規則によって波形全体には差が 残る。実効Offでの無放射は維持し、Modalの自由応答は変更しない。

身体のパラメータは放射スペクトルを変え、共有Landscapeへ影響する。移動の評価は基音位置の地形を読む。出生の配置と対応する再出生の最終選択には、3.4節で述べた身体の代理密度による評価を任意で使える。代謝にも、自分の音を除いた環境に対し、代表Toneの密度で現在位置を評価する機能がある(5.2節)。この機能の既定は無効である。音色の遺伝は未実装である。

出生の代理式を使うには、身体を生成するfactoryが、選んだrendererの直接モデルへの適合を申告する必要がある。現行のSineは対応する。Harmonicはmotionが0で、実際に有効なunisonコピーが一つの場合に対応する。旧rendererのModalは有効なunisonコピーが一つで、brightnessがちょうど1の場合に対応する。nativeのModalは出力にADSRが掛からず、Off後も放射が続くため対応外である。spreadが0、またはunison = 1ならコピーは一つになる。rendererが使わない設定値は、この判定でも無視する。Modalのそれ以外のbrightness、HarmonicやModalのmodeに指定したランダムjitter、能力申告のないfactory、モデルの扱える範囲外の入力は、従来の地形だけによる出生を使う。別のrendererへこの能力が自動で付与されることはない。これらは実装上の適用条件であり、数値的な保証は3.4節の保存参照に含まれる測定点に限る。

身体込みの代謝でも、factoryが申告する、選択したrendererへの適合を使う。密度は、そのrendererの代表Toneを実際に生成・解析して得るため、出生の代理式に固有の厳しいrecipe条件は適用しない。この能力を申告しないfactoryには、従来の点地形による代謝を使う。励振rendererでもSineとHarmonicの身体込みの代謝を使える。Modalには従来の点地形による代謝を使う。

身体込みの再出生の最終評価は旧rendererだけで有効になり、この身体の共通条件に加え、方式ごとに対応範囲を絞る。励振rendererでは全bodyの最終評価を従来の点評価へ戻すが、対応するSine/HarmonicのField提案は身体込みのままである。RandomはSineとLandscapeDensityのrecipeを点評価する。HereditaryはLandscapeDensityとLandscapePeaksのrecipeを点評価する。PeakBiasedで対応するのは、明示的なmode recipeを持たない旧Harmonic、または地形からmodeを作るLandscapeDensity/Peaksの旧Harmonicである。Sine、Modal、明示的な固定ratioのrecipeは点評価を維持する。これらは実装の適用条件であり、数値的な保証は3.4節の測定条件に限る。

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)はワーカースレッド内で動作する集中的なオーディオレンダリングエンジンである。BTreeMap<ToneKey, RoutedTone> によるトーンプールを管理し、各 PhonationBatch(Voice が生成する ToneCmd の集合)を受け取ってトーンの生成・更新・リリースを行う。各トーンは2つのバスのいずれかにルーティングされる:ハビタットバス(エコシステムが環境として解析する音)とプレゼンテーションバス(聴衆が聴く音)である(6.2節)。

Tone(life/sound/tone.rs)は個別の発音単位であり、ADSR包絡 (attack → decay → sustain → release)と、ピッチ・振幅の平滑化を持つ。 旧rendererでは出力へADSRを掛ける。励振rendererではADSRとarticulationで入力を 整形し、身体からの出力へ別のADSRを掛けない。Offの要求から指定releaseの間は 入力を減らし、その末尾で実効Offとなる。SineとHarmonicの放射はそこで0になり、 Modalは自由応答を続ける。release=0の指定も、従来どおり最短1 sampleとなる。

励振rendererの音高Updateは、release中を含む開いたhandleへ適用し、位相や共振器の状態を保つ。 閉じたhandleはUpdateや将来の打撃を受けず、Modalのtailは最後の係数を保持する。 新しいOnは別のToneを生成し、残っている放射と重ねて鳴る。所有者の世代とrouteも 各Toneに残す。実効Offと退役は別の状態であり、閉じたToneの残差上界を source世代ごとに合計して、rendererの下限へ達したときに退役する。 開いたhandleを、音量が0という理由だけで破棄しない。

身体込みの代謝を有効にすると、新旧のrendererで対応するVoiceのハビタットPCMも(id, generation)で識別して採取する。それをハビタットのmixから引き、自分の音を除いた環境を得る。プレゼンテーション専用の音や別世代の音は、自分の音には含めない。共有mixは連続して解析する。Voiceごとの環境PCMの履歴は保持し、そのVoiceの番が来たときに、飛ばしたhopの分をまとめて解析状態へ反映する。有限窓から解析し直す方式ではない。

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、エネルギー枯渇時刻、可聴上の寿命を分けて記録する。

既定のenergy更新は、Voiceの基音位置にある浸食後の協和性levelを使う。任意で有効にした身体込みの代謝は、自分の音を除いた環境に対して現在位置を評価する。代表Toneから得た主観的強度の密度(subjective-intensity density)とERBセル幅で浸食後の協和性scoreを重み付けし、帯域内massで正規化してから、従来のシグモイドでlevelへ変換する。現在位置の密度はVoiceごとに一つ保持し、基音、recipe、世代、解析設定が変わったときに作り直す。

設定は[body_metabolism]のenabled = trueで有効にし、updates_per_hop、observation_frames、representative_hold_secを明示する。この設定節を省略するかenabled = falseなら、従来の点地形による代謝を使う。render_prototype = trueでは、SineとHarmonicにnativeの代表Toneと自分のPCMの減算を使い、Modalは点地形による代謝を維持する。作者は比較結果からupdates_per_hop = 2を採った。2は設定する更新数であり、音響モデルの原理定数ではない。

毎hop、対応するVoiceの中から、設定数を上限として順番に更新する。Voiceごとのslotに単調増加する訪問番号を持ち、小さい番号から選ぶ。評価したVoiceと生まれたVoiceには新しい番号を振り、列の末尾に回す。それ以外のVoiceは直前の身体点数を保持する。出生直後は自分の番が来るまで従来の点数を使う。対応外の身体や評価を得られない場合も従来の点数へ戻り、unknownを既知の0として扱わない。この代謝の身体点数を使うのはenergyの更新であり、生存状態の協和性診断値と発音ゲートへの直接入力は基音位置の点評価を維持する。代謝の設定だけでは再出生の最終採点は変わらない。独立した出生の設定によって、3.4節で述べた旧rendererの対応範囲の身体評価を有効にできる。

この仕組みはダーウィン的圧力を生む:協和なるものの生存(Survival of the Consonant)。音響的な適合が低ければenergyが減り、高ければ維持・回復できる。適合は既定では基音位置のlevel、任意の身体評価を得られたときには身体密度で重み付けしたlevelである。Landscape habituationを有効にすると、かつて支えとなった環境も、活動が続けばeffective valueを失い、音が退いた後に回復する。生存は音響的な適合だけでなく、直近の知覚履歴にも左右される。

render_prototype = trueを選ぶと、身体込みの代謝を設定していても点評価を使う。 旧rendererの代表Toneを使うworkspaceや、代謝用のsource PCM採取・減算は作らない。

5.3 ピッチリターゲティングとクラウディング

エージェントは静的ではない。適応度を改善するために周波数空間を移動する。候補評価は候補基音位置のhabituationで浸食されたscoreを読む。ExactScanは現在の基音ビンを消してraw scoreを計算し直し、比較前に同じlocal erosionを適用する。身体込みの代謝を有効にしても、移動の候補採点はこの点評価のままである。energyの変化は、既存のenergyに依存する振る舞いを通じて、その後の移動へ波及しうる。ピッチ選択には2つの移動モードとクラウディングメカニズムがある。

音高の適用: ピッチ移動は PitchApplyMode が決める。GateSnap はノートの境界でピッチを離散的に切り替え(各ノートは一つの安定した周波数で鳴る)、Glide は連続的なポルタメントで移る。seek_consonance() を使うボイスでは、スクリプトが明示しない限りモードは発声タイミングから自動的に決まる。持続するVoice(once())と明示の持続+参加はGlide、打ち直すVoice(pulse / coupled)は発音時に切り替わる。参加の時計を持たない自由音高のHoldでは、Rearticulateの境界0は採用時に打ち直し、正の境界は最後の発音音高からの変位に応じて滑るか打ち直すかを選ぶ。持続+参加の明示のGateSnapは、採用した目標を鳴らすと選ぶ機会まで保留する。

クラウディング: クラウディング(相互排斥)とピッチ適応は、単一の共有された占有場(occupancy field)を参照する。各占有基音(生 f0)を中心とするガウシアンペナルティで、その幅は crowding_sigma_cents(デフォルト 60)が定め、強度は crowding_strength が制御する。これにより、エージェント同士が同一周波数に収束して「団子」状態になるのを防ぐ。オクターブ等価(クロマ)のペナルティは適用せず、オクターブ関係は協和ポテンシャルを通してだけ作用する。

Leave-Self-Out: ピッチ評価には次の二つの近似がある。

  • ApproxHarmonics: 想定した部分音位置の周辺で、正の地形scoreを差し引く。距離による減衰は24セントを尺度とする指数関数、重みは部分音の添字ごとの1/nである。明示された身体の比率があればその位置を、なければ整数倍音列を使う。重みは実際に放射された部分音振幅ではない。
  • ExactScan: 前処理済みのsubjective-intensity密度から現在の基音ビン一つを消し、H・R・Cを再計算する。上部部分音は残り、消したビンにある他者の寄与も失われる。名称は既存モードの識別子であり、音源単位の厳密な自己除去を意味しない。そのビンに正の有限な密度がなければApproxHarmonicsへ戻る。

どちらも他者だけの音を再構成してから解析する方式ではない。結果の地形は候補基音位置で評価し、候補身体のスペクトル全体では平均しない。

探索温度: 単一の temperature パラメータが確率的な探索の強さを制御し、両方のピッチコアで共有される。0 では貪欲に落ち着き(ヒルクライムは明確な改善があるときだけ動き、ピークサンプラーは最尤候補を選ぶ)、値を上げるとヒルクライムは Metropolis 規則で下り方向の移動も受け入れ、ピークサンプラーの候補選択はソフトマックスで和らぐ。これにより局所最適からの脱出が可能になる。これは同時に運動の緊張のノブでもある。温度の高いボイスは協和から外れて彷徨い、温度を下げれば協和へ落ち着く——緊張と解決が探索温度そのものとして現れる。

Voiceが発音の方針を保つ

自由音高の持続+参加+Rearticulate+正の移動境界では、articulation_persistence(p)で Voiceに私有のBase/Connectを持たせる。Baseは既存の境界と参加に従う。Connectは Toneが生きている間、大小どちらの採用でも滑り、鳴らすと選んだ機会の発音を意図して 控える。新しいTone、発音の代謝、発音由来の参加文脈の学習は生じず、費用による 見送りとは区別する。小さい採用と費用の見送りはConnect、大きい採用と新しく鳴らすと 選んだ機会はBaseを提案する。0 < p < 1では反対の提案だけを確率pで保ち、同じ提案では 乱数を引かない。将来の機会を決めた後は実行まで判断を固定し、待ちのhopで引き直さない。 Connectへの変更は保留を取り消し、最後の実発音音高を保つ。取消した採用の再演や、 方針の変更だけによる発音はしない。

pは配置前の初期条件としてtemplateを通じて継ぐ。再生成はBaseから始め、途中の状態を 継がず専用の乱数系列を持つ。既定0と端1は私有状態を通らず既存経路を使う。演奏中の mode変更はBaseへ戻す。同じmodeと境界だけの変更は保持を続け、境界0の間は私有経路を 休止する。有限Off、rest、余韻待ち、間、生存過程は保持より優先し、Toneが無い時の 合法な発音は塞がない。保持はBaseにも働き、pとConnect時間・発音数は単調に対応しない。 長さは既存の出来事で決まり、秒や拍の数ではない。保持は惰性であり、聴こえた終止、 輪郭、間、フレーズ境界を推定して結び付ける機構ではない。

行き先がない機会でToneを伸ばす

tie(p)は、自由音高の持続+metric/entrained/steady/flow+GateSnapまたはRearticulateに置く、 配置前の伸ばす確率である。選ばれた合法な機会で保留ありは発音し、生きたToneの保留なしを 確率pで伸ばす。省略値は持続+metricでは1、費用で見送れるentrained/steady/flowでは0。 明示の0はtieの状態・乱数を通らず従来の発音、1は無抽選で対象を伸ばす。 中間は個体別の専用系列を実行時に一度使い、予定を待つ間は引かない。境界以下の滑りも 対象で、GateSnapの小さい採用は保留として発音する。発音は既存の機会から抜けた列になり、 音高・時刻候補・費用・見送りの式は変えない。全体のレガート量やフレーズ境界の機構ではない。 Connectの抑止を先に使い、Baseの保留なしだけにtieを使う。方針の提案と保持は変えない。 有限Off・余韻/rest・生存過程が優先し、Toneなしの合法なOnは通す。templateの確率だけを 継ぎ、演奏状態や乱数の途中は継がない。配置前の書く順に依存しない。演奏中のGlideでは 休止し、対象へ戻れば働くが、確率の演奏中setterはない。値はsanitize01に従い、 対象外の最終指定は警告して無視する。

5.4 オンセットタイミング:同期と参加

RhythmRelationは、共有拍への同期(metric())と、音を参照する参加 (entrained()・steady()・flow())を分ける。どちらもPhonationEngineの同じ発音指令経路を使う。

プリセットごとに、時刻を決める方策が保つ関係は異なる。機会と発音は別であり、 発音の合法性、生存過程、休止、発音方針によって、打ち直しを控えたりToneを伸ばしたりする。

プリセット保つもの変わってよいもの保証しないものentrainment(x)
entrained()生存中に固定された身体の固有の速さ固有尺度への近さで重み付けした反復への周期適応。費用による予定近傍の発音、一参加周期までの待ち、見送り等間隔の発音列、Voice間の発音の速さの差の持続、共有拍との位相一致周期適応と発音時刻の音響費用への影響。省略値0.5
flow()反復周期へ適応しない、上下限を持つ抽選の固有尺度不規則な間隔の更新と、音響費用による時刻変更・待ち・見送り規則的な列、拍、固有周期と実発音の平均間隔の一致発音時刻の音響費用への影響。抽選尺度の適応ではない。省略値0.05
steady()固有周期と、sampleへ丸めた後続の自分の予定格子予定時刻で鳴らすか見送るか。実行上の制約でも発音が抜ける発音数、音高の結果、相手の時刻への追従鳴らすか見送るかの費用だけ。省略値0.5
metric()確認された生成側の拍と指定位相への、確信度に応じた引力。確認前の独立した位相実効的な速さと位相。拍の確認前は自走拍そのものの確認、厳密な位相一致、独立した非整数比のテンポ関係拍の速さと位相への引力。省略値0.95

entrainment(0)はこれらの音響文脈による時刻への作用をなくすが、flowの不規則な抽選は 残る。meterは一つの拍と整数比の階層を使う。 steadyで過ぎた機会や合法でない機会も固有周期の整数倍で先へ進める。持続音の初回の Hold発音は後続の格子とは別に即時である。プリセットは配置前の指定で、最後の方式が 優先される。音長は別軸の規則で決まる。

参加方策は、habitat音声から因果的に作る予測と、自身の発音予定を分ける。 予測器は観測済みの反復を約4秒先まで20 ms間隔で射影し、6秒の時定数で平均的な状態へ 戻す。予測範囲を超える持続音の評価には観測済みの平均エネルギーを使い、無音とは扱わない。 未来の予測を観測履歴へ書き込まない。自身の既知のhabitat波形を実測の混合波形から引き、 残りの波形を解析して周囲のエネルギー履歴を作る。従来の共有周期・係数による射影と、局所RMS履歴による予測を候補とし、発行後の実測で比較した混合を使う。

entrained・flowの候補のコストは、参加周期を単位とした変位の二乗、経験した周囲のエネルギー形状との距離、 三つの帯域の重なり積分からなる。短期記憶に保持するのは、発音後の二窓×三帯域(2×3)の 周囲エネルギーであり、候補も同じ窓で比較する。既定の予測は、音長規則の保持時間と VoiceのADSR releaseを64点の包絡proxyで近似する。任意で有効にするfootprint workerは 時間認知の観測器から独立し、発音条件を固定した代表音のパワーを近似して16 binで 参加方策へ渡す。包絡proxyも選べ、bodyの結果が未着・失効・未対応ならproxyへ戻る。 励振rendererのSineとHarmonicでは、nativeの代表PCMから16区間の平均energyを 求め、最大区間で正規化する。旧rendererの解析的なfootprintとはidentityを分ける。 nativeのModalはOff後の自由な放射を旧ADSRのsupportで扱えないため、引き続き 対応外(renderer-phase3)とし、参加方策は包絡proxyを使う。旧renderer用の 解析的なTone energy予測は、励振rendererでは対応外のままである。実PCMを観測するT2や、周囲・自分の 音の履歴による予測は、放射されたbus音声から引き続き動作する。 見送りのコストは1に連続見送り回数を加え、実際の発音指令で回数をリセットする。 これは行動の選好であり、代謝報酬ではない。有界な音響コストだけを理由に 永続的な沈黙へ落ち着く構造を避けるが、音楽的な良さは保証しない。包絡proxyには音響身体や modulatorの追加減衰を含めない。どちらのエネルギー予測も、聴覚上のmaskingや協和・融合のモデルではない。

任意に有効化できるT2前処理は、観測対象の各busの実際の音声からアクセントを得る。 原理層では、AMT 1.6の名前付き聴覚モデルの部品を組み合わせている。 LTFATのerbspacebw(80,8000,1,1000)による30帯域のgammatone bank、半波整流と 内有毛細胞モデルの1 kHz低域通過、limit=10の五段適応、四つの変調出力である。 変調出力は2.5 Hzの低域通過、符号付きの5 Hz・10 Hz帯域通過、$50/3$ Hz帯域通過の絶対値。 有限入力での数値照合により、対応する参照実装との一致を確認している。部品の参照はAMTの gammatone、 ihcenvelope、 adaptloop、 modfilterbankに対応する。 解析workerは実際のsample rateから係数を作り、hopをまたいでfilter状態を保持する。 入力が欠けた場合は新しい初期状態から再開し、再帰filterが依存する入力の始点も支持記録に含める。

群への帰属とイベントの作成は、これらの聴覚モデルとは別の作者規則である。 既存のNSGTの割当てから、T2の各帯域で群が占めるbus質量の比率を求める。 分母には残差の質量も含め、この比率でbus全体の応答を群に条件付ける。 群ごとのPCMや独立したfilter bankは持たない。現在の規則は、各hopの符号付き平均を取り、 連続する四hopの最初の比率を窓内で固定し、成分ごとの正の増分を明示した重みとgainで結合する。 支持が揃い、明示した閾値を超えた局所peakから、アクセントを直接作る。 イベントの重みにも明示したgainを使い、従来の音響検出器によるアクセントの存在は前提にしない。 イベントの時刻と、それが利用可能になる後の時刻を区別したまま、同じアクセントを周期推定器と 次回到来モデルへ渡す。アクセントは元の音群の実績として記録し、所有群が交代したときは 推定状態を初期化する。PCMの欠測、群との対応がunknown、支持の不連続はイベントを抑止し、 支持のある値0は既知の0として扱う。

T2は既定では無効である。生成側のraw再来はtemporal_meter_t2 = true、群のeventは [temporal_t2]で前処理を起動する。rawのmeter入力には群のeventの設定は要らない。 群のeventを使う場合には、音群と周期推定の設定に加え、T2の全設定を明示する必要がある。 設定はcomponent_weights、gain、threshold、weight_gain、window = "hop_mean"、 combination = "positive_component_rise"、attribution = "first_hop_mass_fraction"、 unknown = "suppress"である。数値の自由量は未選定で、既定値を持たない。 参照との一致は前処理の動作についての確認であり、自由量の選定や音楽的な効果を示すものではない。

参加方策は、観測したhabitatの音群から得たPeriodicの次回到来予測も候補選択に使える。 観測した周期と最後のアクセントを用い、発行時に次回の到来時刻を固定する。 予測は、その時刻で0から1へ切り替わる右連続の単一段差で表す。 到来項は既定では無効であり、[temporal_onset_comparison]のarrival = trueで有効になる。 音群の聴覚観測と周期推定の設定が必要で、arrival_weightを省略すると1を使う。 到来の不一致を既存の文脈の不一致と同じ尺度に置く決まりであり、前処理の原理定数ではない。 有限かつ非負の重みを明示する指定も可能である。両項の強さは既存の参加の結合で決まる。

各決定では、判断時までに利用可能で、すべての有効な候補窓を覆う予測を持つ活動中の音群を選び、 全候補に共通の群集合を使う。行動するVoice自身の群は、habitatへのルーティング、音源と音響身体の 世代、身体の観測、prototypeの対応、情報の鮮度が一致した場合だけ除外する。自己群との対応が unknownなら、その対応を理由に群を除外しない。各候補の発音窓で段差が増える量を群ごとの到来確率とし、 共通群集合で一様に平均した値を$P$とする。追加の費用は $\mathrm{coupling} \times \mathrm{arrival_weight} \times (1-P)$であり、予測した到来の近傍にある候補を有利にする。

周期が得られない群、経過時間が不確かな群、時刻関係が不正な群、予測範囲が足りない群は集合から外す。 共通群集合が空なら到来はunknownのまま、到来項を加えない。集合が空でなく$P=0$なら、 確率0が既知であり、重み付きの費用を加える。見送りの判定は、到来項を除いた全候補の最小費用を 引き続き使うため、到来項は候補の選択に作用し、見送りを直接決めない。

steadyの費用と重みは既存のままである。見送りの比較は到来費用を除くため、一候補の 方策では到来費用が発音の有無を変えない。明示の持続との併用では見送ってもToneを保つ。 音高の三mode、境界、tie(省略0)、方針保持、有限音長とrestは既存の発音経路を使い、 Glideでも採用時刻の候補を足さない。再生成ではtemplateの方策と速さを継ぎ、 演奏状態は新しく始める。

intrinsic_rate(hz)は、entrained()・steady()・flow()の創始の身体の速さを、place()または create()の前に置く。プリセットとの書く順には依存しない。固有周期は1/hzで、 生存中は保つ。身体の尺度を置く語であり、発音間隔の命令や共通拍の指定ではない。 同じ周期を参加、有限音長のcyclesとduration_range、rest(periods)、重なり予測の 代表保持長が読み、音の長さと間の秒数も一緒に変わる。省略時は既存の2 Hzの経路を使う。 再生成はPopulationのtemplateを読み、親の適応周期、due、plan、発音方針を継がず始める。 演奏中には変更できない。最終の形がentrained/steady/flowなら有限の0.01〜200 Hzだけを受け入れ、 範囲の外と有限でない値は配置前のscript errorにする。この範囲は実行を保護する値で、 音楽的な推奨範囲ではない。metric、pulse、repeat、onceなど対象外の最終形では、不正な 値でも警告して無視する。flowの更新間隔には別の既存の制限0.035〜4秒があり、極端な 値では実際の間隔はrateに比例しない。rhythm_freqは内部のアーティキュレーション振動子、 proposal_intervalは音高提案の間隔を設定する語のままである。

経験文脈の記憶は、実際の発音指令と、その後の二つの観測窓が揃った場合だけ更新する。設定された固有周期、音響に適応する参加周期、 音の持続には別々の役割を持たせる。entrainedのVoiceは固有周期に近い反復候補を、半octave幅のGaussianに よる近接度と観測の重みから選ぶ。結合強度と反復の支持度に応じ、固有2周期を時定数として 参加周期を候補へ近づける。参照を失えば固有ペースへ戻る。支持度や定数は工学的な選択であり、 人間のbeat確信度や音楽的な最適値として検証されたものではない。

周期の調整では、未確定の将来の予定までの残り周期比を保ち、共通の発音位相を指定しない。同じ観測は一度だけ 使い、未来の証拠と確定済みの発音を変更する更新を拒否する。意図的な待機を周期の訓練値にはしない。 flowの不規則な更新間隔は固有周期を基準とし、反復周期への適応は行わない。音響文脈に応じた 待機・見送りは継続するため、実際の発音間隔を固定する規則ではない。内部の設定をflowへ切り替える際も 確定済みの候補は維持し、後続の更新間隔の基準を固有周期へ戻す。周期参照の時刻履歴は消去し、 再びentrainedへ切り替えたときに、休止していた観測時間を適応の経過時間へ算入しない。

保持時間と重なり予測に使う音長は、参加周期から切り離し、設定された固有周期から求める。 したがってcycles(n)は、周囲の反復が遅くなっても一音の保持を引き延ばさない。 flowの既存の3倍係数は維持し、ADSRのreleaseは引き続き秒で指定する。後の周期観測によって 確定済みの消音時刻を動かさない。候補には実際のonset間隔に対する200 Hz上限も適用し、 振幅と生存可能性のgateが発音可否を決める。

予測は未決定の行動に必要な場合だけ作り、経験した周囲の実音は次の候補比較へ戻す。 判断時までに観測した周囲のRMS履歴も、過去への遅れと観測範囲を伴う不変の記録として予測へ添える。 経験文脈との距離は、二窓で経験した周囲のエネルギーを使って評価する。 持続中の音の終了判断、行動の介入効果と価値の学習は未実装である。

明示的な同期では、発音の機会をCouplingClock(life/phonation_engine.rs)が作る。Voiceごとの位相振動子が整数を横切るたびに機会を出し、実発音は合法性と発音方針に従う。その実効的な速さは、固有の更新の速さと共有拍を混ぜて決まる:

$$ 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$ はレート係数が正に保たれるように選ばれた固定のプルゲインである。位相は決して止まらず、速まるか遅れるかしかない。

この位相引力は同期を意図する発音に使う。entrainedとflowで結合を強める操作は、 音の文脈への応答を強めるもので、この同期時計へ切り替える操作ではない。

各オンセットは、ボイスの rhythm_role が定める強度(beat 1.0、subdivision 0.7、accent 2.5、texture 0.85)を持ち、この強度がそのまま生成メーターの駆動に還流する。反復するアクセントはメーターをより強く駆動するから、ダウンビートは——やがては小節も——宣言されるのではなく、集団によって誘導されうる。このループのどこにも、外から課されるグリッドは存在しない。

任意のmeasure_accent(amount)は、検出したmeasureの構造を発音強度へ戻す。 倍率は1 + 0.35 * amount * confidence * cos(phase)とし、実際のonset時刻で評価する。 measure位相の原点には、累積beat数の任意の原点ではなく、観測したアクセントの円周平均を使う。 measureが未検出なら変調せず、amountの既定値もゼロとする。この経路は新たな発音を予定せず、 小節内の拍数も指定しない。生成側のrhythm_observationにはVoiceが使ったmeasureの位相、周波数、 確信度、比率を記録し、聴取側の観測とは区別する。

持続音と拍への同期

sustain()とmetric()を両方明示すると、書く順によらず生きたToneを保ち、既存の CouplingClockの整数交差を発音の機会に使う。初回はHoldと同じ即時のOn。その後は 自由音高のGateSnap/Rearticulateでは、既定は行き先の採用を保留した拍で打ち、 ほかの拍ではToneを伸ばす(tie(1)と同じ)。毎拍打つにはtie(0)を明示する。 ほかの明示確率はそのまま。固定音高とGlideは交差ごとに打つ。持続+entrained/steady/flowは 費用で見送るため省略値0を保つ。解決した省略値は演奏中のmode切替で対象に入っている 間も使い、tie自体は初期設定だけの量とする。GateSnapと境界0のRearticulateは 最新の採用先を次の合法な交差まで保留する。正の境界、Base/Connectの保持、有限音長とrest、 役割の強さ、確認済み小節の強調、microtimingは既存の発音方策を共用する。 同期には参加の費用見送りも決定済み予定の待ちも無い。控えた交差は時計だけを進め、 後から再演せず、Onの代謝・学習を生じない。

共有の拍は音から確認された拍である。確認前は結合0で、既存のtempo basin中心と独立初期位相から 自走する。外から拍を置く語ではない。固定音高も持続+参加と同じ扱いであり、tieとpersistenceは 自由音高の範囲を保つ。暗黙のCoupledや単独のプリセットの意味は変わらない。

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 スレッディングモデル

楽器binaryのconchordalと、offline用の別binaryconchordal-renderで、 励振rendererを任意に選べる。 TOML設定の最上位に次を置くと有効になる。

render_prototype = true

省略時とfalseでは従来のrendererを使う。設定はbool一つであり、decay、rise、 kick利得、motion倍率の下位設定は持たない。楽器binaryのconchordalは 音声ファイルの出力経路を持たない。自然なFinishでは、どちらの実行経路でも scenarioの終了時に励振を閉じ、残った身体の放射が退役するまで待つ。 offlineはその後にWAVを閉じ、headlessは終了する。GUIは既定ではユーザーの 終了を待ち、Finish後はringへ無音を送る。wait_user_exit = falseなら終了する。 これは生成側の完了であり、deviceやringの再生完了を待つ規則は追加していない。

アプリケーションは4つの主要なスレッドコンテキストとGUIイベントループを生成する。

  1. オーディオスレッド(リアルタイム優先度):

    • audio/output.rs で cpal により管理される。
    • 制約: 絶対にブロックしてはならない。Mutexもメモリ確保も禁止。
    • 責務: ロックフリーリングバッファからモノサンプルをポップし、すべての出力チャンネルにコピーする。Limiter がインターリーブされた出力にインプレースで適用される。
  2. 解析スレッド(バックグラウンド優先度):

    • core/analysis_worker.rs で定義され、core/stream/analysis.rs の AnalysisStream を実行する。
    • 責務: ハビタットバスのホップを受信し、NSGTを実行してlog2パワースペクトルを生成し、調波性フィールドと粗さフィールドの両方を単一のパイプラインで計算する。
    • 更新サイクル: 完了した地形スナップショットをバウンドSPSCチャンネル経由でワーカースレッドに送信する。
  3. リスナー解析スレッド:

    • プレゼンテーションバスのホップに対して ListenerTwin 知覚パイプラインを実行する。
    • 責務: 独立したhabituation fieldと知覚メーターのビート確信度を含め、聴衆が知覚するものをモデル化し、UI、ヘッドレスレポート、DCC圧力カプラに供給する。
  4. ワーカースレッド(シミュレーションループ):

    • app.rs で "worker" と命名される。
    • 責務: メインシミュレーションループを実行する。各イテレーション:解析結果を地形にマージ → Conductorイベントのディスパッチ → Population の進行(ピッチリターゲティング、アーティキュレーション、代謝) → PhonationEngine が ToneCmd を生成 → ScheduleRenderer でオーディオをレンダリング → ハビタットフラックスと集団自身のオンセットから生成 MeterNetwork を駆動 → リングバッファにモノサンプルをプッシュ。
  5. App/GUI スレッド(メイン):

    • eframe/egui ビジュアライザを実行する。
    • 責務: ユーザー入力の処理、ランドスケープの可視化、シミュレーションメタデータの表示。ワーカースレッドから UiFrame スナップショットを受信する。

6.2 データフロー

オーディオスレッドをロックせずにデータの一貫性を保つため、Conchordal はランドスケープを複数チャネル経由で更新する。レンダリングされたオーディオは二つのバスに分かれる。ハビタットバスはエコシステムが感じ取る環境であり、プレゼンテーションバスは聴衆が実際に聴く音である。ドローンをハビタットバスだけに送れば、聴かせることなく地形だけを形づくることもできる。

  1. ワーカースレッドがバスごとにオーディオをレンダリングし、ハビタットホップを解析スレッドへ、プレゼンテーションホップをリスナー解析スレッドへ送信する。
  2. 解析スレッドがNSGT + subjective intensity + roughness + harmonicityパイプラインを実行し、raw Landscapeスナップショットを返送する。
  3. ワーカースレッドが解析結果をLandscapeFrameへマージし、base consonance表現を再計算する。次にecology側のHabituationFieldを進め、effective viewを書き込む。listener解析結果には別のhabituation stateを適用する。
  4. ワーカースレッドがハビタットのオンセットフラックス(DorsalStream)とハビタットへ送られるボイスの発声オンセット強度で生成MeterNetworkを駆動し、結果のMeterStateをNeuralRhythms::from_meter_state経由でlandscape.rhythmへ射影する。
  5. Communityがeffective Landscapeを、ピッチ選択、代謝、spawn、respawn、Voiceのライフサイクルに使う。
  6. DCC couplingが有効なら、tension_pressure = tension_level * coupling_strengthから上限つきのtemperature bonusを作り、Voiceのpitch searchへ戻す。Listenerのtensionにはすでにresolvabilityが含まれるため、couplerでは重ねて掛けない。デフォルトのcoupling strengthは0であり、明示的に有効化しない限り挙動は変わらない。
  7. PhonationEngineがToneCmd batchを生成し、ScheduleRendererがToneの生成・更新・releaseを実行し、選んだ身体の応答を各busへ描く(5.1.3節)。
  8. レンダリングされた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 である。

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"|"rearticulate") で明示上書き可), pitch_core("hill_climb"|"peak_sampler"), glide(v), landscape_weight(v), tessitura_gravity(v), temperature(v)(両コア共有の探索ノブ。0 で貪欲に落ち着く——音楽的にはこれが運動の緊張のノブで、高温ではボイスが協和から外れて彷徨い、冷ますと解決する)ほか。

参加の時計を持たない、音高が自由なHoldのVoiceでは、pitch_apply_mode("rearticulate")の境界を省略するか0にすると、 行き先が変わる採用一回につき一回発音する。採用のsample時刻に旧いToneのreleaseを始め、 新しいToneを新しい音高で立ち上げる。正のrearticulate_above(cents)を添えると、最後に 実際に発音した音高から行き先までの正味の変位で選ぶ。境界を超えれば打ち直し、境界以下なら 同じToneでglide(tau)に従って滑る。選択は次の採用まで保つ。両端がLog2Spaceの正確な bin中心ならbin差をcentへ換算し、それ以外は連続したlog2座標の差を使う。目標の丸め直しや epsilonは加えない。同じ未出力hopで先行する合法な発音があれば、その音高を基準にし、 取り消した要求は実発音の記憶へ残さない。

境界は作曲者が創始のVoiceへ置く量で、既定0、負値と有限でない値は0、上限は置かない。 Rearticulate以外への指定は警告して無視する。演奏中の境界変更だけでは発音せず、次の採用から 使う。再生成したVoiceは境界を継ぐが、親の最後の発音音高は継がない。固定されたVoiceの 音高は固定のままである。同じ行き先、棄却した提案、提案のない更新も余分な発音を作らない。 Glideは滑らかな移動を保つ。modeの切り替えでは鳴っているToneを保ち、未出力の発音要求を 取り消す。自由音高のGatedとRearticulateの併用は、呼び出し順によらず配置時の最終設定と 演奏中の書き込み前にerrorにする。新しい発音と旧音のrelease tailは、既存の合成、energy、 生態が音を聴く経路を通る。

sustain()とentrained()・steady()・flow()のいずれかを明示すると、書く順によらず、持続音と参加の 機会を併せ持つ。待つ・見送るならToneを保つ。省略時のmodeはGlideで、鳴らすと選んだ 機会に、そのsampleの身体音高で打ち直す。entrainedとflowの採用時の一候補は、元の費用、同点時の順序、 決定済みの予定を変えずに比較する。採られなかった移動は滑り、採用と時計の発音が同じ sampleなら一回にまとめる。steadyは採用時の候補を足さず、dueの機会だけを残す。

自由音高でGateSnapを明示すると、採用した行き先を一つ保留する。次の採用で置き換え、 参加の機会で鳴らすと選んだ時だけ消費し、旧音を離して新しい音高へ跳んで立ち上げる。 保留がなければ現在の音高を打ち直す。待つ・見送る間は音高も保留も保ち、滑りや期限を 加えない。採用時刻の追加候補は渡さず、参加の費用と見送りの規則も変えない。同じsampleでは 採用を先に処理し、未来の採用を過去の発音へ使わない。release、死亡、removeは保留を 取り消す。発行した発音はenergyと音響の経路へ一回だけ流れ、予測は既存の有限長の代表的な 音のfootprintを使う。

持続+参加でRearticulateを明示すると、最後の実発音音高から行き先までの距離で選ぶ。 正の境界以下の採用は旧い保留を取り消し、その時刻から滑る。発音はしない。境界を超える 採用は進行中の滑りを止め、身体音高を保ち、最新の行き先を一つ保留する。鳴らすと選んだ 機会でだけ保留を消費し、そこへ跳んで立ち上げる。保留がなければ現在の身体音高を 打ち直す。滑りの途中なら、前の発音と音高が違う場合もある。どちらの打ち直しでも 最後の実発音音高を更新する。待つ・見送る間も音と保留を保ち、始まった滑りは続く。 同じsampleでは採用を先に処理する。採用時刻の追加候補は渡さず、境界で時計の発音を 間引かない。境界の省略と0はGateSnapと同じで、距離0の採用も保留する。 参加の時計がないRearticulateは採用時、時計を持つこの形では鳴らすと選んだ機会で発音する。

演奏中のGlide、GateSnap、Rearticulateの切り替えでは、Toneと判断側の目標を保ち、 保留、選んだ滑り、未出力の制御記録を取り消す。Glideへ戻すと、その目標へ次の制御更新から 滑る。GateSnapやRearticulateへ替えた後は、その後の採用から選ぶ。同じmodeの再指定は 保留を保つ。境界の変更だけでは発音せず、それまで選んだ挙動を次の採用まで保つ。 再生成したVoiceは解決済みの設定を継ぐが、親の演奏中の状態は継がない。既定のWhileAliveや while_alive()だけではこの形を選ばない。単独のプリセットと、pulse、repeatへの sustainの後勝ちは保つ。明示のsustain+metricは持続+同期を選ぶ。プリセットは配置前の指定のままである。

rest()を指定した持続+参加では、cycles(n)またはadaptive_duration()とその 調整語による明示の有限音長を、書く順によらず独立に保持する。Voiceを生かしたまま、 発音ごとに予定した正規のOffを出す。余韻は切らず、同じsource IDとgenerationの全Toneが 実際に終わったとrendererが確認するまで新しい発音を禁止する。確認時から、rest()は その時点の固有周期一つ分、rest(periods)は作曲者が置いた倍数だけ待つ。周期が既知なら 0は余韻の終了だけを待つ。周期が未知、または音が未完了なら、代わりの値や期限を置かず 待ち続ける。負値と有限でない値は0にし、有限の非負値に上限は置かない。

間の終わりは参加を許すだけで、発音を強制しない。既存の候補、費用、見送りを保ち、 意図による抑止を費用の見送りとして学習させない。GateSnapは発音中、余韻待ち、間の あいだも最新の行き先を保留し、次に鳴らすと選んだ機会で使う。GlideはOff後の余韻に 音高更新を渡さない。Rearticulateも余韻待ちと間のあいだに採用を扱い、小さい採用は 旧保留を取り消し、大きい採用は保留する。次の実発音まで最後の発音音高を基準にし、 身体の滑りは離した余韻へ反映しない。release、死亡、removeが優先する。restと音長は配置前の指定で、 再生成は設定を継ぎ、演奏の状態は新たに始める。有限の音長がない場合、明示の持続+ entrained/steady/flow以外は、配置時の書き込み前にerrorにする。三つの音高適用modeを選べる。 明示のwhile_alive()は有限の指定を消す。restがなければ従来の挙動を保つ。この形では 全ての音が有限長で終わり、一音ごとに伸ばすか切るかを選ぶ機能は含まれない。

  • クラウディング: 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);有限音長の持続+参加にはrest()/rest(periods)。
  • リズム(5.4節): metric()は共有拍への同期、entrained()・steady()・flow()は音を参照する参加を選ぶ。entrainment(v)は選んだ関係の中で影響の強さを変え、microtiming(v)は同期目標だけをずらす。temporal_basinは生成側の拍の地形とmetricの身体の初期周期を設定し、intrinsic_rate(hz)はentrained/steady/flowの独立した創始の身体の尺度(省略時2 Hz)を置き、音長と間の秒数も一緒に変える。アーティキュレーション側の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_aversion(w), set_pitch_objective("consonance"|"dissonance")。どちらも評価を変え、感覚としての $R_{01}$ / $H_{01}$ は変えない。
  • 時間地形: 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節の異なる参加の仕方を使う。

  1. Metric(07_heartbeat.rhai): 生成側の拍へ明示的に同期する。同期の実演を主題とするため、拍を打つ専用Voiceを維持する。
  2. Entrained(08_murmuration.rhai): 音の文脈を使い、自身のペースから参加する。Gated発音の回復は協和度に基づき、位相一致報酬を使わない。
  3. Flow(09_rain.rhai): 不規則な身体の更新過程と、音の文脈への弱い応答を使う。音高は引き続きConsonance Fieldに従う。

08と09には同期を補助する専用の拍打ちはない。

7.2 ケーススタディ:漂流と流れ(samples/research/drift_flow.rhai)

この短い研究用fixtureは、Populationへのlive patchとfield-relative placementの反復を示す。自律的なdriftを示すものではない。

  1. 明示的patch: 持続anchorをC2(65.41 Hz)へ、もう一つの持続VoiceをC#3(138.59 Hz)へ置く。後者はpopulation.freq(220.0)で直接220 Hzへ変更し、その後releaseする。
  2. Field query: consonance(130.0).peak().range(1.0, 4.0)を使い、一つのVoiceからなるswarmを5回続けて配置する。live fieldに対する決定論的なqueryを反復するfixtureである。
  3. Terrain change: 最後にanchorをF2(87.31 Hz)へpatchし、配置後のfieldを変える。

自律的なsettlingはsamples/05_settling.rhaiが担う。

7.3 ケーススタディ:Emergence and Resolution(samples/12_emergence_and_resolution.rhai)

最後の統合サンプルは、habitatだけへ送る調波的なroot、metricなcolony、一時的に加わる非拍節的なflowのPopulationを組み合わせる。専用の拍打ちVoiceは置かない。colony自身の発音が共有の生成meterを駆動し、非可聴の持続rootがLandscapeへ音高の基準を与える。

colonyは2.3秒に登場する。11.7秒にScenarioが探索温度を上げてrootを上方へ移し、15.0秒にflowを加える。20.3秒には探索を冷却し、Glideを明示的に有効化し、rootを帰還させ、flowを減音する。23.6秒にflowをreleaseし、24.9秒のcolony減音を経て残るPopulationをreleaseする。これらは予定されたマクロの操作であり、個々の音高探索、発音、生存可能性、協和性に偏ったrespawnは局所的な過程に委ねられる。

「緊張」「解放」は構成の意図を示す名前であり、知覚上の達成を確認した判定ではない。和声展開と終止感は、生成条件に対応する試聴で別に評価する。

8. 結論

Conchordal は生体模倣的計算音響のプルーフオブコンセプトを成功裏に確立する。音楽理論の剛直な抽象化(音符、グリッド、BPM)を連続的な生理学モデル(Log2Space、ERB帯域、神経振動)に置き換えることで、音楽が構成されるのではなく、成長するシステムを実現する。本テクニカルノートで記述した手法の理論的基盤と実験的検証は arXiv:2603.25637 に詳述されている。

Log2Space 座標系と「シブリング投影」アルゴリズムに支えられた技術アーキテクチャは、この新しいパラダイムに堅牢な数学的基盤を提供する。Rust の採用により、これらの複雑な生物学的シミュレーションがリアルタイムで実行可能となり、ALife研究と演奏的楽器の間の溝を橋渡しする。

v0.4.0は論文の知見を楽器そのものに統合し、アーキテクチャに時間軸を加えた。固定のリズムフィルタバンクは、発音の再来の確認によるテンポ適応と、位相・型の再来から得る確信度を備えた強制リミットサイクル振動子——創発メーター——に置き換わった。Voiceのタイミングは、同期するmetricと、音響への参加であるentrained・steady・flowの意図として表す(5.4節)。そして作曲家による時間の制御は、パルスをスケジュールすることなくその形成場所だけを形づくる地形事前分布(meter_stability、temporal_basin)へと還元された。デュアルバス設計は、ハビタット(エコシステムが感じるもの)とプレゼンテーション(聴衆が聴くもの)を分離する。Landscapeの慣れは既定で有効である。ListenerTwinの模擬feedback pathはpitch探索のtemperatureを上げられるが、その結合強度は引き続き既定で0である。

第9章は、Manifesto の公約について果たされたものと未解決のものを縮約した台帳として示し、本書を閉じる。各行の背後の設計判断と、実装が逆に教えたものは、本ノートではなくリポジトリの設計台帳に置く。

9. Manifesto との対応と未解決問題

Manifesto は公約を宣言する。本章は、現在の実装がそのうち何を果たし、何が未解決かを記録する。ここに書くのは、作られた楽器の姿である。各行の背後にある設計判断、数値登録、改訂の履歴はリポジトリの設計台帳 docs/design-notes/technote-ledger.ja.md に置き、本章の旧節番号(§9.2–§9.4)をそこで保持する。

9.1 台帳

Manifesto の公約機構節状態
記号媒介なしの生成Log2Space+ランドスケープ。音名・音階・拍子記号はエンジンのどこにも存在しない§2–4実装済み
周波数軸の地形(蝸牛/脳幹モデル)粗さ・調波性・協和性カーネル§3実装済み
時間軸の地形(神経振動)創発メーター:強制リミットサイクル、既定の発音列または任意の連続T2再来によるテンポ適応。位相・強度は速い入力で更新し、確信度は位相原点の正しさを認定しない。metric は明示的な同期を保ち、entrained・steady・flow は有界な音響観測と身体の参加方策を使う。steadyはdueを固定し、鳴らすか見送るかを選ぶ§4, §5.4部分。全条件での時間関係の持続は未解決。小節アクセントの結合は任意
地形の可変性(文化・個人・未知の原理)協和性カーネル係数、set_roughness_aversion、既定で有効な慣れによる浸食§3.4–3.5, §6.3.6部分。文化的音律体系は未取込
順応と期待Voice ごとの AdaptationContext、ecology/listener の HabituationField、habitat 側の参加へ渡す短期の反復予測とエネルギー予測§3.5, §5部分。関係の記憶、phrase/scene の期待、行動価値学習は未解決
音響生命:知覚・代謝・自律Voice:アーティキュレーション生命コア、正規化エネルギー、時間領域の endurance/recovery、生存可能性§5実装済み
集団:ニッチ・共生・地形変形クラウディング、リスポーン、閉ループ§5実装済み
中央指揮者の不在局所の知覚のみ。一つの共有メーターがhabitatの再来と速い入力の位相・強度を読み、連続T2再来を任意で使う§4–5, §7実装済み。専用の拍打ちは明示的な同期の実演(sample 07)に限る
シナリオ=マクロの演出ディレクターの地形操作§6.3.6作者による構成として実装済み
時間構造を聴覚認知に根差させる既定で無効のtemporal_meter_t2がhabitat全体の連続T2再来を生成側のメーターへ渡す。群アクセントとPeriodic到来は別設定で既定は無効§5.4部分。連続再来・アクセント・到来の機構は実装済み。生成側の再来は群の割当てを前提にせず、因果的な支持とunknownの区別を保つ。群の到来は元の音群への帰属を保つ。群eventの数値自由量は既定値を持たず、到来の重みは省略時に1を使う
DCC 第2段階:生体信号閉ループ[dcc] coupling 有効時、ListenerTwin 圧力を pitch-search temperature へ戻す§4.1, §6.2模擬ループは実装済み・既定無効。実生体信号ループは未解決
実際に提示された音との認知的結合presentation 専用分析。入力欠落時は観測を無効化し、連続した1窓分が揃うまで DCC 圧力を停止§6.2実装済み。実機での過負荷検証は未解決
励振と身体の放射楽器とoffline用binaryで任意に選べる励振renderer。Sine/Harmonicの即時応答、Modalの自由減衰、Offと退役の分離§5.1, §6.1実装済み。既定は従来のrenderer
生きた演奏としての音楽楽器は音声ファイル出力を持たず、別バイナリ conchordal-render がオフライン検証を担う§6バイナリ境界として実装済み
役割の溶解・空間ランドスケープ・音色の遺伝・他領域遺伝的リスポーンはアッセイとして存在—地平

9.2 未解決問題

  • ランドスケープのパラメータとしての文化的音律体系と個人の聴覚特性。
  • entrained・flow における、演奏条件をまたいだ時間関係の持続。
  • phrase、section、長い文脈の記憶。楽器本体の外の研究として保留。
  • 認知的な保持と干渉、重なる音の中での流れの同定。
  • DCC 第2段階の実生体信号ループ。
  • 実機の過負荷と大きな個体数での実時間受入。
  • nativeのModalでは、身体込みの出生・代謝と代表onsetのfootprintは対応外。励振rendererの旧解析的なTone energy予測も対応外のまま。

付録A:主要システムパラメータ

パラメータモジュール単位説明
bins_per_octLog2SpaceInt周波数グリッドの分解能(典型値 48-96)。
sigma_centsHarmonicityParamsCents調波ピークの幅。低いほどイントネーションが厳格。
roughness_kLandscapeParamsFloat粗さマッピングの飽和パラメータ。デフォルト:$(1/0.7) - 1 \approx 0.4286$。
kernel.aConsonanceKernelFloat調波性係数(デフォルト 1.0)。
kernel.bConsonanceKernelFloat粗さ係数(デフォルト −1.35)。
kernel.cConsonanceKernelFloat相互作用係数(デフォルト 1.0)。
kernel.dConsonanceKernelFloatバイアス項(デフォルト 0.0)。
betaConsonanceRepresentationParamsFloat$C_{level01}$ のシグモイド急峻度(デフォルト 2.0)。
roughness_aversionLandscapeParamsFloat粗さの項 $b$、$c$ と密度の $\rho$ に掛かる評価の重み。set_roughness_aversion で設定する。デフォルト 1.0。
thetaConsonanceRepresentationParamsFloat$C_{level01}$ のシグモイド閾値(デフォルト 0.0)。
consonance_density_roughness_gainLandscapeParamsFloat密度カーネルにおける $\rho$(デフォルト 1.0)。
habituation.enabledHabituationParamsBoolLandscapeの慣れによる浸食を有効にする。設定の既定値はtrue。falseを明示するとeffective viewはbase viewとbit単位で一致する。
habituation.satiation_secHabituationParams秒持続刺激の平衡状態までの差が90%縮む時間(既定5.0)。
habituation.recovery_secHabituationParams秒driveがなくなってから90%回復する時間(デフォルト 8.0)。
habituation.ref_driveHabituationParamsFloathabituationの伝達関数における半飽和drive(デフォルト 0.25)。
loudness_expLandscapeParamsFloatsubjective-intensity front endでA-weighted peak powerに適用する圧縮指数(デフォルト 0.23)。
tau_msLandscapeParamsミリ秒peak抽出後のleaky normalization時定数([analysis].tau_ms)。
stabilityMeterShaping0.0-1.0ビートアトラクタ深度(meter_stability):強制力とテンポ学習をスケール。
basin_hzMeterShapingHz ペアsceneのテンポ領域(temporal_basin):拍の周波数学習の初期値と帯域制限。中心はstabilityに依らずmetricの身体の初期周期にも使う。
couplingCoupledTimingSpec0.0-1.0参加では音響文脈の影響、同期では共有拍への引力(entrainment)。
flow_depthCoupledTimingSpec0.0-1.0自由走行オンセットの更新クラスタリング(0 = 規則的)。
steadyCoupledTimingSpecboolean固有周期を固定し、候補をdue一つに限る非flowの参加。
microtimingCoupledTimingSpeccyclesロック目標への符号付きビート位相オフセット。
temperaturePitchHillClimbPitchCore / PitchPeakSamplerCoreFloat ≥ 0両ピッチコア共有の探索ノブ。0 で貪欲に落ち着き、値を上げるほど探索的。音楽的には運動の緊張のノブ(高温=協和から外れて彷徨う、0=落ち着く)。
crowding_strengthPitchHillClimbPitchCoreFloatクラウディングペナルティの強度(デフォルト 0.0)。
crowding_sigma_centsPitchHillClimbPitchCoreCentsクラウディングの空間幅(デフォルト 60.0)。
leave_self_outPitchHillClimbPitchCoreBool自己排除モードの有効/無効。
endurance_secLifecycleConfig::Sustain秒アタックと回復がないゼロ適合時の公称エネルギー枯渇時間。
recovery_secLifecycleConfig::Sustain任意の秒生存可能性信号1で正規化エネルギーを0から1へ戻す時間。
attack_cost_fractionLifecycleConfig::Sustain正規化エネルギー / attack最大強度アタックが消費する容量。
attack_recharge_fractionLifecycleConfig::Sustain正規化エネルギー / attack完全に協和したアタックが回復する最大容量。
dissonance_penaltyLifecycleConfig::SustainFloat ≥ 0ゼロ適合enduranceを保ったまま、良好な適合による寿命延長を形づくる。
dcc.coupling_strengthDccConfig0.0-1.0ListenerTwinのtension feedback強度。デフォルトは0.0(挙動上は無効)。
dcc.max_temperature_bonusDccConfigFloat ≥ 0listener pressureがpitch-search temperatureへ加える最大値(デフォルト 0.10)。
attack_stepKuramotoCoreFloatアタックエンベロープのステップサイズ。
decay_rateKuramotoCoreFloatディケイエンベロープのレート。

付録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 $$