diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest index c914863..b9cdba5 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.0.79.0" /> diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj index 23740f8..cb473bd 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj @@ -74,6 +74,7 @@ + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml index 4c3f4a9..b1286de 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml @@ -116,6 +116,14 @@ + + + + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml index e3eeadc..09b755c 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml @@ -281,7 +281,7 @@ - + + + + + = frequencies[frequencies.Length - 1]) + { + return gains[gains.Length - 1]; + } + int i = 0; + while (freq > frequencies[i + 1]) + { + i++; + } + // 线性插值 + float x1 = frequencies[i]; + float y1 = gains[i]; + float x2 = frequencies[i + 1]; + float y2 = gains[i + 1]; + return y1 + (freq - x1) * ((y2 - y1) / (x2 - x1)); + } + + private void OnRecordingStopped(object? sender, StoppedEventArgs e) + { + } + + public void Dispose() + { + if (!_disposed) + { + _capture?.Dispose(); + _disposed = true; + } + } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs index 97afc41..baa92d9 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs @@ -25,6 +25,8 @@ namespace BetterLyrics.WinUI3.Models.Settings [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsFluidOverlayEnabled { get; set; } = false; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int FluidOverlayOpacity { get; set; } = 100; + [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsSpectrumOverlayEnabled { get; set; } = false; + public LyricsBackgroundSettings() { } public object Clone() diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/LyricsRenderer.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/LyricsRenderer.xaml index 00601ed..5d8bd59 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/LyricsRenderer.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/LyricsRenderer.xaml @@ -14,8 +14,8 @@ diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw index 1c4ee33..8f0a230 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw @@ -1150,6 +1150,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Right + + Spectrum layer + Motion rate diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw index d8a2b59..a0eeaf5 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw @@ -156,6 +156,9 @@ LX Music Serverに接続できない場合は、設定に移動してください。リンクが正しく入力されているかどうかを確認するための高度なオプションに移動してください + + フルスクリーンモード + ロック @@ -436,6 +439,9 @@ 音楽ギャラリー - BetterLyrics + + 狭い + ピクチャーインピクチャーモード @@ -715,9 +721,6 @@ フルスクリーンモード - - フルスクリーンモード - 音楽が再生されていないときに、自動的に歌詞ウィンドウを非表示/表示します @@ -1147,6 +1150,9 @@ + + スペクトラムレイヤー + モーション @@ -1240,7 +1246,4 @@ BetterLyrics はすでに実行されています - - 狭い - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw index e0e0a06..53dd5d0 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw @@ -156,6 +156,9 @@ LX Music Server에 연결할 수 없습니다. 설정으로 이동하십시오 - 고급 옵션이 링크가 올바르게 입력되었는지 확인하십시오. + + 전체화면 모드 + 잠금 @@ -436,6 +439,9 @@ 음악 갤러리 - BetterLyrics + + 협폭 조명 + 사진 인당 모드 @@ -715,9 +721,6 @@ 전체화면 모드 - - 전체화면 모드 - 음악이 재생되지 않을 때 자동으로 가사 창 숨기기/표시 @@ -1147,6 +1150,9 @@ 오른쪽 + + 스펙트럼 레이어 + 모션 @@ -1240,7 +1246,4 @@ BetterLyrics 가 이미 실행 중입니다 - - 협폭 조명 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw index c76513a..005ba5e 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw @@ -156,6 +156,9 @@ 无法连接到 LX 音乐服务器,请转到设置 - 高级选项以检查是否正确输入链接 + + 全屏模式 + 锁定 @@ -436,6 +439,9 @@ 音乐库 - BetterLyrics + + 窄屏模式 + 画中画模式 @@ -715,9 +721,6 @@ 全屏模式 - - 全屏模式 - 音乐未播放/播放时自动隐藏/显示歌词窗口 @@ -1147,6 +1150,9 @@ 靠右 + + 频谱层 + 运动速率 @@ -1240,7 +1246,4 @@ BetterLyrics 已经在运行 - - 窄屏模式 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw index e8b14f5..aac7cbf 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw @@ -156,6 +156,9 @@ 無法連接到 LX 音樂服務器,請轉到設置 - 高級選項以檢查是否正確輸入鏈接 + + 全螢幕模式 + 鎖定 @@ -436,6 +439,9 @@ 音樂庫 - BetterLyrics + + 窄螢幕模式 + 畫中畫模式 @@ -715,9 +721,6 @@ 全螢幕模式 - - 全螢幕模式 - 音樂未播放/播放時自動隱藏/顯示歌詞視窗 @@ -1147,6 +1150,9 @@ 靠右 + + 光譜層 + 動作速率 @@ -1240,7 +1246,4 @@ BetterLyrics 已經在運作 - - 窄螢幕模式 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.CreateResources .cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.CreateResources .cs index 423df8e..1b51252 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.CreateResources .cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.CreateResources .cs @@ -1,4 +1,5 @@ -using CommunityToolkit.WinUI; +using BetterLyrics.WinUI3.Helper; +using CommunityToolkit.WinUI; using Microsoft.Graphics.Canvas.Effects; using System; using System.Collections.Generic; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs index aa5b6e0..5304fc5 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs @@ -1,6 +1,7 @@ using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Helper; using CommunityToolkit.WinUI; +using Hqub.Lastfm; using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas.Brushes; using Microsoft.Graphics.Canvas.Effects; @@ -49,6 +50,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel } DrawAlbumArtBackground(control, combinedDs); DrawFluidBackground(control, combinedDs); + DrawSpectrum(control, combinedDs); combinedDs.DrawImage(blurredLyrics); @@ -100,6 +102,76 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel } } + public void DrawSpectrum(ICanvasAnimatedControl control, CanvasDrawingSession ds) + { + if (_spectrumAnalyzer != null && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsSpectrumOverlayEnabled) + { + var points = new Vector2[_spectrumAnalyzer.BarCount]; + float pointSpacing = 0; + + if (_spectrumAnalyzer.BarCount > 1) + { + pointSpacing = (float)_canvasWidth / (_spectrumAnalyzer.BarCount - 1); + } + + for (int i = 0; i < _spectrumAnalyzer.BarCount; i++) + { + float x = i * pointSpacing; + float amplitude = _spectrumAnalyzer.SmoothSpectrum.Average() * 10 + _spectrumAnalyzer.SmoothSpectrum[i] * 0.5f; + float y = (float)_canvasHeight - amplitude; + points[i] = new Vector2(x, y); + } + + // 用于填充的闭合路径 + using var pathBuilder = new CanvasPathBuilder(ds); + pathBuilder.BeginFigure(points[0]); + + if (_spectrumAnalyzer.BarCount > 2) + { + for (int i = 0; i < _spectrumAnalyzer.BarCount - 1; i++) + { + Vector2 p0 = points[Math.Max(i - 1, 0)]; + Vector2 p1 = points[i]; + Vector2 p2 = points[i + 1]; + Vector2 p3 = points[Math.Min(i + 2, _spectrumAnalyzer.BarCount - 1)]; + + Vector2 cp1 = p1 + (p2 - p0) / 6.0f; + Vector2 cp2 = p2 - (p3 - p1) / 6.0f; + + pathBuilder.AddCubicBezier(cp1, cp2, p2); + } + } + else + { + pathBuilder.AddLine(points[1]); + } + + pathBuilder.AddLine(new Vector2(points[_spectrumAnalyzer.BarCount - 1].X, (float)_canvasHeight)); + pathBuilder.AddLine(new Vector2(points[0].X, (float)_canvasHeight)); + pathBuilder.EndFigure(CanvasFigureLoop.Closed); + + using var geometry = CanvasGeometry.CreatePath(pathBuilder); + var gradientStops = new CanvasGradientStop[] + { + new() { Position = 0.0f, Color = _albumArtAccentColorTransition.Value }, + new() { Position = 1.0f, Color = Colors.Transparent } + }; + + using var gradientBrush = new CanvasLinearGradientBrush(ds, gradientStops); + gradientBrush.StartPoint = new Vector2((float)_canvasWidth / 2, (float)_canvasHeight); + gradientBrush.EndPoint = new Vector2((float)_canvasWidth / 2, points.Select(p => p.Y).Min()); + + // 使用渐变画刷填充 + ds.FillGeometry(geometry, gradientBrush); + + // 绘制轮廓线 + // var lineColor = Colors.SkyBlue; + // float strokeWidth = 2f; + // session.DrawGeometry(geometry, lineColor, strokeWidth); + + } + } + private void DrawFluidBackground(ICanvasAnimatedControl control, CanvasDrawingSession ds) { if (_effect != null && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsFluidOverlayEnabled) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs index a28eb68..2b151f8 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs @@ -85,6 +85,13 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel _isAlbumArtSizeChanged = true; } } + else if (message.Sender is LyricsBackgroundSettings) + { + if (message.PropertyName == nameof(LyricsBackgroundSettings.IsSpectrumOverlayEnabled)) + { + _isSpectrumOverlayEnabledChanged = true; + } + } } public void Receive(PropertyChangedMessage message) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs index 610fac4..bf35fb7 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs @@ -54,6 +54,8 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel private bool _isSongInfoFontSizeChanged = false; private bool _isAlbumArtSizeChanged = false; + private bool _isSpectrumOverlayEnabledChanged = true; + public void Update(ICanvasAnimatedControl control, CanvasAnimatedUpdateEventArgs args) { _elapsedTime = args.Timing.ElapsedTime; @@ -101,6 +103,25 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel _rotateAngle += _coverRotateBaseSpeed * _liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.CoverOverlaySpeed / 100.0; _rotateAngle %= Math.PI * 2; + if (_isSpectrumOverlayEnabledChanged) + { + if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsSpectrumOverlayEnabled) + { + _spectrumAnalyzer?.StartCapture(); + } + else + { + _spectrumAnalyzer?.StopCapture(); + } + + _isSpectrumOverlayEnabledChanged = false; + } + + if (_spectrumAnalyzer?.IsCapturing == true) + { + _spectrumAnalyzer?.UpdateSmoothSpectrum(); + } + //if (_isCanvasWidthChanged) //{ // if (_canvasWidth < 500) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs index ae1f824..ec28e6b 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs @@ -172,6 +172,8 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel [NotifyPropertyChangedRecipients] public partial ElementTheme ThemeTypeSent { get; set; } + private SpectrumAnalyzer? _spectrumAnalyzer; + public LyricsRendererViewModel( ISettingsService settingsService, IMediaSessionsService mediaSessionsService, @@ -181,7 +183,6 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel _settingsService = settingsService; _mediaSessionsService = mediaSessionsService; _liveStatesService = liveStatesService; - _lastFMService = lastFMService; _logger = Ioc.Default.GetRequiredService>(); @@ -191,7 +192,6 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel _titleTextFormat.HorizontalAlignment = _artistTextFormat.HorizontalAlignment = _liveStatesService.LiveStates.LyricsWindowStatus.AlbumArtLayoutSettings.SongInfoAlignmentType.ToCanvasHorizontalAlignment(); UpdateSongInfoFontSize(); - _timelineSyncThreshold = 0; _mediaSessionsService.IsPlayingChanged += MediaSessionsService_IsPlayingChanged; @@ -203,6 +203,8 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel IsPlaying = _mediaSessionsService.IsPlaying; UpdateColorConfig(); + + _spectrumAnalyzer = new SpectrumAnalyzer(); } private void MediaSessionsService_LyricsChanged(object? sender, LyricsChangedEventArgs e)