mirror of
https://github.com/jayfunc/BetterLyrics.git
synced 2026-01-12 19:24:55 +08:00
update version to 1.0.40.0 and refactor image drawing methods for better opacity handling
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
<Identity
|
<Identity
|
||||||
Name="37412.BetterLyrics"
|
Name="37412.BetterLyrics"
|
||||||
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
|
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
|
||||||
Version="1.0.39.0" />
|
Version="1.0.40.0" />
|
||||||
|
|
||||||
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawBackgroundImgae(ICanvasAnimatedControl control, CanvasDrawingSession ds, CanvasBitmap canvasBitmap, float opacity)
|
private void DrawBackgroundImgae(OpacityEffect effect, CanvasDrawingSession ds, CanvasBitmap canvasBitmap)
|
||||||
{
|
{
|
||||||
float imageWidth = (float)canvasBitmap.Size.Width;
|
float imageWidth = (float)canvasBitmap.Size.Width;
|
||||||
float imageHeight = (float)canvasBitmap.Size.Height;
|
float imageHeight = (float)canvasBitmap.Size.Height;
|
||||||
@@ -107,62 +107,12 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
float x = _canvasWidth / 2 - imageWidth * scaleFactor / 2;
|
float x = _canvasWidth / 2 - imageWidth * scaleFactor / 2;
|
||||||
float y = _canvasHeight / 2 - imageHeight * scaleFactor / 2;
|
float y = _canvasHeight / 2 - imageHeight * scaleFactor / 2;
|
||||||
|
|
||||||
// Original source: https://zhuanlan.zhihu.com/p/37178216
|
ds.DrawImage(effect, new Vector2(x, y));
|
||||||
float gain = _lyricsBgBrightnessTransition.Value;
|
|
||||||
|
|
||||||
float whiteX = 1 - 0.5f * gain;
|
|
||||||
float whiteY = 0.5f + 0.5f * gain;
|
|
||||||
float blackX = 0.5f - 0.5f * gain;
|
|
||||||
float blackY = 0 + 0.5f * gain;
|
|
||||||
|
|
||||||
ds.DrawImage(new OpacityEffect
|
|
||||||
{
|
|
||||||
Source = new BrightnessEffect
|
|
||||||
{
|
|
||||||
Source = new ScaleEffect
|
|
||||||
{
|
|
||||||
Scale = new Vector2(scaleFactor),
|
|
||||||
Source = canvasBitmap,
|
|
||||||
},
|
|
||||||
WhitePoint = new Vector2(whiteX, whiteY),
|
|
||||||
BlackPoint = new Vector2(blackX, blackY),
|
|
||||||
},
|
|
||||||
Opacity = opacity,
|
|
||||||
}, new Vector2(x, y));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawForegroundImgae(ICanvasAnimatedControl control, CanvasDrawingSession ds, CanvasBitmap canvasBitmap, float opacity)
|
private void DrawForegroundImgae(OpacityEffect effect, CanvasDrawingSession ds)
|
||||||
{
|
{
|
||||||
if (opacity == 0) return;
|
ds.DrawImage(effect, new Vector2(_albumArtXTransition.Value, _albumArtYTransition.Value));
|
||||||
|
|
||||||
float imageWidth = (float)canvasBitmap.Size.Width;
|
|
||||||
float imageHeight = (float)canvasBitmap.Size.Height;
|
|
||||||
|
|
||||||
float scaleFactor = _albumArtSize / Math.Min(imageWidth, imageHeight);
|
|
||||||
if (scaleFactor < 0.01f) return;
|
|
||||||
|
|
||||||
float cornerRadius = _albumArtCornerRadius / 100f * _albumArtSize / 2;
|
|
||||||
|
|
||||||
using var cornerRadiusMask = new CanvasCommandList(control.Device);
|
|
||||||
using var cornerRadiusMaskDs = cornerRadiusMask.CreateDrawingSession();
|
|
||||||
cornerRadiusMaskDs.FillRoundedRectangle(
|
|
||||||
new Rect(0, 0, imageWidth * scaleFactor, imageHeight * scaleFactor),
|
|
||||||
cornerRadius, cornerRadius, Colors.White
|
|
||||||
);
|
|
||||||
|
|
||||||
ds.DrawImage(new OpacityEffect
|
|
||||||
{
|
|
||||||
Source = new AlphaMaskEffect
|
|
||||||
{
|
|
||||||
Source = new ScaleEffect
|
|
||||||
{
|
|
||||||
Scale = new Vector2(scaleFactor),
|
|
||||||
Source = canvasBitmap,
|
|
||||||
},
|
|
||||||
AlphaMask = cornerRadiusMask,
|
|
||||||
},
|
|
||||||
Opacity = opacity,
|
|
||||||
}, new Vector2(_albumArtXTransition.Value, _albumArtYTransition.Value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawAlbumArtBackground(ICanvasAnimatedControl control, CanvasDrawingSession ds)
|
private void DrawAlbumArtBackground(ICanvasAnimatedControl control, CanvasDrawingSession ds)
|
||||||
@@ -173,13 +123,13 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
using var overlappedCoversDs = overlappedCovers.CreateDrawingSession();
|
using var overlappedCoversDs = overlappedCovers.CreateDrawingSession();
|
||||||
overlappedCoversDs.Transform = Matrix3x2.CreateRotation(_rotateAngle, control.Size.ToVector2() * 0.5f);
|
overlappedCoversDs.Transform = Matrix3x2.CreateRotation(_rotateAngle, control.Size.ToVector2() * 0.5f);
|
||||||
|
|
||||||
if (_lastAlbumArtCanvasBitmap != null)
|
if (_lastBgImageEffect != null && !_lastBgImageEffect.IsDisposed() && _lastAlbumArtCanvasBitmap != null)
|
||||||
{
|
{
|
||||||
DrawBackgroundImgae(control, overlappedCoversDs, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
|
DrawBackgroundImgae(_lastBgImageEffect, overlappedCoversDs, _lastAlbumArtCanvasBitmap);
|
||||||
}
|
}
|
||||||
if (_albumArtCanvasBitmap != null)
|
if (_bgImageEffect != null && !_bgImageEffect.IsDisposed() && _albumArtCanvasBitmap != null)
|
||||||
{
|
{
|
||||||
DrawBackgroundImgae(control, overlappedCoversDs, _albumArtCanvasBitmap, _albumArtBgTransition.Value);
|
DrawBackgroundImgae(_bgImageEffect, overlappedCoversDs, _albumArtCanvasBitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
overlappedCoversDs.Transform = Matrix3x2.Identity;
|
overlappedCoversDs.Transform = Matrix3x2.Identity;
|
||||||
@@ -222,13 +172,14 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
{
|
{
|
||||||
using var albumArt = new CanvasCommandList(control.Device);
|
using var albumArt = new CanvasCommandList(control.Device);
|
||||||
using var albumArtDs = albumArt.CreateDrawingSession();
|
using var albumArtDs = albumArt.CreateDrawingSession();
|
||||||
if (_albumArtCanvasBitmap != null)
|
|
||||||
|
if (_lastFgImageEffect != null && !_lastFgImageEffect.IsDisposed() && _lastAlbumArtCanvasBitmap != null)
|
||||||
{
|
{
|
||||||
DrawForegroundImgae(control, albumArtDs, _albumArtCanvasBitmap, _albumArtBgTransition.Value);
|
DrawForegroundImgae(_lastFgImageEffect, albumArtDs);
|
||||||
}
|
}
|
||||||
if (_lastAlbumArtCanvasBitmap != null)
|
if (_fgImageEffect != null && !_fgImageEffect.IsDisposed() && _albumArtCanvasBitmap != null)
|
||||||
{
|
{
|
||||||
DrawForegroundImgae(control, albumArtDs, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
|
DrawForegroundImgae(_fgImageEffect, albumArtDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
using var opacity = new CanvasCommandList(control.Device);
|
using var opacity = new CanvasCommandList(control.Device);
|
||||||
@@ -367,12 +318,16 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
// 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次)
|
// 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次)
|
||||||
// Current line will not be blurred
|
// Current line will not be blurred
|
||||||
combinedDs.DrawImage(
|
combinedDs.DrawImage(
|
||||||
new GaussianBlurEffect
|
new OpacityEffect
|
||||||
{
|
{
|
||||||
Source = new OpacityEffect { Source = bgLyrics, Opacity = line.OpacityTransition.Value * _lyricsOpacityTransition.Value },
|
Source = new GaussianBlurEffect
|
||||||
BlurAmount = line.BlurAmountTransition.Value,
|
{
|
||||||
BorderMode = EffectBorderMode.Soft,
|
Source = bgLyrics,
|
||||||
Optimization = EffectOptimization.Speed,
|
BlurAmount = line.BlurAmountTransition.Value,
|
||||||
|
BorderMode = EffectBorderMode.Soft,
|
||||||
|
Optimization = EffectOptimization.Speed,
|
||||||
|
},
|
||||||
|
Opacity = line.OpacityTransition.Value * _lyricsOpacityTransition.Value,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
using Microsoft.Graphics.Canvas;
|
||||||
|
using Microsoft.Graphics.Canvas.Effects;
|
||||||
|
using Microsoft.Graphics.Canvas.UI.Xaml;
|
||||||
|
using Microsoft.UI;
|
||||||
|
using Microsoft.UI.Xaml.Controls;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Foundation;
|
||||||
|
using Windows.Graphics.Effects;
|
||||||
|
|
||||||
|
namespace BetterLyrics.WinUI3.ViewModels
|
||||||
|
{
|
||||||
|
public partial class LyricsRendererViewModel
|
||||||
|
{
|
||||||
|
private OpacityEffect? _lastBgImageEffect;
|
||||||
|
private OpacityEffect? _bgImageEffect;
|
||||||
|
|
||||||
|
private OpacityEffect? _lastFgImageEffect;
|
||||||
|
private OpacityEffect? _fgImageEffect;
|
||||||
|
|
||||||
|
private OpacityEffect CreateBgImageEffect(CanvasBitmap canvasBitmap, float opacity)
|
||||||
|
{
|
||||||
|
float imageWidth = (float)canvasBitmap.Size.Width;
|
||||||
|
float imageHeight = (float)canvasBitmap.Size.Height;
|
||||||
|
|
||||||
|
float targetSize = MathF.Sqrt(MathF.Pow(_canvasWidth, 2) + MathF.Pow(_canvasHeight, 2));
|
||||||
|
float scaleFactor = targetSize / MathF.Min(imageWidth, imageHeight);
|
||||||
|
|
||||||
|
// Original source: https://zhuanlan.zhihu.com/p/37178216
|
||||||
|
float gain = _lyricsBgBrightnessTransition.Value;
|
||||||
|
|
||||||
|
float whiteX = 1 - 0.5f * gain;
|
||||||
|
float whiteY = 0.5f + 0.5f * gain;
|
||||||
|
float blackX = 0.5f - 0.5f * gain;
|
||||||
|
float blackY = 0 + 0.5f * gain;
|
||||||
|
|
||||||
|
return new OpacityEffect
|
||||||
|
{
|
||||||
|
Source = new BrightnessEffect
|
||||||
|
{
|
||||||
|
Source = new ScaleEffect
|
||||||
|
{
|
||||||
|
Scale = new Vector2(scaleFactor),
|
||||||
|
Source = canvasBitmap,
|
||||||
|
},
|
||||||
|
WhitePoint = new Vector2(whiteX, whiteY),
|
||||||
|
BlackPoint = new Vector2(blackX, blackY),
|
||||||
|
},
|
||||||
|
Opacity = opacity,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private OpacityEffect? CreateFgImageEffect(ICanvasAnimatedControl control, CanvasBitmap canvasBitmap, float opacity)
|
||||||
|
{
|
||||||
|
// TODO 最大化/还原时图片大小未跟随改变
|
||||||
|
if (opacity == 0) return null;
|
||||||
|
|
||||||
|
float imageWidth = (float)canvasBitmap.Size.Width;
|
||||||
|
float imageHeight = (float)canvasBitmap.Size.Height;
|
||||||
|
|
||||||
|
float scaleFactor = _albumArtSize / Math.Min(imageWidth, imageHeight);
|
||||||
|
if (scaleFactor < 0.01f) return null;
|
||||||
|
|
||||||
|
float cornerRadius = _albumArtCornerRadius / 100f * _albumArtSize / 2;
|
||||||
|
|
||||||
|
// TODO 当前未监听专辑封面圆角变化
|
||||||
|
var cornerRadiusMask = new CanvasCommandList(control);
|
||||||
|
var cornerRadiusMaskDs = cornerRadiusMask.CreateDrawingSession();
|
||||||
|
cornerRadiusMaskDs.FillRoundedRectangle(
|
||||||
|
new Rect(0, 0, imageWidth * scaleFactor, imageHeight * scaleFactor),
|
||||||
|
cornerRadius, cornerRadius, Colors.White
|
||||||
|
);
|
||||||
|
|
||||||
|
return new OpacityEffect
|
||||||
|
{
|
||||||
|
Source = new AlphaMaskEffect
|
||||||
|
{
|
||||||
|
Source = new ScaleEffect
|
||||||
|
{
|
||||||
|
Scale = new Vector2(scaleFactor),
|
||||||
|
Source = canvasBitmap,
|
||||||
|
},
|
||||||
|
AlphaMask = cornerRadiusMask,
|
||||||
|
},
|
||||||
|
Opacity = opacity,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,21 +49,58 @@ namespace BetterLyrics.WinUI3.ViewModels
|
|||||||
_displayType = _displayTypeReceived;
|
_displayType = _displayTypeReceived;
|
||||||
_playingLineIndex = playingLineIndex;
|
_playingLineIndex = playingLineIndex;
|
||||||
|
|
||||||
if (_albumArtChanged)
|
// 背景图切换计算
|
||||||
|
// 将当前背景图放到 _lastAlbumArtSwBitmap 中 并设置不透明度为 1
|
||||||
|
// 将新的背景图放到 _albumArtSwBitmap 中 并设置不透明度为 0
|
||||||
|
// 这样可以实现背景图的连贯渐变效果
|
||||||
|
if (_albumArtChanged || _isCanvasHeightChanged || _isCanvasWidthChanged ||
|
||||||
|
_lyricsBgBrightnessTransition.IsTransitioning ||
|
||||||
|
_albumArtBgTransition.IsTransitioning)
|
||||||
{
|
{
|
||||||
if (_lastAlbumArtSwBitmap != null)
|
// 必须先在此处重置动画
|
||||||
|
if (_albumArtChanged)
|
||||||
{
|
{
|
||||||
_lastAlbumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _lastAlbumArtSwBitmap);
|
_albumArtBgTransition.Reset(0f);
|
||||||
|
_albumArtBgTransition.StartTransition(1f);
|
||||||
}
|
}
|
||||||
_albumArtBgTransition.Reset(0f);
|
// 更新 last
|
||||||
_albumArtBgTransition.StartTransition(1f);
|
if (_albumArtChanged)
|
||||||
if (_albumArtSwBitmap != null)
|
|
||||||
{
|
{
|
||||||
_albumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _albumArtSwBitmap);
|
if (_lastAlbumArtSwBitmap != null)
|
||||||
|
{
|
||||||
|
_lastAlbumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _lastAlbumArtSwBitmap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_lastBgImageEffect?.Dispose();
|
||||||
|
_lastBgImageEffect = null;
|
||||||
|
_lastFgImageEffect?.Dispose();
|
||||||
|
_lastFgImageEffect = null;
|
||||||
|
if (_lastAlbumArtCanvasBitmap != null)
|
||||||
|
{
|
||||||
|
_lastFgImageEffect = CreateFgImageEffect(control, _lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
|
||||||
|
_lastBgImageEffect = CreateBgImageEffect(_lastAlbumArtCanvasBitmap, 1 - _albumArtBgTransition.Value);
|
||||||
|
}
|
||||||
|
// 更新 current
|
||||||
|
if (_albumArtChanged)
|
||||||
|
{
|
||||||
|
if (_albumArtSwBitmap != null)
|
||||||
|
{
|
||||||
|
_albumArtCanvasBitmap = CanvasBitmap.CreateFromSoftwareBitmap(control, _albumArtSwBitmap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_bgImageEffect?.Dispose();
|
||||||
|
_bgImageEffect = null;
|
||||||
|
_fgImageEffect?.Dispose();
|
||||||
|
_fgImageEffect = null;
|
||||||
|
if (_albumArtCanvasBitmap != null)
|
||||||
|
{
|
||||||
|
_fgImageEffect = CreateFgImageEffect(control, _albumArtCanvasBitmap, _albumArtBgTransition.Value);
|
||||||
|
_bgImageEffect = CreateBgImageEffect(_albumArtCanvasBitmap, _albumArtBgTransition.Value);
|
||||||
}
|
}
|
||||||
_albumArtChanged = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_albumArtChanged = false;
|
||||||
|
|
||||||
if (_isDynamicCoverOverlayEnabled)
|
if (_isDynamicCoverOverlayEnabled)
|
||||||
{
|
{
|
||||||
_rotateAngle += _coverRotateSpeed;
|
_rotateAngle += _coverRotateSpeed;
|
||||||
|
|||||||
44
Promotion/en.txt
Normal file
44
Promotion/en.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
* The free trial version is identical to the paid version — no feature limitations.
|
||||||
|
|
||||||
|
🎵 BetterLyrics — Lyrics that move you, visuals that delight. A stunning lyrics display tool for Windows.
|
||||||
|
|
||||||
|
Looking for a smooth, dynamic, and immersive way to view lyrics on Windows?
|
||||||
|
BetterLyrics delivers a whole new visual experience — making every song truly sing on screen.
|
||||||
|
|
||||||
|
✨ Key Features
|
||||||
|
|
||||||
|
- Beautiful UI with smooth animations
|
||||||
|
Built with WinUI 3, featuring multiple themes and dynamic backgrounds. Enjoy seamless lyric scrolling, fade effects, and rich visuals.
|
||||||
|
|
||||||
|
- Offline translation with support for 30 languages
|
||||||
|
Automatically reads translation lines embedded in local lyrics files. Multi-language support helps you understand every lyric, no internet needed.
|
||||||
|
|
||||||
|
- Supports multiple lyric sources and formats
|
||||||
|
Reads local lyrics in LRC, ESLRC, TTML, and other formats. Also fetches lyrics online from major sources like QQ Music, NetEase Cloud Music, Kugou, and LrcLib.
|
||||||
|
|
||||||
|
- Real-time sync with various music players
|
||||||
|
Compatible with NetEase Cloud, Kugou, Apple Music, Spotify, PotPlayer, MusicBee, AIMP, and even the default Windows player. Lyrics sync automatically—no setup required.
|
||||||
|
|
||||||
|
- Multiple display modes to suit your workflow
|
||||||
|
Switch easily between immersive full-screen mode, floating desktop lyrics, and smart window docking to fit any listening scenario.
|
||||||
|
|
||||||
|
- Auto-hide when playback is paused
|
||||||
|
The interface stays out of your way — lyrics automatically hide when music stops, keeping your screen clean and distraction-free.
|
||||||
|
|
||||||
|
🔧 Extra Features You’ll Love
|
||||||
|
|
||||||
|
- Fine-tune lyric timing with offset adjustment — perfect for mismatched audio versions
|
||||||
|
|
||||||
|
- Toggle translation, customize layout, pin or lock windows — your lyrics, your way
|
||||||
|
|
||||||
|
- Active community, frequent updates, and responsive support for user feedback
|
||||||
|
|
||||||
|
✅ Perfect For:
|
||||||
|
|
||||||
|
- Users who want floating desktop lyrics to elevate their listening experience
|
||||||
|
|
||||||
|
- Listeners who use multiple players or need support for various lyric formats
|
||||||
|
|
||||||
|
- Fans of beautiful, customizable visuals in their music tools
|
||||||
|
|
||||||
|
🎧 Whether you're immersed in music through headphones or want lyrics to stay visible on your screen, BetterLyrics gives you a personalized, immersive way to experience every song.
|
||||||
44
Promotion/ja.txt
Normal file
44
Promotion/ja.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
* 無料体験版と有料版は機能に違いはありません。
|
||||||
|
|
||||||
|
🎵 BetterLyrics — 歌詞が心を動かし、目を楽しませる。高品質なWindows用歌詞表示ツール
|
||||||
|
|
||||||
|
Windowsで滑らかでダイナミック、没入感のある歌詞表示を体験しませんか?
|
||||||
|
BetterLyricsは全く新しいビジュアル体験を提供し、すべての曲が画面上でまるで「歌っている」ように感じられます。
|
||||||
|
|
||||||
|
✨ 主な機能
|
||||||
|
|
||||||
|
- 美しいインターフェースと滑らかなアニメーション
|
||||||
|
WinUI 3をベースに開発され、複数のテーマや動的な背景をサポート。歌詞のスクロールやフェード効果など、視覚的に洗練された演出を楽しめます。
|
||||||
|
|
||||||
|
- オフライン翻訳対応、30言語サポート
|
||||||
|
ローカルの歌詞ファイルに含まれる翻訳を自動で読み込み表示。インターネット接続なしで多言語の歌詞理解をサポートします。
|
||||||
|
|
||||||
|
- 多様な歌詞フォーマットとソースに対応
|
||||||
|
LRC、ESLRC、TTMLなどのローカル歌詞ファイルを読み込み、さらにQQミュージック、NetEaseクラウドミュージック、Kugou、LrcLibなどの主要オンラインソースから歌詞を取得可能です。
|
||||||
|
|
||||||
|
- 多くの音楽プレイヤーとリアルタイム同期
|
||||||
|
NetEaseクラウドミュージック、Kugou、Apple Music、Spotify、PotPlayer、MusicBee、AIMP、そしてWindows標準プレイヤーまで幅広く対応。歌詞は自動的に同期され、手動設定は不要です。
|
||||||
|
|
||||||
|
- 多彩な表示モードを自由に切り替え
|
||||||
|
没入型の全画面モード、デスクトップに浮かぶ歌詞、スマートウィンドウドッキングなど、用途に合わせて切り替え可能。
|
||||||
|
|
||||||
|
- 再生停止時には自動で非表示
|
||||||
|
音楽が一時停止すると歌詞画面が自動的に隠れ、画面を邪魔せずスッキリ使えます。
|
||||||
|
|
||||||
|
🔧 便利な追加機能
|
||||||
|
|
||||||
|
- 微調整可能な歌詞タイムラインオフセットで、音源のズレをぴったり補正
|
||||||
|
|
||||||
|
- 翻訳表示のオンオフ、レイアウトのカスタマイズ、ウィンドウの固定・ロックなどの高度な設定
|
||||||
|
|
||||||
|
- 活発なユーザーコミュニティによる継続的なアップデートと迅速なフィードバック対応
|
||||||
|
|
||||||
|
✅ こんな方におすすめ
|
||||||
|
|
||||||
|
- デスクトップに歌詞を浮かべて、より豊かな音楽体験を求める方
|
||||||
|
|
||||||
|
- 複数のプレイヤーや多様な歌詞フォーマットを使いたい方
|
||||||
|
|
||||||
|
- 美しくカスタマイズ可能なUIを好む方
|
||||||
|
|
||||||
|
🎧 ヘッドホンで没入して聴くときも、デスクトップに歌詞を表示して楽しむときも、BetterLyricsがあなたの音楽体験をより特別なものにします。
|
||||||
45
Promotion/ko.txt
Normal file
45
Promotion/ko.txt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
* 무료 체험판과 유료 버전은 기능 차이가 전혀 없습니다.
|
||||||
|
|
||||||
|
🎵 BetterLyrics — 가사는 눈으로, 감동은 마음으로. 고품질 Windows용 가사 디스플레이 도구
|
||||||
|
|
||||||
|
Windows에서 부드럽고 역동적이며 몰입감 있는 가사 표시를 경험해보세요.
|
||||||
|
BetterLyrics는 완전히 새로운 시각적 음악 경험을 선사합니다. 이제 모든 곡이 화면 위에서 살아 숨쉽니다.
|
||||||
|
|
||||||
|
✨ 주요 기능
|
||||||
|
|
||||||
|
- 세련된 인터페이스와 부드러운 애니메이션
|
||||||
|
WinUI 3 기반으로 개발되었으며 다양한 테마와 동적 배경을 지원합니다. 가사 스크롤, 페이드 효과 등 시각적 효과가 매끄럽고 아름답습니다.
|
||||||
|
|
||||||
|
- 30개 언어를 지원하는 오프라인 번역 기능
|
||||||
|
로컬 가사 파일 내에 포함된 번역 내용을 자동으로 읽어와 표시합니다. 인터넷 연결 없이도 다양한 언어의 가사를 이해할 수 있습니다.
|
||||||
|
|
||||||
|
- 다양한 가사 형식 및 소스 지원
|
||||||
|
LRC, ESLRC, TTML 등 로컬 파일 형식을 지원하며, QQ 음악, 넷이즈 클라우드, 쿠거우, LrcLib 등 주요 온라인 소스에서 가사를 자동으로 가져올 수 있습니다.
|
||||||
|
|
||||||
|
- 다양한 음악 플레이어와 실시간 동기화
|
||||||
|
넷이즈, 쿠거우, Apple Music, Spotify, PotPlayer, MusicBee, AIMP, 그리고 Windows 기본 플레이어까지 폭넓게 호환됩니다. 가사는 자동으로 동기화되어 별도 설정 없이도 편리하게 사용 가능합니다.
|
||||||
|
|
||||||
|
- 다양한 디스플레이 모드 제공
|
||||||
|
몰입형 전체 화면, 바탕화면 가사 띄우기, 스마트 윈도우 도킹 등 다양한 사용 환경에 맞춰 자유롭게 전환할 수 있습니다.
|
||||||
|
|
||||||
|
- 자동 숨김 기능으로 깔끔한 화면 유지
|
||||||
|
음악이 일시정지되면 가사 창이 자동으로 숨겨져 화면을 방해하지 않고 깔끔함을 유지합니다.
|
||||||
|
|
||||||
|
🔧 세심한 부가기능
|
||||||
|
|
||||||
|
- 가사 싱크를 미세하게 조정할 수 있는 타임라인 오프셋 기능 제공
|
||||||
|
|
||||||
|
- 번역 표시 여부, 레이아웃 설정, 창 고정 및 잠금 등 고급 옵션 지원
|
||||||
|
|
||||||
|
- 활발한 사용자 커뮤니티 운영 중이며, 지속적인 업데이트와 피드백 반영
|
||||||
|
|
||||||
|
✅ 이런 분께 추천합니다
|
||||||
|
|
||||||
|
- 바탕화면에 가사를 띄워 감성적인 음악 감상을 원하는 분
|
||||||
|
|
||||||
|
- 다양한 플레이어나 가사 형식을 사용하는 분
|
||||||
|
|
||||||
|
- 세련되고 사용자 맞춤형 UI를 선호하는 분
|
||||||
|
|
||||||
|
🎧 헤드폰을 쓰고 몰입해서 듣든, 바탕화면에 가사를 띄워 놓고 감상하든 BetterLyrics는 여러분만의 음악 감상 경험을 완성해드립니다.
|
||||||
|
|
||||||
44
Promotion/zh-CN.txt
Normal file
44
Promotion/zh-CN.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
* 免费试用版与付费版无任何区别
|
||||||
|
|
||||||
|
🎵 BetterLyrics —— 曲中人心、词悦双眼,高颜值 Windows 歌词展示工具
|
||||||
|
|
||||||
|
想在 Windows 上体验流畅、动态、沉浸的歌词显示效果?
|
||||||
|
BetterLyrics 打造全新视觉体验,让每一首歌都真正“唱”给你看!
|
||||||
|
|
||||||
|
✨ 核心功能亮点
|
||||||
|
|
||||||
|
- 界面美观,动画丝滑
|
||||||
|
基于 WinUI 3 框架开发,支持多种主题风格与动态背景,歌词滚动、淡入淡出等特效令人眼前一亮。
|
||||||
|
|
||||||
|
- 可配置接入离线翻译,支持 30 种语言
|
||||||
|
自动读取本地歌词中的翻译内容,支持多语言自动识别与显示,助你听懂每一句歌词。
|
||||||
|
|
||||||
|
- 支持多种歌词来源与格式
|
||||||
|
可读取本地的 LRC、ESLRC、TTML 等格式歌词文件,同时支持从在线源获取歌词,包括 QQ 音乐、网易云、酷狗音乐与 LrcLib 等主流平台。
|
||||||
|
|
||||||
|
- 多播放器实时同步
|
||||||
|
支持网易云音乐、酷狗音乐、Apple Music、Spotify、PotPlayer、MusicBee、AIMP 等,系统自带播放器也能用,歌词自动同步无需手动干预。
|
||||||
|
|
||||||
|
- 多种显示模式随心切换
|
||||||
|
沉浸式全屏、桌面悬浮歌词、窗口智能停靠,满足你不同场景的需求。
|
||||||
|
|
||||||
|
- 自动隐藏,安静陪伴
|
||||||
|
播放器暂停时自动隐藏歌词界面,不打扰、不占屏,清爽使用体验。
|
||||||
|
|
||||||
|
🔧 更多贴心功能
|
||||||
|
|
||||||
|
- 歌词时间轴支持偏移微调,解决不同版本音频对不上的问题
|
||||||
|
|
||||||
|
- 支持歌词翻译开关、界面布局自由设置、窗口置顶/锁定等高级功能
|
||||||
|
|
||||||
|
- 拥有活跃的用户社区,持续更新优化,问题反馈及时响应
|
||||||
|
|
||||||
|
✅ 推荐使用场景
|
||||||
|
|
||||||
|
- 想要桌面歌词悬浮,提升听歌氛围
|
||||||
|
|
||||||
|
- 需要跨平台、多格式的歌词显示支持
|
||||||
|
|
||||||
|
- 喜欢细节丰富、界面可自定义的听歌工具
|
||||||
|
|
||||||
|
🎧 无论你是用耳机沉浸式聆听,还是想让歌词在桌面随时可见,BetterLyrics 都能为你打造专属的听歌体验!
|
||||||
44
Promotion/zh-TW.txt
Normal file
44
Promotion/zh-TW.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
* 免費試用版與付費版功能完全一致
|
||||||
|
|
||||||
|
🎵 BetterLyrics —— 曲動人心、詞悅雙眼,高顏值 Windows 歌詞顯示工具
|
||||||
|
|
||||||
|
想在 Windows 上體驗流暢、動態、沉浸感十足的歌詞顯示效果?
|
||||||
|
BetterLyrics 為你打造全新視覺享受,讓每一首歌都真正「唱」給你看!
|
||||||
|
|
||||||
|
✨ 核心功能亮點
|
||||||
|
|
||||||
|
- 介面美觀,動畫流暢
|
||||||
|
採用 WinUI 3 框架打造,支援多種主題風格與動態背景,歌詞滾動、淡入淡出等特效精緻細膩。
|
||||||
|
|
||||||
|
- 可設定離線翻譯,支援 30 種語言
|
||||||
|
自動讀取本地歌詞中的翻譯內容,支援多語系辨識與顯示,幫你聽懂每一句歌詞。
|
||||||
|
|
||||||
|
- 支援多種歌詞來源與格式
|
||||||
|
可讀取本地的 LRC、ESLRC、TTML 等格式歌詞檔,同時支援從線上來源獲取歌詞,包括 QQ 音樂、網易雲、酷狗音樂與 LrcLib 等主流平台。
|
||||||
|
|
||||||
|
- 多播放器即時同步
|
||||||
|
相容網易雲音樂、酷狗音樂、Apple Music、Spotify、PotPlayer、MusicBee、AIMP 等播放器,甚至支援系統內建播放器,歌詞自動同步無須手動調整。
|
||||||
|
|
||||||
|
- 多種顯示模式自由切換
|
||||||
|
沉浸式全螢幕、桌面浮動歌詞、智慧貼齊窗口等模式,靈活搭配不同使用場景。
|
||||||
|
|
||||||
|
- 自動隱藏,安靜陪伴
|
||||||
|
音樂暫停時自動隱藏歌詞介面,不打擾、不佔螢幕,帶來更清爽的使用體驗。
|
||||||
|
|
||||||
|
🔧 更多貼心功能
|
||||||
|
|
||||||
|
- 歌詞時間軸支援細微調整,完美對齊不同版本的音訊
|
||||||
|
|
||||||
|
- 支援翻譯開關、介面版面自定義、窗口鎖定與置頂等進階選項
|
||||||
|
|
||||||
|
- 活躍用戶社群持續參與、版本持續優化、問題回饋即時處理
|
||||||
|
|
||||||
|
✅ 適用場景推薦
|
||||||
|
|
||||||
|
- 想要桌面浮動歌詞,增強聽歌氛圍
|
||||||
|
|
||||||
|
- 需要跨平台、多格式的歌詞支援
|
||||||
|
|
||||||
|
- 喜愛細節豐富、介面可自訂的聽歌工具
|
||||||
|
|
||||||
|
🎧 無論你是戴上耳機沉浸聆聽,還是想讓歌詞隨時浮現在桌面,BetterLyrics 都能為你打造專屬的聽歌體驗!
|
||||||
2
README.CN.md
Normal file
2
README.CN.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
## 简体中文文档现已迁移
|
||||||
|
[点此访问](https://github.com/jayfunc/BetterLyrics/blob/dev/README.zh-CN.md)
|
||||||
Reference in New Issue
Block a user