This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Vue.js 3とVuetify 3で構築されたWeb版メトロノームアプリケーションです。WebAudioFontを使用した高品質なドラム音源と、WebWorkerによる精密なタイミング制御を実装しています。PWA(Progressive Web App)として設計されており、デバイスにインストールしてオフラインでも使用可能です。
このプロジェクトにはビルドシステムがありません。ブラウザで直接動作するクライアントサイドのみのアプリケーションです:
- package.jsonやビルドツールなし - 依存関係はCDNまたはローカルファイルで読み込み
- Playwrightテスト - UIテストと音響タイミングテストを分離した包括的なテストスイート
- リンターやフォーマッターなし - 直接ファイル編集方式
- 静的ファイル配信 -
npx serveによる配信(npm run serve)
- WebWorkerタイミング: インラインワーカー
workerScriptによる精密スケジューリング(メインスレッドブロック回避)- タブが非アクティブになったときに
setTimeout/setIntervalが停止する問題を回避 - WebWorkerは背景で動作し続けるため、正確なタイミングを維持
- WebWorker内では
setTimeoutは遅延しないため、20ms間隔でのtick処理が可能
- タブが非アクティブになったときに
- WebAudioFont:
/lib/webaudiofontdata/sound/ディレクトリからサウンドフォントファイルを読み込み - Web Audio API:
AudioContext.currentTimeによる直接音声スケジューリング - タイミング精度:
QUEUE_PREPARING_TIME = 0.5秒でオーディオバッファキューイング - 無音表現: 完全な無音(0)ではなく0.0001を使用してブラウザの「音を出していますよ」マークの点滅を防止
script.js: 全アプリケーションロジックを含む単一Vue.jsコンポーネント(907行)index.html: メインエントリーポイント、CDNからVue.jsとVuetifyを読み込み、テスト用data-testid属性含むmanifest.webmanifest: PWA設定/lib/webaudiofont/: 音声合成ライブラリ/lib/webaudiofontdata/sound/: ドラム音源サンプルtests/: Playwrightテストファイル(UI、MIDI、タイミングの3分割)playwright.config.js: テスト設定(UI、MIDI、タイミングテストの分離)
- Vue.jsリアクティブデータでUI状態管理
- URLハッシュで設定永続化(
#bpm=120&rhythm=quarter&voice=snare) - localStorageでMIDIコントローラー設定
- 外部状態管理ライブラリは使用せず
processMidiMessage(): 長大なif-elseチェーンからハンドラーマップパターンに改善(保守性・可読性向上)start()メソッド分割: 責任別に3メソッドに分割initializePlayback(): 初期状態設定setupWorkerScheduler(): WebWorker + 音声スケジューリングsetupFlashAnimation(): フラッシュアニメーション
- 包括的テストカバレッジ: 全MIDI機能とタイミング精度がテストで検証済み
- 単一責任原則: 各メソッドが明確な1つの責任を持つ
- 可読性重視: 複雑なロジックを理解しやすい単位に分割
- テスタビリティ: ダイレクトメソッドテストによる確実な動作保証
設定可能なCCマッピングでMIDIコントローラーをサポート:
- デフォルトMIDIチャンネル: 15
- CC 74/75: テンポMSB/LSB制御(14bit精度でBPM制御、MIDIのCCは7bit制限のため分割)
- CC 76: タップテンポ
- CC 90: 相対テンポ調整
- CC 91-98: インクリメント/デクリメント制御
- CC 100: 開始/停止切り替え
MIDI設定はlocalStorageにmidiSettingsキーで保存されます。
一部のリズムパターンは関数として定義され、noteCountを引数として受け取ります:
notes: function me (n) {
// me: 自己関数参照で状態保持
// n: monotonic増加するnoteCount、n個ごとに異なる音を生成
}# ローカルでファイル配信
npm run serve# 全テスト(UI + MIDI + タイミングテスト)
npm test
# UIテストのみ(高速、5-10秒)
npm run test:ui
# MIDIテストのみ(高速、5-10秒)
npm run test:midi
# 音響タイミングテストのみ(時間がかかる、15-25秒)
npm run test:timing
# ヘッド付きモードでテスト実行(ブラウザ表示)
npm run test:headed
npm run test:ui-headed
# 特定のテストのみ実行
npm run test:ui -- --grep "タップテンポ"- UIテスト (
tests/ui.spec.js): ボタンクリック、フォーム入力、キーボードショートカット、URLハッシュ復元 - MIDIテスト (
tests/midi.spec.js):processMidiMessage()メソッドの直接テスト、全MIDIコントロール機能の検証 - 音響タイミングテスト (
tests/timing.spec.js): WebAudioFontのqueueWaveTable監視による実際の音響タイミング精度検証 - WebAudioFont監視: 実際の音出力なしで
AudioContext.when値による高精度タイミング検証(±0.01秒精度) - ブラウザ内タイマー: Playwrightのタイミングに依存しない
setTimeoutによるタップテンポ精度テスト - URLハッシュテスト:
about:blank経由でページリロードを強制し、loadHashParams()実行を確実にする - ダイレクトメソッドテスト: Vueインスタンスへの直接アクセスによるMIDI機能の単体テスト
- 安定化されたタイミングテスト: キューイング時間(500ms)を考慮し、最初と最後のintervalのみ比較することで過渡期データを除外
audioContext.stateを確認 - 開始にユーザーインタラクションが必要な場合があります/lib/webaudiofontdata/sound/のサウンドフォント読み込みを確認- ブラウザDevToolsのPerformanceタブでWebWorkerタイミングを監視
- Flash機能は150ms以上の間隔でのみ動作(ちらつき防止、人間の認知限界を考慮)
リズムパターンはscript.jsのrhythmscomputed propertyで定義されています。各パターンはbeat(タイミング)とaccent(音量)プロパティを持つオブジェクトの配列です。
/lib/webaudiofontdata/sound/に新しいサウンドフォントファイルを追加script.jsのvoices配列に新しい音源定義を更新webaudiofontオブジェクトに対応するローダーを含める
- Web Audio APIサポートが必要な現代的ブラウザ
- ES2015+機能を使用(モジュール、アロー関数、async/await)
- PWA機能は本番環境でHTTPS必須
- MIDIサポートにはWeb MIDI API必須(Chrome、Edge)
- テスト: Playwrightが Chrome/Desktop環境で実行(WebAudioFont対応必須)