@music-lyric-player/base
v0.18.1
Published
Music Lyric Player - Base Player
Readme
@music-lyric-player/base
Owns playback time, active-line tracking, and event emission. Pure logic with zero DOM dependencies — pair it with @music-lyric-player/dom for the default renderer, or plug in your own.
Install
npm install @music-lyric-player/base music-lyric-kitEvents
| Event | Payload | Fires when |
| ------------- | -------------------------------------------- | -------------------------- |
| play | (currentTime: number) | Playback starts or resumes |
| pause | (currentTime: number) | Playback pauses |
| lyricUpdate | (info: Info) | A new lyric is loaded |
| linesUpdate | (lines, indexes, firstActiveIndex, isSeek) | Active lines change |
Usage
import { BaseLyricPlayer } from '@music-lyric-player/base'
import { ParserPipeline } from 'music-lyric-kit'
const base = new BaseLyricPlayer()
base.event.add('play', (time) => {})
base.event.add('pause', (time) => {})
base.event.add('lyricUpdate', (info) => {})
base.event.add('linesUpdate', (lines, indexes, firstActiveIndex, isSeek) => {})
const { result } = new ParserPipeline({
content: { original: '[00:01.114]Hello world' },
format: 'lrc',
})
.parse()
.pureClean()
.interludeInsert()
.spaceInsert()
.final()
base.updateLyric(result)
base.play(0)Options
| Field | Type | Default | Description |
| ------------------------------- | ------------------------ | ------------- | ---------------------------------------------------------------------------------------------- |
| driver | 'animation' \| 'timer' | 'animation' | Tick source. animation uses requestAnimationFrame; timer uses setTimeout(16) |
| bridgeActive | boolean | true | Promote lines sandwiched between active lines back to active so the block reads as continuous |
| mergeWindow | number | 300 | Merge deactivation of consecutive lines whose end times fall within this many ms (0 disables) |
| mergeLimit | number | 3 | Max lines per merge batch; longer runs force-flush every mergeLimit lines (0 unbounded) |
| offset.global | number | 0 | Global time offset in ms applied to every lyric |
| offset.useMeta | boolean | true | Apply the offset carried by the lyric's own meta (MetaType.Offset) |
| offset.resetTempOnLyricChange | boolean | true | Reset the temp offset (set via updateTempOffset) to 0 when a new lyric loads |
base.config.merge({ driver: 'animation' })