NoraBar は WPF の MVVM 寄りの構成で作られています。画面は XAML、状態は ViewModel、Windows 連携は Service に分けています。
MainWindow
-> MainViewModel
-> MusicViewModel
-> MediaControlService
-> AudioVisualizerService
-> LyricsService
-> SettingsService
-> StartupService
-> LocalizationService
-> DesignAMusicView / DesignBMusicView
MainWindow は画面上端に常駐する透明ウィンドウです。
Topmost=Trueで最前面に表示します。ShowInTaskbar=Falseでタスクバーには出しません。- 通常時は
200x2の細い領域です。 - マウスホバーで
Music状態になり、選択中のデザインビューを表示します。 - マウスが離れると
Idle状態に戻り、コンテンツを閉じます。
アプリ全体の設定と画面状態を持ちます。
- 現在のデザインスタイル
- 現在の HUD 状態
- プログレスバー表示
- 同期歌詞表示
- HUD の表示位置
- 表示言語
- 設定画面のページ
- 更新確認ダイアログ
- ライセンスダイアログ
設定値が変わると SettingsService.Save を呼び出して保存します。
音楽表示に必要な状態をまとめます。
- 曲名
- アーティスト
- アルバムアート
- 再生状態
- 再生位置
- 総時間
- 進捗率
- 現在の歌詞
- 波形データ
再生、一時停止、前の曲、次の曲のコマンドもここから提供します。
Windows の GlobalSystemMediaTransportControlsSessionManager を使い、現在のメディアセッションから曲情報と再生状態を取得します。
再生位置はタイマーで更新し、再生中の場合は LastUpdatedTime から経過時間を補正します。
CSCore の WasapiLoopbackCapture でシステム音声を取得し、FFT の結果を 8 本のバーへ変換します。
低域寄りの周波数帯を使い、デシベル変換してから 0.0 から 1.0 の範囲に正規化しています。
曲名、アーティスト、アルバム、総時間を使って LRCLIB API から同期歌詞を取得します。現在の再生位置に合わせて、対応する歌詞の行を提供します。
ユーザー設定を JSON として保存します。
%AppData%\NoraBar\settings.json
設定ディレクトリ名はアプリ名と同じ NoraBar です。
Windows のスタートアップフォルダーに NoraBar.lnk を作成または削除します。ショートカットには --startup 引数を付け、起動時に設定画面が自動表示されないようにしています。
日本語と英語の表示文言を辞書で管理します。設定変更時は ViewModel が関連プロパティの変更通知を出し、画面表示を更新します。
HUD には 2 つのビューがあります。
DesignAMusicView: コンパクトな Minimal 表示DesignBMusicView: 情報量を増やした Productivity 表示
どちらも MusicViewModel の情報を MainViewModel.Music 経由で参照します。