@applemusic-like-lyrics/core 0.0.15 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,108 @@
1
+ import { Disposable, HasElement } from "../interfaces";
2
+ export declare abstract class AbstractBaseRenderer implements Disposable, HasElement {
3
+ /**
4
+ * 修改背景的流动速度,数字越大越快,默认为 2
5
+ * @param speed 背景的流动速度,默认为 2
6
+ */
7
+ abstract setFlowSpeed(speed: number): void;
8
+ /**
9
+ * 修改背景的渲染比例,默认是 0.5
10
+ *
11
+ * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能
12
+ * @param scale 背景的渲染比例
13
+ */
14
+ abstract setRenderScale(scale: number): void;
15
+ /**
16
+ * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能
17
+ * @param enable 是否启用静态模式
18
+ */
19
+ abstract setStaticMode(enable: boolean): void;
20
+ /**
21
+ * 修改背景动画帧率,默认是 30 FPS
22
+ *
23
+ * 如果设置成 0 则会停止动画
24
+ * @param fps 目标帧率,默认 30 FPS
25
+ */
26
+ abstract setFPS(fps: number): void;
27
+ /**
28
+ * 暂停背景动画,画面即便是更新了图片也不会发生变化
29
+ */
30
+ abstract pause(): void;
31
+ /**
32
+ * 恢复播放背景动画
33
+ */
34
+ abstract resume(): void;
35
+ /**
36
+ * 设置背景专辑图片,图片材质加载并设置完成后会返回
37
+ * @param albumUrl 图片的目标链接
38
+ */
39
+ abstract setAlbumImage(albumUrl: string): Promise<void>;
40
+ /**
41
+ * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间
42
+ *
43
+ * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)
44
+ *
45
+ * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)
46
+ * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间
47
+ */
48
+ abstract setLowFreqVolume(volume: number): void;
49
+ /**
50
+ * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃
51
+ *
52
+ * 部分渲染器会根据这个特征调整自身效果
53
+ *
54
+ * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)
55
+ *
56
+ * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)
57
+ */
58
+ abstract setHasLyric(hasLyric: boolean): void;
59
+ abstract dispose(): void;
60
+ abstract getElement(): HTMLElement;
61
+ }
62
+ export declare abstract class BaseRenderer extends AbstractBaseRenderer {
63
+ protected canvas: HTMLCanvasElement;
64
+ private observer;
65
+ protected flowSpeed: number;
66
+ protected currerntRenderScale: number;
67
+ constructor(canvas: HTMLCanvasElement);
68
+ setRenderScale(scale: number): void;
69
+ /**
70
+ * 当画板元素大小发生变化时此函数会被调用
71
+ * 可以在此处重设和渲染器相关的尺寸设置
72
+ * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理
73
+ * @param width 画板元素实际的物理像素宽度,有可能为 0
74
+ * @param height 画板元素实际的物理像素高度,有可能为 0
75
+ */
76
+ protected onResize(width: number, height: number): void;
77
+ /**
78
+ * 修改背景的流动速度,数字越大越快,默认为 2
79
+ * @param speed 背景的流动速度,默认为 2
80
+ */
81
+ setFlowSpeed(speed: number): void;
82
+ /**
83
+ * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能
84
+ * @param enable 是否启用静态模式
85
+ */
86
+ abstract setStaticMode(enable: boolean): void;
87
+ /**
88
+ * 修改背景动画帧率,默认是 30 FPS
89
+ *
90
+ * 如果设置成 0 则会停止动画
91
+ * @param fps 目标帧率,默认 30 FPS
92
+ */
93
+ abstract setFPS(fps: number): void;
94
+ /**
95
+ * 暂停背景动画,画面即便是更新了图片也不会发生变化
96
+ */
97
+ abstract pause(): void;
98
+ /**
99
+ * 恢复播放背景动画
100
+ */
101
+ abstract resume(): void;
102
+ /**
103
+ * 设置背景专辑图片,图片材质加载并设置完成后会返回
104
+ * @param albumUrl 图片的目标链接
105
+ */
106
+ abstract setAlbumImage(albumUrl: string): Promise<void>;
107
+ dispose(): void;
108
+ }
@@ -0,0 +1,55 @@
1
+ import { BaseRenderer } from "./base";
2
+ export declare class EplorRenderer extends BaseRenderer {
3
+ protected canvas: HTMLCanvasElement;
4
+ private hasLyric;
5
+ private hasLyricValue;
6
+ private maxFPS;
7
+ private lastTickTime;
8
+ private lastFrameTime;
9
+ private _lowFreqVolume;
10
+ private paused;
11
+ private staticMode;
12
+ private gl;
13
+ private reduceImageSizeCanvas;
14
+ private tickHandle;
15
+ private sprites;
16
+ private ampTransition;
17
+ private playTime;
18
+ private frameTime;
19
+ private IllIlllIlIIlllI;
20
+ private onTick;
21
+ private mainProgram;
22
+ private blendProgram;
23
+ private copyProgram;
24
+ private noiseProgram;
25
+ private static readonly rawVertexBuffer;
26
+ private static readonly rawIndexBuffer;
27
+ private vertexBuffer;
28
+ private indexBuffer;
29
+ private noiseTexture;
30
+ private fb;
31
+ private historyFrameBuffer;
32
+ constructor(canvas: HTMLCanvasElement);
33
+ private _currentSize;
34
+ private _targetSize;
35
+ private renderSize;
36
+ private pixelSize;
37
+ protected onResize(width: number, height: number): void;
38
+ private checkResize;
39
+ private requestTick;
40
+ private drawScreen;
41
+ private bindDefaultFrameBuffer;
42
+ private onRedraw;
43
+ private copyFrameBuffer;
44
+ private setupGL;
45
+ setLowFreqVolume(volume: number): void;
46
+ setStaticMode(enable: boolean): void;
47
+ setFPS(fps: number): void;
48
+ pause(): void;
49
+ resume(): void;
50
+ private loadImage;
51
+ setAlbumImage(albumUrl: string): Promise<void>;
52
+ setHasLyric(hasLyric: boolean): void;
53
+ getElement(): HTMLElement;
54
+ dispose(): void;
55
+ }
@@ -3,11 +3,26 @@
3
3
  * 一个播放歌词的组件
4
4
  * @author SteveXMH
5
5
  */
6
- import type { HasElement, Disposable } from "../interfaces";
7
- import { PixiRenderer } from "./pixi-renderer";
8
- export declare class BackgroundRender extends PixiRenderer implements HasElement, Disposable {
6
+ export { AbstractBaseRenderer, BaseRenderer } from "./base";
7
+ import { AbstractBaseRenderer, BaseRenderer } from "./base";
8
+ export { PixiRenderer } from "./pixi-renderer";
9
+ export { EplorRenderer } from "./eplor-renderer";
10
+ export declare class BackgroundRender<Renderer extends BaseRenderer> implements AbstractBaseRenderer {
9
11
  private element;
10
- constructor();
12
+ private renderer;
13
+ constructor(renderer: Renderer, canvas: HTMLCanvasElement);
14
+ static new<Renderer extends BaseRenderer>(type: {
15
+ new (canvas: HTMLCanvasElement): Renderer;
16
+ }): BackgroundRender<Renderer>;
17
+ setRenderScale(scale: number): void;
18
+ setFlowSpeed(speed: number): void;
19
+ setStaticMode(enable: boolean): void;
20
+ setFPS(fps: number): void;
21
+ pause(): void;
22
+ resume(): void;
23
+ setLowFreqVolume(volume: number): void;
24
+ setHasLyric(hasLyric: boolean): void;
25
+ setAlbumImage(albumUrl: string): Promise<void>;
11
26
  getElement(): HTMLCanvasElement;
12
27
  dispose(): void;
13
28
  }
@@ -1,52 +1,22 @@
1
- import { Disposable } from "../interfaces";
2
- export declare class PixiRenderer implements Disposable {
3
- private canvas;
4
- private observer;
1
+ import { BaseRenderer } from "./base";
2
+ export declare class PixiRenderer extends BaseRenderer {
3
+ protected canvas: HTMLCanvasElement;
5
4
  private app;
6
5
  private curContainer?;
7
6
  private staticMode;
8
7
  private lastContainer;
9
8
  private onTick;
10
- private flowSpeed;
11
- private currerntRenderScale;
12
9
  constructor(canvas: HTMLCanvasElement);
13
- /**
14
- * 修改背景的流动速度,数字越大越快,默认为 2
15
- * @param speed 背景的流动速度,默认为 2
16
- */
17
- setFlowSpeed(speed: number): void;
18
- /**
19
- * 修改背景的渲染比例,默认是 0.5
20
- *
21
- * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能
22
- * @param scale 背景的渲染比例
23
- */
10
+ protected onResize(width: number, height: number): void;
24
11
  setRenderScale(scale: number): void;
25
12
  private rebuildFilters;
26
- /**
27
- * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能
28
- * @param enable 是否启用静态模式
29
- */
30
13
  setStaticMode(enable?: boolean): void;
31
- /**
32
- * 修改背景动画帧率,默认是 30 FPS
33
- *
34
- * 如果设置成 0 则会停止动画
35
- * @param fps 目标帧率,默认 30 FPS
36
- */
37
14
  setFPS(fps: number): void;
38
- /**
39
- * 暂停背景动画,画面即便是更新了图片也不会发生变化
40
- */
41
15
  pause(): void;
42
- /**
43
- * 恢复播放背景动画
44
- */
45
16
  resume(): void;
46
- /**
47
- * 设置背景专辑图片,图片材质加载并设置完成后会返回
48
- * @param albumUrl 图片的目标链接
49
- */
17
+ setLowFreqVolume(_volume: number): void;
18
+ setHasLyric(_hasLyric: boolean): void;
50
19
  setAlbumImage(albumUrl: string): Promise<void>;
51
20
  dispose(): void;
21
+ getElement(): HTMLElement;
52
22
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export type * from "./interfaces";
2
2
  export type * as spring from "./utils/spring";
3
- export { BackgroundRender } from "./bg-render";
3
+ export * from "./bg-render";
4
4
  export { LyricPlayer, type LyricLineMouseEvent } from "./lyric-player";
@@ -28,6 +28,9 @@ export declare class LyricLineMouseEvent extends MouseEvent {
28
28
  */
29
29
  line: LyricLineEl, event: MouseEvent);
30
30
  }
31
+ export interface LyricLineMouseEventListener {
32
+ (evt: LyricLineMouseEvent): void;
33
+ }
31
34
  /**
32
35
  * 歌词播放组件,本框架的核心组件
33
36
  *
@@ -100,7 +103,11 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
100
103
  */
101
104
  getEnableScale(): boolean;
102
105
  readonly style: import("jss").StyleSheet<"lyricPlayer" | "lyricLine" | "@media (max-width: 1024px)" | "lyricDuetLine" | "lyricBgLine" | "lyricMainLine" | "lyricSubLine" | "disableSpring" | "interludeDots" | "@supports (mix-blend-mode: plus-lighter)" | "tmpDisableTransition">;
106
+ private _baseFontSize;
107
+ get baseFontSize(): number;
108
+ private isPageVisible;
103
109
  private onPageShow;
110
+ private onPageHide;
104
111
  constructor();
105
112
  private beginScrollHandler;
106
113
  private endScrollHandler;
@@ -206,6 +213,14 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
206
213
  * @param time 当前播放进度,单位为毫秒
207
214
  */
208
215
  setCurrentTime(time: number, isSeek?: boolean): void;
216
+ /**
217
+ * 暂停部分效果演出,目前会暂停播放间奏点的动画
218
+ */
219
+ pause(): void;
220
+ /**
221
+ * 恢复部分效果演出,目前会恢复播放间奏点的动画
222
+ */
223
+ resume(): void;
209
224
  /**
210
225
  * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:
211
226
  *
@@ -9,14 +9,18 @@ export declare class InterludeDots implements HasElement, Disposable {
9
9
  private left;
10
10
  private top;
11
11
  private scale;
12
+ private playing;
12
13
  private lastStyle;
13
14
  private currentInterlude?;
14
15
  private currentTime;
16
+ private interludeTime;
15
17
  private targetBreatheDuration;
16
18
  constructor(lyricPlayer: LyricPlayer);
17
19
  getElement(): HTMLElement;
18
20
  setTransform(left?: number, top?: number): void;
19
21
  setInterlude(interlude?: [number, number]): void;
22
+ pause(): void;
23
+ resume(): void;
20
24
  update(delta?: number): void;
21
25
  dispose(): void;
22
26
  }
@@ -33,9 +33,12 @@ export declare class LyricLineEl extends EventTarget implements HasElement, Disp
33
33
  addMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | AddEventListenerOptions | undefined): void;
34
34
  removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
35
35
  private isEnabled;
36
- enable(): void;
36
+ enable(maskAnimationTime?: number): void;
37
+ disable(maskAnimationTime?: number): void;
38
+ resume(): void;
39
+ pause(): void;
40
+ setMaskAnimationState(maskAnimationTime?: number): void;
37
41
  measureSize(): [number, number];
38
- disable(): void;
39
42
  setLine(line: LyricLine): void;
40
43
  getLine(): LyricLine;
41
44
  private _hide;
@@ -47,7 +50,10 @@ export declare class LyricLineEl extends EventTarget implements HasElement, Disp
47
50
  rebuildElement(): void;
48
51
  private initFloatAnimation;
49
52
  private initEmphasizeAnimation;
53
+ private get totalDuration();
50
54
  updateMaskImage(): void;
55
+ private generateCalcBasedMaskImage;
56
+ private generateWebAnimationBasedMaskImage;
51
57
  getElement(): HTMLElement;
52
58
  setTransform(left?: number, top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number): void;
53
59
  update(delta?: number): void;
@@ -0,0 +1,2 @@
1
+ export declare function derivative(f: (x: number) => number): (x: number) => number;
2
+ export declare function getVelocity(f: (t: number) => number): (t: number) => number;
@@ -0,0 +1,25 @@
1
+ export type Matrix4 = [
2
+ number,
3
+ number,
4
+ number,
5
+ number,
6
+ number,
7
+ number,
8
+ number,
9
+ number,
10
+ number,
11
+ number,
12
+ number,
13
+ number,
14
+ number,
15
+ number,
16
+ number,
17
+ number
18
+ ];
19
+ export declare function createMatrix4(): Matrix4;
20
+ export declare function scaleMatrix4(m: Matrix4, scale?: number, origin?: {
21
+ x: number;
22
+ y: number;
23
+ }): Matrix4;
24
+ export declare function translateMatrix4(m: Matrix4, x?: number, y?: number, z?: number): Matrix4;
25
+ export declare function matrix4ToCSS(m: Matrix4, fractionDigits?: number): string;
@@ -0,0 +1,33 @@
1
+ import { Disposable } from "..";
2
+ export interface SpringParams {
3
+ mass: number;
4
+ damping: number;
5
+ stiffness: number;
6
+ }
7
+ type CSSStyleKeys = {
8
+ [Style in keyof CSSStyleDeclaration]: Style extends string ? CSSStyleDeclaration[Style] extends string ? Style : never : never;
9
+ }[keyof CSSStyleDeclaration];
10
+ /**
11
+ * 基于 Web Animation API 的弹簧动画工具类,效果上可能逊于实时演算的版本
12
+ */
13
+ export declare class WebAnimationSpring extends EventTarget implements Disposable {
14
+ private element;
15
+ private styleName;
16
+ private valueGenerator;
17
+ private currentPosition;
18
+ private currentAnimation;
19
+ private targetPosition;
20
+ private isStatic;
21
+ private params;
22
+ private currentSolver;
23
+ private getV;
24
+ constructor(element: HTMLElement, styleName: CSSStyleKeys, valueGenerator: (value: number) => string, currentPosition?: number);
25
+ makeStatic(): void;
26
+ setTargetPosition(targetPosition: number): void;
27
+ getCurrentPosition(): number;
28
+ getCurrentVelocity(): number;
29
+ private onStepFinished;
30
+ stop(): void;
31
+ dispose(): void;
32
+ }
33
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@applemusic-like-lyrics/core",
3
3
  "packageManager": "yarn@3.6.1",
4
- "version": "0.0.15",
4
+ "version": "0.1.0",
5
5
  "description": "AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件",
6
6
  "repository": {
7
7
  "url": "https://github.com/Steve-xmh/applemusic-like-lyrics.git",
@@ -16,30 +16,33 @@
16
16
  "build:docs": "typedoc --plugin typedoc-plugin-markdown --out docs src/index.ts",
17
17
  "build": "vite build",
18
18
  "build:dev": "vite build",
19
- "fmt": "rome format --write ./src",
19
+ "fmt": "biome format --write ./src",
20
20
  "dev": "vite dev"
21
21
  },
22
+ "type": "module",
22
23
  "main": "./dist/amll-core.cjs",
23
- "module": "./dist/amll-core.mjs",
24
+ "module": "./dist/amll-core.js",
24
25
  "typings": "./dist/index.d.ts",
25
26
  "exports": {
26
27
  ".": {
27
28
  "types": "./dist/index.d.ts",
28
- "import": "./dist/amll-core.mjs",
29
+ "import": "./dist/amll-core.js",
29
30
  "require": "./dist/amll-core.cjs"
30
31
  }
31
32
  },
32
33
  "devDependencies": {
33
34
  "@applemusic-like-lyrics/lyric": "^0.0.2",
35
+ "@applemusic-like-lyrics/ttml": "^0.1.0",
36
+ "@biomejs/biome": "1.5.3",
34
37
  "@types/stats.js": "^0.17.0",
35
38
  "lil-gui": "^0.18.2",
36
- "rome": "^12.1.3",
37
39
  "stats.js": "^0.17.0",
38
40
  "typedoc": "^0.25.2",
39
41
  "typedoc-plugin-markdown": "^3.16.0",
40
42
  "typescript": "^5.2.2",
41
43
  "vite": "^4.4.11",
42
44
  "vite-plugin-dts": "^3.6.0",
45
+ "vite-plugin-glsl": "^1.2.1",
43
46
  "vite-plugin-top-level-await": "^1.3.1",
44
47
  "vite-plugin-wasm": "^3.2.2"
45
48
  },
@@ -53,5 +56,9 @@
53
56
  "@pixi/sprite": "*",
54
57
  "jss": "*",
55
58
  "jss-preset-default": "*"
56
- }
59
+ },
60
+ "dependencies": {
61
+ "bezier-easing": "^2.1.0"
62
+ },
63
+ "gitHead": "ebb5942fb850b61c676477de96f440c18aa75c07"
57
64
  }