Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions packages/alphatab/src/exporter/GpifWriter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1739,34 +1739,31 @@ export class GpifWriter {

instrumentSet.addElement('Name').innerText = GpifWriter._drumKitProgramInfo.instrumentSetName;
instrumentSet.addElement('Type').innerText = GpifWriter._drumKitProgramInfo.instrumentSetType;
const currentElementType: string = '';
let currentElementName: string = '';
let currentElement: XmlNode | null = null;
let currentArticulations: XmlNode = new XmlNode();
const counterPerType = new Map<string, number>();
const elements = instrumentSet.addElement('Elements');
for (const articulation of articulations) {
if (!currentElementType || currentElementType !== articulation.elementType) {
const currentElement = elements.addElement('Element');

let name = articulation.elementType;
if (counterPerType.has(name)) {
const counter = counterPerType.get(name)!;
name += ` ${counter}`;
counterPerType.set(name, counter + 1);
} else {
counterPerType.set(name, 1);
}

currentElementName = name;
currentElement.addElement('Name').innerText = name;
// Group by elementName (e.g., 'Snare', 'Charley', 'Kick Drum')
// If elementName is not set, fall back to elementType
const elementNameToUse = articulation.elementName || articulation.elementType;

if (!currentElementName || currentElementName !== elementNameToUse) {
currentElement = elements.addElement('Element');
currentElementName = elementNameToUse;

currentElement.addElement('Name').innerText = elementNameToUse;
currentElement.addElement('Type').innerText = articulation.elementType;
currentElement.addElement('SoundbankName').innerText = articulation.soundbankName || '';

currentArticulations = currentElement.addElement('Articulations');
}

const articulationNode = currentArticulations.addElement('Articulation');
articulationNode.addElement('Name').innerText =
// Use articulationName if available, otherwise generate a name
const articulationNameToUse = articulation.articulationName ||
`${currentElementName} ${currentArticulations.childNodes.length}`;
articulationNode.addElement('Name').innerText = articulationNameToUse;
articulationNode.addElement('StaffLine').innerText = articulation.staffLine.toString();
articulationNode.addElement('Noteheads').innerText = [
this._mapMusicSymbol(articulation.noteHeadDefault),
Expand All @@ -1791,7 +1788,11 @@ export class GpifWriter {
articulationNode.addElement('TechniqueSymbol').innerText = this._mapMusicSymbol(
articulation.techniqueSymbol
);
articulationNode.addElement('InputMidiNumbers').innerText = '';
// Write InputMidiNumbers using the inputMidiNumber field
articulationNode.addElement('InputMidiNumbers').innerText =
articulation.inputMidiNumber > 0 ? articulation.inputMidiNumber.toString() : '';
// Write OutputRSESound
articulationNode.addElement('OutputRSESound').innerText = articulation.outputRSESound || '';
articulationNode.addElement('OutputMidiNumber').innerText = articulation.outputMidiNumber.toString();
}
} else {
Expand Down
1 change: 1 addition & 0 deletions packages/alphatab/src/generated/DisplaySettingsJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ export interface DisplaySettingsJson {
*
* * Comparing files against each other (top/bottom comparison)
* * Aligning the playback of multiple files on one screen assuming the same tempo (e.g. one file per track).
* @deprecated Use the {@link LayoutMode.Parchment} to display a music sheet respecting the systems layout.
*/
systemsLayoutMode?: SystemsLayoutMode | keyof typeof SystemsLayoutMode | Lowercase<keyof typeof SystemsLayoutMode>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ export class InstrumentArticulationSerializer {
o.set("techniquesymbol", obj.techniqueSymbol as number);
o.set("techniquesymbolplacement", obj.techniqueSymbolPlacement as number);
o.set("outputmidinumber", obj.outputMidiNumber);
o.set("inputmidinumber", obj.inputMidiNumber);
o.set("outputrsesound", obj.outputRSESound);
o.set("soundbankname", obj.soundbankName);
o.set("articulationname", obj.articulationName);
o.set("elementname", obj.elementName);
return o;
}
public static setProperty(obj: InstrumentArticulation, property: string, v: unknown): boolean {
Expand Down Expand Up @@ -58,6 +63,21 @@ export class InstrumentArticulationSerializer {
case "outputmidinumber":
obj.outputMidiNumber = v! as number;
return true;
case "inputmidinumber":
obj.inputMidiNumber = v! as number;
return true;
case "outputrsesound":
obj.outputRSESound = v! as string;
return true;
case "soundbankname":
obj.soundbankName = v! as string;
return true;
case "articulationname":
obj.articulationName = v! as string;
return true;
case "elementname":
obj.elementName = v! as string;
return true;
}
return false;
}
Expand Down
10 changes: 10 additions & 0 deletions packages/alphatab/src/importer/MusicXmlImporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,13 @@ class TrackInfo {

private static _defaultNoteArticulation: InstrumentArticulation = new InstrumentArticulation(
'Default',
'Default',
'Default',
0,
0,
0,
'',
'',
MusicFontSymbol.NoteheadBlack,
MusicFontSymbol.NoteheadHalf,
MusicFontSymbol.NoteheadWhole
Expand Down Expand Up @@ -169,9 +174,14 @@ class TrackInfo {
const staffLine = musicXmlStaffSteps - stepDifference;

const newArticulation = new InstrumentArticulation(
articulation.elementName,
articulation.elementType,
articulation.articulationName,
staffLine,
articulation.inputMidiNumber,
articulation.outputMidiNumber,
articulation.outputRSESound,
articulation.soundbankName,
articulation.noteHeadDefault,
articulation.noteHeadHalf,
articulation.noteHeadWhole,
Expand Down
39 changes: 37 additions & 2 deletions packages/alphatab/src/model/InstrumentArticulation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,54 @@ export class InstrumentArticulation {
*/
public outputMidiNumber: number;

/**
* Gets or sets the input MIDI number for this articulation.
*/
public inputMidiNumber: number;

/**
* Gets or sets the RSE sound path for playback (e.g., 'stick.hit.hit').
*/
public outputRSESound: string;

/**
* Gets or sets the soundbank name for the element (e.g., 'Master-Snare').
*/
public soundbankName: string;

/**
* Gets or sets the display name for this articulation (e.g., 'Snare (hit)').
*/
public articulationName: string;

/**
* Gets or sets the display name for the element (e.g., 'Snare').
*/
public elementName: string;

public constructor(
elementName: string = '',
elementType: string = '',
articulationName: string = '',
staffLine: number = 0,
inputMidiNumber: number = 0,
outputMidiNumber: number = 0,
outputRSESound: string = '',
soundbankName: string = '',
noteHeadDefault: MusicFontSymbol = MusicFontSymbol.None,
noteHeadHalf: MusicFontSymbol = MusicFontSymbol.None,
noteHeadWhole: MusicFontSymbol = MusicFontSymbol.None,
techniqueSymbol: MusicFontSymbol = MusicFontSymbol.None,
techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Inside
techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Outside,
) {
this.elementName = elementName;
this.elementType = elementType;
this.outputMidiNumber = outputMidiNumber;
this.articulationName = articulationName;
this.staffLine = staffLine;
this.inputMidiNumber = inputMidiNumber;
this.outputMidiNumber = outputMidiNumber;
this.outputRSESound = outputRSESound;
this.soundbankName = soundbankName;
this.noteHeadDefault = noteHeadDefault;
this.noteHeadHalf = noteHeadHalf !== MusicFontSymbol.None ? noteHeadHalf : noteHeadDefault;
this.noteHeadWhole = noteHeadWhole !== MusicFontSymbol.None ? noteHeadWhole : noteHeadDefault;
Expand Down
Loading