[F] Fix lyrics out of sync when using speed change
This commit is contained in:
@@ -22,7 +22,6 @@ Practice Japanese Karaoke lyrics reading and typing at the same time with KaraDa
|
|||||||
* [ ] 升降调
|
* [ ] 升降调
|
||||||
* [x] 播放/暂停音乐控制
|
* [x] 播放/暂停音乐控制
|
||||||
* [x] 变速
|
* [x] 变速
|
||||||
* [ ] 變速歌詞一起變速
|
|
||||||
* [ ] 音域分析(自动推荐升降调幅度)
|
* [ ] 音域分析(自动推荐升降调幅度)
|
||||||
* [ ] 电视模式
|
* [ ] 电视模式
|
||||||
* [ ] 和手机配对、用手机点歌
|
* [ ] 和手机配对、用手机点歌
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ export class MusicControl {
|
|||||||
audioUrl: string
|
audioUrl: string
|
||||||
vocalsUrl?: string
|
vocalsUrl?: string
|
||||||
|
|
||||||
|
private _lastSpeedChangeTransportTime: number = 0
|
||||||
|
private _accumulatedAudioTime: number = 0
|
||||||
|
|
||||||
constructor(audioUrl: string, vocalsUrl?: string) {
|
constructor(audioUrl: string, vocalsUrl?: string) {
|
||||||
this.audioUrl = audioUrl
|
this.audioUrl = audioUrl
|
||||||
this.vocalsUrl = vocalsUrl
|
this.vocalsUrl = vocalsUrl
|
||||||
@@ -63,6 +66,10 @@ export class MusicControl {
|
|||||||
await Promise.all(promises)
|
await Promise.all(promises)
|
||||||
this.log('Audio loaded')
|
this.log('Audio loaded')
|
||||||
|
|
||||||
|
// Reset time tracking
|
||||||
|
this._lastSpeedChangeTransportTime = 0
|
||||||
|
this._accumulatedAudioTime = 0
|
||||||
|
|
||||||
// Sync player to transport and schedule start at 0
|
// Sync player to transport and schedule start at 0
|
||||||
// We do this regardless of transport state to ensure it's scheduled
|
// We do this regardless of transport state to ensure it's scheduled
|
||||||
this.player.sync().start(0)
|
this.player.sync().start(0)
|
||||||
@@ -76,6 +83,13 @@ export class MusicControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSpeed(speed: number) {
|
setSpeed(speed: number) {
|
||||||
|
// Calculate how much audio time has passed since the last speed change
|
||||||
|
const currentTransportTime = Tone.getTransport().seconds
|
||||||
|
const transportDelta = currentTransportTime - this._lastSpeedChangeTransportTime
|
||||||
|
this._accumulatedAudioTime += transportDelta * this.speed
|
||||||
|
|
||||||
|
this._lastSpeedChangeTransportTime = currentTransportTime
|
||||||
|
|
||||||
this.speed = speed
|
this.speed = speed
|
||||||
this.player.playbackRate = this.speed
|
this.player.playbackRate = this.speed
|
||||||
if (this.vocalsPlayer) {
|
if (this.vocalsPlayer) {
|
||||||
@@ -88,7 +102,9 @@ export class MusicControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTime() {
|
getTime() {
|
||||||
return Tone.getTransport().seconds
|
const currentTransportTime = Tone.getTransport().seconds
|
||||||
|
const transportDelta = currentTransportTime - this._lastSpeedChangeTransportTime
|
||||||
|
return this._accumulatedAudioTime + transportDelta * this.speed
|
||||||
}
|
}
|
||||||
|
|
||||||
startCheckLoop() {
|
startCheckLoop() {
|
||||||
@@ -102,7 +118,7 @@ export class MusicControl {
|
|||||||
// In karaoke mode (dual tracks), we don't pause for typing
|
// In karaoke mode (dual tracks), we don't pause for typing
|
||||||
if (this.vocalsPlayer) return
|
if (this.vocalsPlayer) return
|
||||||
|
|
||||||
const ct = Tone.getTransport().seconds
|
const ct = this.getTime()
|
||||||
const ni = this.currentLineIndex + 1
|
const ni = this.currentLineIndex + 1
|
||||||
if (ni >= this.lyrics.length) return
|
if (ni >= this.lyrics.length) return
|
||||||
const nt = this.parseTime(this.lyrics[ni].time)
|
const nt = this.parseTime(this.lyrics[ni].time)
|
||||||
|
|||||||
Reference in New Issue
Block a user