AIVONY

ピアノ初心者 × AI/ツール作りを temptation bundling(抱き合わせ)した趣味プロジェクト。狙いは 上達速度ではなく 「辞めない × 楽しい」 の最大化。名は Claude(Opus) × 作品番号 Op.88 × ピアノ88鍵。

  • 状態:DESIGN.md の棚5要素(§5.1〜5.5)すべて最低限実装済み(2026-06-23)。正典は repo 直下 AIVONY/DESIGN.md。 旧名 opus-88/ から AIVONY/ に改名(2026-06-23)。
  • 構成変更(2026-08-31):拍の時計を PC が持つようになった(P-125a 内蔵メトロノームは使わない)。 端末(スマホ/タブレット)から操作するクリックサーバを Windows 側に立て、クリックは MOTU M2 へ、 ピアノ音は AUX OUT から M2 に混ぜて監聴する。端末が送るのは命令だけで、端末は音を鳴らさない。 裁定 6 本は AIVONY/AIVONY_ADR_2026-08-31.md、恒久的な前提は AIVONY/CLAUDE.md。 未実施:AUX OUT → M2 の配線(ケーブル未購入)・MIDI 記録の実機確認・出力レイテンシの実測・譜面台の表示媒体の選定。
  • 実装済み:§5.5 生成 / §5.3 FSRS / §5.2 ジャーナルRAG / §5.4 演奏diff / §5.1 アンビエント可視化+MIDIライブロガー。 棚の追加要素として §2 客観指標を実体化した練習ヒートマップ&統計タブも実装(2026-06-23)。
  • 起動方法:バックエンドの正典=コンテナ内で python main.py(AIVONY/backend)→ http://localhost:8000。 host 直起動は start.bat(→start.ps1、PORT=8010)でバックエンド+MIDIロガー+ブラウザを一括起動。 クリックサーバは Windows 側で AIVONY/click/ に入って python aivony_click.py(ポート 8014)。 スマホからは http://192.168.0.7:8014/metronome.html(2026-08-31。拍・音・端末はこちらが正典)。 ※ Ollama (ollama serve) を先に起動(gemma4:12b 必須)、ピアノの電源も先に入れる。
  • 設定(2026-06-18):load_dotenv(override=False)。優先順位 env > .env(gitignore) > code default。 ground truth は code default(gemma4:12b/172.23.32.1)と .env.example。起動時 resolved 行を出力。

実装構成(2026-06-17 時点)

ファイル役割
AIVONY/backend/main.pyFastAPI バックエンド(ABC生成・ジャーナル・ジャーナルRAG・FSRS・MIDIログ配信)
AIVONY/backend/diff.py演奏 vs 参照の diff(編集距離アライメント・自前実装)
AIVONY/backend/stats.py練習統計(鍵域ヒートマップ・タイミング一貫性・セッション集計)
AIVONY/host/midi_logger.pyWindowsホスト専用 MIDIライブロガー(mido + python-rtmidi)
AIVONY/click/aivony_click.pyWindowsホスト専用 クリックサーバ(拍を MIDI ch10 の打楽器で P-125a に送る・操作API/SSE・click/ の静的配信・打鍵のずれ集計。ポート 8014)
AIVONY/click/daily.html譜面ページ(?display=stand/phone で宣言・高さフィットとページ分割)
AIVONY/tools/検証用(layout_check.py・test_click_midi.py・MIDI 実機プローブ2本)
AIVONY/click/metronome.htmlスマホ/タブレット用の操作パネル(テンポ・拍子・開始停止)
AIVONY/web/index.html単一HTML フロントエンド(生成/ジャーナル/復習/ライブ の4タブ・abcjs 組み込み)
AIVONY/backend/data/cards.jsonFSRS カードデータ(自動生成)
AIVONY/backend/data/journal.md練習ジャーナル(追記式)
AIVONY/backend/data/midi_log.jsonlMIDIイベントログ(host が追記・コンテナが読む。gitignore)
AIVONY/start.bat / start.ps1host 一括起動(サーバ+MIDIロガー+ブラウザ)

6タブ構成

  • 生成タブ:調・種類(スケール/アルペジオ/メロディ/5指練習)・難易度・小節数を指定し、gemma4:12b → ABC記法 → abcjs で楽譜表示+Web Audio 再生。
  • ジャーナルタブ:練習メモを Markdown 形式で追記。生成フレーズをそのまま保存するボタンあり。さらに簡易RAGで過去ログに質問(bigram類似度検索→gemma4:12b)。
  • 復習タブ:曲名・パッセージを登録し FSRS 間隔反復(Again/Hard/Good/Easy の4択)で管理。
  • ライブタブ:MIDIロガーが書く midi_log.jsonl をポーリングし、弾いた音を canvas に発光ブロブで描画(音高=色相・velocity=大きさ)。
  • 統計タブ:midi_log.jsonl を集計(§2 客観指標)。鍵域ヒートマップ・ベロシティ分布・セッション・タイミング一貫性(IOIのCV)を表示。
  • 照合タブ:自己リファレンス(§6 選択肢2)。クリーンな一回を基準保存し、後のtakeと照合して安定度(一致率・弾き漏れ/過ぎ・タイミング偏差)を出す。

技術スタック

  • バックエンド:FastAPI + httpx + fsrs + pydantic + uvicorn + numpy(diff用)
  • フロントエンド:Vanilla JS + abcjs(楽譜表示・Web Audio 再生)+ Canvas2D(ライブ可視化)
  • MIDIキャプチャ:mido + python-rtmidi(Windowsホスト専用=コンテナの壁)
  • Ollama 接続:WSL2 → Windows ホスト IP 172.23.32.1:11434(start.ps1 ではホスト側なので localhost:11434)

妥協ポイント(§8通り・正典に詳細)

  • ジャーナルRAGは embedding→Chroma ではなく bigram類似度(手元 Ollama が --embeddings 無し起動だったため)。
  • 演奏diff は partitura のアライメント機能が存在せず編集距離DPで自前実装。参照は生成スケール+自己リファレンス(保存take)。外部スコア(MusicXML)モードは未実装。
  • ライブ可視化は音響レイヤー(M2)未使用で MIDI velocity のみの近似。

通底原則

純度と制御は気軽に妥協していい。目的(辞めない × 楽しい)だけは妥協しない。 最大の罠は「道具作りが練習を食うこと」=ツールの完成度は成果物にしない(§3)。

status/tags の正は正典(AIVONY/DESIGN.md)。この地図は派生。