Skip to content

EffectLyrics can drift when lyrics land on tied/continuation notes #2727

@AvaTheArchitect

Description

@AvaTheArchitect

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

When a lyric syllable is attached to a tie-destination / continuation note, alphaTab appears to render that lyric on the tied continuation beat instead of carrying it forward to the next fresh note attack.

This causes the lyric stream to drift out of alignment after held notes. In my test case, the lyric “sease” which is part of the word disease but the lyric reads as "di - sease" is held across a tied note, but the next lyric “Yeah,” is rendered on the tie destination. After that point, following syllables are shifted until the phrase is corrected manually.|

Here is the first image that shows this clearly:

Image

I compared the same GP file against other players and being a singer myself I knew there are rests or breaths between these lyrics, and on the other players they appear to treat the tied continuation as a held/extender position rather than a new lyric attack. You can see that here:

Image

I tested once again on my Labs Native alphaTab Repo and confirmed the same issue the first screenshot:

Image

And you can see the syllables or renderer does not know when to shift the lyrics or that any lyrics are held when there is a (4) tie in note or continued note as we can. Eventually what happens is one by one the lyrics start to fall a note behind as each tie destination or continuation note is played. Before you know it the lyrics are now 5 notes behind.

Lastly, we found a way to fix this and to carry the lyrics forward:

Image

Expected Behavior

Lyrics should align to fresh note attacks, not tied continuation notes.

If a beat is only a tie destination / continuation of a held note, it should not consume the next lyric syllable. The lyric should be carried forward to the next real note attack, while the tied note behaves more like a lyric extender / held position.

Steps To Reproduce

  1. Load a GP file with lyrics and tied / held vocal notes.
  2. Use alphaTab with EffectLyrics enabled.
  3. Find a phrase where one lyric syllable is sustained across a tied note.
  4. Compare the lyric placement against Songsterr or Guitar Pro-style lyric phrasing.
  5. Notice that alphaTab places the next lyric syllable on the tie-destination beat instead of the next fresh note attack.

In my test file, the affected phrase is around the lyric “di-sease / Yeah,” where “sease” is held, but “Yeah,” is placed on the tied continuation note.

Link to jsFiddle, CodePen, Project

No response

Version and Environment

alphaTab v1.8.1 
webpack v1.8.1
Chrome Browser
Next.js

Platform

Web

Anything else?

I used a probe to inspect the beat data and found this pattern:

tick: 68640
lyric0: "sease"
isTieOrigin: true
isTieDestination: false

tick: 69120
lyric0: "Yeah,"
isTieDestination: true
tieOrigin: true

So the next lyric token is being attached to a tie-destination / continuation beat.

As a workaround in our player, we tested a small carry-queue approach:

  • If a lyric lands on a continuation beat, queue it instead of rendering it there.
  • Skip rests.
  • Render queued lyrics on the next fresh note attack.
  • If that beat also has its own lyric, carry that lyric forward to the next valid beat.

This restored the lyric alignment to match the Songsterr reference in the affected phrase.

I can provide the test GP file, screenshots, video, and a PR with the carry-queue style fix if this seems like the right direction.

Related note: I also noticed a separate layout behavior where alphaTab renders EffectLyrics above the tab staff, which creates a large upper lyric lane. In Guitar Pro, lyrics can be positioned under the tab staff in certain layouts, and Songsterr-style tab rendering also places lyrics below the staff. I may open a separate issue for that so this ticket can stay focused on the tied-note lyric drift.

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions