Skip to content

Latest commit

 

History

History
105 lines (70 loc) · 3.33 KB

File metadata and controls

105 lines (70 loc) · 3.33 KB

アーキテクチャ

NoraBar は WPF の MVVM 寄りの構成で作られています。画面は XAML、状態は ViewModel、Windows 連携は Service に分けています。

全体像

MainWindow
  -> MainViewModel
       -> MusicViewModel
            -> MediaControlService
            -> AudioVisualizerService
            -> LyricsService
       -> SettingsService
       -> StartupService
       -> LocalizationService
  -> DesignAMusicView / DesignBMusicView

MainWindow

MainWindow は画面上端に常駐する透明ウィンドウです。

  • Topmost=True で最前面に表示します。
  • ShowInTaskbar=False でタスクバーには出しません。
  • 通常時は 200x2 の細い領域です。
  • マウスホバーで Music 状態になり、選択中のデザインビューを表示します。
  • マウスが離れると Idle 状態に戻り、コンテンツを閉じます。

MainViewModel

アプリ全体の設定と画面状態を持ちます。

  • 現在のデザインスタイル
  • 現在の HUD 状態
  • プログレスバー表示
  • 同期歌詞表示
  • HUD の表示位置
  • 表示言語
  • 設定画面のページ
  • 更新確認ダイアログ
  • ライセンスダイアログ

設定値が変わると SettingsService.Save を呼び出して保存します。

MusicViewModel

音楽表示に必要な状態をまとめます。

  • 曲名
  • アーティスト
  • アルバムアート
  • 再生状態
  • 再生位置
  • 総時間
  • 進捗率
  • 現在の歌詞
  • 波形データ

再生、一時停止、前の曲、次の曲のコマンドもここから提供します。

Services

MediaControlService

Windows の GlobalSystemMediaTransportControlsSessionManager を使い、現在のメディアセッションから曲情報と再生状態を取得します。

再生位置はタイマーで更新し、再生中の場合は LastUpdatedTime から経過時間を補正します。

AudioVisualizerService

CSCore の WasapiLoopbackCapture でシステム音声を取得し、FFT の結果を 8 本のバーへ変換します。

低域寄りの周波数帯を使い、デシベル変換してから 0.0 から 1.0 の範囲に正規化しています。

LyricsService

曲名、アーティスト、アルバム、総時間を使って LRCLIB API から同期歌詞を取得します。現在の再生位置に合わせて、対応する歌詞の行を提供します。

SettingsService

ユーザー設定を JSON として保存します。

%AppData%\NoraBar\settings.json

設定ディレクトリ名はアプリ名と同じ NoraBar です。

StartupService

Windows のスタートアップフォルダーに NoraBar.lnk を作成または削除します。ショートカットには --startup 引数を付け、起動時に設定画面が自動表示されないようにしています。

LocalizationService

日本語と英語の表示文言を辞書で管理します。設定変更時は ViewModel が関連プロパティの変更通知を出し、画面表示を更新します。

Views

HUD には 2 つのビューがあります。

  • DesignAMusicView: コンパクトな Minimal 表示
  • DesignBMusicView: 情報量を増やした Productivity 表示

どちらも MusicViewModel の情報を MainViewModel.Music 経由で参照します。