From 43ec0aaa769f2bbe12d0ea860575f9f3645127c6 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 8 Nov 2026 01:56:18 +0100 Subject: [PATCH 1/4] feat(render): place lyrics below the staff or hide them The new RenderStylesheet.lyricsPlacement chooses between the current placement (Auto: above the tab staff, below staves without tabs), Below (below the last staff of the track, leaving the space above the tabs to bends, whammy bar and vibrato) and Hidden. alphaTex sets it with \lyricsPlacement auto|below|hidden and exports it when not Auto. Lyrics are created by one effect per placement; only the one matching the stylesheet creates glyphs, so the default rendering is unchanged. Refs #2776 --- packages/alphatab/src/Environment.ts | 9 +- packages/alphatab/src/NotationSettings.ts | 2 +- .../src/generated/SerializerSchema.ts | 2 +- .../model/RenderStylesheetSerializer.ts | 89 ++++++++++--------- .../alphaTex/AlphaTex1EnumMappings.ts | 9 ++ .../alphaTex/AlphaTex1LanguageDefinitions.ts | 2 + .../alphaTex/AlphaTex1LanguageHandler.ts | 27 +++++- .../alphatab/src/model/RenderStylesheet.ts | 28 ++++++ packages/alphatab/src/model/_barrel.ts | 3 +- .../src/rendering/effects/LyricsEffectInfo.ts | 47 +++++----- .../alphatab/test/generated/SerializerFill.ts | 2 + .../test/importer/AlphaTexImporter.test.ts | 13 +++ .../AlphaTexImporter.test.ts.snap | 20 +++++ .../test/rendering/EffectPlacement.test.ts | 60 +++++++++++++ .../features/EffectsAndAnnotations.test.ts | 25 ++++++ packages/alphatex/src/definitions.ts | 2 + packages/alphatex/src/enum.ts | 9 ++ .../src/metadata/score/lyricsplacement.ts | 28 ++++++ packages/ui/src/player/settings/schema.ts | 1 + .../docs/features/render/coverage-lyrics.mdx | 15 +++- website/docs/releases/release1_10.mdx | 13 +++ 21 files changed, 335 insertions(+), 71 deletions(-) create mode 100644 packages/alphatex/src/metadata/score/lyricsplacement.ts diff --git a/packages/alphatab/src/Environment.ts b/packages/alphatab/src/Environment.ts index fe6bceb03d..281453312d 100644 --- a/packages/alphatab/src/Environment.ts +++ b/packages/alphatab/src/Environment.ts @@ -12,6 +12,7 @@ import { Logger } from '@coderline/alphatab/Logger'; import type { Font } from '@coderline/alphatab/model/Font'; import { GolpeType } from '@coderline/alphatab/model/GolpeType'; import { HarmonicType } from '@coderline/alphatab/model/HarmonicType'; +import { LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; import type { ICanvas } from '@coderline/alphatab/platform/ICanvas'; import { AlphaSynthWebWorklet } from '@coderline/alphatab/platform/javascript/AlphaSynthAudioWorkletOutput'; import { BrowserUiFacade } from '@coderline/alphatab/platform/javascript/BrowserUiFacade'; @@ -43,7 +44,7 @@ import { createGolpeEffectInfo } from '@coderline/alphatab/rendering/effects/Gol import { createHarmonicsEffectInfo } from '@coderline/alphatab/rendering/effects/HarmonicsEffectInfo'; import { leftHandTapEffectInfo } from '@coderline/alphatab/rendering/effects/LeftHandTapEffectInfo'; import { letRingEffectInfo } from '@coderline/alphatab/rendering/effects/LetRingEffectInfo'; -import { lyricsEffectInfo } from '@coderline/alphatab/rendering/effects/LyricsEffectInfo'; +import { createLyricsEffectInfo } from '@coderline/alphatab/rendering/effects/LyricsEffectInfo'; import { markerEffectInfo } from '@coderline/alphatab/rendering/effects/MarkerEffectInfo'; import { noteOrnamentEffectInfo } from '@coderline/alphatab/rendering/effects/NoteOrnamentEffectInfo'; import { numberedBarKeySignatureEffectInfo } from '@coderline/alphatab/rendering/effects/NumberedBarKeySignatureEffectInfo'; @@ -543,7 +544,7 @@ export class Environment { // // Tabs new TabBarRendererFactory([ - { effect: lyricsEffectInfo, mode: EffectBandMode.SharedTop }, + { effect: createLyricsEffectInfo(LyricsPlacement.Auto), mode: EffectBandMode.SharedTop }, { effect: tabWhammyEffectInfo, mode: EffectBandMode.OwnedTop }, { effect: trillEffectInfo, mode: EffectBandMode.OwnedTop }, @@ -578,7 +579,9 @@ export class Environment { effect: createGolpeEffectInfo(GolpeType.Thumb), mode: EffectBandMode.OwnedBottom, shouldCreate: staff => !staff.showStandardNotation - } + }, + // shared and last: bottom of the tab staff, or of the last shown staff without tabs + { effect: createLyricsEffectInfo(LyricsPlacement.Below), mode: EffectBandMode.SharedBottom } ]) ]; diff --git a/packages/alphatab/src/NotationSettings.ts b/packages/alphatab/src/NotationSettings.ts index 03124efde1..e8df62b7e8 100644 --- a/packages/alphatab/src/NotationSettings.ts +++ b/packages/alphatab/src/NotationSettings.ts @@ -212,7 +212,7 @@ export enum NotationElement { EffectLetRing = 23, /** - * The lyrics of the track shown above the staff. + * The lyrics of the track, placed as configured in `RenderStylesheet.lyricsPlacement`. */ EffectLyrics = 24, diff --git a/packages/alphatab/src/generated/SerializerSchema.ts b/packages/alphatab/src/generated/SerializerSchema.ts index f403f4ec2b..cfaa1c0429 100644 --- a/packages/alphatab/src/generated/SerializerSchema.ts +++ b/packages/alphatab/src/generated/SerializerSchema.ts @@ -12,5 +12,5 @@ export class SerializerSchema { /** * A hash of the field ids, keys and types of all serialized classes (50 classes). */ - public static readonly fingerprint: number = 0xb9644837; + public static readonly fingerprint: number = 0xc4694831; } diff --git a/packages/alphatab/src/generated/model/RenderStylesheetSerializer.ts b/packages/alphatab/src/generated/model/RenderStylesheetSerializer.ts index 28be070fc6..4112951951 100644 --- a/packages/alphatab/src/generated/model/RenderStylesheetSerializer.ts +++ b/packages/alphatab/src/generated/model/RenderStylesheetSerializer.ts @@ -9,6 +9,7 @@ import { RecordFields } from "@coderline/alphatab/io/RecordFields"; import { BracketExtendMode } from "@coderline/alphatab/model/RenderStylesheet"; import { JsonHelper } from "@coderline/alphatab/io/JsonHelper"; import { TuningDisplayMode } from "@coderline/alphatab/model/RenderStylesheet"; +import { LyricsPlacement } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNamePolicy } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNameMode } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNameOrientation } from "@coderline/alphatab/model/RenderStylesheet"; @@ -22,7 +23,7 @@ import type { IObjectWriter } from "@coderline/alphatab/io/IObjectWriter"; * @internal */ export class RenderStylesheetSerializer { - private static readonly _fields: RecordFields = new RecordFields(["hidedynamics", "bracketextendmode", "usesystemsignseparator", "globaldisplaytuning", "tuningdisplaymode", "pertrackdisplaytuning", "globaldisplaychorddiagramsontop", "pertrackchorddiagramsontop", "globaldisplaychorddiagramsinscore", "singletracktracknamepolicy", "multitracktracknamepolicy", "firstsystemtracknamemode", "othersystemstracknamemode", "firstsystemtracknameorientation", "othersystemstracknameorientation", "multitrackmultibarrest", "pertrackmultibarrest", "extendbarlines", "hideemptystaves", "hideemptystavesinfirstsystem", "showsinglestaffbrackets", "barnumberdisplay", "scoreconfig", "tabconfig", "slashconfig", "numberedconfig"]); + private static readonly _fields: RecordFields = new RecordFields(["hidedynamics", "bracketextendmode", "usesystemsignseparator", "globaldisplaytuning", "tuningdisplaymode", "lyricsplacement", "pertrackdisplaytuning", "globaldisplaychorddiagramsontop", "pertrackchorddiagramsontop", "globaldisplaychorddiagramsinscore", "singletracktracknamepolicy", "multitracktracknamepolicy", "firstsystemtracknamemode", "othersystemstracknamemode", "firstsystemtracknameorientation", "othersystemstracknameorientation", "multitrackmultibarrest", "pertrackmultibarrest", "extendbarlines", "hideemptystaves", "hideemptystavesinfirstsystem", "showsinglestaffbrackets", "barnumberdisplay", "scoreconfig", "tabconfig", "slashconfig", "numberedconfig"]); public static read(obj: RenderStylesheet, reader: IObjectReader): void { reader.readRecord(RenderStylesheetSerializer._fields, (id, k, r) => { switch (id) { @@ -42,66 +43,69 @@ export class RenderStylesheetSerializer { obj.tuningDisplayMode = JsonHelper.parseEnum(r.readValue(), TuningDisplayMode)!; return true; case 5: - RenderStylesheetSerializer._readPerTrackDisplayTuning(obj, r); + obj.lyricsPlacement = JsonHelper.parseEnum(r.readValue(), LyricsPlacement)!; return true; case 6: - obj.globalDisplayChordDiagramsOnTop = r.readBoolean(); + RenderStylesheetSerializer._readPerTrackDisplayTuning(obj, r); return true; case 7: - RenderStylesheetSerializer._readPerTrackChordDiagramsOnTop(obj, r); + obj.globalDisplayChordDiagramsOnTop = r.readBoolean(); return true; case 8: - obj.globalDisplayChordDiagramsInScore = r.readBoolean(); + RenderStylesheetSerializer._readPerTrackChordDiagramsOnTop(obj, r); return true; case 9: - obj.singleTrackTrackNamePolicy = JsonHelper.parseEnum(r.readValue(), TrackNamePolicy)!; + obj.globalDisplayChordDiagramsInScore = r.readBoolean(); return true; case 10: - obj.multiTrackTrackNamePolicy = JsonHelper.parseEnum(r.readValue(), TrackNamePolicy)!; + obj.singleTrackTrackNamePolicy = JsonHelper.parseEnum(r.readValue(), TrackNamePolicy)!; return true; case 11: - obj.firstSystemTrackNameMode = JsonHelper.parseEnum(r.readValue(), TrackNameMode)!; + obj.multiTrackTrackNamePolicy = JsonHelper.parseEnum(r.readValue(), TrackNamePolicy)!; return true; case 12: - obj.otherSystemsTrackNameMode = JsonHelper.parseEnum(r.readValue(), TrackNameMode)!; + obj.firstSystemTrackNameMode = JsonHelper.parseEnum(r.readValue(), TrackNameMode)!; return true; case 13: - obj.firstSystemTrackNameOrientation = JsonHelper.parseEnum(r.readValue(), TrackNameOrientation)!; + obj.otherSystemsTrackNameMode = JsonHelper.parseEnum(r.readValue(), TrackNameMode)!; return true; case 14: - obj.otherSystemsTrackNameOrientation = JsonHelper.parseEnum(r.readValue(), TrackNameOrientation)!; + obj.firstSystemTrackNameOrientation = JsonHelper.parseEnum(r.readValue(), TrackNameOrientation)!; return true; case 15: - obj.multiTrackMultiBarRest = r.readBoolean(); + obj.otherSystemsTrackNameOrientation = JsonHelper.parseEnum(r.readValue(), TrackNameOrientation)!; return true; case 16: - obj.perTrackMultiBarRest = new Set(r.readValue() as number[]); + obj.multiTrackMultiBarRest = r.readBoolean(); return true; case 17: - obj.extendBarLines = r.readBoolean(); + obj.perTrackMultiBarRest = new Set(r.readValue() as number[]); return true; case 18: - obj.hideEmptyStaves = r.readBoolean(); + obj.extendBarLines = r.readBoolean(); return true; case 19: - obj.hideEmptyStavesInFirstSystem = r.readBoolean(); + obj.hideEmptyStaves = r.readBoolean(); return true; case 20: - obj.showSingleStaffBrackets = r.readBoolean(); + obj.hideEmptyStavesInFirstSystem = r.readBoolean(); return true; case 21: - obj.barNumberDisplay = JsonHelper.parseEnum(r.readValue(), BarNumberDisplay)!; + obj.showSingleStaffBrackets = r.readBoolean(); return true; case 22: - ScoreStaffConfigSerializer.readFlexible(obj.scoreConfig, r); + obj.barNumberDisplay = JsonHelper.parseEnum(r.readValue(), BarNumberDisplay)!; return true; case 23: - TabStaffConfigSerializer.readFlexible(obj.tabConfig, r); + ScoreStaffConfigSerializer.readFlexible(obj.scoreConfig, r); return true; case 24: - SlashStaffConfigSerializer.readFlexible(obj.slashConfig, r); + TabStaffConfigSerializer.readFlexible(obj.tabConfig, r); return true; case 25: + SlashStaffConfigSerializer.readFlexible(obj.slashConfig, r); + return true; + case 26: NumberedStaffConfigSerializer.readFlexible(obj.numberedConfig, r); return true; } @@ -133,50 +137,51 @@ export class RenderStylesheetSerializer { w.booleanField(2, obj.useSystemSignSeparator); w.booleanField(3, obj.globalDisplayTuning); w.numberField(4, obj.tuningDisplayMode as number); + w.numberField(5, obj.lyricsPlacement as number); if (obj.perTrackDisplayTuning !== null) { - w.mapField(5); + w.mapField(6); for (const [k, v] of obj.perTrackDisplayTuning!) { w.prop(k.toString()); w.writeBoolean(v); } w.endMap(); } - w.booleanField(6, obj.globalDisplayChordDiagramsOnTop); + w.booleanField(7, obj.globalDisplayChordDiagramsOnTop); if (obj.perTrackChordDiagramsOnTop !== null) { - w.mapField(7); + w.mapField(8); for (const [k, v] of obj.perTrackChordDiagramsOnTop!) { w.prop(k.toString()); w.writeBoolean(v); } w.endMap(); } - w.booleanField(8, obj.globalDisplayChordDiagramsInScore); - w.numberField(9, obj.singleTrackTrackNamePolicy as number); - w.numberField(10, obj.multiTrackTrackNamePolicy as number); - w.numberField(11, obj.firstSystemTrackNameMode as number); - w.numberField(12, obj.otherSystemsTrackNameMode as number); - w.numberField(13, obj.firstSystemTrackNameOrientation as number); - w.numberField(14, obj.otherSystemsTrackNameOrientation as number); - w.booleanField(15, obj.multiTrackMultiBarRest); + w.booleanField(9, obj.globalDisplayChordDiagramsInScore); + w.numberField(10, obj.singleTrackTrackNamePolicy as number); + w.numberField(11, obj.multiTrackTrackNamePolicy as number); + w.numberField(12, obj.firstSystemTrackNameMode as number); + w.numberField(13, obj.otherSystemsTrackNameMode as number); + w.numberField(14, obj.firstSystemTrackNameOrientation as number); + w.numberField(15, obj.otherSystemsTrackNameOrientation as number); + w.booleanField(16, obj.multiTrackMultiBarRest); if (obj.perTrackMultiBarRest !== null) { const a: number[] = []; for (const v of obj.perTrackMultiBarRest!) { a.push(v); } - w.valueField(16, a); + w.valueField(17, a); } - w.booleanField(17, obj.extendBarLines); - w.booleanField(18, obj.hideEmptyStaves); - w.booleanField(19, obj.hideEmptyStavesInFirstSystem); - w.booleanField(20, obj.showSingleStaffBrackets); - w.numberField(21, obj.barNumberDisplay as number); - w.field(22); - ScoreStaffConfigSerializer.write(obj.scoreConfig, w); + w.booleanField(18, obj.extendBarLines); + w.booleanField(19, obj.hideEmptyStaves); + w.booleanField(20, obj.hideEmptyStavesInFirstSystem); + w.booleanField(21, obj.showSingleStaffBrackets); + w.numberField(22, obj.barNumberDisplay as number); w.field(23); - TabStaffConfigSerializer.write(obj.tabConfig, w); + ScoreStaffConfigSerializer.write(obj.scoreConfig, w); w.field(24); - SlashStaffConfigSerializer.write(obj.slashConfig, w); + TabStaffConfigSerializer.write(obj.tabConfig, w); w.field(25); + SlashStaffConfigSerializer.write(obj.slashConfig, w); + w.field(26); NumberedStaffConfigSerializer.write(obj.numberedConfig, w); w.endObject(); } diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts index 04ca53a3e2..76e6c9ccb3 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts @@ -23,6 +23,7 @@ import type { Rasgueado } from '@coderline/alphatab/model/Rasgueado'; import type { BarNumberDisplay, BracketExtendMode, + LyricsPlacement, TrackNameMode, TrackNameOrientation, TrackNamePolicy, @@ -222,6 +223,14 @@ export class AlphaTex1EnumMappings { public static readonly tuningDisplayModeReversed = AlphaTex1EnumMappings._reverse( AlphaTex1EnumMappings.tuningDisplayMode ); + public static readonly lyricsPlacement = new Map([ + ['auto', 0], + ['below', 1], + ['hidden', 2] + ]); + public static readonly lyricsPlacementReversed = AlphaTex1EnumMappings._reverse( + AlphaTex1EnumMappings.lyricsPlacement + ); public static readonly textAlign = new Map([ ['left', 0], ['center', 1], diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts index 52e1a97f8d..f1bd3749c6 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts @@ -182,6 +182,7 @@ export class AlphaTex1LanguageDefinitions { ['hidedynamics', null], ['usesystemsignseparator', null], ['tuningdisplaymode', [[[[100, 107], 0, ['score', 'staff']]]]], + ['lyricsplacement', [[[[100, 107], 0, ['auto', 'below', 'hidden']]]]], ['multibarrest', null], ['bracketextendmode', [[[[100, 107], 0, ['nobrackets', 'groupstaves', 'groupsimilarinstruments']]]]], ['singletracktracknamepolicy', [[[[100, 107], 0, ['hidden', 'firstsystem', 'allsystems']]]]], @@ -540,6 +541,7 @@ export class AlphaTex1LanguageDefinitions { ['hidedynamics', null], ['usesystemsignseparator', null], ['tuningdisplaymode', null], + ['lyricsplacement', null], ['multibarrest', null], ['bracketextendmode', null], ['singletracktracknamepolicy', null], diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts index 8b0c97f978..a2d18658c1 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts @@ -79,7 +79,12 @@ import { NoteOrnament } from '@coderline/alphatab/model/NoteOrnament'; import { Ottavia } from '@coderline/alphatab/model/Ottavia'; import { PercussionMapper } from '@coderline/alphatab/model/PercussionMapper'; import { PickStroke } from '@coderline/alphatab/model/PickStroke'; -import { BarNumberDisplay, type RenderStylesheet, TuningDisplayMode } from '@coderline/alphatab/model/RenderStylesheet'; +import { + BarNumberDisplay, + LyricsPlacement, + type RenderStylesheet, + TuningDisplayMode +} from '@coderline/alphatab/model/RenderStylesheet'; import { HeaderFooterStyle, Score, ScoreStyle, ScoreSubElement } from '@coderline/alphatab/model/Score'; import { Section } from '@coderline/alphatab/model/Section'; import { SimileMark } from '@coderline/alphatab/model/SimileMark'; @@ -216,6 +221,18 @@ export class AlphaTex1LanguageHandler implements IAlphaTexLanguageImportHandler } score.stylesheet.tuningDisplayMode = tuningDisplayMode!; return ApplyNodeResult.Applied; + case 'lyricsplacement': + const lyricsPlacement = AlphaTex1LanguageHandler._parseEnumValue( + importer, + metaData.arguments!, + 'lyrics placement', + AlphaTex1EnumMappings.lyricsPlacement + ); + if (lyricsPlacement === undefined) { + return ApplyNodeResult.NotAppliedSemanticError; + } + score.stylesheet.lyricsPlacement = lyricsPlacement!; + return ApplyNodeResult.Applied; case 'multibarrest': score.stylesheet.multiTrackMultiBarRest = true; return ApplyNodeResult.Applied; @@ -2826,6 +2843,14 @@ export class AlphaTex1LanguageHandler implements IAlphaTexLanguageImportHandler ) ); } + if (stylesheet.lyricsPlacement !== LyricsPlacement.Auto) { + nodes.push( + Atnf.identMeta( + 'lyricsPlacement', + AlphaTex1EnumMappings.lyricsPlacementReversed.get(stylesheet.lyricsPlacement)! + ) + ); + } if (stylesheet.multiTrackMultiBarRest) { nodes.push(Atnf.meta('multiBarRest')); } diff --git a/packages/alphatab/src/model/RenderStylesheet.ts b/packages/alphatab/src/model/RenderStylesheet.ts index ac8df7a156..b53e7c5793 100644 --- a/packages/alphatab/src/model/RenderStylesheet.ts +++ b/packages/alphatab/src/model/RenderStylesheet.ts @@ -117,6 +117,28 @@ export enum BarNumberDisplay { Hide = 2 } +/** + * Lists the places where lyrics are displayed. + * @since 1.10.0 + * @public + */ +export enum LyricsPlacement { + /** + * Lyrics are displayed above the tablature staff. Staves without a tablature staff display them below the staff. + */ + Auto = 0, + + /** + * Lyrics are displayed below the last staff (e.g. below the tablature staff for standard notation and tablature). + */ + Below = 1, + + /** + * Lyrics are not displayed. + */ + Hidden = 2 +} + /** * This class represents the rendering stylesheet. * It contains settings which control the display of the score when rendered. @@ -151,6 +173,12 @@ export class RenderStylesheet { */ public tuningDisplayMode: TuningDisplayMode = TuningDisplayMode.Score; + /** + * The place where lyrics are displayed. + * @since 1.10.0 + */ + public lyricsPlacement: LyricsPlacement = LyricsPlacement.Auto; + /** * Whether to show the tuning.(per-track) */ diff --git a/packages/alphatab/src/model/_barrel.ts b/packages/alphatab/src/model/_barrel.ts index e68b6e194e..18696b985a 100644 --- a/packages/alphatab/src/model/_barrel.ts +++ b/packages/alphatab/src/model/_barrel.ts @@ -52,7 +52,8 @@ export { TrackNameMode, TrackNameOrientation, TuningDisplayMode, - BarNumberDisplay + BarNumberDisplay, + LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; export { RepeatGroup } from '@coderline/alphatab/model/RepeatGroup'; export { Score, ScoreSubElement, ScoreStyle, HeaderFooterStyle } from '@coderline/alphatab/model/Score'; diff --git a/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts b/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts index b7d1e77131..69140e0837 100644 --- a/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts +++ b/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts @@ -1,4 +1,5 @@ import type { Beat } from '@coderline/alphatab/model/Beat'; +import { LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; import { NotationElement } from '@coderline/alphatab/NotationSettings'; import { TextAlign } from '@coderline/alphatab/platform/ICanvas'; import type { BarRendererBase } from '@coderline/alphatab/rendering/BarRendererBase'; @@ -9,26 +10,30 @@ import { LyricsGlyph } from '@coderline/alphatab/rendering/glyphs/LyricsGlyph'; import { OverlayRodPolicy } from '@coderline/alphatab/rendering/OverlayRodPolicy'; /** + * Creates the lyrics effect for one placement. Only the effect matching the + * `lyricsPlacement` of the score stylesheet creates glyphs. * @internal */ -export const lyricsEffectInfo: EffectInfo = { - effectId: 'EffectLyrics', - notationElement: NotationElement.EffectLyrics, - hideOnMultiTrack: false, - sizingMode: EffectBarGlyphSizing.SingleOnBeat, - placementCategory: EffectBandPlacementCategory.HorizontalRow, - overlayRodPolicy: OverlayRodPolicy.Centered, - shouldCreateGlyph: (_renderer: BarRendererBase, beat: Beat): boolean => { - return !!beat.lyrics; - }, - createNewGlyph: (renderer: BarRendererBase, beat: Beat): EffectGlyph => { - return new LyricsGlyph( - 0, - 0, - beat.lyrics!, - renderer.resources.elementFonts.get(NotationElement.EffectLyrics)!, - TextAlign.Center - ); - }, - canExpand: (_from: Beat, _to: Beat): boolean => true -}; +export function createLyricsEffectInfo(placement: LyricsPlacement): EffectInfo { + return { + effectId: placement === LyricsPlacement.Below ? 'EffectLyricsBelow' : 'EffectLyrics', + notationElement: NotationElement.EffectLyrics, + hideOnMultiTrack: false, + sizingMode: EffectBarGlyphSizing.SingleOnBeat, + placementCategory: EffectBandPlacementCategory.HorizontalRow, + overlayRodPolicy: OverlayRodPolicy.Centered, + shouldCreateGlyph: (_renderer: BarRendererBase, beat: Beat): boolean => { + return !!beat.lyrics && beat.voice.bar.staff.track.score.stylesheet.lyricsPlacement === placement; + }, + createNewGlyph: (renderer: BarRendererBase, beat: Beat): EffectGlyph => { + return new LyricsGlyph( + 0, + 0, + beat.lyrics!, + renderer.resources.elementFonts.get(NotationElement.EffectLyrics)!, + TextAlign.Center + ); + }, + canExpand: (_from: Beat, _to: Beat): boolean => true + }; +} diff --git a/packages/alphatab/test/generated/SerializerFill.ts b/packages/alphatab/test/generated/SerializerFill.ts index 2410b10173..1e19800bdd 100644 --- a/packages/alphatab/test/generated/SerializerFill.ts +++ b/packages/alphatab/test/generated/SerializerFill.ts @@ -138,6 +138,7 @@ import { RenderStylesheet } from "@coderline/alphatab/model/RenderStylesheet"; import { RenderStylesheetSerializer } from "@coderline/alphatab/generated/model/RenderStylesheetSerializer"; import { BracketExtendMode } from "@coderline/alphatab/model/RenderStylesheet"; import { TuningDisplayMode } from "@coderline/alphatab/model/RenderStylesheet"; +import { LyricsPlacement } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNamePolicy } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNameMode } from "@coderline/alphatab/model/RenderStylesheet"; import { TrackNameOrientation } from "@coderline/alphatab/model/RenderStylesheet"; @@ -1027,6 +1028,7 @@ export class SerializerFill { obj.useSystemSignSeparator = !obj.useSystemSignSeparator; obj.globalDisplayTuning = !obj.globalDisplayTuning; obj.tuningDisplayMode = SerializerFill.otherEnumValue(TuningDisplayMode, obj.tuningDisplayMode) as TuningDisplayMode; + obj.lyricsPlacement = SerializerFill.otherEnumValue(LyricsPlacement, obj.lyricsPlacement) as LyricsPlacement; { obj.perTrackDisplayTuning = new Map(); obj.perTrackDisplayTuning!.set(3, true); diff --git a/packages/alphatab/test/importer/AlphaTexImporter.test.ts b/packages/alphatab/test/importer/AlphaTexImporter.test.ts index 517db5d333..6809d339c0 100644 --- a/packages/alphatab/test/importer/AlphaTexImporter.test.ts +++ b/packages/alphatab/test/importer/AlphaTexImporter.test.ts @@ -34,6 +34,7 @@ import { Rasgueado } from '@coderline/alphatab/model/Rasgueado'; import { BarNumberDisplay, BracketExtendMode, + LyricsPlacement, TrackNameMode, TrackNameOrientation, TrackNamePolicy, @@ -1850,6 +1851,7 @@ describe('AlphaTexImporterTest', () => { \\bracketExtendMode nobrackets \\useSystemSignSeparator \\tuningDisplayMode staff + \\lyricsPlacement below \\singleTrackTrackNamePolicy allsystems \\multiTrackTrackNamePolicy Hidden \\firstSystemTrackNameMode fullname @@ -1868,6 +1870,7 @@ describe('AlphaTexImporterTest', () => { expect(score.stylesheet.bracketExtendMode).toBe(BracketExtendMode.NoBrackets); expect(score.stylesheet.useSystemSignSeparator).toBe(true); expect(score.stylesheet.tuningDisplayMode).toBe(TuningDisplayMode.Staff); + expect(score.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); expect(score.stylesheet.singleTrackTrackNamePolicy).toBe(TrackNamePolicy.AllSystems); expect(score.stylesheet.multiTrackTrackNamePolicy).toBe(TrackNamePolicy.Hidden); expect(score.stylesheet.firstSystemTrackNameMode).toBe(TrackNameMode.FullName); @@ -1877,6 +1880,15 @@ describe('AlphaTexImporterTest', () => { testExportRoundtrip(score); }); + it('lyrics-placement', () => { + expect(parseTex('.').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Auto); + expect(parseTex('\\lyricsPlacement auto .').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Auto); + + const hidden = parseTex('\\lyricsPlacement hidden .'); + expect(hidden.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Hidden); + testExportRoundtrip(hidden); + }); + it('bar-sizing', () => { const score = parseTex(` 3.3.4 | \\scale 0.5 3.3.4 | \\width 300 3.3.4 @@ -2430,6 +2442,7 @@ describe('AlphaTexImporterTest', () => { it('bar optional', () => importErrorTest('. \\section ("a" 1)')); it('bracketextendmode', () => importErrorTest('\\bracketextendmode invalid')); + it('lyricsplacement', () => importErrorTest('\\lyricsplacement invalid')); it('singletracktracknamepolicy', () => importErrorTest('\\singletracktracknamepolicy invalid')); it('multitracktracknamepolicy', () => importErrorTest('\\multitracktracknamepolicy invalid')); it('firstsystemtracknamemode', () => importErrorTest('\\firstsystemtracknamemode invalid')); diff --git a/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap b/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap index 26a102a434..9c5b0e39ac 100644 --- a/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap +++ b/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap @@ -6170,6 +6170,26 @@ exports[`AlphaTexImporterTest > errors > at219 > gracetype > semantic-diagnostic ] `; +exports[`AlphaTexImporterTest > errors > at219 > lyricsplacement > lexer-diagnostics 1`] = `[]`; + +exports[`AlphaTexImporterTest > errors > at219 > lyricsplacement > parser-diagnostics 1`] = ` +[ + Map { + "code" => 219, + "severity" => 2, + "message" => "Error parsing arguments: no overload matched arguments (). Signatures: +(auto|below|hidden)", + "start" => Map { + "col" => 17, + "line" => 1, + "offset" => 16, + }, + }, +] +`; + +exports[`AlphaTexImporterTest > errors > at219 > lyricsplacement > semantic-diagnostics 1`] = `[]`; + exports[`AlphaTexImporterTest > errors > at219 > multitracktracknamepolicy > lexer-diagnostics 1`] = `[]`; exports[`AlphaTexImporterTest > errors > at219 > multitracktracknamepolicy > parser-diagnostics 1`] = ` diff --git a/packages/alphatab/test/rendering/EffectPlacement.test.ts b/packages/alphatab/test/rendering/EffectPlacement.test.ts index 997690ccf1..260f1b1a8d 100644 --- a/packages/alphatab/test/rendering/EffectPlacement.test.ts +++ b/packages/alphatab/test/rendering/EffectPlacement.test.ts @@ -203,6 +203,66 @@ describe('EffectPlacementTests', () => { expect(band(staff.barRenderers[0], 'EffectLyrics', false)).toBeTruthy(); }); + describe('lyrics-placement', () => { + /** + * @returns the staves and sides with a lyrics band in the first bar, as `staffId-top` or `staffId-bottom` + */ + async function lyricsBands(placement: string, staff: string): Promise { + const renderer = await render(` + ${placement ? `\\lyricsPlacement ${placement}` : ''} + \\lyrics "this is my life" + \\staff {${staff}} + :4 3.3 5.3 7.3 8.3 + `); + const locations: string[] = []; + for (const renderStaff of renderer.layout!.systems[0].allStaves) { + const r = renderStaff.barRenderers[0]; + for (const top of [true, false]) { + for (const effectId of ['EffectLyrics', 'EffectLyricsBelow']) { + if (band(r, effectId, top)) { + locations.push(`${renderStaff.staffId}-${top ? 'top' : 'bottom'}`); + } + } + } + } + return locations; + } + + it('auto-score-tab', async () => { + expect(await lyricsBands('', 'score tabs')).toEqual(['tab-top']); + }); + + it('auto-tab', async () => { + expect(await lyricsBands('auto', 'tabs')).toEqual(['tab-top']); + }); + + it('auto-score', async () => { + expect(await lyricsBands('auto', 'score')).toEqual(['score-bottom']); + }); + + it('below-score-tab', async () => { + expect(await lyricsBands('below', 'score tabs')).toEqual(['tab-bottom']); + }); + + it('below-tab', async () => { + expect(await lyricsBands('below', 'tabs')).toEqual(['tab-bottom']); + }); + + it('below-score', async () => { + expect(await lyricsBands('below', 'score')).toEqual(['score-bottom']); + }); + + it('below-slash', async () => { + expect(await lyricsBands('below', 'slash')).toEqual(['slash-bottom']); + }); + + it('hidden', async () => { + expect((await lyricsBands('hidden', 'score tabs')).length).toBe(0); + expect((await lyricsBands('hidden', 'tabs')).length).toBe(0); + expect((await lyricsBands('hidden', 'score')).length).toBe(0); + }); + }); + it('key-signature-skyline-per-accidental', async () => { // the flats of A flat major sit at different heights, each takes only its own width const renderer = await render(` diff --git a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts index b5b4448e1b..a14d5c25ce 100644 --- a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -631,6 +631,31 @@ describe('EffectsAndAnnotationsTests', () => { } ); }); + + describe('placement', () => { + async function test(name: string, placement: string, staff: string) { + await VisualTestHelper.runVisualTestTex( + ` + \\lyricsPlacement ${placement} + \\lyrics "Do Re Mi Fa So La Ti Do" + \\lyrics "One Two Three Four" + \\staff {${staff}} + :4 3.3{b (0 4)} 5.3{v} 7.3 8.3 | 5.2{b (0 4 0)} 5.2 7.2{v} 8.2 + `, + `test-data/visual-tests/effects-and-annotations/lyrics-placement-${name}.png`, + undefined, + o => { + // second system: the lyrics below must not run into it + o.settings.display.barsPerRow = 1; + } + ); + } + + it('below-score-tab', async () => await test('below-score-tab', 'below', 'score tabs')); + it('below-tab', async () => await test('below-tab', 'below', 'tabs')); + it('below-score', async () => await test('below-score', 'below', 'score')); + it('hidden', async () => await test('hidden', 'hidden', 'score tabs')); + }); }); describe('hopo-arcs', () => { diff --git a/packages/alphatex/src/definitions.ts b/packages/alphatex/src/definitions.ts index 0770afb988..485110c79c 100644 --- a/packages/alphatex/src/definitions.ts +++ b/packages/alphatex/src/definitions.ts @@ -44,6 +44,7 @@ import { systemsLayout } from '@coderline/alphatab-alphatex//metadata/score/syst import { tab } from '@coderline/alphatab-alphatex//metadata/score/tab'; import { title } from '@coderline/alphatab-alphatex//metadata/score/title'; import { tuningDisplayMode } from '@coderline/alphatab-alphatex//metadata/score/tuningdisplaymode'; +import { lyricsPlacement } from '@coderline/alphatab-alphatex/metadata/score/lyricsplacement'; import { useSystemSignSeparator } from '@coderline/alphatab-alphatex//metadata/score/usesystemsignseparator'; import { words } from '@coderline/alphatab-alphatex//metadata/score/words'; import { wordsAndMusic } from '@coderline/alphatab-alphatex//metadata/score/wordsandmusic'; @@ -185,6 +186,7 @@ export const scoreMetaData = metadata( hideDynamics, useSystemSignSeparator, tuningDisplayMode, + lyricsPlacement, multiBarRest, bracketExtendMode, singleTrackTrackNamePolicy, diff --git a/packages/alphatex/src/enum.ts b/packages/alphatex/src/enum.ts index 67f9c11b36..99ff9457a7 100644 --- a/packages/alphatex/src/enum.ts +++ b/packages/alphatex/src/enum.ts @@ -21,6 +21,7 @@ export const alphaTexMappedEnumLookup = { TrackNameOrientation: alphaTab.model.TrackNameOrientation, TrackNameMode: alphaTab.model.TrackNameMode, TuningDisplayMode: alphaTab.model.TuningDisplayMode, + LyricsPlacement: alphaTab.model.LyricsPlacement, TextAlign: alphaTab.platform.TextAlign, BendType: alphaTab.model.BendType, KeySignature: alphaTab.model.KeySignature, @@ -247,6 +248,14 @@ export const alphaTexMappedEnumMapping: { Score: { snippet: 'score', shortDescription: 'Display tuning information above the score.' }, Staff: { snippet: 'staff', shortDescription: 'Display tuning note names beside tab staff lines.' } }, + LyricsPlacement: { + Auto: { + snippet: 'auto', + shortDescription: 'Display lyrics above the tab staff, or below the staff if no tabs are shown.' + }, + Below: { snippet: 'below', shortDescription: 'Display lyrics below the last staff.' }, + Hidden: { snippet: 'hidden', shortDescription: 'Do not display lyrics.' } + }, TextAlign: { Left: { snippet: 'left', diff --git a/packages/alphatex/src/metadata/score/lyricsplacement.ts b/packages/alphatex/src/metadata/score/lyricsplacement.ts new file mode 100644 index 0000000000..07b8d10a49 --- /dev/null +++ b/packages/alphatex/src/metadata/score/lyricsplacement.ts @@ -0,0 +1,28 @@ +import * as alphaTab from '@coderline/alphatab'; +import { enumParameter } from '@coderline/alphatab-alphatex/enum'; +import type { MetadataTagDefinition } from '@coderline/alphatab-alphatex/types'; + +export const lyricsPlacement: MetadataTagDefinition = { + tag: '\\lyricsPlacement', + snippet: '\\lyricsPlacement ${1:below}$0', + shortDescription: 'Sets where lyrics are displayed.', + signatures: [ + { + parameters: [ + { + name: 'placement', + shortDescription: 'The placement to use', + parseMode: alphaTab.importer.alphaTex.ArgumentListParseTypesMode.Required, + ...enumParameter('LyricsPlacement') + } + ] + } + ], + examples: ` + \\lyricsPlacement below + \\track "Guitar" + \\staff { score tabs } + \\lyrics "Do Re Mi Fa" + 0.6.4 2.6.4 3.6.4 0.5.4 + ` +}; diff --git a/packages/ui/src/player/settings/schema.ts b/packages/ui/src/player/settings/schema.ts index 4dfe8f4cb9..e160f21bc9 100644 --- a/packages/ui/src/player/settings/schema.ts +++ b/packages/ui/src/player/settings/schema.ts @@ -502,6 +502,7 @@ export function buildSchema(module: AlphaTabModule): SchemaGroup[] { stylesheet('useSystemSignSeparator', 'System sign separator', { type: 'toggle' }), stylesheet('globalDisplayTuning', 'Show guitar tuning', { type: 'toggle' }), stylesheet('tuningDisplayMode', 'Tuning placement', { type: 'enum', options: enumOptions(m.TuningDisplayMode as unknown as EnumObject, { Score: 'Above the score', Staff: 'At the staff' }) }), + stylesheet('lyricsPlacement', 'Lyrics placement', { type: 'enum', options: enumOptions(m.LyricsPlacement as unknown as EnumObject, { Auto: 'Default', Below: 'Below the staff', Hidden: 'Hidden' }) }), stylesheet('globalDisplayChordDiagramsOnTop', 'Chord diagrams on top', { type: 'toggle' }), stylesheet('globalDisplayChordDiagramsInScore', 'Chord diagrams in the score', { type: 'toggle' }), stylesheet('singleTrackTrackNamePolicy', 'Track names (single track)', { type: 'enum', options: enumOptions(m.TrackNamePolicy as unknown as EnumObject) }), diff --git a/website/docs/features/render/coverage-lyrics.mdx b/website/docs/features/render/coverage-lyrics.mdx index c7e37e2858..852f2b128d 100644 --- a/website/docs/features/render/coverage-lyrics.mdx +++ b/website/docs/features/render/coverage-lyrics.mdx @@ -11,7 +11,7 @@ keywords: import { AlphaTab } from '@site/src/components/AlphaTab'; -Lyrics render below the staff with each syllable positioned under the beat it belongs to. alphaTab reads lyric lines from the source file or accepts them programmatically through the API. +Lyrics render with each syllable positioned under the beat it belongs to. alphaTab reads lyric lines from the source file or accepts them programmatically through the API. ## Aligning to beats {#alignment} @@ -42,6 +42,18 @@ Multiple verses stack below the staff, one line per verse — the way hymnals an :4 G3 :8 C4 :4 E4 D4 | :4 C4 :8 D4 :4 E4 C4 `} +## Placement {#placement} + +[`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) decides where the lyrics go. The default [`LyricsPlacement.Auto`](/docs/reference/types/model/lyricsplacement) shows them above the tab staff, between standard notation and tabs; a staff without tabs, like a vocal line, shows them below. `LyricsPlacement.Below` moves them below the last staff of the track, which keeps the space above the tabs free for bends, whammy bar and vibrato. `LyricsPlacement.Hidden` hides the lyrics of the score. In alphaTex, use `\lyricsPlacement auto|below|hidden`. + +{` +\\lyricsPlacement below +\\track "Guitar" +\\staff {score tabs} +\\lyrics "Bend it up and let it ring" +:4 7.3{b (0 4)} 9.3 :8 7.3 9.3 :4 7.2{v} | :2 9.3{b (0 4 0)} 7.3 +`} + ## Rendering fonts {#fonts} Lyrics use a dedicated font entry so a chart can restyle them without touching the rest of the score — the typical case for a hymnal that pairs a serif melody with a large sans-serif lyric line. Point `display.resources.wordsFont` at any registered family to change size, weight, or face. @@ -82,6 +94,7 @@ const api = new alphaTab.AlphaTabApi(container, { ## Where to look next - [Toggling notation elements off](./coverage-toggle-elements) — hide any category globally. +- [`RenderStylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) — the stylesheet entry for the lyrics placement. - [Custom text fonts](./custom-text-fonts) — configure the lyric font family and size. - [Font family fallbacks](./font-family-fallbacks) — handle missing font families gracefully. - [`notation.elements`](/docs/reference/settings/notation/elements) — the settings entry point for the element map. diff --git a/website/docs/releases/release1_10.mdx b/website/docs/releases/release1_10.mdx index e20f508f99..63343fd371 100644 --- a/website/docs/releases/release1_10.mdx +++ b/website/docs/releases/release1_10.mdx @@ -39,6 +39,19 @@ Numbered staves write every note instead of a single digit per beat. A chord is The previous display with a single digit of the first voice, as in Guitar Pro, is available as the new [`NumberedNoteMode.SingleNote`](/docs/reference/types/model/numberednotemode); it now shows the highest note of a chord. Details: [Chords and multiple voices](/docs/features/render/numbered-notation#chords-and-multiple-voices). +#### render: lyrics below the staff or hidden +https://github.com/CoderLine/alphaTab/issues/2776 + +The new [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) moves lyrics below the last staff of a track with [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement), which keeps the space above the tabs free for bends, whammy bar and vibrato, or hides them with `LyricsPlacement.Hidden`. alphaTex sets it with `\lyricsPlacement`. The default `LyricsPlacement.Auto` keeps the current placement. Details: [Lyrics placement](/docs/features/render/coverage-lyrics#placement). + +{` +\\lyricsPlacement below +\\track "Guitar" +\\staff {score tabs} +\\lyrics "Bend it up and let it ring" +:4 7.3{b (0 4)} 9.3 :8 7.3 9.3 :4 7.2{v} | :2 9.3{b (0 4 0)} 7.3 +`} + ### Kotlin #### kotlin: platform-independent alphaTab-core library From dd8a5d67808467a241b2b0f3ef707fd37ec37860 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 8 Nov 2026 02:12:30 +0100 Subject: [PATCH 2/4] feat(render): place lyrics relative to the standard notation staff Lyrics placement follows the Guitar Pro stylesheet: Below (default) or Above the standard notation staff, or Hidden. Without standard notation the lyrics move to the next shown staff in the cascade (tablature, slash, numbered), so tab-only tracks show them below the tabs. Guitar Pro files map System/hideLyrics to Hidden and System/drawLyricsUpside to Above; the exporter writes both keys. Refs #2776 --- packages/alphatab/src/Environment.ts | 20 +++++++----- .../alphatab/src/importer/BinaryStylesheet.ts | 18 +++++++++++ .../alphaTex/AlphaTex1EnumMappings.ts | 4 +-- .../alphaTex/AlphaTex1LanguageDefinitions.ts | 2 +- .../alphaTex/AlphaTex1LanguageHandler.ts | 2 +- .../alphatab/src/model/RenderStylesheet.ts | 12 +++++--- .../src/rendering/effects/LyricsEffectInfo.ts | 27 ++++++++++++---- .../lyrics-placement-above-score-tab.gp | Bin 0 -> 12413 bytes .../lyrics-placement-below-score-tab.gp | Bin 0 -> 12413 bytes .../guitarpro8/lyrics-placement-below-tab.gp | Bin 0 -> 12349 bytes .../lyrics-placement-hide-score-tab.gp | Bin 0 -> 12384 bytes .../test/importer/AlphaTexImporter.test.ts | 8 ++--- .../test/importer/Gp8Importer.test.ts | 13 ++++++++ .../AlphaTexImporter.test.ts.snap | 2 +- .../test/rendering/EffectPlacement.test.ts | 29 ++++++++++-------- .../features/EffectsAndAnnotations.test.ts | 2 ++ packages/alphatex/src/enum.ts | 7 ++--- .../src/metadata/score/lyricsplacement.ts | 4 +-- packages/ui/src/player/settings/schema.ts | 2 +- .../docs/features/render/coverage-lyrics.mdx | 4 +-- website/docs/releases/release1_10.mdx | 7 +++-- 21 files changed, 111 insertions(+), 52 deletions(-) create mode 100644 packages/alphatab/test-data/guitarpro8/lyrics-placement-above-score-tab.gp create mode 100644 packages/alphatab/test-data/guitarpro8/lyrics-placement-below-score-tab.gp create mode 100644 packages/alphatab/test-data/guitarpro8/lyrics-placement-below-tab.gp create mode 100644 packages/alphatab/test-data/guitarpro8/lyrics-placement-hide-score-tab.gp diff --git a/packages/alphatab/src/Environment.ts b/packages/alphatab/src/Environment.ts index 281453312d..a4f8f6539c 100644 --- a/packages/alphatab/src/Environment.ts +++ b/packages/alphatab/src/Environment.ts @@ -12,7 +12,6 @@ import { Logger } from '@coderline/alphatab/Logger'; import type { Font } from '@coderline/alphatab/model/Font'; import { GolpeType } from '@coderline/alphatab/model/GolpeType'; import { HarmonicType } from '@coderline/alphatab/model/HarmonicType'; -import { LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; import type { ICanvas } from '@coderline/alphatab/platform/ICanvas'; import { AlphaSynthWebWorklet } from '@coderline/alphatab/platform/javascript/AlphaSynthAudioWorkletOutput'; import { BrowserUiFacade } from '@coderline/alphatab/platform/javascript/BrowserUiFacade'; @@ -44,7 +43,10 @@ import { createGolpeEffectInfo } from '@coderline/alphatab/rendering/effects/Gol import { createHarmonicsEffectInfo } from '@coderline/alphatab/rendering/effects/HarmonicsEffectInfo'; import { leftHandTapEffectInfo } from '@coderline/alphatab/rendering/effects/LeftHandTapEffectInfo'; import { letRingEffectInfo } from '@coderline/alphatab/rendering/effects/LetRingEffectInfo'; -import { createLyricsEffectInfo } from '@coderline/alphatab/rendering/effects/LyricsEffectInfo'; +import { + lyricsAboveEffectInfo, + lyricsBelowEffectInfo +} from '@coderline/alphatab/rendering/effects/LyricsEffectInfo'; import { markerEffectInfo } from '@coderline/alphatab/rendering/effects/MarkerEffectInfo'; import { noteOrnamentEffectInfo } from '@coderline/alphatab/rendering/effects/NoteOrnamentEffectInfo'; import { numberedBarKeySignatureEffectInfo } from '@coderline/alphatab/rendering/effects/NumberedBarKeySignatureEffectInfo'; @@ -468,6 +470,8 @@ export class Environment { // // Slash new SlashBarRendererFactory([ + { effect: lyricsAboveEffectInfo, mode: EffectBandMode.OwnedTop }, + { effect: lyricsBelowEffectInfo, mode: EffectBandMode.OwnedBottom }, { effect: tempoEffectInfo, mode: EffectBandMode.SharedTop }, { effect: tripletFeelEffectInfo, mode: EffectBandMode.SharedTop }, { effect: markerEffectInfo, mode: EffectBandMode.SharedTop }, @@ -483,6 +487,8 @@ export class Environment { // // Score (standard notation) new ScoreBarRendererFactory([ + { effect: lyricsAboveEffectInfo, mode: EffectBandMode.OwnedTop }, + { effect: lyricsBelowEffectInfo, mode: EffectBandMode.OwnedBottom }, { effect: capoEffectInfo, mode: EffectBandMode.SharedTop }, { effect: fermataEffectInfo, mode: EffectBandMode.SharedTop }, { effect: beatBarreEffectInfo, mode: EffectBandMode.SharedTop }, @@ -536,6 +542,8 @@ export class Environment { // // Numbered new NumberedBarRendererFactory([ + { effect: lyricsAboveEffectInfo, mode: EffectBandMode.OwnedTop }, + { effect: lyricsBelowEffectInfo, mode: EffectBandMode.OwnedBottom }, { effect: numberedBarKeySignatureEffectInfo, mode: EffectBandMode.OwnedTop, order: 1000 }, { effect: slideLabelEffectInfo, mode: EffectBandMode.OwnedTop }, { effect: hammerPullLabelEffectInfo, mode: EffectBandMode.OwnedTop } @@ -544,8 +552,8 @@ export class Environment { // // Tabs new TabBarRendererFactory([ - { effect: createLyricsEffectInfo(LyricsPlacement.Auto), mode: EffectBandMode.SharedTop }, - + { effect: lyricsAboveEffectInfo, mode: EffectBandMode.OwnedTop }, + { effect: lyricsBelowEffectInfo, mode: EffectBandMode.OwnedBottom }, { effect: tabWhammyEffectInfo, mode: EffectBandMode.OwnedTop }, { effect: trillEffectInfo, mode: EffectBandMode.OwnedTop }, { effect: wideBeatVibratoEffectInfo, mode: EffectBandMode.OwnedTop }, @@ -579,9 +587,7 @@ export class Environment { effect: createGolpeEffectInfo(GolpeType.Thumb), mode: EffectBandMode.OwnedBottom, shouldCreate: staff => !staff.showStandardNotation - }, - // shared and last: bottom of the tab staff, or of the last shown staff without tabs - { effect: createLyricsEffectInfo(LyricsPlacement.Below), mode: EffectBandMode.SharedBottom } + } ]) ]; diff --git a/packages/alphatab/src/importer/BinaryStylesheet.ts b/packages/alphatab/src/importer/BinaryStylesheet.ts index b0a9b68f00..5e14844f76 100644 --- a/packages/alphatab/src/importer/BinaryStylesheet.ts +++ b/packages/alphatab/src/importer/BinaryStylesheet.ts @@ -8,6 +8,7 @@ import { Color } from '@coderline/alphatab/model/Color'; import { BarNumberDisplay, type BracketExtendMode, + LyricsPlacement, TrackNameMode, TrackNameOrientation, TrackNamePolicy, @@ -385,6 +386,13 @@ export class BinaryStylesheet { break; } } + + // hiding wins over the placement, independent of the key order + if (this.raw.get('System/hideLyrics') === true) { + score.stylesheet.lyricsPlacement = LyricsPlacement.Hidden; + } else if (this.raw.get('System/drawLyricsUpside') === true) { + score.stylesheet.lyricsPlacement = LyricsPlacement.Above; + } } private _toTextAlign(value: number): TextAlign { switch (value) { @@ -566,6 +574,16 @@ export class BinaryStylesheet { } binaryStylesheet.addValue('System/ExtendedBarLines', score.stylesheet.extendBarLines, DataType.Boolean); + binaryStylesheet.addValue( + 'System/hideLyrics', + score.stylesheet.lyricsPlacement === LyricsPlacement.Hidden, + DataType.Boolean + ); + binaryStylesheet.addValue( + 'System/drawLyricsUpside', + score.stylesheet.lyricsPlacement === LyricsPlacement.Above, + DataType.Boolean + ); const scoreStyle = score.style; if (scoreStyle) { diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts index 76e6c9ccb3..b82fba3d5c 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1EnumMappings.ts @@ -224,8 +224,8 @@ export class AlphaTex1EnumMappings { AlphaTex1EnumMappings.tuningDisplayMode ); public static readonly lyricsPlacement = new Map([ - ['auto', 0], - ['below', 1], + ['below', 0], + ['above', 1], ['hidden', 2] ]); public static readonly lyricsPlacementReversed = AlphaTex1EnumMappings._reverse( diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts index f1bd3749c6..6c694252be 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageDefinitions.ts @@ -182,7 +182,7 @@ export class AlphaTex1LanguageDefinitions { ['hidedynamics', null], ['usesystemsignseparator', null], ['tuningdisplaymode', [[[[100, 107], 0, ['score', 'staff']]]]], - ['lyricsplacement', [[[[100, 107], 0, ['auto', 'below', 'hidden']]]]], + ['lyricsplacement', [[[[100, 107], 0, ['below', 'above', 'hidden']]]]], ['multibarrest', null], ['bracketextendmode', [[[[100, 107], 0, ['nobrackets', 'groupstaves', 'groupsimilarinstruments']]]]], ['singletracktracknamepolicy', [[[[100, 107], 0, ['hidden', 'firstsystem', 'allsystems']]]]], diff --git a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts index a2d18658c1..377b393d65 100644 --- a/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts +++ b/packages/alphatab/src/importer/alphaTex/AlphaTex1LanguageHandler.ts @@ -2843,7 +2843,7 @@ export class AlphaTex1LanguageHandler implements IAlphaTexLanguageImportHandler ) ); } - if (stylesheet.lyricsPlacement !== LyricsPlacement.Auto) { + if (stylesheet.lyricsPlacement !== LyricsPlacement.Below) { nodes.push( Atnf.identMeta( 'lyricsPlacement', diff --git a/packages/alphatab/src/model/RenderStylesheet.ts b/packages/alphatab/src/model/RenderStylesheet.ts index b53e7c5793..1b73b40857 100644 --- a/packages/alphatab/src/model/RenderStylesheet.ts +++ b/packages/alphatab/src/model/RenderStylesheet.ts @@ -124,14 +124,16 @@ export enum BarNumberDisplay { */ export enum LyricsPlacement { /** - * Lyrics are displayed above the tablature staff. Staves without a tablature staff display them below the staff. + * Lyrics are displayed below the standard notation staff. Without standard notation, + * they are displayed below the next shown staff (tablature, slash, numbered). */ - Auto = 0, + Below = 0, /** - * Lyrics are displayed below the last staff (e.g. below the tablature staff for standard notation and tablature). + * Lyrics are displayed above the standard notation staff. Without standard notation, + * they are displayed above the next shown staff (tablature, slash, numbered). */ - Below = 1, + Above = 1, /** * Lyrics are not displayed. @@ -177,7 +179,7 @@ export class RenderStylesheet { * The place where lyrics are displayed. * @since 1.10.0 */ - public lyricsPlacement: LyricsPlacement = LyricsPlacement.Auto; + public lyricsPlacement: LyricsPlacement = LyricsPlacement.Below; /** * Whether to show the tuning.(per-track) diff --git a/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts b/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts index 69140e0837..e491c32498 100644 --- a/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts +++ b/packages/alphatab/src/rendering/effects/LyricsEffectInfo.ts @@ -10,20 +10,25 @@ import { LyricsGlyph } from '@coderline/alphatab/rendering/glyphs/LyricsGlyph'; import { OverlayRodPolicy } from '@coderline/alphatab/rendering/OverlayRodPolicy'; /** - * Creates the lyrics effect for one placement. Only the effect matching the - * `lyricsPlacement` of the score stylesheet creates glyphs. + * Creates the lyrics effect for one side of the staff. Glyphs are created only on the + * cascade-primary staff (standard notation, else the next shown one) and only for the + * `lyricsPlacement` of the score stylesheet. * @internal */ -export function createLyricsEffectInfo(placement: LyricsPlacement): EffectInfo { +function createLyricsEffectInfo(placement: LyricsPlacement): EffectInfo { return { - effectId: placement === LyricsPlacement.Below ? 'EffectLyricsBelow' : 'EffectLyrics', + effectId: placement === LyricsPlacement.Above ? 'EffectLyricsAbove' : 'EffectLyrics', notationElement: NotationElement.EffectLyrics, hideOnMultiTrack: false, sizingMode: EffectBarGlyphSizing.SingleOnBeat, placementCategory: EffectBandPlacementCategory.HorizontalRow, overlayRodPolicy: OverlayRodPolicy.Centered, - shouldCreateGlyph: (_renderer: BarRendererBase, beat: Beat): boolean => { - return !!beat.lyrics && beat.voice.bar.staff.track.score.stylesheet.lyricsPlacement === placement; + shouldCreateGlyph: (renderer: BarRendererBase, beat: Beat): boolean => { + return ( + !!beat.lyrics && + beat.voice.bar.staff.track.score.stylesheet.lyricsPlacement === placement && + renderer.staff!.isCascadePrimary + ); }, createNewGlyph: (renderer: BarRendererBase, beat: Beat): EffectGlyph => { return new LyricsGlyph( @@ -37,3 +42,13 @@ export function createLyricsEffectInfo(placement: LyricsPlacement): EffectInfo { canExpand: (_from: Beat, _to: Beat): boolean => true }; } + +/** + * @internal + */ +export const lyricsAboveEffectInfo: EffectInfo = createLyricsEffectInfo(LyricsPlacement.Above); + +/** + * @internal + */ +export const lyricsBelowEffectInfo: EffectInfo = createLyricsEffectInfo(LyricsPlacement.Below); diff --git a/packages/alphatab/test-data/guitarpro8/lyrics-placement-above-score-tab.gp b/packages/alphatab/test-data/guitarpro8/lyrics-placement-above-score-tab.gp new file mode 100644 index 0000000000000000000000000000000000000000..30c9ea6be176b0d49ad03593e82d24be085c41ca GIT binary patch literal 12413 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 S0wBJ=o?idJ;`K)W;Qs+xB)Cif literal 0 HcmV?d00001 diff --git a/packages/alphatab/test-data/guitarpro8/lyrics-placement-below-score-tab.gp b/packages/alphatab/test-data/guitarpro8/lyrics-placement-below-score-tab.gp new file mode 100644 index 0000000000000000000000000000000000000000..83514b9b800e105e22c2bedaabaa3066f5afa0fc GIT binary patch literal 12413 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 R0L0hV)9W8tzWxXR{69R3xnBSP literal 0 HcmV?d00001 diff --git a/packages/alphatab/test-data/guitarpro8/lyrics-placement-below-tab.gp b/packages/alphatab/test-data/guitarpro8/lyrics-placement-below-tab.gp new file mode 100644 index 0000000000000000000000000000000000000000..fdde8b09eea6cc141383206395dbadda2e35b9c8 GIT binary patch literal 12349 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 { \\bracketExtendMode nobrackets \\useSystemSignSeparator \\tuningDisplayMode staff - \\lyricsPlacement below + \\lyricsPlacement above \\singleTrackTrackNamePolicy allsystems \\multiTrackTrackNamePolicy Hidden \\firstSystemTrackNameMode fullname @@ -1870,7 +1870,7 @@ describe('AlphaTexImporterTest', () => { expect(score.stylesheet.bracketExtendMode).toBe(BracketExtendMode.NoBrackets); expect(score.stylesheet.useSystemSignSeparator).toBe(true); expect(score.stylesheet.tuningDisplayMode).toBe(TuningDisplayMode.Staff); - expect(score.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); + expect(score.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Above); expect(score.stylesheet.singleTrackTrackNamePolicy).toBe(TrackNamePolicy.AllSystems); expect(score.stylesheet.multiTrackTrackNamePolicy).toBe(TrackNamePolicy.Hidden); expect(score.stylesheet.firstSystemTrackNameMode).toBe(TrackNameMode.FullName); @@ -1881,8 +1881,8 @@ describe('AlphaTexImporterTest', () => { }); it('lyrics-placement', () => { - expect(parseTex('.').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Auto); - expect(parseTex('\\lyricsPlacement auto .').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Auto); + expect(parseTex('.').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); + expect(parseTex('\\lyricsPlacement below .').stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); const hidden = parseTex('\\lyricsPlacement hidden .'); expect(hidden.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Hidden); diff --git a/packages/alphatab/test/importer/Gp8Importer.test.ts b/packages/alphatab/test/importer/Gp8Importer.test.ts index 8b3751611f..94d885cb49 100644 --- a/packages/alphatab/test/importer/Gp8Importer.test.ts +++ b/packages/alphatab/test/importer/Gp8Importer.test.ts @@ -8,6 +8,7 @@ import { Duration } from '@coderline/alphatab/model/Duration'; import { BarNumberDisplay, BracketExtendMode, + LyricsPlacement, TrackNameMode, TrackNameOrientation, TrackNamePolicy, @@ -564,4 +565,16 @@ describe('Gp8ImporterTest', () => { expect(score.stylesheet.tuningDisplayMode).toBe(TuningDisplayMode.Staff); }) + + it('lyrics-placement', async () => { + async function placement(name: string): Promise { + const reader = await prepareImporterWithFile(`guitarpro8/lyrics-placement-${name}.gp`); + return reader.readScore().stylesheet.lyricsPlacement; + } + + expect(await placement('above-score-tab')).toBe(LyricsPlacement.Above); + expect(await placement('below-score-tab')).toBe(LyricsPlacement.Below); + expect(await placement('below-tab')).toBe(LyricsPlacement.Below); + expect(await placement('hide-score-tab')).toBe(LyricsPlacement.Hidden); + }); }); diff --git a/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap b/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap index 9c5b0e39ac..6fe4c266fa 100644 --- a/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap +++ b/packages/alphatab/test/importer/__snapshots__/AlphaTexImporter.test.ts.snap @@ -6178,7 +6178,7 @@ exports[`AlphaTexImporterTest > errors > at219 > lyricsplacement > parser-diagno "code" => 219, "severity" => 2, "message" => "Error parsing arguments: no overload matched arguments (). Signatures: -(auto|below|hidden)", +(below|above|hidden)", "start" => Map { "col" => 17, "line" => 1, diff --git a/packages/alphatab/test/rendering/EffectPlacement.test.ts b/packages/alphatab/test/rendering/EffectPlacement.test.ts index 260f1b1a8d..624aa161f6 100644 --- a/packages/alphatab/test/rendering/EffectPlacement.test.ts +++ b/packages/alphatab/test/rendering/EffectPlacement.test.ts @@ -218,7 +218,7 @@ describe('EffectPlacementTests', () => { for (const renderStaff of renderer.layout!.systems[0].allStaves) { const r = renderStaff.barRenderers[0]; for (const top of [true, false]) { - for (const effectId of ['EffectLyrics', 'EffectLyricsBelow']) { + for (const effectId of ['EffectLyrics', 'EffectLyricsAbove']) { if (band(r, effectId, top)) { locations.push(`${renderStaff.staffId}-${top ? 'top' : 'bottom'}`); } @@ -228,20 +228,12 @@ describe('EffectPlacementTests', () => { return locations; } - it('auto-score-tab', async () => { - expect(await lyricsBands('', 'score tabs')).toEqual(['tab-top']); - }); - - it('auto-tab', async () => { - expect(await lyricsBands('auto', 'tabs')).toEqual(['tab-top']); - }); - - it('auto-score', async () => { - expect(await lyricsBands('auto', 'score')).toEqual(['score-bottom']); + it('below-default-score-tab', async () => { + expect(await lyricsBands('', 'score tabs')).toEqual(['score-bottom']); }); it('below-score-tab', async () => { - expect(await lyricsBands('below', 'score tabs')).toEqual(['tab-bottom']); + expect(await lyricsBands('below', 'score tabs')).toEqual(['score-bottom']); }); it('below-tab', async () => { @@ -256,6 +248,19 @@ describe('EffectPlacementTests', () => { expect(await lyricsBands('below', 'slash')).toEqual(['slash-bottom']); }); + it('above-score-tab', async () => { + expect(await lyricsBands('above', 'score tabs')).toEqual(['score-top']); + }); + + it('above-tab', async () => { + expect(await lyricsBands('above', 'tabs')).toEqual(['tab-top']); + }); + + it('above-slash-tab', async () => { + // tabs come before slash in the staff cascade + expect(await lyricsBands('above', 'slash tabs')).toEqual(['tab-top']); + }); + it('hidden', async () => { expect((await lyricsBands('hidden', 'score tabs')).length).toBe(0); expect((await lyricsBands('hidden', 'tabs')).length).toBe(0); diff --git a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts index a14d5c25ce..c85894fd3d 100644 --- a/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/packages/alphatab/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -654,6 +654,8 @@ describe('EffectsAndAnnotationsTests', () => { it('below-score-tab', async () => await test('below-score-tab', 'below', 'score tabs')); it('below-tab', async () => await test('below-tab', 'below', 'tabs')); it('below-score', async () => await test('below-score', 'below', 'score')); + it('above-score-tab', async () => await test('above-score-tab', 'above', 'score tabs')); + it('above-tab', async () => await test('above-tab', 'above', 'tabs')); it('hidden', async () => await test('hidden', 'hidden', 'score tabs')); }); }); diff --git a/packages/alphatex/src/enum.ts b/packages/alphatex/src/enum.ts index 99ff9457a7..3f6777aa45 100644 --- a/packages/alphatex/src/enum.ts +++ b/packages/alphatex/src/enum.ts @@ -249,11 +249,8 @@ export const alphaTexMappedEnumMapping: { Staff: { snippet: 'staff', shortDescription: 'Display tuning note names beside tab staff lines.' } }, LyricsPlacement: { - Auto: { - snippet: 'auto', - shortDescription: 'Display lyrics above the tab staff, or below the staff if no tabs are shown.' - }, - Below: { snippet: 'below', shortDescription: 'Display lyrics below the last staff.' }, + Below: { snippet: 'below', shortDescription: 'Display lyrics below the standard notation staff.' }, + Above: { snippet: 'above', shortDescription: 'Display lyrics above the standard notation staff.' }, Hidden: { snippet: 'hidden', shortDescription: 'Do not display lyrics.' } }, TextAlign: { diff --git a/packages/alphatex/src/metadata/score/lyricsplacement.ts b/packages/alphatex/src/metadata/score/lyricsplacement.ts index 07b8d10a49..6f62cc64a9 100644 --- a/packages/alphatex/src/metadata/score/lyricsplacement.ts +++ b/packages/alphatex/src/metadata/score/lyricsplacement.ts @@ -4,7 +4,7 @@ import type { MetadataTagDefinition } from '@coderline/alphatab-alphatex/types'; export const lyricsPlacement: MetadataTagDefinition = { tag: '\\lyricsPlacement', - snippet: '\\lyricsPlacement ${1:below}$0', + snippet: '\\lyricsPlacement ${1:above}$0', shortDescription: 'Sets where lyrics are displayed.', signatures: [ { @@ -19,7 +19,7 @@ export const lyricsPlacement: MetadataTagDefinition = { } ], examples: ` - \\lyricsPlacement below + \\lyricsPlacement above \\track "Guitar" \\staff { score tabs } \\lyrics "Do Re Mi Fa" diff --git a/packages/ui/src/player/settings/schema.ts b/packages/ui/src/player/settings/schema.ts index e160f21bc9..eb08cf9395 100644 --- a/packages/ui/src/player/settings/schema.ts +++ b/packages/ui/src/player/settings/schema.ts @@ -502,7 +502,7 @@ export function buildSchema(module: AlphaTabModule): SchemaGroup[] { stylesheet('useSystemSignSeparator', 'System sign separator', { type: 'toggle' }), stylesheet('globalDisplayTuning', 'Show guitar tuning', { type: 'toggle' }), stylesheet('tuningDisplayMode', 'Tuning placement', { type: 'enum', options: enumOptions(m.TuningDisplayMode as unknown as EnumObject, { Score: 'Above the score', Staff: 'At the staff' }) }), - stylesheet('lyricsPlacement', 'Lyrics placement', { type: 'enum', options: enumOptions(m.LyricsPlacement as unknown as EnumObject, { Auto: 'Default', Below: 'Below the staff', Hidden: 'Hidden' }) }), + stylesheet('lyricsPlacement', 'Lyrics placement', { type: 'enum', options: enumOptions(m.LyricsPlacement as unknown as EnumObject, { Below: 'Below the staff', Above: 'Above the staff', Hidden: 'Hidden' }) }), stylesheet('globalDisplayChordDiagramsOnTop', 'Chord diagrams on top', { type: 'toggle' }), stylesheet('globalDisplayChordDiagramsInScore', 'Chord diagrams in the score', { type: 'toggle' }), stylesheet('singleTrackTrackNamePolicy', 'Track names (single track)', { type: 'enum', options: enumOptions(m.TrackNamePolicy as unknown as EnumObject) }), diff --git a/website/docs/features/render/coverage-lyrics.mdx b/website/docs/features/render/coverage-lyrics.mdx index 852f2b128d..aa07158af7 100644 --- a/website/docs/features/render/coverage-lyrics.mdx +++ b/website/docs/features/render/coverage-lyrics.mdx @@ -44,10 +44,10 @@ Multiple verses stack below the staff, one line per verse — the way hymnals an ## Placement {#placement} -[`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) decides where the lyrics go. The default [`LyricsPlacement.Auto`](/docs/reference/types/model/lyricsplacement) shows them above the tab staff, between standard notation and tabs; a staff without tabs, like a vocal line, shows them below. `LyricsPlacement.Below` moves them below the last staff of the track, which keeps the space above the tabs free for bends, whammy bar and vibrato. `LyricsPlacement.Hidden` hides the lyrics of the score. In alphaTex, use `\lyricsPlacement auto|below|hidden`. +[`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) decides where the lyrics go, like the lyrics setting of the Guitar Pro stylesheet. The placement is relative to the standard notation staff: [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (the default) shows them below it, `LyricsPlacement.Above` above it. When standard notation is not shown, the lyrics move to the next shown staff, in the order tablature, slash, numbered: a tab-only guitar part shows them below the tabs, which keeps the space above the tabs free for bends, whammy bar and vibrato. `LyricsPlacement.Hidden` hides the lyrics of the score. In alphaTex, use `\lyricsPlacement below|above|hidden`. The Guitar Pro importer and exporter read and write the setting. {` -\\lyricsPlacement below +\\lyricsPlacement above \\track "Guitar" \\staff {score tabs} \\lyrics "Bend it up and let it ring" diff --git a/website/docs/releases/release1_10.mdx b/website/docs/releases/release1_10.mdx index 63343fd371..028244f72a 100644 --- a/website/docs/releases/release1_10.mdx +++ b/website/docs/releases/release1_10.mdx @@ -39,13 +39,13 @@ Numbered staves write every note instead of a single digit per beat. A chord is The previous display with a single digit of the first voice, as in Guitar Pro, is available as the new [`NumberedNoteMode.SingleNote`](/docs/reference/types/model/numberednotemode); it now shows the highest note of a chord. Details: [Chords and multiple voices](/docs/features/render/numbered-notation#chords-and-multiple-voices). -#### render: lyrics below the staff or hidden +#### render: lyrics above or below the staff, or hidden https://github.com/CoderLine/alphaTab/issues/2776 -The new [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) moves lyrics below the last staff of a track with [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement), which keeps the space above the tabs free for bends, whammy bar and vibrato, or hides them with `LyricsPlacement.Hidden`. alphaTex sets it with `\lyricsPlacement`. The default `LyricsPlacement.Auto` keeps the current placement. Details: [Lyrics placement](/docs/features/render/coverage-lyrics#placement). +The new [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) places lyrics [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (default) or `LyricsPlacement.Above` the standard notation staff, or hides them with `LyricsPlacement.Hidden`, like the lyrics setting of the Guitar Pro stylesheet. Without standard notation, the lyrics move to the next shown staff (tablature, slash, numbered). alphaTex sets it with `\lyricsPlacement`, and the Guitar Pro importer and exporter read and write it. Details: [Lyrics placement](/docs/features/render/coverage-lyrics#placement). {` -\\lyricsPlacement below +\\lyricsPlacement above \\track "Guitar" \\staff {score tabs} \\lyrics "Bend it up and let it ring" @@ -65,6 +65,7 @@ alphaTab for Kotlin is published as two packages, like the .NET version. The new * Low octave dots on numbered staves sit below the duration lines instead of between digit and lines, as in printed jiǎnpǔ. * Numbered staves show all notes of chords and all voices. Set `notes` of the numbered staff configuration to `NumberedNoteMode.SingleNote` (alphaTex: `\defaultStaffDisplay numbered { notes singleNote }`) for one digit per beat; see [Single note mode](/docs/features/render/numbered-notation#single-note-mode). +* Lyrics of tab-only tracks are shown below the tab staff instead of above it. With standard notation and tabs, they sit directly below the standard notation staff. Set [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) to `LyricsPlacement.Above` (alphaTex: `\lyricsPlacement above`) to show them above the staff. #### Kotlin packages From 6b5e9e7ff9f12e2b20bf3f2d34a0238bbc008f4b Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 8 Nov 2026 02:20:36 +0100 Subject: [PATCH 3/4] feat(importer): read the lyrics placement from MusicXML MusicXML places each lyric on its own; the score-wide lyricsPlacement becomes Above only when every lyric of the file is placed above, so files mixing above and below keep the default. The Guitar Pro stylesheet keys are read with the casts the other keys use, which the C# target requires. Refs #2776 --- .../alphatab/src/importer/BinaryStylesheet.ts | 13 ++++-- .../alphatab/src/importer/MusicXmlImporter.ts | 17 +++++++- .../test/importer/Gp8Importer.test.ts | 18 ++++---- .../test/importer/MusicXmlImporter.test.ts | 41 ++++++++++++++++++- .../docs/features/render/coverage-lyrics.mdx | 2 +- website/docs/releases/release1_10.mdx | 2 +- 6 files changed, 77 insertions(+), 16 deletions(-) diff --git a/packages/alphatab/src/importer/BinaryStylesheet.ts b/packages/alphatab/src/importer/BinaryStylesheet.ts index 5e14844f76..e9b5b4a4d0 100644 --- a/packages/alphatab/src/importer/BinaryStylesheet.ts +++ b/packages/alphatab/src/importer/BinaryStylesheet.ts @@ -146,8 +146,16 @@ export class BinaryStylesheet { } public apply(score: Score): void { + let hideLyrics = false; + let drawLyricsUpside = false; for (const [key, value] of this.raw) { switch (key) { + case 'System/hideLyrics': + hideLyrics = value as boolean; + break; + case 'System/drawLyricsUpside': + drawLyricsUpside = value as boolean; + break; case 'StandardNotation/hideDynamics': score.stylesheet.hideDynamics = value as boolean; break; @@ -387,10 +395,9 @@ export class BinaryStylesheet { } } - // hiding wins over the placement, independent of the key order - if (this.raw.get('System/hideLyrics') === true) { + if (hideLyrics) { score.stylesheet.lyricsPlacement = LyricsPlacement.Hidden; - } else if (this.raw.get('System/drawLyricsUpside') === true) { + } else if (drawLyricsUpside) { score.stylesheet.lyricsPlacement = LyricsPlacement.Above; } } diff --git a/packages/alphatab/src/importer/MusicXmlImporter.ts b/packages/alphatab/src/importer/MusicXmlImporter.ts index 5e7ce159d8..795b339f97 100644 --- a/packages/alphatab/src/importer/MusicXmlImporter.ts +++ b/packages/alphatab/src/importer/MusicXmlImporter.ts @@ -41,7 +41,7 @@ import { NoteOrnament } from '@coderline/alphatab/model/NoteOrnament'; import { Ottavia } from '@coderline/alphatab/model/Ottavia'; import { PercussionMapper } from '@coderline/alphatab/model/PercussionMapper'; import { PickStroke } from '@coderline/alphatab/model/PickStroke'; -import { BarNumberDisplay } from '@coderline/alphatab/model/RenderStylesheet'; +import { BarNumberDisplay, LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; import { Score } from '@coderline/alphatab/model/Score'; import { Section } from '@coderline/alphatab/model/Section'; import { Staff } from '@coderline/alphatab/model/Staff'; @@ -282,6 +282,8 @@ export class MusicXmlImporter extends ScoreImporter { * Used to only store custom bar numbers where the measure number differs from it. */ private _nextBarNumber: number = 1; + private _lyricsCount: number = 0; + private _lyricsAboveCount: number = 0; private _divisionsPerQuarterNote: number = 1; /** @@ -308,6 +310,7 @@ export class MusicXmlImporter extends ScoreImporter { this._parseDom(dom); this._applySpans(); this._applyDynamics(); + this._applyLyricsPlacement(); ModelUtils.consolidate(this._score); this._score.finish(this.settings); this._score.rebuildRepeatGroups(); @@ -3654,7 +3657,19 @@ export class MusicXmlImporter extends ScoreImporter { newBeat.updateDurations(); } + private _applyLyricsPlacement() { + // the placement is per lyric, the stylesheet score-wide: above only if no lyric is below + if (this._lyricsCount > 0 && this._lyricsAboveCount === this._lyricsCount) { + this._score.stylesheet.lyricsPlacement = LyricsPlacement.Above; + } + } + private _parseLyric(element: XmlNode, beat: Beat, track: Track) { + this._lyricsCount++; + if (element.getAttribute('placement', '') === 'above') { + this._lyricsAboveCount++; + } + const info = this._indexToTrackInfo.get(track.index)!; const index = info.getLyricLine(element.getAttribute('number', '')); if (beat.lyrics === null) { diff --git a/packages/alphatab/test/importer/Gp8Importer.test.ts b/packages/alphatab/test/importer/Gp8Importer.test.ts index 94d885cb49..3435ae5c65 100644 --- a/packages/alphatab/test/importer/Gp8Importer.test.ts +++ b/packages/alphatab/test/importer/Gp8Importer.test.ts @@ -566,15 +566,15 @@ describe('Gp8ImporterTest', () => { }) - it('lyrics-placement', async () => { - async function placement(name: string): Promise { - const reader = await prepareImporterWithFile(`guitarpro8/lyrics-placement-${name}.gp`); - return reader.readScore().stylesheet.lyricsPlacement; - } + async function lyricsPlacement(name: string): Promise { + const reader = await prepareImporterWithFile(`guitarpro8/lyrics-placement-${name}.gp`); + return reader.readScore().stylesheet.lyricsPlacement; + } - expect(await placement('above-score-tab')).toBe(LyricsPlacement.Above); - expect(await placement('below-score-tab')).toBe(LyricsPlacement.Below); - expect(await placement('below-tab')).toBe(LyricsPlacement.Below); - expect(await placement('hide-score-tab')).toBe(LyricsPlacement.Hidden); + it('lyrics-placement', async () => { + expect(await lyricsPlacement('above-score-tab')).toBe(LyricsPlacement.Above); + expect(await lyricsPlacement('below-score-tab')).toBe(LyricsPlacement.Below); + expect(await lyricsPlacement('below-tab')).toBe(LyricsPlacement.Below); + expect(await lyricsPlacement('hide-score-tab')).toBe(LyricsPlacement.Hidden); }); }); diff --git a/packages/alphatab/test/importer/MusicXmlImporter.test.ts b/packages/alphatab/test/importer/MusicXmlImporter.test.ts index 85b89019a5..7569b8c09d 100644 --- a/packages/alphatab/test/importer/MusicXmlImporter.test.ts +++ b/packages/alphatab/test/importer/MusicXmlImporter.test.ts @@ -15,7 +15,7 @@ import { ModelUtils } from '@coderline/alphatab/model/ModelUtils'; import { Ottavia } from '@coderline/alphatab/model/Ottavia'; import { PlaybackInformation } from '@coderline/alphatab/model/PlaybackInformation'; import type { Note } from '@coderline/alphatab/model/Note'; -import { BarNumberDisplay } from '@coderline/alphatab/model/RenderStylesheet'; +import { BarNumberDisplay, LyricsPlacement } from '@coderline/alphatab/model/RenderStylesheet'; import type { Score } from '@coderline/alphatab/model/Score'; import { SimileMark } from '@coderline/alphatab/model/SimileMark'; import { VibratoType } from '@coderline/alphatab/model/VibratoType'; @@ -2073,4 +2073,43 @@ describe('MusicXmlImporterTests', () => { expect(tempoPosition(' sound="yes"')).toBe(0.5); }); }); + + describe('lyrics-placement', () => { + function placement(lyricAttributes: string[]): LyricsPlacement { + let notes = ''; + for (const attributes of lyricAttributes) { + notes += `C41quarterla`; + } + const xml = `P11G2${notes}`; + const score = MusicXmlImporterTestHelper.prepareImporterWithBytes(IOHelper.stringToBytes(xml)).readScore(); + return score.stylesheet.lyricsPlacement; + } + + it('all-above', () => { + expect(placement([' placement="above"', ' placement="above"'])).toBe(LyricsPlacement.Above); + }); + + it('mixed', () => { + expect(placement([' placement="above"', ' placement="below"'])).toBe(LyricsPlacement.Below); + expect(placement([' placement="above"', ''])).toBe(LyricsPlacement.Below); + }); + + it('unspecified', () => { + expect(placement(['', ''])).toBe(LyricsPlacement.Below); + const noLyrics: string[] = []; + expect(placement(noLyrics)).toBe(LyricsPlacement.Below); + }); + + it('testsuite-mixed-voices', async () => { + // voice 1 above, voice 2 below the staff: the score-wide placement stays below + const twoVoices = await MusicXmlImporterTestHelper.loadFile( + 'test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml' + ); + expect(twoVoices.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); + const multiStaff = await MusicXmlImporterTestHelper.loadFile( + 'test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.xml' + ); + expect(multiStaff.stylesheet.lyricsPlacement).toBe(LyricsPlacement.Below); + }); + }); }); diff --git a/website/docs/features/render/coverage-lyrics.mdx b/website/docs/features/render/coverage-lyrics.mdx index aa07158af7..077b1817ba 100644 --- a/website/docs/features/render/coverage-lyrics.mdx +++ b/website/docs/features/render/coverage-lyrics.mdx @@ -44,7 +44,7 @@ Multiple verses stack below the staff, one line per verse — the way hymnals an ## Placement {#placement} -[`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) decides where the lyrics go, like the lyrics setting of the Guitar Pro stylesheet. The placement is relative to the standard notation staff: [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (the default) shows them below it, `LyricsPlacement.Above` above it. When standard notation is not shown, the lyrics move to the next shown staff, in the order tablature, slash, numbered: a tab-only guitar part shows them below the tabs, which keeps the space above the tabs free for bends, whammy bar and vibrato. `LyricsPlacement.Hidden` hides the lyrics of the score. In alphaTex, use `\lyricsPlacement below|above|hidden`. The Guitar Pro importer and exporter read and write the setting. +[`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) decides where the lyrics go, like the lyrics setting of the Guitar Pro stylesheet. The placement is relative to the standard notation staff: [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (the default) shows them below it, `LyricsPlacement.Above` above it. When standard notation is not shown, the lyrics move to the next shown staff, in the order tablature, slash, numbered: a tab-only guitar part shows them below the tabs, which keeps the space above the tabs free for bends, whammy bar and vibrato. `LyricsPlacement.Hidden` hides the lyrics of the score. In alphaTex, use `\lyricsPlacement below|above|hidden`. The Guitar Pro importer and exporter read and write the setting; the MusicXML importer sets `Above` when all lyrics of the file are placed above the staff. {` \\lyricsPlacement above diff --git a/website/docs/releases/release1_10.mdx b/website/docs/releases/release1_10.mdx index 028244f72a..de0c380d01 100644 --- a/website/docs/releases/release1_10.mdx +++ b/website/docs/releases/release1_10.mdx @@ -42,7 +42,7 @@ The previous display with a single digit of the first voice, as in Guitar Pro, i #### render: lyrics above or below the staff, or hidden https://github.com/CoderLine/alphaTab/issues/2776 -The new [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) places lyrics [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (default) or `LyricsPlacement.Above` the standard notation staff, or hides them with `LyricsPlacement.Hidden`, like the lyrics setting of the Guitar Pro stylesheet. Without standard notation, the lyrics move to the next shown staff (tablature, slash, numbered). alphaTex sets it with `\lyricsPlacement`, and the Guitar Pro importer and exporter read and write it. Details: [Lyrics placement](/docs/features/render/coverage-lyrics#placement). +The new [`score.stylesheet.lyricsPlacement`](/docs/reference/types/model/renderstylesheet/#lyricsplacement) places lyrics [`LyricsPlacement.Below`](/docs/reference/types/model/lyricsplacement) (default) or `LyricsPlacement.Above` the standard notation staff, or hides them with `LyricsPlacement.Hidden`, like the lyrics setting of the Guitar Pro stylesheet. Without standard notation, the lyrics move to the next shown staff (tablature, slash, numbered). alphaTex sets it with `\lyricsPlacement`, the Guitar Pro importer and exporter read and write it, and the MusicXML importer sets `Above` when all lyrics are placed above the staff. Details: [Lyrics placement](/docs/features/render/coverage-lyrics#placement). {` \\lyricsPlacement above From 676cbe63f6ef83d39a1e490dfb7435dd755be23f Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 8 Nov 2026 02:38:17 +0100 Subject: [PATCH 4/4] test(render): add the reviewed lyrics placement references Refs #2776 --- .../lyrics-placement-above-score-tab.png | Bin 0 -> 28401 bytes .../lyrics-placement-above-tab.png | Bin 0 -> 17717 bytes .../lyrics-placement-below-score-tab.png | Bin 0 -> 28943 bytes .../lyrics-placement-below-score.png | Bin 0 -> 15255 bytes .../lyrics-placement-below-tab.png | Bin 0 -> 17731 bytes .../lyrics-placement-hidden.png | Bin 0 -> 25337 bytes .../visual-tests/general/font-fallback.png | Bin 22172 -> 22159 bytes .../overlay-rod-multi-staff-aggregation.png | Bin 15023 -> 15022 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-above-score-tab.png create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-above-tab.png create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score-tab.png create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score.png create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-tab.png create mode 100644 packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-hidden.png diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-above-score-tab.png b/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-above-score-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..b89a5ff85607d133a085656cb1ed5c28546a2853 GIT binary patch literal 28401 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 z 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 O4*0a$uLZw2Mf?}>!{w(wnH%P^1Ov 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 A(f|Me literal 0 HcmV?d00001 diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score-tab.png b/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..823b0b7bf2e4aa8adbf7a06a0f16abbe94fe68fd GIT binary patch literal 28943 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 Te4;&s-UB{mbF$(Guj~H_&h0^d literal 0 HcmV?d00001 diff --git a/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score.png b/packages/alphatab/test-data/visual-tests/effects-and-annotations/lyrics-placement-below-score.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2bca231e3ec2eb9f573d3abad5494ca1c4ba0f GIT binary patch literal 15255 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 YRD;ltiDEn18+aTTGwYwrf5P4W2OOjvVE_OC diff --git a/packages/alphatab/test-data/visual-tests/overlay-rod-spacing/overlay-rod-multi-staff-aggregation.png b/packages/alphatab/test-data/visual-tests/overlay-rod-spacing/overlay-rod-multi-staff-aggregation.png index af6f0d8af5cfebe6fa234bd2f92316041fc6c6af..f39dc52fc9dd150e6cad51d5c0cb4fb081a12a8e 100644 GIT binary patch delta 6544 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%0D!&b{i2v`AyXSTOsm+3yAB^9h9?dG@ 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 as^;XATT!3fph0xBA4JDcyIkw>%l`pp1?J2E delta 6517 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 Byg&c|