# ハエの脳は音楽を理解できるか？

お手本を聴かせたあと、固定のハエ脳モデルの状態から音符を復元できるかを試す実験です。追加の読み出し器を学習させます。ハエ自身の学習や音楽理解を再現したという主張ではありません。

## 最初の実習

1. トップページで「のぼる」を選び、「お手本を聴く」を押します。ド・ミ・ソの3音、最後だけ長いお手本です。
2. 「練習をはじめる」を押します。初回は固定の8曲に、現在のお手本が未登録ならその曲も加えて練習します。「練習中のお手本も聴く」を外すと無音で計算できます。
3. 返事の乱数シードを **1** にして「歌い返してもらう」を押します。これは練習と同じ条件の復習です。正解に近くても一般化の証拠にはなりません。
4. シードを **2** に変えて同じ操作をします。刺激の発火タイミングが変わっただけで返事が崩れるかを調べます。
5. 「空にする」を押して、たとえばシ・ド・ファを入力します。**練習を押さずに**歌い返してもらうと、未学習の曲への応用を試せます。
6. 「3つの条件を比べる」を押します。同じ曲・同じシード・同じ学習済み読み出し器で、通常、伝播なし、聴いたあとに状態をリセットした条件を比べます。

お手本は3〜5音。音符のボタンを押すと「短い / 長い」が切り替わります。音階はド〜シの7音、1オクターブです。録音、マイク、音楽ファイルの解析は実装していません。入力の音程抽出と脳モデルの実験を混同しないため、音符が既知の鍵盤から始めます。

## 結果の読み方

- 音程の一致: 同じ順番の音程が一致した割合。
- 長さの一致: 同じ順番の音の長さが一致した割合。
- 両方の一致: 音程と長さが両方一致した割合。
- 分母はお手本と返事の長い方の音数。余った音・足りない音も不一致です。無音の返事は0%です。
- 音符の横幅は長さ、色の違いはお手本との不一致です。五線譜の代わりに音名と長さを読む比較表示です。
- 全体のテンポはユーザーが与えます。テンポの推定・自由な発音タイミングは学習しません。再現対象は順番付きの音程と、短い / 長いの二値です。

100%でも「音楽を理解した」という意味ではありません。同じ学習例への当てはめ、刺激の区別、状態の残存、未学習曲への応用は別々に評価します。現在の8曲・シード1では学習例へ強く適合し、違うシードや新しい曲には弱い結果になっています。失敗もこの実験の結果です。詳細は `docs/verification.md` を参照してください。

## 入力から返事まで

```text
お手本の音符 → 人工的な7入力群 → 実配線LIF → 20 msの無入力
                                           ↓
                           入力群以外の状態を192個の数値へ集約
                                           ↓
                              学習済み線形読み出し器 → 返事
お手本の正解 ───────────────────────────────→ 採点
```

### 音符入力

MaleCNSの型名が `JO-` で始まる672神経を、データの順序に従って7群へ均等に割り当てます。1群96神経。JOの注釈を利用していますが、ドをこの群に入れるという対応は人工的で、JOの自然な周波数応答や音楽聴覚を再現していません。

各音符について、該当群へ220 HzのPoisson刺激を与えます。短い音は15 ms、長い音は30 ms、各音のあとに3 msの無入力区間を置きます。すべて聴き終わったあとに20 msの無入力区間を計算します。音楽の再生時間は神経時間を引き伸ばした表示であり、生物学的な聴覚時間ではありません。

全166,700神経と25,582,938接続を使用します。LIFの計算法、神経伝達物質の符号、接続の由来と限界は [モデル文書](model.md) に記載しています。配線重みは練習中も変えません。

### 状態を取り出す

JO入力細胞を除外した残りの細胞を、添字の固定ハッシュで64群へ分けます。各群の `tanh((v+52)/10)`、`tanh(g/20)`、最後の20 msの `log1p(発火数)` を平均し、192次元の特徴量にします。vは電位、gはシナプス状態です。曲ID、音符列、長さ、神経tick、再生時計は推定器に渡しません。短期的な状態の残存を読み出しており、長期記憶の再現ではありません。

入力群を除外しても、神経状態には入力への直接的な応答や経過時間の影響が残り得ます。これを音楽的な表現と決めつけません。

### 読み出し器の学習

各練習曲をシード1で独立に計算し、最後の神経特徴量と正解音符列を対にします。特徴量を標準化（標準偏差の下限0.00001）し、切片付きの正則化線形回帰（λ=1、切片も正則化）を解きます。5音分それぞれについて「終了または7音」の8出力と、長さ2出力を持ちます。最も大きい値を選び、「終了」が選ばれたところで返事を終えます。

`decode(model, features)` は学習済み係数と192次元の状態だけを受け取ります。練習曲を検索して再生する機構はありません。特徴量が完全に0なら、切片から音を作らず無音を返します。この無音ゲートは人工的な規則なので、リセット後の無音だけで記憶の因果関係を証明したとは扱いません。

設計の参考は固定の再帰回路と学習する読み出しを組み合わせる [Liquid State Machineの論文（Maass et al., 2002）](https://pubmed.ncbi.nlm.nih.gov/12433288/) です。本アプリのハエデータへの適用や音楽課題を、その論文が検証したわけではありません。

## 3Dのハエ

ヘッドフォン、頭、複眼、触角、胴、6本の脚、2枚の羽をThree.jsの立体形状で構築しています。ドラッグや「見る角度」で回転できます。お手本の再生中に頭と羽が動き、返事の再生中は口も動きます。これらは音符再生に同期した演技です。学習の進み具合や神経の自然な運動を表現したものではありません。

神経の発火数は別のメーターに実計算値として表示します。「動きを減らす」またはOSの動きを減らす設定で演技を止められます。3Dが使用できない場合も、実験・音・保存は使用できます。WebGL2対応のPC版Chromeを想定しています。

## 脳の反応画像

練習や返事の計算をすると「音を聴いた脳の反応」に図が現れます。「見る区間」で各音の入力中と、音が止まったあとの20 msを切り替え、「反応の画像を保存」でPNGを保存できます。条件比較の「返事と反応」「無音の反応」から、通常・伝播なし・状態リセットの図を表示できます。

背景はMaleCNSの細胞体位置をXY平面に投影し、位置のある細胞を約20個に1個表示します。橙色はその区間で実際に計算された発火で、位置が分かる細胞の発火数上位500個まで。点の大きさは区間長で割った発火率に基づく固定尺度です。位置不明の細胞も発火総数には含まれます。図の間引きは表示だけで、神経計算には全配線を使います。

脳を撮影した画像ではなく、簡略化したモデルの計算結果です。入力群の発火も含むため、橙色の点が増えたことだけで音楽理解を判定しません。

## 保存と復旧

- MIDI / WAV: 表示中の返事を保存。テンポはその返事を作ったときの値です。
- 実験JSON: お手本、返事、採点、神経特徴量、学習済み係数、練習例、条件、対照結果。検証やコードでの再計算用で、ノート読み込みとは別の形式です。
- ノート: 練習曲と特徴量、現在のお手本。読み込むと同じ読み出し器を再計算します。
- 学習ノートはブラウザに自動保存。端末・ブラウザ・URLが変わると共有されません。必要なら「ノートを書き出す」で移してください。
- 中断時は進行中の練習を破棄し、完了済みの学習を保持します。最大24曲です。
- 音もデータも外部AIへ送りません。3Dライブラリはローカルに置きます。フォントのみGoogle Fontsから取得します。

## コードの読み順

1. `src/echo-model.js`: 入力、特徴量、線形回帰、推定、採点。
2. `src/echo-worker.js`: 実配線のロードと計算。
3. `src/echo-ui.js`: お手本・返事の再生、操作、ノート保存。
4. `src/fly3d.js`: ヘッドフォンのハエと再生時の演技。
5. `tests/echo.test.mjs`: 推定に正解を渡さないこと、対照条件、保存した係数の再利用。

次に調べるなら、練習例を増やす、音を入力する群を変える、読み出しまでの待ち時間を変える、神経配線をシャッフルした対照を用意する、といった方向があります。ハエ配線が一般的な回路より音楽に向いているか、リズム構造を理解するかは未検証です。
