1. 導入:生体音響パラダイム

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

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

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

本ドキュメントでは、Conchordal アーキテクチャの3つの基盤的柱を探求する。

  1. 心理音響座標系: 線形ヘルツおよび整数MIDIノートに代わる Log2Space とERBスケールの数学的フレームワーク。
  2. 認知的地形: 生のオーディオストリームから粗さ($R$)と調波性($H$)のフィールドを計算するリアルタイムDSPパイプライン。
  3. 生命エンジン: 音響エンティティの代謝、移動、および神経同期を統治するエージェントベースモデル。

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. 聴覚的地形:環境の分析

「地形(Landscape)」は Conchordal における中心的なデータ構造である。すべてのエージェントの共有環境として機能し、各周波数ビンの心理音響的「ポテンシャル」を表す動的スカラー場である。エージェントは互いに直接相互作用しない。地形と相互作用し、地形が全集団のスペクトルエネルギーを集約する。これによりシミュレーションの計算量がエージェント数から切り離される($O(N^2)$ ではなく $O(N)$)。

地形はオーディオフレーム(またはブロック)ごとに解析ワーカーによって更新される。2つの主要メトリクスが合成される。

  • 粗さ($R$): 近接する部分音間の急速なうなりによって引き起こされる感覚的不協和。
  • 調波性($H$): 仮想ピッチの強度およびスペクトル周期性の測度。

両メトリクスは $[0, 1]$ 範囲に正規化される。協和性はその後2つの層で導出される。観測量を単一の適応度スコアに融合する協和性カーネルと、そのスコアを異なる下流消費者向けに変形する表現変換のセットである。

第1層 — 協和性カーネル(双線形族):

$$ C_{score} = a \cdot H_{01} + b \cdot R_{01} + c \cdot H_{01} R_{01} + d $$

デフォルト係数:$a = 1.0$、$b = -1.35$、$c = 1.0$、$d = 0.0$。$b < 0$ であるため粗さはペナルティとして作用し、$c > 0$ であるため高い調波性がそのペナルティを減衰させる(相互作用項 $c \cdot H_{01} R_{01}$ は $H_{01}$ が大きいとき $b \cdot R_{01}$ を部分的に相殺する)。双線形族は以前の $\alpha H - wR$ 定式化を $c = 0$ の特殊ケースとして包含する。

第2層 — 表現:

名前範囲意味
$C_{score}$$aH + bR + cHR + d$$(-\infty,+\infty)$カーネルからの生の適応度
$C_{level01}$$\sigma(\beta(C_{score} - \theta))$$[0,1]$代謝ゲート(シグモイド)
$C_{density_mass}$$\max(0,;H_{01}(1 - \rho R_{01}))$$[0,+\infty)$生の密度質量($\rho$-カーネル)
$C_{density_pmf}$$\text{normalize}(C_{density_mass})$$[0,1],;\Sigma=1$ピッチ選択PMF
$C_{energy}$$-C_{score}$$(-\infty,+\infty)$最小化用エネルギー

ここで $\sigma(x) = 1/(1+e^{-x})$、$\beta$ はシグモイドの急峻度(デフォルト2.0)、$\theta$ はシグモイドの閾値(デフォルト0.0)である。密度質量は係数 $a{=}1, b{=}0, c{=}{-}\rho, d{=}0$ を持つ別個の $\rho$-カーネルを使用し、$C_{density_mass} = H_{01}(1 - \rho R_{01})$ を $\geq 0$ にクランプする。パラメータ $\rho$(consonance_density_roughness_gain、デフォルト1.0)は粗さがスポーン確率を抑制する強度を制御する。

個々のエージェントは独自の知覚コンテキスト(PerceptualContext)を保持し、エージェントごとの飽き(boredom)と馴化(familiarity)を追跡して、ピッチ選択時に追加のスコア調整を提供する。

3.1 非定常ガボール変換(NSGT)

Log2Space をスペクトルデータで満たすために、Conchordal は非定常ガボール変換(NSGT)のカスタム実装を使用する。固定窓サイズを使用する短時間フーリエ変換(STFT)とは異なり、NSGT は2.2節で導出された定Q特性を維持するために窓長 $L$ を周波数に反比例させて変化させる。

3.1.1 カーネルベースのスペクトル解析

core/nsgt_kernel.rs の実装は、この変換を効率的に行うためにスパースカーネルアプローチを採用している。各対数周波数帯域 $k$ について、時間領域カーネル $h_k$ が事前計算される。このカーネルは、帯域の中心周波数 $f_k$ における複素正弦波と長さ $L_k \approx Q \cdot f_s / f_k$ の周期的ハン窓 $w_k$ を結合する。

$$ h_k[n] = w_k[n] \cdot e^{-j 2\pi f_k n / f_s} $$

これらのカーネルは初期化時に周波数領域($K_k[\nu]$)に変換される。性能を最適化するため、システムはこれらの周波数カーネルをスパース化し、有意なエネルギーを持つビンのみを保持する。

実行時には、入力オーディオバッファに対して単一のFFTを実行してスペクトル $X[\nu]$ を取得する。帯域 $k$ の複素係数 $C_k$ は周波数領域での内積により計算される。

$$ C_k = \frac{1}{N_{fft}} \sum_{\nu} X[\nu] \cdot K_k^*[\nu] $$

この「1回のFFT、多数のカーネル」アプローチにより、Conchordal は各帯域ごとに個別のDFTを計算したり再帰フィルタバンクを使用したりする計算コストなしに、20Hzから20kHzまでをカバーする高分解能の対数間隔スペクトルを生成できる。

3.1.2 リアルタイム時間平滑化

NSGTから得られる生のスペクトル係数 $C_k$ は、オーディオ入力の確率的性質(特にノイズベースのエージェント)により高い分散を示す。エージェントがサンプリングする安定したフィールドを作るため、RtNsgtKernelLog2 構造体はNSGTを時間平滑化層でラップする。

帯域ごとのリーキー積分器(指数平滑化)が実装される。重要なのは、時定数 $\tau$ が周波数依存であることだ。緩やかに変化する低周波はより長い $\tau$ で平滑化され、過渡的な詳細を含む高周波はより短い $\tau$ を持つ。

$$ y_k[t] = (1 - \alpha_k) \cdot |C_k[t]| + \alpha_k \cdot y_k[t-1] $$

ここで平滑化係数 $\alpha_k$ はフレーム間隔 $\Delta t$ から導出される。

$$ \alpha_k = e^{-\Delta t / \tau(f_k)} $$

これは耳の「積分時間」をモデル化し、地形が瞬時の信号パワーではなく心理音響的な知覚を反映することを保証する。

3.2 粗さ($R$)計算:Plomp-Levelt モデル

粗さとは、同一臨界帯域内にあるが単一の音として知覚されるほど近接していないスペクトル成分の干渉によって引き起こされる「荒々しさ」や「うなり」の感覚(ビーティング)である。Conchordal はERB領域での畳み込みを通じた Plomp-Levelt モデルの変形を実装する。

3.2.1 干渉カーネル

計算の核心は core/roughness_kernel.rs で定義される粗さカーネルである。このカーネル $K_{rough}(\Delta z)$ は、$\Delta z$ ERB離れた2つの部分音間の干渉曲線をモデル化する。この曲線は、部分音が離れるにつれて急速に上昇するペナルティを作り出し、約0.25 ERB(最大粗さ)でピークに達し、さらに離れると減衰する。

実装では、パラメータ化された関数 eval_kernel_delta_erb を使用してこの形状を生成する。

$$ g(\Delta z) = e^{-\frac{\Delta z^2}{2\sigma^2}} \cdot (1 - e^{-(\frac{\Delta z}{\sigma_{suppress}})^p}) $$

第2項は抑制因子であり、$\Delta z \to 0$ でカーネルがゼロに向かうことを保証し、単一の純音が自己粗さを生成することを防ぐ。

3.2.2 畳み込みアプローチ

すべてのスペクトルビンに対するペアワイズの粗さ計算($N^2$ の計算量)はリアルタイム応用には計算上不可能である。Conchordal は粗さの計算を線形畳み込みとして扱うことでこれを解決する。

  1. マッピング: NSGTからの対数間隔振幅スペクトルを線形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}$ が減少し、システムの粗さ耐性が高まる。

区分的飽和マッピング: 正規化された粗さ $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. 下方投影(基音探索): 現在のスペクトル包絡を「下方にぼかす」。エネルギーを持つすべてのビン $i$ について、アルゴリズムは整数 $k \in {1, 2, \dots, N}$ に対してビン $i - \log_2(k)$ にエネルギーを加算する。

    $$ Roots[i] = \sum_k A[i + \log_2(k)] \cdot w_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 は 100 Hz 基音の完全5度である。
    • 500 Hz は 100 Hz 基音の長3度である。

したがって、西洋音楽理論のハードコードされた知識なしに、システムは倍音列の物理法則の帰結として、長3度および完全5度の関係に自然に安定性ピークを生成する。200 Hz のエージェントは 300 Hz と 500 Hz に「重力井戸」を作り出し、他のエージェントを長三和音の形成へと誘引する。

3.3.3 鏡像双対性:倍音列 vs. 下倍音列

core/harmonicity_kernel.rs の実装には深遠なパラメータ mirror_weight($\alpha$)が含まれる。このパラメータは2つの異なる投影パスをブレンドする。

  • パスA(倍音/長調): 上述の標準的な「下方→上方」投影。倍音列に基づく重力を生成し、長調の調性を優位にする。
  • パスB(下倍音/短調): 反転した「上方→下方」投影。共通倍音を見つけ、下倍音を投影する。パスAの理論的双対であり、短調やフリジア旋法の調性(下倍音列)を優位にする。

$$ H_{final} = (1-\alpha)H_{overtone} + \alpha H_{undertone} $$

mirror_weight を変調することで、ユーザーは宇宙の基本物理を長調中心から短調中心へと連続的に変形させ、エコシステムがその変化に応じてどのように再組織化するかを観察できる。

4. 生命エンジン:エージェントと自律性

「生命エンジン」はDSP地形の上で実行されるエージェントベースのシミュレーション層である。「個体(Individual)」の集団を管理し、そのライフサイクル、感覚処理、およびアクチュエーション(オーディオ合成)を処理する。

4.1 個体アーキテクチャ

Individual 構造体(life/individual.rs)はエコシステムの原子単位である。AnySoundBody アクチュエータ、ArticulationWrapperArticulationCore をラップ)、PitchControllerPitchCore をラップ)、そしてノートレベルのタイミングを管理する PhonationEngine の複数のコンポーネントで構成される。Individual 自体は統合層として機能し、ライフサイクル(代謝、エネルギー)、知覚コンテキスト、およびコンポーネント間を直接結合せずに協調する制御プレーン信号を管理する。

4.1.1 SoundBody(アクチュエータ)

SoundBody トレイトはエージェントの音声生成能力を定義する。波形のレンダリングとスペクトルフットプリントのシステムへの投射(地形更新用)を担当する。

  • SineBody: 純粋な正弦波を合成する。
  • HarmonicBody: 基音と一連の部分音からなる複合音を合成する。このボディは TimbreGenotype の概念を導入し、以下のようなパラメータをエンコードする。
    • stiffness: 非調波性係数(部分音列の伸長)。
    • brightness: スペクトル傾斜(高次部分音の減衰)。
    • comb: 偶数倍音の減衰。
    • damping: 周波数依存の減衰率。
    • vibrato_rate / vibrato_depth: LFOベースのピッチ変調。
    • jitter: 有機的なゆらぎのための 1/f ピンクノイズFM強度。
    • unison: コーラス的な厚みのためのデチューンコピー量。
    • mode: Harmonic(整数倍)vs. Metallic(非整数比)。

HarmonicBody は音色の進化を可能にする。高い stiffness を持つエージェントは純粋に調和的な地形での生存が困難になり、その非調和的部分音が集団と衝突しない独自の「スペクトルニッチ」の探索を強いられる。

4.1.2 コアスタック(Articulation, Pitch)

振る舞いは焦点を絞ったコアに分割され、新しい戦略で容易に拡張できるよう各々が個別のファイルに定義される。

  • ArticulationCore(いつ/ゲート)life/articulation_core.rs: リズム、ゲーティング、エンベロープダイナミクスを管理する。バリアントとして KuramotoCoreNeuralRhythms への蔵本モデル的同期)、SequencedCore(固定長エンベロープ)、DroneCore(緩やかな揺らぎ)がある。ArticulationCore は Individual から制御プレーン信号を受信し、ゲートの開閉を決定する。

  • PitchCore(どこ)life/pitch_core.rs: 協和性、距離ペナルティ、音域重力、およびエージェントごとの知覚調整に基づいて、対数周波数空間での次の目標を提案する。2つの実装が存在する。

    • PitchHillClimbPitchCore: 現在の目標周辺の離散的な候補セットを評価し、各候補を協和性からペナルティ(距離、音域重力、持続バイアス、PerceptualContext からの知覚調整)を差し引いたスコアで評価する。
    • PitchPeakSamplerCore: 地形の協和性ピークからサンプリングし、より探索的な戦略を提供する。

    PitchController は PitchCore をリターゲティングロジックと積分ウィンドウ管理でラップする。

4.1.3 制御プレーン信号:Planned と Error

Individual は直接結合ではなく2つの直交する信号を通じてコアを協調させる。

  • Planned: PitchCore がターゲット(TargetProposal)を提案し、Individual が「計画」状態——次の目標周波数、予測跳躍距離、顕著性——を維持する。これはエージェントの意図を表す。
  • Error: Individual は SoundBody の現在のピッチと計画目標との間の不一致(符号付きセント、絶対セント)を計算する。これは以前の行動の結果を表し、観測や将来の拡張(例:適応的アーティキュレーション)に利用可能である。重要なのは、PitchCore はエラー信号を読み取らない——探索はフィードバックから切り離されたままである。

この分離により各コアは焦点を維持する。PitchCore は地形を探索し、ArticulationCore はエンベロープを形成し、Individual がタイミングと状態遷移をオーケストレーションする。

4.2 ライフサイクルと代謝

Conchordal のエージェントは生物学的代謝をモデル化したエネルギーダイナミクスによって統治される。LifecycleConfig は2つの存在モードを定義する。

  • Decay: エージェントは固定の initial_energy プールを持って生まれる。時間経過(半減期)とともにこのエネルギーを消費し、ゼロに達すると死亡する。これはプラックやパーカッションのような一過性の音をモデル化する。
  • Sustain: エージェントは metabolism_rate(1秒あたりのエネルギー損失)を持ち、協和性依存のリチャージによってエネルギーを獲得できる。
    • リチャージ: これは重要なフィードバックループである。フォネーションアタックごとに獲得されるエネルギーは、MetabolismPolicy を通じてエージェントの $C_{level01}$(シグモイドマッピングされた協和性)によってスケーリングされる。
    • 生存: 不協和な(低い $C_{level01}$)領域にいるエージェントは「飢餓」状態になる——エネルギーが減少し、振幅がフェードし、最終的に死亡する。協和的な(高い $C_{level01}$)領域にいるエージェントは「栄養」を得る——エネルギーを維持または獲得し、より大きな音量でより長く生存できる。

このメカニクスはダーウィン的圧力を生み出す:協和なるものの生存(Survival of the Consonant)。和声的関係を見出したエージェントだけが生き残り聴取される故に、音楽的構造が創発する。

4.3 ピッチリターゲティングロジック

エージェントは静的ではない。適応度を改善するために周波数空間を移動する。実行層はリターゲットゲート(シータゼロ交差と積分ウィンドウ)を適用し、その後 PitchCore に次の目標の提案を求める。

  1. リターゲットゲート: Individual は現在の周波数に基づいて時間を積分し、シータ交差がウィンドウと整合した場合にのみ発火する。これによりリターゲティングがリズミカルかつスケール感応的に保たれる。
  2. ピッチ提案: PitchCore(例:PitchHillClimbPitchCore)は現在の目標周辺の離散的な候補セットを評価する。各候補を協和性からペナルティ(距離、音域重力、持続バイアス、PerceptualContext からのエージェントごとの知覚調整)を差し引いたスコアで評価する。提案には改善強度を反映する salience スコア(0..1)が含まれる。

4.3.1 ホップポリシー

ピッチ移動は連続的なポルタメントではなくホップポリシーを使用する。

  1. フェードアウト: ArticulationCore がゲートを閉じ、振幅を無音までフェードする。
  2. スナップ: Individual が SoundBody のピッチを新しい目標に更新する(離散的ジャンプ)。
  3. フェードイン: ゲートが再び開き、新しいピッチが鳴る。

順序が重要: スナップが発生するサンプルでは、協和性の評価前にピッチが更新され、地形スコアがエージェントの実際の発音周波数を反映することが保証される。エラー信号は一貫性を維持するためスナップ前の現在ピッチから計算される。将来スナップ後のエラーが必要になった場合、別個の信号として追加可能である。

これらのタイミングに敏感な遷移は、微妙な破壊を防ぐために回帰テストで保護されている。

5. 時間ダイナミクス:神経リズム

Conchordal はマスタークロックやメトロノームの概念を排除する。代わりに、時間は神経振動(脳波)に着想を得た連続的な変調フィールドによって構造化される。これは「空間」地形に対する「時間」の等価物である。

5.1 変調バンク

NeuralRhythms 構造体は、生理学的周波数帯域に同調した共振フィルタのバンクを管理する。

  • デルタ(0.5–4 Hz): エコシステムの巨視的な「脈動」。この帯域に同期するエージェントはフレーズレベルの長い音符を奏でる。
  • シータ(4–8 Hz): 「アーティキュレーション」レート。音節的リズムと中速度のモチーフを統治する。
  • アルファ(8–12 Hz): 「テクスチャ」レート。トレモロ、ビブラート、きらめき効果に使用される。
  • ベータ(15–30 Hz): 「緊張」レート。不協和や興奮に関連する高速のフラッターである。

5.2 活力と自励振動

各帯域は減衰調和振動子であるレゾネータとして実装される。重要なパラメータは vitality である。

  • Vitality = 0: レゾネータは受動的フィルタとして機能する。イベント(例:大音量のエージェントのスポーン)によって励起された場合にのみ振動し、その後減衰する。
  • Vitality > 0: レゾネータはアクティブゲインを持つ。入力がなくてもリズミカルなサイクルを維持しながら自励振動できる。

これは双方向の相互作用を生み出す。グローバルリズムがエージェントを駆動し(同期引き込み)、エージェントもまたグローバルリズムを駆動する(励起)。デルタ帯域でスポーンする大音量の「キック」エージェントはデルタレゾネータを「鳴らし」、その帯域に結合した他のエージェントの同期を引き起こす。

5.3 蔵本同期引き込み

KuramotoCore ArticulationCore は蔵本モデル型の結合振動子モデルを使用する。

$$ \frac{d\theta_i}{dt} = \omega_i + \frac{K}{N} \sum_{j=1}^N \sin(\theta_j - \theta_i) $$

Conchordal では、「結合」$K$ は各エージェントへの直接結合ではなく、グローバルな NeuralRhythms への結合である(平均場近似)。

  • 感度: 各エージェントは、どの帯域(デルタ、シータ等)を聴取するかを決定する感度プロファイルを持つ。
  • 位相ロック: エージェントは内部のアーティキュレーション位相をレゾネータの位相に合わせて調整する。

これにより創発的同期が生じる。ランダムなタイミングでスポーンされたエージェントは、数秒かけて徐々に位相がドリフトし、デルタまたはシータ帯域のビートに位相ロックする。結果として、中央シーケンサなしで——群れには明示的にプログラムされていない——同期したパルスが生じ、一貫したリズムパターンが形成される。

6. システムアーキテクチャと実装詳細

Conchordal はリアルタイムオーディオの厳格な要件(レイテンシ < 10ms)と重い数値解析(NSGT/畳み込み)を両立するため、Rust で実装されている。アーキテクチャは並行・ロックフリーの設計パターンを採用する。

6.1 スレッディングモデル

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

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

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

    • core/analysis_worker.rs で定義され、core/stream/analysis.rsAnalysisStream を実行する。
    • 責務: オーディオホップ(時間領域チャンク)を受信し、NSGTを実行してlog2パワースペクトルを生成し、その後単一のパイプラインで調波性フィールド(兄弟投影)と粗さフィールド(ERB領域畳み込み)の両方を計算する。
    • 更新サイクル: 解析が完了すると、更新された地形スナップショットをバウンドSPSCチャンネル経由でワーカースレッドに送信する。
  3. ワーカースレッド(シミュレーションループ):

    • app.rs"worker" と命名される。
    • 責務: メインシミュレーションループを実行する。各イテレーション:解析結果を現在の地形にマージし、Conductorイベントをディスパッチし、Population を進行させ(ピッチリターゲティング、アーティキュレーション、代謝)、ScheduleRenderer でオーディオをレンダリングし、DorsalStream(リズム抽出)にフィードし、オーディオスレッド用のリングバッファにモノサンプルをプッシュする。
    • DorsalStream: リズム解析(core/stream/dorsal.rs)はこのループ内で同期的に実行され、NeuralRhythms 変調バンク用のリズミカルエネルギーメトリクス(e_low, e_mid, e_high, flux)を抽出するためにオーディオチャンクを処理する。
  4. App/GUI スレッド(メイン):

    • eframe/egui ビジュアライザを実行する。
    • 責務: ユーザー入力の処理、地形の可視化(ui/plots.rs)、およびシミュレーションメタデータの表示。バウンドチャンネルを通じてワーカースレッドから UiFrame スナップショットを受信する。

6.2 データフロー

オーディオスレッドをロックせずにデータ一貫性を維持するため、Conchordal は地形にマルチチャンネル更新戦略を使用する。

  1. ワーカースレッドがオーディオをレンダリングし、各ホップをバウンドチャンネル経由で解析スレッドに送信する。
  2. 解析スレッドが完全なNSGT + 粗さ + 調波性パイプラインを実行し、結果の Landscape スナップショットを返送する。
  3. ワーカースレッドが解析結果を現在の LandscapeFrame にマージし、統合された協和性フィールドを再計算する。
  4. Population が現在の地形をピッチ選択、代謝、およびエージェントライフサイクルのために評価する。
  5. DorsalStream がワーカーループ内で同期的にオーディオを処理し、リズムメトリクスを更新して landscape.rhythm に格納する。
  6. レンダリングされたモノオーディオがオーディオスレッドが消費するロックフリーリングバッファにプッシュされる。

この疎結合アーキテクチャにより、解析スレッドがリアルタイムからわずかに遅延しても、オーディオスレッドは常に一貫したサンプルストリームを参照できる。解析スレッドはNSGTの時間連続性を維持するため、すべてのホップを順序通りに処理する。

6.3 Conductor:Rhai によるスクリプティング

Conductor モジュールは人間のアーティストとエコシステムの間のインターフェースとして機能する。Rhai スクリプト言語を組み込み、シミュレーション制御のための高レベルAPIを公開する。

ScriptHost 構造体は内部のRust関数をRhaiコマンドにマッピングする。

  • derive(species): プリセット(sine, harmonic, saw, square, noise)から新しい種ハンドルを作成し、メソッドチェーンで amp, freq, brain, phonation, timbre, metabolism, adsr, pitch_mode, pitch_core を設定可能にする。
  • create(species, count): 種ハンドルからエージェントグループを作成する。さらなる設定用の GroupHandle を返す。
  • .place(strategy): グループにスポーン戦略を割り当てる。戦略には consonance(root_freq), consonance_density_pmf(min, max), random_log(min, max), linear(start, end) がある。
  • wait(seconds): 保留中のグループをコミットし、タイムラインカーソルを進める。時間構造を形成する主要なメカニズムである。
  • flush(): タイムラインを進めずに保留中のグループをコミットする。
  • release(group): グループをフェードアウトリリース対象としてマークする。
  • scene(name, callback): 名前付きシーン境界をマークする。コールバック内で作成されたグループはシーン終了時に自動的にリリースされる。
  • play(callback): スコープ付きブロックを実行——内部で作成されたグループは終了時にリリースされる。
  • parallel([callbacks]): 複数のブロックを並行実行(タイムライン分岐)し、カーソルを最も遅い終了点まで進める。
  • set_harmonicity_mirror_weight(value): mirror_weight パラメータをリアルタイムで変調する。
  • set_roughness_k(value): 粗さ飽和パラメータ $k$ を調整する。
  • set_global_coupling(value): 蔵本結合強度を制御する。
  • seed(value): 再現可能な実行のためにランダムシードを設定する。

シナリオ解析: シナリオは .rhai ファイルから読み込まれる。この分離により、ユーザーは「マクロ構造」(物語的弧、変化する物理法則)を作曲する一方、「ミクロ構造」(具体的な音符やリズム)はエージェントがそれらの変化に適応することから創発する。

7. ケーススタディ:創発的挙動の分析

以下の事例は samples/ ディレクトリに由来し、特定のパラメータ設定がどのように複雑な音楽的挙動につながるかを示す。

7.1 ケーススタディ:自己組織化リズム(samples/02_mechanisms/rhythmic_sync.rhai

このスクリプトは時間の創発的量子化を示す。

  1. フェーズ1(種): 単一の高エネルギーエージェント「キック」が60 Hzでスポーンされる。その周期的なアーティキュレーションが NeuralRhythms のデルタ帯域レゾネータを励起する。
  2. フェーズ2(群れ): ランダムな位相を持つエージェントの雲がスポーンされる。
  3. 創発: エージェントはデルタ帯域に結合した KuramotoCore ArticulationCore を使用するため、キックが確立したリズムを感知する。数秒の間に位相がドリフトしてキックに位相ロックする。結果として、群れには明示的にプログラムされていない同期パルスが生じる——結合振動子の物理から生まれたものである。

7.2 ケーススタディ:鏡像双対性(samples/04_ecosystems/mirror_dualism.rhai

このスクリプトは mirror_weight パラメータの構造的役割を探求する。

  1. セットアップ: C4(261.63 Hz)にアンカードローンを確立する。
  2. 状態A(長調): set_harmonicity_mirror_weight(0.0)。共通基音投影(倍音列)を使用する。協和性を追求するエージェントは E4 と G4 の周辺に集まり、C長三和音を形成する。
  3. 状態B(短調): set_harmonicity_mirror_weight(1.0)。共通倍音投影(下倍音列)に切り替わる。地形の「重力」が反転する。エージェントは Ab3 と F3(Cに対する短6度と完全4度の音程)で安定性を見出し、フリジア旋法/短調のテクスチャを生成する。これは、Conchordal における「調性」が温度や重力に類似した操作可能な環境変数であることを示す。

7.3 ケーススタディ:漂流と流れ(samples/04_ecosystems/drift_flow.rhai

このスクリプトはホップベースの移動ロジックを検証する。

  1. 操作: 強い不協和のエージェント(C#3)が強力なアンカー(C2)の隣に配置される。
  2. 観察: C#3 エージェントはピッチの離散的なホップを行う。調波性フィールドに「引かれ」、フェードアウトして近傍の調波的「安定井戸」(おそらく E3 または G3)にスナップする。
  3. ダイナミクス: エージェントごとの飽きが有効な場合、エージェントは E3 に数秒間留まった後「飽きて」(知覚的適応によりローカル協和性が低下し)、再び別の安定音程を見つけるためにホップする。これにより、引力と斥力の単純な物理法則によって生成される、終わりのない非反復のメロディが生じる。

8. 結論

Conchordal は生体模倣的計算音響のプルーフオブコンセプトを成功裏に確立する。音楽理論の剛直な抽象化(音符、グリッド、BPM)を連続的な生理学モデル(Log2Space、ERB帯域、神経振動)に置き換えることで、音楽が構成されるのではなく、成長するシステムを実現する。

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

Conchordal の将来の開発は、空間化(地形の3D空間への拡張)と進化遺伝学(成功したエージェントが TimbreGenotype を次世代に受け渡すことを可能にする)に焦点を当て、音と生命のアナロジーをさらに深化させる。

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

パラメータモジュール単位説明
bins_per_octLog2SpaceInt周波数グリッドの分解能(典型値 48-96)。
sigma_centsHarmonicityParamsCents調波ピークの幅。低いほどイントネーションが厳格。
mirror_weightHarmonicityParams0.0-1.0倍音(長調)と下倍音(短調)の重力のバランス。
roughness_kLandscapeParamsFloat粗さマッピングの飽和パラメータ。デフォルト:$(1/0.7) - 1 \approx 0.4286$($x=1$ が $\approx 0.7$ にマッピング)。
kernel.aConsonanceKernelFloat調波性係数(デフォルト 1.0)。
kernel.bConsonanceKernelFloat粗さ係数(デフォルト −1.35;負値は粗さにペナルティ)。
kernel.cConsonanceKernelFloat相互作用係数(デフォルト 1.0;正値は高い調波性で粗さペナルティを減衰)。
kernel.dConsonanceKernelFloatバイアス項(デフォルト 0.0)。
betaConsonanceRepresentationParamsFloat$C_{level01}$ のシグモイド急峻度(デフォルト 2.0)。
thetaConsonanceRepresentationParamsFloat$C_{level01}$ のシグモイド閾値(デフォルト 0.0)。
consonance_density_roughness_gainLandscapeParamsFloat密度カーネル $H(1-\rho R)$ における $\rho$(デフォルト 1.0)。
vitalityDorsalStream0.0-1.0リズムセクションの自励振動エネルギー。
persistencePitchHillClimbPitchCore0.0-1.0エージェントの移動/変化への抵抗(ピッチ選択内のポリシーバイアス)。

付録B:数学的要約

協和性カーネル(双線形):

$$ C_{score} = a \cdot H_{01} + b \cdot R_{01} + c \cdot H_{01} R_{01} + d $$

協和性レベル(シグモイド表現):

$$ C_{level01} = \frac{1}{1 + e^{-\beta(C_{score} - \theta)}} $$

協和性密度質量($\rho$-カーネル):

$$ C_{density_mass} = \max(0,; H_{01}(1 - \rho R_{01})) $$

粗さ飽和マッピング(参照正規化された比 $x$ から $R_{01} \in [0,1]$):

$$ R_{01}(x; k) = \begin{cases} 0 & \text{if } x \leq 0 \ x \cdot \frac{1}{1+k} & \text{if } 0 < x < 1 \ 1 - \frac{k}{x+k} & \text{if } x \geq 1 \end{cases} $$

ここで $k$ は roughness_k(デフォルト $\approx 0.4286$)。関数は $x=1$ で連続であり、$x \to \infty$ で1に飽和する。

調波性投影(兄弟アルゴリズム): $$ H[i] = (1-\alpha)\sum_m \left( \sum_k A[i+\log_2(k)] \right)[i-\log_2(m)] + \alpha \sum_m \left( \sum_k A[i-\log_2(k)] \right)[i+\log_2(m)] $$

粗さ畳み込み: $$ R_{shape}(z) = \int A(\tau) \cdot K_{plomp}(|z-\tau|_{ERB}) d\tau $$