From 1adfd3f1dd294bf8f40238b45261ef2996bb92c1 Mon Sep 17 00:00:00 2001 From: L-Sun Date: Sun, 28 Dec 2025 15:11:38 +0800 Subject: [PATCH 1/5] fix(exporter): add missing tags of percussion in gp exporter --- packages/alphatab/src/exporter/GpifWriter.ts | 37 +- .../model/InstrumentArticulationSerializer.ts | 20 + .../src/model/InstrumentArticulation.ts | 37 +- .../alphatab/src/model/PercussionMapper.ts | 1258 +++++++++-------- 4 files changed, 779 insertions(+), 573 deletions(-) diff --git a/packages/alphatab/src/exporter/GpifWriter.ts b/packages/alphatab/src/exporter/GpifWriter.ts index a01ed2701..d7522a229 100644 --- a/packages/alphatab/src/exporter/GpifWriter.ts +++ b/packages/alphatab/src/exporter/GpifWriter.ts @@ -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(); 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), @@ -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 { diff --git a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts index 2e91ec8b8..3049e83a0 100644 --- a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts +++ b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts @@ -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 { @@ -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; } diff --git a/packages/alphatab/src/model/InstrumentArticulation.ts b/packages/alphatab/src/model/InstrumentArticulation.ts index 47d1415aa..6e465778d 100644 --- a/packages/alphatab/src/model/InstrumentArticulation.ts +++ b/packages/alphatab/src/model/InstrumentArticulation.ts @@ -72,6 +72,31 @@ 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( elementType: string = '', staffLine: number = 0, @@ -80,7 +105,12 @@ export class InstrumentArticulation { noteHeadHalf: MusicFontSymbol = MusicFontSymbol.None, noteHeadWhole: MusicFontSymbol = MusicFontSymbol.None, techniqueSymbol: MusicFontSymbol = MusicFontSymbol.None, - techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Inside + techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Inside, + inputMidiNumber: number = 0, + outputRSESound: string = '', + soundbankName: string = '', + articulationName: string = '', + elementName: string = '' ) { this.elementType = elementType; this.outputMidiNumber = outputMidiNumber; @@ -90,6 +120,11 @@ export class InstrumentArticulation { this.noteHeadWhole = noteHeadWhole !== MusicFontSymbol.None ? noteHeadWhole : noteHeadDefault; this.techniqueSymbol = techniqueSymbol; this.techniqueSymbolPlacement = techniqueSymbolPlacement; + this.inputMidiNumber = inputMidiNumber; + this.outputRSESound = outputRSESound; + this.soundbankName = soundbankName; + this.articulationName = articulationName; + this.elementName = elementName; } public getSymbol(duration: Duration): MusicFontSymbol { diff --git a/packages/alphatab/src/model/PercussionMapper.ts b/packages/alphatab/src/model/PercussionMapper.ts index 6654fce0f..28e289b19 100644 --- a/packages/alphatab/src/model/PercussionMapper.ts +++ b/packages/alphatab/src/model/PercussionMapper.ts @@ -42,10 +42,11 @@ export class PercussionMapper { /* * This map was generated using the following steps: - * 1. Make a new GP7 file with a drumkit track + * 1. Make a new GP8 file with a drumkit track * 2. Add one note for each midi value using the instrument panel - * 3. Load the file in alphaTab and set a breakpoint in the GP7 importer. - * 4. Use the following snipped in the console to generate the map initializer (fix enums manually): + * 3. Load the file in alphaTab and set a breakpoint in the GP8 importer. + * 4. Use the following snippet in the console to generate the map initializer (fix enums manually): + * * parser = new DOMParser(); * xmlDoc = parser.parseFromString(xml, 'text/xml'); * articulations = xmlDoc.getElementsByTagName('Articulation'); @@ -53,186 +54,274 @@ export class PercussionMapper { * s = ''; * for(let i = 0; i < articulations.length; i++) { * const articulation = articulations[i]; - * let midi = articulation.getElementsByTagName('InputMidiNumbers'); - * if(midi.length === 1) { - * midi = midi[0].textContent; - * const elementType = articulation.parentElement.parentElement.getElementsByTagName('Type')[0].textContent; - * const outputMidiNumber = articulation.getElementsByTagName('OutputMidiNumber')[0].textContent; - * const staffLine = articulation.getElementsByTagName('StaffLine')[0].textContent; - * const techniqueSymbol = articulation.getElementsByTagName('TechniqueSymbol')[0].textContent; - * const techniquePlacement = articulation.getElementsByTagName('TechniquePlacement')[0].textContent; - * const noteHeads = articulation.getElementsByTagName('Noteheads')[0].textContent.split(' ').map(n=>n = 'MusicFontSymbol.' + n); - * if(!existingArticulations.has(midi)) { - * if(techniqueSymbol) { - * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]}, ${techniqueSymbol}, ${techniquePlacement})],\r\n`; - * } - * else { - * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]})],\r\n`; - * } - * existingArticulations.set(midi, true); - * } - * } + * let inputMidiNumbers = articulation.getElementsByTagName('InputMidiNumbers'); + * if(inputMidiNumbers.length === 1 && inputMidiNumbers[0].textContent) { + * const midi = inputMidiNumbers[0].textContent; + * if(!existingArticulations.has(midi)) { + * // Get Element-level data + * const element = articulation.parentElement.parentElement; + * const elementType = element.getElementsByTagName('Type')[0].textContent; + * const elementName = element.getElementsByTagName('Name')[0].textContent; + * const soundbankName = element.getElementsByTagName('SoundbankName')[0]?.textContent || ''; + * + * // Get Articulation-level data + * const articulationName = articulation.getElementsByTagName('Name')[0].textContent; + * const outputMidiNumber = articulation.getElementsByTagName('OutputMidiNumber')[0].textContent; + * const staffLine = articulation.getElementsByTagName('StaffLine')[0].textContent; + * const techniqueSymbol = articulation.getElementsByTagName('TechniqueSymbol')[0].textContent; + * const techniquePlacement = articulation.getElementsByTagName('TechniquePlacement')[0].textContent; + * const outputRSESound = articulation.getElementsByTagName('OutputRSESound')[0]?.textContent || ''; + * const noteHeads = articulation.getElementsByTagName('Noteheads')[0].textContent.split(' ').map(n => 'MusicFontSymbol.' + n); + * + * // Map technique placement to enum + * const placementMap = { + * 'above': 'TechniqueSymbolPlacement.Above', + * 'below': 'TechniqueSymbolPlacement.Below', + * 'inside': 'TechniqueSymbolPlacement.Inside', + * 'outside': 'TechniqueSymbolPlacement.Outside' + * }; + * const placementEnum = placementMap[techniquePlacement] || 'TechniqueSymbolPlacement.Inside'; + * + * // Map technique symbol to enum (if exists) + * const techniqueSymbolEnum = techniqueSymbol ? 'MusicFontSymbol.' + techniqueSymbol : 'MusicFontSymbol.None'; + * + * // Generate the code + * s += ` new InstrumentArticulation(\r\n`; + * s += ` '${elementType}',\r\n`; + * s += ` ${staffLine},\r\n`; + * s += ` ${outputMidiNumber},\r\n`; + * s += ` ${noteHeads[0]},\r\n`; + * s += ` ${noteHeads[1]},\r\n`; + * s += ` ${noteHeads[2]},\r\n`; + * s += ` ${techniqueSymbolEnum},\r\n`; + * s += ` ${placementEnum},\r\n`; + * s += ` ${midi},\r\n`; + * s += ` '${outputRSESound}',\r\n`; + * s += ` '${soundbankName}',\r\n`; + * s += ` '${articulationName}',\r\n`; + * s += ` '${elementName}'\r\n`; + * s += ` ), \r\n`; + * + * existingArticulations.set(midi, true); + * } + * } * } - * copy(s) + * // Add the array wrapper + * console.log('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); + * copy('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); */ - public static instrumentArticulations: Map = new Map([ - [ - 38, - new InstrumentArticulation( + public static instrumentArticulations: Map = new Map([ + new InstrumentArticulation( 'snare', 3, 38, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 37, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 38, + 'stick.hit.hit', + 'Master-Snare', + 'Snare (hit)', + 'Snare' + ), + new InstrumentArticulation( 'snare', 3, 37, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 91, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 37, + 'stick.hit.sidestick', + 'Master-Snare', + 'Snare (side stick)', + 'Snare' + ), + new InstrumentArticulation( 'snare', 3, 38, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 42, - new InstrumentArticulation( + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 91, + 'stick.hit.rimshot', + 'Master-Snare', + 'Snare (rim shot)', + 'Snare' + ), + new InstrumentArticulation( 'hiHat', -1, 42, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 92, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 42, + 'stick.hit.closed', + 'Master-Hihat', + 'Hi-Hat (closed)', + 'Charley' + ), + new InstrumentArticulation( 'hiHat', -1, 46, MusicFontSymbol.NoteheadCircleSlash, MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.NoteheadCircleSlash - ) - ], - [ - 46, - new InstrumentArticulation( + MusicFontSymbol.NoteheadCircleSlash, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 92, + 'stick.hit.half', + 'Master-Hihat', + 'Hi-Hat (half)', + 'Charley' + ), + new InstrumentArticulation( 'hiHat', -1, 46, MusicFontSymbol.NoteheadCircleX, MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.NoteheadCircleX - ) - ], - [ - 44, - new InstrumentArticulation( + MusicFontSymbol.NoteheadCircleX, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 46, + 'stick.hit.open', + 'Master-Hihat', + 'Hi-Hat (open)', + 'Charley' + ), + new InstrumentArticulation( 'hiHat', 9, 44, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 35, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 44, + 'pedal.hit.pedal', + 'Master-Hihat', + 'Pedal Hi-Hat (hit)', + 'Charley' + ), + new InstrumentArticulation( 'kickDrum', 8, 35, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 36, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 35, + 'pedal.hit.hit', + 'AcousticKick-Percu', + 'Kick (hit)', + 'Acoustic Kick Drum' + ), + new InstrumentArticulation( 'kickDrum', 7, 36, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 50, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 36, + 'pedal.hit.hit', + 'Master-Kick', + 'Kick (hit)', + 'Kick Drum' + ), + new InstrumentArticulation( 'tom', 1, 50, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 48, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 50, + 'stick.hit.hit', + 'Master-Tom05', + 'High Floor Tom (hit)', + 'Tom Very High' + ), + new InstrumentArticulation( 'tom', 2, 48, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 47, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 48, + 'stick.hit.hit', + 'Master-Tom04', + 'High Tom (hit)', + 'Tom High' + ), + new InstrumentArticulation( 'tom', 4, 47, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 45, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 47, + 'stick.hit.hit', + 'Master-Tom03', + 'Mid Tom (hit)', + 'Tom Medium' + ), + new InstrumentArticulation( 'tom', 5, 45, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 43, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 45, + 'stick.hit.hit', + 'Master-Tom02', + 'Low Tom (hit)', + 'Tom Low' + ), + new InstrumentArticulation( 'tom', 6, 43, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 93, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 43, + 'stick.hit.hit', + 'Master-Tom01', + 'Very Low Tom (hit)', + 'Tom Very Low' + ), + new InstrumentArticulation( 'ride', 0, 51, @@ -240,34 +329,44 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.PictEdgeOfCymbal, - TechniqueSymbolPlacement.Below - ) - ], - [ - 51, - new InstrumentArticulation( + TechniqueSymbolPlacement.Above, + 93, + 'stick.hit.edge', + 'Master-Ride', + 'Ride (edge)', + 'Ride' + ), + new InstrumentArticulation( 'ride', 0, 51, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 53, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 51, + 'stick.hit.mid', + 'Master-Ride', + 'Ride (middle)', + 'Ride' + ), + new InstrumentArticulation( 'ride', 0, 53, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 94, - new InstrumentArticulation( + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 53, + 'stick.hit.bell', + 'Master-Ride', + 'Ride (bell)', + 'Ride' + ), + new InstrumentArticulation( 'ride', 0, 51, @@ -275,23 +374,29 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Above - ) - ], - [ - 55, - new InstrumentArticulation( + TechniqueSymbolPlacement.Outside, + 94, + 'stick.hit.choke', + 'Master-Ride', + 'Ride (choke)', + 'Ride' + ), + new InstrumentArticulation( 'splash', -2, 55, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 95, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 55, + 'stick.hit.hit', + 'Master-Splash', + 'Splash (hit)', + 'Splash' + ), + new InstrumentArticulation( 'splash', -2, 55, @@ -299,45 +404,59 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Below - ) - ], - [ - 52, - new InstrumentArticulation( + TechniqueSymbolPlacement.Outside, + 95, + 'stick.hit.choke', + 'Master-Splash', + 'Splash (choke)', + 'Splash' + ), + new InstrumentArticulation( 'china', -3, 52, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat - ) - ], - [ - 96, - new InstrumentArticulation( + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 52, + 'stick.hit.hit', + 'Master-China', + 'China (hit)', + 'China' + ), + new InstrumentArticulation( 'china', -3, 52, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat - ) - ], - [ - 49, - new InstrumentArticulation( + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 96, + 'stick.hit.choke', + 'Master-China', + 'China (choke)', + 'China' + ), + new InstrumentArticulation( 'crash', -2, 49, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX - ) - ], - [ - 97, - new InstrumentArticulation( + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 49, + 'stick.hit.hit', + 'Master-Crash02', + 'Crash high (hit)', + 'Crash High' + ), + new InstrumentArticulation( 'crash', -2, 49, @@ -345,23 +464,29 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Below - ) - ], - [ - 57, - new InstrumentArticulation( + TechniqueSymbolPlacement.Outside, + 97, + 'stick.hit.choke', + 'Master-Crash02', + 'Crash high (choke)', + 'Crash High' + ), + new InstrumentArticulation( 'crash', -1, 57, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX - ) - ], - [ - 98, - new InstrumentArticulation( + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 57, + 'stick.hit.hit', + 'Master-Crash01', + 'Crash medium (hit)', + 'Crash Medium' + ), + new InstrumentArticulation( 'crash', -1, 57, @@ -369,111 +494,149 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Below - ) - ], - [ - 99, - new InstrumentArticulation( + TechniqueSymbolPlacement.Outside, + 98, + 'stick.hit.choke', + 'Master-Crash01', + 'Crash medium (choke)', + 'Crash Medium' + ), + new InstrumentArticulation( 'cowbell', 1, 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 100, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 99, + 'stick.hit.hit', + 'CowbellBig-Percu', + 'Cowbell low (hit)', + 'Cowbell Low' + ), + new InstrumentArticulation( 'cowbell', 1, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 56, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 100, + 'stick.hit.tip', + 'CowbellBig-Percu', + 'Cowbell low (tip)', + 'Cowbell Low' + ), + new InstrumentArticulation( 'cowbell', 0, 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 101, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 56, + 'stick.hit.hit', + 'CowbellMid-Percu', + 'Cowbell medium (hit)', + 'Cowbell Medium' + ), + new InstrumentArticulation( 'cowbell', 0, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 102, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 101, + 'stick.hit.tip', + 'CowbellMid-Percu', + 'Cowbell medium (tip)', + 'Cowbell Medium' + ), + new InstrumentArticulation( 'cowbell', -1, 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 103, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 102, + 'stick.hit.hit', + 'CowbellSmall-Percu', + 'Cowbell high (hit)', + 'Cowbell High' + ), + new InstrumentArticulation( 'cowbell', -1, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 77, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 103, + 'stick.hit.tip', + 'CowbellSmall-Percu', + 'Cowbell high (tip)', + 'Cowbell High' + ), + new InstrumentArticulation( 'woodblock', -9, 77, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 76, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 77, + 'stick.hit.hit', + 'WoodblockLow-Percu', + 'Woodblock low (hit)', + 'Woodblock Low' + ), + new InstrumentArticulation( 'woodblock', -10, 76, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 60, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 76, + 'stick.hit.hit', + 'WoodblockHigh-Percu', + 'Woodblock high (hit)', + 'Woodblock High' + ), + new InstrumentArticulation( 'bongo', -4, 60, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 104, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 60, + 'hand.hit.hit', + 'BongoHigh-Percu', + 'Bongo High (hit)', + 'Bongo High' + ), + new InstrumentArticulation( 'bongo', -5, 60, @@ -481,34 +644,44 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ) - ], - [ - 105, - new InstrumentArticulation( + TechniqueSymbolPlacement.Inside, + 104, + 'hand.hit.mute', + 'BongoHigh-Percu', + 'Bongo High (mute)', + 'Bongo High' + ), + new InstrumentArticulation( 'bongo', -6, 60, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 61, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 105, + 'hand.hit.slap', + 'BongoHigh-Percu', + 'Bongo High (slap)', + 'Bongo High' + ), + new InstrumentArticulation( 'bongo', -7, 61, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 106, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 61, + 'hand.hit.hit', + 'BongoLow-Percu', + 'Bongo Low (hit)', + 'Bongo Low' + ), + new InstrumentArticulation( 'bongo', -8, 61, @@ -516,89 +689,119 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ) - ], - [ - 107, - new InstrumentArticulation( + TechniqueSymbolPlacement.Inside, + 106, + 'hand.hit.mute', + 'BongoLow-Percu', + 'Bongo Low (mute)', + 'Bongo Low' + ), + new InstrumentArticulation( 'bongo', -16, 61, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 66, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 107, + 'hand.hit.slap', + 'BongoLow-Percu', + 'Bongo Low (slap)', + 'Bongo Low' + ), + new InstrumentArticulation( 'timbale', 10, 66, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 65, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 66, + 'stick.hit.hit', + 'TimbaleLow-Percu', + 'Timbale low (hit)', + 'Timbale Low' + ), + new InstrumentArticulation( 'timbale', 9, 65, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 68, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 65, + 'stick.hit.hit', + 'TimbaleHigh-Percu', + 'Timbale high (hit)', + 'Timbale High' + ), + new InstrumentArticulation( 'agogo', 12, 68, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 67, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 68, + 'stick.hit.hit', + 'AgogoLow-Percu', + 'Agogo low (hit)', + 'Agogo Low' + ), + new InstrumentArticulation( 'agogo', 11, 67, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 64, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 67, + 'stick.hit.hit', + 'AgogoHigh-Percu', + 'Agogo high (hit)', + 'Agogo High' + ), + new InstrumentArticulation( 'conga', 17, 64, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 108, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 64, + 'hand.hit.hit', + 'CongaLow-Percu', + 'Conga low (hit)', + 'Conga Low' + ), + new InstrumentArticulation( 'conga', 16, 64, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 109, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 108, + 'hand.hit.slap', + 'CongaLow-Percu', + 'Conga low (slap)', + 'Conga Low' + ), + new InstrumentArticulation( 'conga', 15, 64, @@ -606,34 +809,44 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ) - ], - [ - 63, - new InstrumentArticulation( + TechniqueSymbolPlacement.Inside, + 109, + 'hand.hit.mute', + 'CongaLow-Percu', + 'Conga low (mute)', + 'Conga Low' + ), + new InstrumentArticulation( 'conga', 14, 63, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 110, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 63, + 'hand.hit.hit', + 'CongaHigh-Percu', + 'Conga high (hit)', + 'Conga High' + ), + new InstrumentArticulation( 'conga', 13, 63, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 62, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 110, + 'hand.hit.slap', + 'CongaHigh-Percu', + 'Conga high (slap)', + 'Conga High' + ), + new InstrumentArticulation( 'conga', 19, 62, @@ -641,67 +854,89 @@ export class PercussionMapper { MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ) - ], - [ - 72, - new InstrumentArticulation( + TechniqueSymbolPlacement.Inside, + 62, + 'hand.hit.mute', + 'CongaHigh-Percu', + 'Conga high (mute)', + 'Conga High' + ), + new InstrumentArticulation( 'whistle', -11, 72, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 71, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 72, + 'blow.hit.hit', + 'WhistleLow-Percu', + 'Whistle low (hit)', + 'Whistle Low' + ), + new InstrumentArticulation( 'whistle', -17, 71, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 73, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 71, + 'blow.hit.hit', + 'WhistleHigh-Percu', + 'Whistle high (hit)', + 'Whistle High' + ), + new InstrumentArticulation( 'guiro', 38, 73, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 74, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 73, + 'stick.hit.hit', + 'Guiro-Percu', + 'Guiro (hit)', + 'Guiro' + ), + new InstrumentArticulation( 'guiro', 37, 74, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 86, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 74, + 'stick.scrape.return', + 'Guiro-Percu', + 'Guiro (scrap-return)', + 'Guiro' + ), + new InstrumentArticulation( 'surdo', 36, 86, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ) - ], - [ - 87, - new InstrumentArticulation( + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 86, + 'brush.hit.hit', + 'Surdo-Percu', + 'Surdo (hit)', + 'Surdo' + ), + new InstrumentArticulation( 'surdo', 35, 87, @@ -709,23 +944,29 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ) - ], - [ - 54, - new InstrumentArticulation( + TechniqueSymbolPlacement.Inside, + 87, + 'brush.hit.mute', + 'Surdo-Percu', + 'Surdo (mute)', + 'Surdo' + ), + new InstrumentArticulation( 'tambourine', 3, 54, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 111, - new InstrumentArticulation( + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 54, + 'hand.hit.hit', + 'Tambourine-Percu', + 'Tambourine (hit)', + 'Tambourine' + ), + new InstrumentArticulation( 'tambourine', 2, 54, @@ -733,12 +974,14 @@ export class PercussionMapper { MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ) - ], - [ - 112, - new InstrumentArticulation( + TechniqueSymbolPlacement.Above, + 111, + 'hand.hit.return', + 'Tambourine-Percu', + 'Tambourine (return)', + 'Tambourine' + ), + new InstrumentArticulation( 'tambourine', 1, 54, @@ -746,67 +989,61 @@ export class PercussionMapper { MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.StringsDownBow, - TechniqueSymbolPlacement.Below - ) - ], - [ - 113, - new InstrumentArticulation( + TechniqueSymbolPlacement.Above, + 112, + 'hand.hit.roll', + 'Tambourine-Percu', + 'Tambourine (roll)', + 'Tambourine' + ), + new InstrumentArticulation( 'tambourine', -7, 54, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 79, - new InstrumentArticulation( + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.None, + TechniqueSymbolPlacement.Outside, + 113, + 'hand.hit.handhit', + 'Tambourine-Percu', + 'Tambourine (hand)', + 'Tambourine' + ), + new InstrumentArticulation( 'cuica', 30, 79, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 78, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'cuica', 29, 78, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 58, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'vibraslap', 28, 58, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 81, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'triangle', 27, 81, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 80, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'triangle', 26, 80, @@ -815,55 +1052,40 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 114, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'grancassa', 25, 43, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 115, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'piatti', 18, 49, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 116, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'piatti', 24, 49, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 69, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'cabasa', 23, 69, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 117, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'cabasa', 22, 69, @@ -872,44 +1094,32 @@ export class PercussionMapper { MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 85, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'castanets', 21, 85, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 75, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'claves', 20, 75, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 70, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'maraca', -12, 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 118, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'maraca', -13, 70, @@ -918,22 +1128,16 @@ export class PercussionMapper { MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 119, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'maraca', -14, 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 120, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'maraca', -15, 70, @@ -942,22 +1146,16 @@ export class PercussionMapper { MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 82, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'shaker', -23, 54, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 122, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'shaker', -24, 54, @@ -966,22 +1164,16 @@ export class PercussionMapper { MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 84, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'bellTree', -18, 53, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 123, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'bellTree', -19, 53, @@ -990,22 +1182,16 @@ export class PercussionMapper { MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 83, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'jingleBell', -20, 53, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 124, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'unpitched', -21, 62, @@ -1014,11 +1200,8 @@ export class PercussionMapper { MusicFontSymbol.NoteheadNull, MusicFontSymbol.GuitarGolpe, TechniqueSymbolPlacement.Above - ) - ], - [ - 125, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'unpitched', -22, 62, @@ -1027,55 +1210,40 @@ export class PercussionMapper { MusicFontSymbol.NoteheadNull, MusicFontSymbol.GuitarGolpe, TechniqueSymbolPlacement.Below - ) - ], - [ - 39, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'handClap', 3, 39, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 40, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'snare', 3, 40, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 31, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'snare', 3, 40, MusicFontSymbol.NoteheadSlashedBlack2, MusicFontSymbol.NoteheadSlashedBlack2, MusicFontSymbol.NoteheadSlashedBlack2 - ) - ], - [ - 41, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'tom', 5, 41, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 59, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'ride', 2, 59, @@ -1084,33 +1252,24 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.PictEdgeOfCymbal, TechniqueSymbolPlacement.Below - ) - ], - [ - 126, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'ride', 2, 59, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 127, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'ride', 2, 59, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 29, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'ride', 2, 59, @@ -1119,33 +1278,24 @@ export class PercussionMapper { MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Above - ) - ], - [ - 30, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'crash', -3, 49, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 33, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'snare', 3, 37, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 34, - new InstrumentArticulation( + ), + new InstrumentArticulation( 'snare', 3, 38, @@ -1153,8 +1303,8 @@ export class PercussionMapper { MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadBlack ) - ] - ]); + ].map(articulation => [articulation.inputMidiNumber, articulation]) +); // these are manually defined names/identifiers for the articulation list above. // they are currently only used in the AlphaTex importer when using default articulations From 8b564e40adea0238e832a84b43cb40ace067fda7 Mon Sep 17 00:00:00 2001 From: L-Sun Date: Sun, 28 Dec 2025 16:10:32 +0800 Subject: [PATCH 2/5] refactor: adjust parameters order --- .../src/model/InstrumentArticulation.ts | 24 +- .../alphatab/src/model/PercussionMapper.ts | 2494 +++++++++-------- 2 files changed, 1299 insertions(+), 1219 deletions(-) diff --git a/packages/alphatab/src/model/InstrumentArticulation.ts b/packages/alphatab/src/model/InstrumentArticulation.ts index 6e465778d..08e42d266 100644 --- a/packages/alphatab/src/model/InstrumentArticulation.ts +++ b/packages/alphatab/src/model/InstrumentArticulation.ts @@ -98,33 +98,33 @@ export class InstrumentArticulation { 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, - inputMidiNumber: number = 0, - outputRSESound: string = '', - soundbankName: string = '', - articulationName: string = '', - elementName: string = '' + 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; this.techniqueSymbol = techniqueSymbol; this.techniqueSymbolPlacement = techniqueSymbolPlacement; - this.inputMidiNumber = inputMidiNumber; - this.outputRSESound = outputRSESound; - this.soundbankName = soundbankName; - this.articulationName = articulationName; - this.elementName = elementName; } public getSymbol(duration: Duration): MusicFontSymbol { diff --git a/packages/alphatab/src/model/PercussionMapper.ts b/packages/alphatab/src/model/PercussionMapper.ts index 28e289b19..a4648b27d 100644 --- a/packages/alphatab/src/model/PercussionMapper.ts +++ b/packages/alphatab/src/model/PercussionMapper.ts @@ -50,28 +50,31 @@ export class PercussionMapper { * parser = new DOMParser(); * xmlDoc = parser.parseFromString(xml, 'text/xml'); * articulations = xmlDoc.getElementsByTagName('Articulation'); + * capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1); * existingArticulations = new Map(); * s = ''; * for(let i = 0; i < articulations.length; i++) { * const articulation = articulations[i]; * let inputMidiNumbers = articulation.getElementsByTagName('InputMidiNumbers'); * if(inputMidiNumbers.length === 1 && inputMidiNumbers[0].textContent) { - * const midi = inputMidiNumbers[0].textContent; - * if(!existingArticulations.has(midi)) { + * const inputMidiNumber = inputMidiNumbers[0].textContent; + * if(!existingArticulations.has(inputMidiNumber)) { * // Get Element-level data * const element = articulation.parentElement.parentElement; * const elementType = element.getElementsByTagName('Type')[0].textContent; * const elementName = element.getElementsByTagName('Name')[0].textContent; * const soundbankName = element.getElementsByTagName('SoundbankName')[0]?.textContent || ''; - * + * * // Get Articulation-level data * const articulationName = articulation.getElementsByTagName('Name')[0].textContent; * const outputMidiNumber = articulation.getElementsByTagName('OutputMidiNumber')[0].textContent; * const staffLine = articulation.getElementsByTagName('StaffLine')[0].textContent; - * const techniqueSymbol = articulation.getElementsByTagName('TechniqueSymbol')[0].textContent; + * const techniqueSymbol = capitalize(articulation.getElementsByTagName('TechniqueSymbol')[0].textContent); * const techniquePlacement = articulation.getElementsByTagName('TechniquePlacement')[0].textContent; * const outputRSESound = articulation.getElementsByTagName('OutputRSESound')[0]?.textContent || ''; - * const noteHeads = articulation.getElementsByTagName('Noteheads')[0].textContent.split(' ').map(n => 'MusicFontSymbol.' + n); + * const noteHeads = articulation.getElementsByTagName('Noteheads')[0] + * .textContent.split(' ') + * .map(n => 'MusicFontSymbol.' + capitalize(n)); * * // Map technique placement to enum * const placementMap = { @@ -87,22 +90,22 @@ export class PercussionMapper { * * // Generate the code * s += ` new InstrumentArticulation(\r\n`; + * s += ` '${elementName}',\r\n`; * s += ` '${elementType}',\r\n`; + * s += ` '${articulationName}',\r\n`; * s += ` ${staffLine},\r\n`; + * s += ` ${inputMidiNumber},\r\n`; * s += ` ${outputMidiNumber},\r\n`; + * s += ` '${outputRSESound}',\r\n`; + * s += ` '${soundbankName}',\r\n`; * s += ` ${noteHeads[0]},\r\n`; * s += ` ${noteHeads[1]},\r\n`; * s += ` ${noteHeads[2]},\r\n`; * s += ` ${techniqueSymbolEnum},\r\n`; - * s += ` ${placementEnum},\r\n`; - * s += ` ${midi},\r\n`; - * s += ` '${outputRSESound}',\r\n`; - * s += ` '${soundbankName}',\r\n`; - * s += ` '${articulationName}',\r\n`; - * s += ` '${elementName}'\r\n`; + * s += ` ${placementEnum}\r\n`; * s += ` ), \r\n`; * - * existingArticulations.set(midi, true); + * existingArticulations.set(inputMidiNumber, true); * } * } * } @@ -110,1201 +113,1274 @@ export class PercussionMapper { * console.log('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); * copy('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); */ - public static instrumentArticulations: Map = new Map([ - new InstrumentArticulation( - 'snare', - 3, - 38, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 38, - 'stick.hit.hit', - 'Master-Snare', - 'Snare (hit)', - 'Snare' - ), - new InstrumentArticulation( - 'snare', - 3, - 37, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 37, - 'stick.hit.sidestick', - 'Master-Snare', - 'Snare (side stick)', - 'Snare' - ), - new InstrumentArticulation( - 'snare', - 3, - 38, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 91, - 'stick.hit.rimshot', - 'Master-Snare', - 'Snare (rim shot)', - 'Snare' - ), - new InstrumentArticulation( - 'hiHat', - -1, - 42, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 42, - 'stick.hit.closed', - 'Master-Hihat', - 'Hi-Hat (closed)', - 'Charley' - ), - new InstrumentArticulation( - 'hiHat', - -1, - 46, - MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 92, - 'stick.hit.half', - 'Master-Hihat', - 'Hi-Hat (half)', - 'Charley' - ), - new InstrumentArticulation( - 'hiHat', - -1, - 46, - MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 46, - 'stick.hit.open', - 'Master-Hihat', - 'Hi-Hat (open)', - 'Charley' - ), - new InstrumentArticulation( - 'hiHat', - 9, - 44, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 44, - 'pedal.hit.pedal', - 'Master-Hihat', - 'Pedal Hi-Hat (hit)', - 'Charley' - ), - new InstrumentArticulation( - 'kickDrum', - 8, - 35, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 35, - 'pedal.hit.hit', - 'AcousticKick-Percu', - 'Kick (hit)', - 'Acoustic Kick Drum' - ), - new InstrumentArticulation( - 'kickDrum', - 7, - 36, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 36, - 'pedal.hit.hit', - 'Master-Kick', - 'Kick (hit)', - 'Kick Drum' - ), - new InstrumentArticulation( - 'tom', - 1, - 50, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 50, - 'stick.hit.hit', - 'Master-Tom05', - 'High Floor Tom (hit)', - 'Tom Very High' - ), - new InstrumentArticulation( - 'tom', - 2, - 48, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 48, - 'stick.hit.hit', - 'Master-Tom04', - 'High Tom (hit)', - 'Tom High' - ), - new InstrumentArticulation( - 'tom', - 4, - 47, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 47, - 'stick.hit.hit', - 'Master-Tom03', - 'Mid Tom (hit)', - 'Tom Medium' - ), - new InstrumentArticulation( - 'tom', - 5, - 45, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 45, - 'stick.hit.hit', - 'Master-Tom02', - 'Low Tom (hit)', - 'Tom Low' - ), - new InstrumentArticulation( - 'tom', - 6, - 43, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 43, - 'stick.hit.hit', - 'Master-Tom01', - 'Very Low Tom (hit)', - 'Tom Very Low' - ), - new InstrumentArticulation( - 'ride', - 0, - 51, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.PictEdgeOfCymbal, - TechniqueSymbolPlacement.Above, - 93, - 'stick.hit.edge', - 'Master-Ride', - 'Ride (edge)', - 'Ride' - ), - new InstrumentArticulation( - 'ride', - 0, - 51, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 51, - 'stick.hit.mid', - 'Master-Ride', - 'Ride (middle)', - 'Ride' - ), - new InstrumentArticulation( - 'ride', - 0, - 53, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 53, - 'stick.hit.bell', - 'Master-Ride', - 'Ride (bell)', - 'Ride' - ), - new InstrumentArticulation( - 'ride', - 0, - 51, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside, - 94, - 'stick.hit.choke', - 'Master-Ride', - 'Ride (choke)', - 'Ride' - ), - new InstrumentArticulation( - 'splash', - -2, - 55, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 55, - 'stick.hit.hit', - 'Master-Splash', - 'Splash (hit)', - 'Splash' - ), - new InstrumentArticulation( - 'splash', - -2, - 55, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside, - 95, - 'stick.hit.choke', - 'Master-Splash', - 'Splash (choke)', - 'Splash' - ), - new InstrumentArticulation( - 'china', - -3, - 52, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 52, - 'stick.hit.hit', - 'Master-China', - 'China (hit)', - 'China' - ), - new InstrumentArticulation( - 'china', - -3, - 52, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 96, - 'stick.hit.choke', - 'Master-China', - 'China (choke)', - 'China' - ), - new InstrumentArticulation( - 'crash', - -2, - 49, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 49, - 'stick.hit.hit', - 'Master-Crash02', - 'Crash high (hit)', - 'Crash High' - ), - new InstrumentArticulation( - 'crash', - -2, - 49, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside, - 97, - 'stick.hit.choke', - 'Master-Crash02', - 'Crash high (choke)', - 'Crash High' - ), - new InstrumentArticulation( - 'crash', - -1, - 57, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 57, - 'stick.hit.hit', - 'Master-Crash01', - 'Crash medium (hit)', - 'Crash Medium' - ), - new InstrumentArticulation( - 'crash', - -1, - 57, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside, - 98, - 'stick.hit.choke', - 'Master-Crash01', - 'Crash medium (choke)', - 'Crash Medium' - ), - new InstrumentArticulation( - 'cowbell', - 1, - 56, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 99, - 'stick.hit.hit', - 'CowbellBig-Percu', - 'Cowbell low (hit)', - 'Cowbell Low' - ), - new InstrumentArticulation( - 'cowbell', - 1, - 56, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 100, - 'stick.hit.tip', - 'CowbellBig-Percu', - 'Cowbell low (tip)', - 'Cowbell Low' - ), - new InstrumentArticulation( - 'cowbell', - 0, - 56, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 56, - 'stick.hit.hit', - 'CowbellMid-Percu', - 'Cowbell medium (hit)', - 'Cowbell Medium' - ), - new InstrumentArticulation( - 'cowbell', - 0, - 56, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 101, - 'stick.hit.tip', - 'CowbellMid-Percu', - 'Cowbell medium (tip)', - 'Cowbell Medium' - ), - new InstrumentArticulation( - 'cowbell', - -1, - 56, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 102, - 'stick.hit.hit', - 'CowbellSmall-Percu', - 'Cowbell high (hit)', - 'Cowbell High' - ), - new InstrumentArticulation( - 'cowbell', - -1, - 56, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 103, - 'stick.hit.tip', - 'CowbellSmall-Percu', - 'Cowbell high (tip)', - 'Cowbell High' - ), - new InstrumentArticulation( - 'woodblock', - -9, - 77, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 77, - 'stick.hit.hit', - 'WoodblockLow-Percu', - 'Woodblock low (hit)', - 'Woodblock Low' - ), - new InstrumentArticulation( - 'woodblock', - -10, - 76, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 76, - 'stick.hit.hit', - 'WoodblockHigh-Percu', - 'Woodblock high (hit)', - 'Woodblock High' - ), - new InstrumentArticulation( - 'bongo', - -4, - 60, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 60, - 'hand.hit.hit', - 'BongoHigh-Percu', - 'Bongo High (hit)', - 'Bongo High' - ), - new InstrumentArticulation( - 'bongo', - -5, - 60, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside, - 104, - 'hand.hit.mute', - 'BongoHigh-Percu', - 'Bongo High (mute)', - 'Bongo High' - ), - new InstrumentArticulation( - 'bongo', - -6, - 60, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 105, - 'hand.hit.slap', - 'BongoHigh-Percu', - 'Bongo High (slap)', - 'Bongo High' - ), - new InstrumentArticulation( - 'bongo', - -7, - 61, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 61, - 'hand.hit.hit', - 'BongoLow-Percu', - 'Bongo Low (hit)', - 'Bongo Low' - ), - new InstrumentArticulation( - 'bongo', - -8, - 61, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside, - 106, - 'hand.hit.mute', - 'BongoLow-Percu', - 'Bongo Low (mute)', - 'Bongo Low' - ), - new InstrumentArticulation( - 'bongo', - -16, - 61, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 107, - 'hand.hit.slap', - 'BongoLow-Percu', - 'Bongo Low (slap)', - 'Bongo Low' - ), - new InstrumentArticulation( - 'timbale', - 10, - 66, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 66, - 'stick.hit.hit', - 'TimbaleLow-Percu', - 'Timbale low (hit)', - 'Timbale Low' - ), - new InstrumentArticulation( - 'timbale', - 9, - 65, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 65, - 'stick.hit.hit', - 'TimbaleHigh-Percu', - 'Timbale high (hit)', - 'Timbale High' - ), - new InstrumentArticulation( - 'agogo', - 12, - 68, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 68, - 'stick.hit.hit', - 'AgogoLow-Percu', - 'Agogo low (hit)', - 'Agogo Low' - ), - new InstrumentArticulation( - 'agogo', - 11, - 67, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 67, - 'stick.hit.hit', - 'AgogoHigh-Percu', - 'Agogo high (hit)', - 'Agogo High' - ), - new InstrumentArticulation( - 'conga', - 17, - 64, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 64, - 'hand.hit.hit', - 'CongaLow-Percu', - 'Conga low (hit)', - 'Conga Low' - ), - new InstrumentArticulation( - 'conga', - 16, - 64, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 108, - 'hand.hit.slap', - 'CongaLow-Percu', - 'Conga low (slap)', - 'Conga Low' - ), - new InstrumentArticulation( - 'conga', - 15, - 64, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside, - 109, - 'hand.hit.mute', - 'CongaLow-Percu', - 'Conga low (mute)', - 'Conga Low' - ), - new InstrumentArticulation( - 'conga', - 14, - 63, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 63, - 'hand.hit.hit', - 'CongaHigh-Percu', - 'Conga high (hit)', - 'Conga High' - ), - new InstrumentArticulation( - 'conga', - 13, - 63, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 110, - 'hand.hit.slap', - 'CongaHigh-Percu', - 'Conga high (slap)', - 'Conga High' - ), - new InstrumentArticulation( - 'conga', - 19, - 62, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside, - 62, - 'hand.hit.mute', - 'CongaHigh-Percu', - 'Conga high (mute)', - 'Conga High' - ), - new InstrumentArticulation( - 'whistle', - -11, - 72, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 72, - 'blow.hit.hit', - 'WhistleLow-Percu', - 'Whistle low (hit)', - 'Whistle Low' - ), - new InstrumentArticulation( - 'whistle', - -17, - 71, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 71, - 'blow.hit.hit', - 'WhistleHigh-Percu', - 'Whistle high (hit)', - 'Whistle High' - ), - new InstrumentArticulation( - 'guiro', - 38, - 73, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 73, - 'stick.hit.hit', - 'Guiro-Percu', - 'Guiro (hit)', - 'Guiro' - ), - new InstrumentArticulation( - 'guiro', - 37, - 74, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 74, - 'stick.scrape.return', - 'Guiro-Percu', - 'Guiro (scrap-return)', - 'Guiro' - ), - new InstrumentArticulation( - 'surdo', - 36, - 86, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 86, - 'brush.hit.hit', - 'Surdo-Percu', - 'Surdo (hit)', - 'Surdo' - ), - new InstrumentArticulation( - 'surdo', - 35, - 87, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside, - 87, - 'brush.hit.mute', - 'Surdo-Percu', - 'Surdo (mute)', - 'Surdo' - ), - new InstrumentArticulation( - 'tambourine', - 3, - 54, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 54, - 'hand.hit.hit', - 'Tambourine-Percu', - 'Tambourine (hit)', - 'Tambourine' - ), - new InstrumentArticulation( - 'tambourine', - 2, - 54, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Above, - 111, - 'hand.hit.return', - 'Tambourine-Percu', - 'Tambourine (return)', - 'Tambourine' - ), - new InstrumentArticulation( - 'tambourine', - 1, - 54, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.StringsDownBow, - TechniqueSymbolPlacement.Above, - 112, - 'hand.hit.roll', - 'Tambourine-Percu', - 'Tambourine (roll)', - 'Tambourine' - ), - new InstrumentArticulation( - 'tambourine', - -7, - 54, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.None, - TechniqueSymbolPlacement.Outside, - 113, - 'hand.hit.handhit', - 'Tambourine-Percu', - 'Tambourine (hand)', - 'Tambourine' - ), - new InstrumentArticulation( - 'cuica', - 30, - 79, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'cuica', - 29, - 78, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'vibraslap', - 28, - 58, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'triangle', - 27, - 81, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'triangle', - 26, - 80, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'grancassa', - 25, - 43, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'piatti', - 18, - 49, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'piatti', - 24, - 49, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'cabasa', - 23, - 69, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'cabasa', - 22, - 69, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'castanets', - 21, - 85, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'claves', - 20, - 75, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'maraca', - -12, - 70, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'maraca', - -13, - 70, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'maraca', - -14, - 70, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'maraca', - -15, - 70, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'shaker', - -23, - 54, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'shaker', - -24, - 54, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'bellTree', - -18, - 53, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'bellTree', - -19, - 53, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'jingleBell', - -20, - 53, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'unpitched', - -21, - 62, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.GuitarGolpe, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'unpitched', - -22, - 62, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.GuitarGolpe, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'handClap', - 3, - 39, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'snare', - 3, - 40, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'snare', - 3, - 40, - MusicFontSymbol.NoteheadSlashedBlack2, - MusicFontSymbol.NoteheadSlashedBlack2, - MusicFontSymbol.NoteheadSlashedBlack2 - ), - new InstrumentArticulation( - 'tom', - 5, - 41, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'ride', - 2, - 59, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.PictEdgeOfCymbal, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'ride', - 2, - 59, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'ride', - 2, - 59, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ), - new InstrumentArticulation( - 'ride', - 2, - 59, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'crash', - -3, - 49, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'snare', - 3, - 37, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'snare', - 3, - 38, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadBlack - ) - ].map(articulation => [articulation.inputMidiNumber, articulation]) -); + public static instrumentArticulations: Map = new Map([ + new InstrumentArticulation( + 'Snare', + 'snare', + 'Snare (hit)', + 3, + 38, + 38, + 'stick.hit.hit', + 'Master-Snare', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Snare', + 'snare', + 'Snare (side stick)', + 3, + 37, + 37, + 'stick.hit.sidestick', + 'Master-Snare', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Snare', + 'snare', + 'Snare (rim shot)', + 3, + 91, + 38, + 'stick.hit.rimshot', + 'Master-Snare', + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ), + new InstrumentArticulation( + 'Charley', + 'hiHat', + 'Hi-Hat (closed)', + -1, + 42, + 42, + 'stick.hit.closed', + 'Master-Hihat', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Charley', + 'hiHat', + 'Hi-Hat (half)', + -1, + 92, + 46, + 'stick.hit.half', + 'Master-Hihat', + MusicFontSymbol.NoteheadCircleSlash, + MusicFontSymbol.NoteheadCircleSlash, + MusicFontSymbol.NoteheadCircleSlash + ), + new InstrumentArticulation( + 'Charley', + 'hiHat', + 'Hi-Hat (open)', + -1, + 46, + 46, + 'stick.hit.open', + 'Master-Hihat', + MusicFontSymbol.NoteheadCircleX, + MusicFontSymbol.NoteheadCircleX, + MusicFontSymbol.NoteheadCircleX + ), + new InstrumentArticulation( + 'Charley', + 'hiHat', + 'Pedal Hi-Hat (hit)', + 9, + 44, + 44, + 'pedal.hit.pedal', + 'Master-Hihat', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Acoustic Kick Drum', + 'kickDrum', + 'Kick (hit)', + 8, + 35, + 35, + 'pedal.hit.hit', + 'AcousticKick-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Kick Drum', + 'kickDrum', + 'Kick (hit)', + 7, + 36, + 36, + 'pedal.hit.hit', + 'Master-Kick', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Tom Very High', + 'tom', + 'High Floor Tom (hit)', + 1, + 50, + 50, + 'stick.hit.hit', + 'Master-Tom05', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Tom High', + 'tom', + 'High Tom (hit)', + 2, + 48, + 48, + 'stick.hit.hit', + 'Master-Tom04', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Tom Medium', + 'tom', + 'Mid Tom (hit)', + 4, + 47, + 47, + 'stick.hit.hit', + 'Master-Tom03', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Tom Low', + 'tom', + 'Low Tom (hit)', + 5, + 45, + 45, + 'stick.hit.hit', + 'Master-Tom02', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Tom Very Low', + 'tom', + 'Very Low Tom (hit)', + 6, + 43, + 43, + 'stick.hit.hit', + 'Master-Tom01', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Ride', + 'ride', + 'Ride (edge)', + 0, + 93, + 51, + 'stick.hit.edge', + 'Master-Ride', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.PictEdgeOfCymbal, + TechniqueSymbolPlacement.Above + ), + new InstrumentArticulation( + 'Ride', + 'ride', + 'Ride (middle)', + 0, + 51, + 51, + 'stick.hit.mid', + 'Master-Ride', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Ride', + 'ride', + 'Ride (bell)', + 0, + 53, + 53, + 'stick.hit.bell', + 'Master-Ride', + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ), + new InstrumentArticulation( + 'Ride', + 'ride', + 'Ride (choke)', + 0, + 94, + 51, + 'stick.hit.choke', + 'Master-Ride', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Splash', + 'splash', + 'Splash (hit)', + -2, + 55, + 55, + 'stick.hit.hit', + 'Master-Splash', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Splash', + 'splash', + 'Splash (choke)', + -2, + 95, + 55, + 'stick.hit.choke', + 'Master-Splash', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'China', + 'china', + 'China (hit)', + -3, + 52, + 52, + 'stick.hit.hit', + 'Master-China', + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat + ), + new InstrumentArticulation( + 'China', + 'china', + 'China (choke)', + -3, + 96, + 52, + 'stick.hit.choke', + 'Master-China', + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat + ), + new InstrumentArticulation( + 'Crash High', + 'crash', + 'Crash high (hit)', + -2, + 49, + 49, + 'stick.hit.hit', + 'Master-Crash02', + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX + ), + new InstrumentArticulation( + 'Crash High', + 'crash', + 'Crash high (choke)', + -2, + 97, + 49, + 'stick.hit.choke', + 'Master-Crash02', + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Crash Medium', + 'crash', + 'Crash medium (hit)', + -1, + 57, + 57, + 'stick.hit.hit', + 'Master-Crash01', + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX + ), + new InstrumentArticulation( + 'Crash Medium', + 'crash', + 'Crash medium (choke)', + -1, + 98, + 57, + 'stick.hit.choke', + 'Master-Crash01', + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Cowbell Low', + 'cowbell', + 'Cowbell low (hit)', + 1, + 99, + 56, + 'stick.hit.hit', + 'CowbellBig-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ), + new InstrumentArticulation( + 'Cowbell Low', + 'cowbell', + 'Cowbell low (tip)', + 1, + 100, + 56, + 'stick.hit.tip', + 'CowbellBig-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ), + new InstrumentArticulation( + 'Cowbell Medium', + 'cowbell', + 'Cowbell medium (hit)', + 0, + 56, + 56, + 'stick.hit.hit', + 'CowbellMid-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ), + new InstrumentArticulation( + 'Cowbell Medium', + 'cowbell', + 'Cowbell medium (tip)', + 0, + 101, + 56, + 'stick.hit.tip', + 'CowbellMid-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ), + new InstrumentArticulation( + 'Cowbell High', + 'cowbell', + 'Cowbell high (hit)', + -1, + 102, + 56, + 'stick.hit.hit', + 'CowbellSmall-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ), + new InstrumentArticulation( + 'Cowbell High', + 'cowbell', + 'Cowbell high (tip)', + -1, + 103, + 56, + 'stick.hit.tip', + 'CowbellSmall-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ), + new InstrumentArticulation( + 'Woodblock Low', + 'woodblock', + 'Woodblock low (hit)', + -9, + 77, + 77, + 'stick.hit.hit', + 'WoodblockLow-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ), + new InstrumentArticulation( + 'Woodblock High', + 'woodblock', + 'Woodblock high (hit)', + -10, + 76, + 76, + 'stick.hit.hit', + 'WoodblockHigh-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ), + new InstrumentArticulation( + 'Bongo High', + 'bongo', + 'Bongo High (hit)', + -4, + 60, + 60, + 'hand.hit.hit', + 'BongoHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Bongo High', + 'bongo', + 'Bongo High (mute)', + -5, + 104, + 60, + 'hand.hit.mute', + 'BongoHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Bongo High', + 'bongo', + 'Bongo High (slap)', + -6, + 105, + 60, + 'hand.hit.slap', + 'BongoHigh-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Bongo Low', + 'bongo', + 'Bongo Low (hit)', + -7, + 61, + 61, + 'hand.hit.hit', + 'BongoLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Bongo Low', + 'bongo', + 'Bongo Low (mute)', + -8, + 106, + 61, + 'hand.hit.mute', + 'BongoLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Bongo Low', + 'bongo', + 'Bongo Low (slap)', + -16, + 107, + 61, + 'hand.hit.slap', + 'BongoLow-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Timbale Low', + 'timbale', + 'Timbale low (hit)', + 10, + 66, + 66, + 'stick.hit.hit', + 'TimbaleLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Timbale High', + 'timbale', + 'Timbale high (hit)', + 9, + 65, + 65, + 'stick.hit.hit', + 'TimbaleHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Agogo Low', + 'agogo', + 'Agogo low (hit)', + 12, + 68, + 68, + 'stick.hit.hit', + 'AgogoLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Agogo High', + 'agogo', + 'Agogo high (hit)', + 11, + 67, + 67, + 'stick.hit.hit', + 'AgogoHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Conga Low', + 'conga', + 'Conga low (hit)', + 17, + 64, + 64, + 'hand.hit.hit', + 'CongaLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Conga Low', + 'conga', + 'Conga low (slap)', + 16, + 108, + 64, + 'hand.hit.slap', + 'CongaLow-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Conga Low', + 'conga', + 'Conga low (mute)', + 15, + 109, + 64, + 'hand.hit.mute', + 'CongaLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Conga High', + 'conga', + 'Conga high (hit)', + 14, + 63, + 63, + 'hand.hit.hit', + 'CongaHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Conga High', + 'conga', + 'Conga high (slap)', + 13, + 110, + 63, + 'hand.hit.slap', + 'CongaHigh-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Conga High', + 'conga', + 'Conga high (mute)', + 19, + 62, + 62, + 'hand.hit.mute', + 'CongaHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Whistle Low', + 'whistle', + 'Whistle low (hit)', + -11, + 72, + 72, + 'blow.hit.hit', + 'WhistleLow-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Whistle High', + 'whistle', + 'Whistle high (hit)', + -17, + 71, + 71, + 'blow.hit.hit', + 'WhistleHigh-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Guiro', + 'guiro', + 'Guiro (hit)', + 38, + 73, + 73, + 'stick.hit.hit', + 'Guiro-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Guiro', + 'guiro', + 'Guiro (scrap-return)', + 37, + 74, + 74, + 'stick.scrape.return', + 'Guiro-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Surdo', + 'surdo', + 'Surdo (hit)', + 36, + 86, + 86, + 'brush.hit.hit', + 'Surdo-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Surdo', + 'surdo', + 'Surdo (mute)', + 35, + 87, + 87, + 'brush.hit.mute', + 'Surdo-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Tambourine', + 'tambourine', + 'Tambourine (hit)', + 3, + 54, + 54, + 'hand.hit.hit', + 'Tambourine-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ), + new InstrumentArticulation( + 'Tambourine', + 'tambourine', + 'Tambourine (return)', + 2, + 111, + 54, + 'hand.hit.return', + 'Tambourine-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Above + ), + new InstrumentArticulation( + 'Tambourine', + 'tambourine', + 'Tambourine (roll)', + 1, + 112, + 54, + 'hand.hit.roll', + 'Tambourine-Percu', + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.StringsDownBow, + TechniqueSymbolPlacement.Above + ), + new InstrumentArticulation( + 'Tambourine', + 'tambourine', + 'Tambourine (hand)', + -7, + 113, + 54, + 'hand.hit.handhit', + 'Tambourine-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Cuica', + 'cuica', + 'Cuica (open)', + 30, + 79, + 79, + 'hand.hit.hit', + 'Cuica-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Cuica', + 'cuica', + 'Cuica (mute)', + 29, + 78, + 78, + 'hand.hit.mute', + 'Cuica-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Vibraslap', + 'vibraslap', + 'Vibraslap (hit)', + 28, + 58, + 58, + 'hand.hit.hit', + 'Vibraslap-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Triangle', + 'triangle', + 'Triangle (hit)', + 27, + 81, + 81, + 'stick.hit.hit', + 'Triangle-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Triangle', + 'triangle', + 'Triangle (mute)', + 26, + 80, + 80, + 'stick.hit.mute', + 'Triangle-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ), + new InstrumentArticulation( + 'Grancassa', + 'grancassa', + 'Grancassa (hit)', + 25, + 114, + 43, + 'mallet.hit.hit', + 'Grancassa-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Piatti', + 'piatti', + 'Piatti (hit)', + 18, + 115, + 49, + 'hand.hit.hit', + 'Piatti-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Piatti', + 'piatti', + 'Piatti (hand)', + 24, + 116, + 49, + 'hand.hit.hit', + 'Piatti-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Cabasa', + 'cabasa', + 'Cabasa (hit)', + 23, + 69, + 69, + 'hand.hit.hit', + 'Cabasa-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Cabasa', + 'cabasa', + 'Cabasa (return)', + 22, + 117, + 69, + 'hand.hit.return', + 'Cabasa-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Castanets', + 'castanets', + 'Castanets (hit)', + 21, + 85, + 85, + 'hand.hit.hit', + 'Castanets-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Claves', + 'claves', + 'Claves (hit)', + 20, + 75, + 75, + 'stick.hit.hit', + 'Claves-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Left Maraca', + 'maraca', + 'Left Maraca (hit)', + -12, + 70, + 70, + 'hand.hit.hit', + 'Maracas-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Left Maraca', + 'maraca', + 'Left Maraca (return)', + -13, + 118, + 70, + 'hand.hit.return', + 'Maracas-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Right Maraca', + 'maraca', + 'Right Maraca (hit)', + -14, + 119, + 70, + 'hand.hit.hit', + 'Maracas-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Right Maraca', + 'maraca', + 'Right Maraca (return)', + -15, + 120, + 70, + 'hand.hit.return', + 'Maracas-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Shaker', + 'shaker', + 'Shaker (hit)', + -23, + 82, + 82, + 'hand.hit.hit', + 'ShakerStudio-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Shaker', + 'shaker', + 'Shaker (return)', + -24, + 122, + 82, + 'hand.hit.return', + 'ShakerStudio-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Bell Tree', + 'bellTree', + 'Bell Tree (hit)', + -18, + 84, + 53, + 'stick.hit.hit', + 'BellTree-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Bell Tree', + 'bellTree', + 'Bell Tree (return)', + -19, + 123, + 53, + 'stick.hit.return', + 'BellTree-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Jingle Bell', + 'jingleBell', + 'Jingle Bell (hit)', + -20, + 83, + 53, + 'stick.hit.hit', + 'JingleBell-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Golpe', + 'unpitched', + 'Golpe (thumb)', + -21, + 124, + 62, + 'thumb.hit.body', + 'Golpe-Percu', + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.GuitarGolpe, + TechniqueSymbolPlacement.Below + ), + new InstrumentArticulation( + 'Golpe', + 'unpitched', + 'Golpe (finger)', + -22, + 125, + 62, + 'finger4.hit.body', + 'Golpe-Percu', + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.GuitarGolpe, + TechniqueSymbolPlacement.Above + ), + new InstrumentArticulation( + 'Hand Clap', + 'handClap', + 'Hand Clap (hit)', + 3, + 39, + 39, + 'hand.hit.hit', + 'GroupHandClap-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Electric Snare', + 'snare', + 'Electric Snare (hit)', + 3, + 40, + 40, + 'stick.hit.hit', + 'ElectricSnare-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Sticks', + 'snare', + 'Snare (side stick)', + 3, + 31, + 40, + 'stick.hit.sidestick', + 'Stick-Percu', + MusicFontSymbol.NoteheadSlashedBlack2, + MusicFontSymbol.NoteheadSlashedBlack2, + MusicFontSymbol.NoteheadSlashedBlack2 + ), + new InstrumentArticulation( + 'Very Low Floor Tom', + 'tom', + 'Low Floor Tom (hit)', + 5, + 41, + 41, + 'stick.hit.hit', + 'LowFloorTom-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ), + new InstrumentArticulation( + 'Ride Cymbal 2', + 'ride', + 'Ride (edge)', + 2, + 59, + 59, + 'stick.hit.edge', + 'Ride-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.PictEdgeOfCymbal, + TechniqueSymbolPlacement.Above + ), + new InstrumentArticulation( + 'Ride Cymbal 2', + 'ride', + 'Ride (middle)', + 2, + 126, + 59, + 'stick.hit.mid', + 'Ride-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Ride Cymbal 2', + 'ride', + 'Ride (bell)', + 2, + 127, + 59, + 'stick.hit.bell', + 'Ride-Percu', + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ), + new InstrumentArticulation( + 'Ride Cymbal 2', + 'ride', + 'Ride (choke)', + 2, + 29, + 59, + 'stick.hit.choke', + 'Ride-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Outside + ), + new InstrumentArticulation( + 'Reverse Cymbal', + 'crash', + 'Reverse Cymbal (hit)', + -3, + 30, + 49, + 'stick.hit.hit', + 'Reverse-Cymbal', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Metronome', + 'snare', + 'Metronome (hit)', + 3, + 33, + 37, + 'stick.hit.sidestick', + 'Metronome-Percu', + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ), + new InstrumentArticulation( + 'Metronome', + 'snare', + 'Metronome (bell)', + 3, + 34, + 38, + 'stick.hit.hit', + 'Metronome-Percu', + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadBlack + ), + ].map(articulation => [articulation.inputMidiNumber, articulation])); // these are manually defined names/identifiers for the articulation list above. // they are currently only used in the AlphaTex importer when using default articulations @@ -1411,6 +1487,10 @@ export class PercussionMapper { public static getArticulationName(n: Note): string { const articulation = PercussionMapper.getArticulation(n); + if(articulation && articulation.articulationName !== '') { + return articulation.articulationName; + } + let input = n.percussionArticulation; if (articulation) { input = articulation.outputMidiNumber; From 370460269db998941cbea0b2f9adaff2c58f96f4 Mon Sep 17 00:00:00 2001 From: L-Sun Date: Sun, 28 Dec 2025 16:17:04 +0800 Subject: [PATCH 3/5] fix: missing parameters in InstrumentArticulation constructor --- packages/alphatab/src/generated/DisplaySettingsJson.ts | 1 + packages/alphatab/src/importer/MusicXmlImporter.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/packages/alphatab/src/generated/DisplaySettingsJson.ts b/packages/alphatab/src/generated/DisplaySettingsJson.ts index cdbaf34b1..8b3febfa4 100644 --- a/packages/alphatab/src/generated/DisplaySettingsJson.ts +++ b/packages/alphatab/src/generated/DisplaySettingsJson.ts @@ -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; } diff --git a/packages/alphatab/src/importer/MusicXmlImporter.ts b/packages/alphatab/src/importer/MusicXmlImporter.ts index 51c1ef281..1f16f3be0 100644 --- a/packages/alphatab/src/importer/MusicXmlImporter.ts +++ b/packages/alphatab/src/importer/MusicXmlImporter.ts @@ -128,8 +128,13 @@ class TrackInfo { private static _defaultNoteArticulation: InstrumentArticulation = new InstrumentArticulation( 'Default', + 'Default', + 'Default', + 0, 0, 0, + '', + '', MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole @@ -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, From 004cca3d72e1b9fb3b83ef75d2d00b9bc5817f1f Mon Sep 17 00:00:00 2001 From: L-Sun Date: Sat, 3 Jan 2026 02:00:54 +0800 Subject: [PATCH 4/5] Revert last 3 commits This reverts: - 37046026 fix: missing parameters in InstrumentArticulation constructor - 8b564e40 refactor: adjust parameters order - 1adfd3f1 fix(exporter): add missing tags of percussion in gp exporter --- packages/alphatab/src/exporter/GpifWriter.ts | 37 +- .../src/generated/DisplaySettingsJson.ts | 1 - .../model/InstrumentArticulationSerializer.ts | 20 - .../alphatab/src/importer/MusicXmlImporter.ts | 10 - .../src/model/InstrumentArticulation.ts | 39 +- .../alphatab/src/model/PercussionMapper.ts | 2246 ++++++++--------- 6 files changed, 1028 insertions(+), 1325 deletions(-) diff --git a/packages/alphatab/src/exporter/GpifWriter.ts b/packages/alphatab/src/exporter/GpifWriter.ts index d7522a229..a01ed2701 100644 --- a/packages/alphatab/src/exporter/GpifWriter.ts +++ b/packages/alphatab/src/exporter/GpifWriter.ts @@ -1739,31 +1739,34 @@ 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(); const elements = instrumentSet.addElement('Elements'); for (const articulation of articulations) { - // 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; + 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; currentElement.addElement('Type').innerText = articulation.elementType; - currentElement.addElement('SoundbankName').innerText = articulation.soundbankName || ''; currentArticulations = currentElement.addElement('Articulations'); } const articulationNode = currentArticulations.addElement('Articulation'); - // Use articulationName if available, otherwise generate a name - const articulationNameToUse = articulation.articulationName || + articulationNode.addElement('Name').innerText = `${currentElementName} ${currentArticulations.childNodes.length}`; - articulationNode.addElement('Name').innerText = articulationNameToUse; articulationNode.addElement('StaffLine').innerText = articulation.staffLine.toString(); articulationNode.addElement('Noteheads').innerText = [ this._mapMusicSymbol(articulation.noteHeadDefault), @@ -1788,11 +1791,7 @@ export class GpifWriter { articulationNode.addElement('TechniqueSymbol').innerText = this._mapMusicSymbol( articulation.techniqueSymbol ); - // 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('InputMidiNumbers').innerText = ''; articulationNode.addElement('OutputMidiNumber').innerText = articulation.outputMidiNumber.toString(); } } else { diff --git a/packages/alphatab/src/generated/DisplaySettingsJson.ts b/packages/alphatab/src/generated/DisplaySettingsJson.ts index 8b3febfa4..cdbaf34b1 100644 --- a/packages/alphatab/src/generated/DisplaySettingsJson.ts +++ b/packages/alphatab/src/generated/DisplaySettingsJson.ts @@ -354,7 +354,6 @@ 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; } diff --git a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts index 3049e83a0..2e91ec8b8 100644 --- a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts +++ b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts @@ -30,11 +30,6 @@ 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 { @@ -63,21 +58,6 @@ 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; } diff --git a/packages/alphatab/src/importer/MusicXmlImporter.ts b/packages/alphatab/src/importer/MusicXmlImporter.ts index 1f16f3be0..51c1ef281 100644 --- a/packages/alphatab/src/importer/MusicXmlImporter.ts +++ b/packages/alphatab/src/importer/MusicXmlImporter.ts @@ -128,13 +128,8 @@ class TrackInfo { private static _defaultNoteArticulation: InstrumentArticulation = new InstrumentArticulation( 'Default', - 'Default', - 'Default', - 0, 0, 0, - '', - '', MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole @@ -174,14 +169,9 @@ 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, diff --git a/packages/alphatab/src/model/InstrumentArticulation.ts b/packages/alphatab/src/model/InstrumentArticulation.ts index 08e42d266..47d1415aa 100644 --- a/packages/alphatab/src/model/InstrumentArticulation.ts +++ b/packages/alphatab/src/model/InstrumentArticulation.ts @@ -72,54 +72,19 @@ 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.Outside, + techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Inside ) { - this.elementName = elementName; this.elementType = elementType; - this.articulationName = articulationName; - this.staffLine = staffLine; - this.inputMidiNumber = inputMidiNumber; this.outputMidiNumber = outputMidiNumber; - this.outputRSESound = outputRSESound; - this.soundbankName = soundbankName; + this.staffLine = staffLine; this.noteHeadDefault = noteHeadDefault; this.noteHeadHalf = noteHeadHalf !== MusicFontSymbol.None ? noteHeadHalf : noteHeadDefault; this.noteHeadWhole = noteHeadWhole !== MusicFontSymbol.None ? noteHeadWhole : noteHeadDefault; diff --git a/packages/alphatab/src/model/PercussionMapper.ts b/packages/alphatab/src/model/PercussionMapper.ts index a4648b27d..6654fce0f 100644 --- a/packages/alphatab/src/model/PercussionMapper.ts +++ b/packages/alphatab/src/model/PercussionMapper.ts @@ -42,1345 +42,1119 @@ export class PercussionMapper { /* * This map was generated using the following steps: - * 1. Make a new GP8 file with a drumkit track + * 1. Make a new GP7 file with a drumkit track * 2. Add one note for each midi value using the instrument panel - * 3. Load the file in alphaTab and set a breakpoint in the GP8 importer. - * 4. Use the following snippet in the console to generate the map initializer (fix enums manually): - * + * 3. Load the file in alphaTab and set a breakpoint in the GP7 importer. + * 4. Use the following snipped in the console to generate the map initializer (fix enums manually): * parser = new DOMParser(); * xmlDoc = parser.parseFromString(xml, 'text/xml'); * articulations = xmlDoc.getElementsByTagName('Articulation'); - * capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1); * existingArticulations = new Map(); * s = ''; * for(let i = 0; i < articulations.length; i++) { * const articulation = articulations[i]; - * let inputMidiNumbers = articulation.getElementsByTagName('InputMidiNumbers'); - * if(inputMidiNumbers.length === 1 && inputMidiNumbers[0].textContent) { - * const inputMidiNumber = inputMidiNumbers[0].textContent; - * if(!existingArticulations.has(inputMidiNumber)) { - * // Get Element-level data - * const element = articulation.parentElement.parentElement; - * const elementType = element.getElementsByTagName('Type')[0].textContent; - * const elementName = element.getElementsByTagName('Name')[0].textContent; - * const soundbankName = element.getElementsByTagName('SoundbankName')[0]?.textContent || ''; - * - * // Get Articulation-level data - * const articulationName = articulation.getElementsByTagName('Name')[0].textContent; - * const outputMidiNumber = articulation.getElementsByTagName('OutputMidiNumber')[0].textContent; - * const staffLine = articulation.getElementsByTagName('StaffLine')[0].textContent; - * const techniqueSymbol = capitalize(articulation.getElementsByTagName('TechniqueSymbol')[0].textContent); - * const techniquePlacement = articulation.getElementsByTagName('TechniquePlacement')[0].textContent; - * const outputRSESound = articulation.getElementsByTagName('OutputRSESound')[0]?.textContent || ''; - * const noteHeads = articulation.getElementsByTagName('Noteheads')[0] - * .textContent.split(' ') - * .map(n => 'MusicFontSymbol.' + capitalize(n)); - * - * // Map technique placement to enum - * const placementMap = { - * 'above': 'TechniqueSymbolPlacement.Above', - * 'below': 'TechniqueSymbolPlacement.Below', - * 'inside': 'TechniqueSymbolPlacement.Inside', - * 'outside': 'TechniqueSymbolPlacement.Outside' - * }; - * const placementEnum = placementMap[techniquePlacement] || 'TechniqueSymbolPlacement.Inside'; - * - * // Map technique symbol to enum (if exists) - * const techniqueSymbolEnum = techniqueSymbol ? 'MusicFontSymbol.' + techniqueSymbol : 'MusicFontSymbol.None'; - * - * // Generate the code - * s += ` new InstrumentArticulation(\r\n`; - * s += ` '${elementName}',\r\n`; - * s += ` '${elementType}',\r\n`; - * s += ` '${articulationName}',\r\n`; - * s += ` ${staffLine},\r\n`; - * s += ` ${inputMidiNumber},\r\n`; - * s += ` ${outputMidiNumber},\r\n`; - * s += ` '${outputRSESound}',\r\n`; - * s += ` '${soundbankName}',\r\n`; - * s += ` ${noteHeads[0]},\r\n`; - * s += ` ${noteHeads[1]},\r\n`; - * s += ` ${noteHeads[2]},\r\n`; - * s += ` ${techniqueSymbolEnum},\r\n`; - * s += ` ${placementEnum}\r\n`; - * s += ` ), \r\n`; - * - * existingArticulations.set(inputMidiNumber, true); - * } - * } + * let midi = articulation.getElementsByTagName('InputMidiNumbers'); + * if(midi.length === 1) { + * midi = midi[0].textContent; + * const elementType = articulation.parentElement.parentElement.getElementsByTagName('Type')[0].textContent; + * const outputMidiNumber = articulation.getElementsByTagName('OutputMidiNumber')[0].textContent; + * const staffLine = articulation.getElementsByTagName('StaffLine')[0].textContent; + * const techniqueSymbol = articulation.getElementsByTagName('TechniqueSymbol')[0].textContent; + * const techniquePlacement = articulation.getElementsByTagName('TechniquePlacement')[0].textContent; + * const noteHeads = articulation.getElementsByTagName('Noteheads')[0].textContent.split(' ').map(n=>n = 'MusicFontSymbol.' + n); + * if(!existingArticulations.has(midi)) { + * if(techniqueSymbol) { + * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]}, ${techniqueSymbol}, ${techniquePlacement})],\r\n`; + * } + * else { + * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]})],\r\n`; + * } + * existingArticulations.set(midi, true); + * } + * } * } - * // Add the array wrapper - * console.log('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); - * copy('[\r\n' + s + ' ].map(articulation => [articulation.inputMidiNumber, articulation])'); + * copy(s) */ public static instrumentArticulations: Map = new Map([ - new InstrumentArticulation( - 'Snare', - 'snare', - 'Snare (hit)', - 3, + [ 38, - 38, - 'stick.hit.hit', - 'Master-Snare', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Snare', - 'snare', - 'Snare (side stick)', - 3, - 37, + new InstrumentArticulation( + 'snare', + 3, + 38, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 37, - 'stick.hit.sidestick', - 'Master-Snare', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Snare', - 'snare', - 'Snare (rim shot)', - 3, + new InstrumentArticulation( + 'snare', + 3, + 37, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 91, - 38, - 'stick.hit.rimshot', - 'Master-Snare', - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ), - new InstrumentArticulation( - 'Charley', - 'hiHat', - 'Hi-Hat (closed)', - -1, - 42, + new InstrumentArticulation( + 'snare', + 3, + 38, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ) + ], + [ 42, - 'stick.hit.closed', - 'Master-Hihat', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Charley', - 'hiHat', - 'Hi-Hat (half)', - -1, + new InstrumentArticulation( + 'hiHat', + -1, + 42, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 92, + new InstrumentArticulation( + 'hiHat', + -1, + 46, + MusicFontSymbol.NoteheadCircleSlash, + MusicFontSymbol.NoteheadCircleSlash, + MusicFontSymbol.NoteheadCircleSlash + ) + ], + [ 46, - 'stick.hit.half', - 'Master-Hihat', - MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.NoteheadCircleSlash, - MusicFontSymbol.NoteheadCircleSlash - ), - new InstrumentArticulation( - 'Charley', - 'hiHat', - 'Hi-Hat (open)', - -1, - 46, - 46, - 'stick.hit.open', - 'Master-Hihat', - MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.NoteheadCircleX, - MusicFontSymbol.NoteheadCircleX - ), - new InstrumentArticulation( - 'Charley', - 'hiHat', - 'Pedal Hi-Hat (hit)', - 9, - 44, + new InstrumentArticulation( + 'hiHat', + -1, + 46, + MusicFontSymbol.NoteheadCircleX, + MusicFontSymbol.NoteheadCircleX, + MusicFontSymbol.NoteheadCircleX + ) + ], + [ 44, - 'pedal.hit.pedal', - 'Master-Hihat', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Acoustic Kick Drum', - 'kickDrum', - 'Kick (hit)', - 8, + new InstrumentArticulation( + 'hiHat', + 9, + 44, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 35, - 35, - 'pedal.hit.hit', - 'AcousticKick-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Kick Drum', - 'kickDrum', - 'Kick (hit)', - 7, - 36, + new InstrumentArticulation( + 'kickDrum', + 8, + 35, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 36, - 'pedal.hit.hit', - 'Master-Kick', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Tom Very High', - 'tom', - 'High Floor Tom (hit)', - 1, - 50, + new InstrumentArticulation( + 'kickDrum', + 7, + 36, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 50, - 'stick.hit.hit', - 'Master-Tom05', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Tom High', - 'tom', - 'High Tom (hit)', - 2, + new InstrumentArticulation( + 'tom', + 1, + 50, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 48, - 48, - 'stick.hit.hit', - 'Master-Tom04', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Tom Medium', - 'tom', - 'Mid Tom (hit)', - 4, - 47, + new InstrumentArticulation( + 'tom', + 2, + 48, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 47, - 'stick.hit.hit', - 'Master-Tom03', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Tom Low', - 'tom', - 'Low Tom (hit)', - 5, - 45, + new InstrumentArticulation( + 'tom', + 4, + 47, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 45, - 'stick.hit.hit', - 'Master-Tom02', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Tom Very Low', - 'tom', - 'Very Low Tom (hit)', - 6, + new InstrumentArticulation( + 'tom', + 5, + 45, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 43, - 43, - 'stick.hit.hit', - 'Master-Tom01', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Ride', - 'ride', - 'Ride (edge)', - 0, + new InstrumentArticulation( + 'tom', + 6, + 43, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 93, + new InstrumentArticulation( + 'ride', + 0, + 51, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.PictEdgeOfCymbal, + TechniqueSymbolPlacement.Below + ) + ], + [ 51, - 'stick.hit.edge', - 'Master-Ride', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.PictEdgeOfCymbal, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'Ride', - 'ride', - 'Ride (middle)', - 0, - 51, - 51, - 'stick.hit.mid', - 'Master-Ride', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Ride', - 'ride', - 'Ride (bell)', - 0, - 53, + new InstrumentArticulation( + 'ride', + 0, + 51, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 53, - 'stick.hit.bell', - 'Master-Ride', - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ), - new InstrumentArticulation( - 'Ride', - 'ride', - 'Ride (choke)', - 0, + new InstrumentArticulation( + 'ride', + 0, + 53, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ) + ], + [ 94, - 51, - 'stick.hit.choke', - 'Master-Ride', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Splash', - 'splash', - 'Splash (hit)', - -2, - 55, + new InstrumentArticulation( + 'ride', + 0, + 51, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Above + ) + ], + [ 55, - 'stick.hit.hit', - 'Master-Splash', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Splash', - 'splash', - 'Splash (choke)', - -2, + new InstrumentArticulation( + 'splash', + -2, + 55, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 95, - 55, - 'stick.hit.choke', - 'Master-Splash', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'China', - 'china', - 'China (hit)', - -3, + new InstrumentArticulation( + 'splash', + -2, + 55, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Below + ) + ], + [ 52, - 52, - 'stick.hit.hit', - 'Master-China', - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat - ), - new InstrumentArticulation( - 'China', - 'china', - 'China (choke)', - -3, + new InstrumentArticulation( + 'china', + -3, + 52, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat + ) + ], + [ 96, - 52, - 'stick.hit.choke', - 'Master-China', - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat, - MusicFontSymbol.NoteheadHeavyXHat - ), - new InstrumentArticulation( - 'Crash High', - 'crash', - 'Crash high (hit)', - -2, - 49, + new InstrumentArticulation( + 'china', + -3, + 52, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat, + MusicFontSymbol.NoteheadHeavyXHat + ) + ], + [ 49, - 'stick.hit.hit', - 'Master-Crash02', - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX - ), - new InstrumentArticulation( - 'Crash High', - 'crash', - 'Crash high (choke)', - -2, + new InstrumentArticulation( + 'crash', + -2, + 49, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX + ) + ], + [ 97, - 49, - 'stick.hit.choke', - 'Master-Crash02', - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Crash Medium', - 'crash', - 'Crash medium (hit)', - -1, - 57, + new InstrumentArticulation( + 'crash', + -2, + 49, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Below + ) + ], + [ 57, - 'stick.hit.hit', - 'Master-Crash01', - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX - ), - new InstrumentArticulation( - 'Crash Medium', - 'crash', - 'Crash medium (choke)', - -1, + new InstrumentArticulation( + 'crash', + -1, + 57, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX + ) + ], + [ 98, - 57, - 'stick.hit.choke', - 'Master-Crash01', - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.NoteheadHeavyX, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Cowbell Low', - 'cowbell', - 'Cowbell low (hit)', - 1, + new InstrumentArticulation( + 'crash', + -1, + 57, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.NoteheadHeavyX, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Below + ) + ], + [ 99, - 56, - 'stick.hit.hit', - 'CowbellBig-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ), - new InstrumentArticulation( - 'Cowbell Low', - 'cowbell', - 'Cowbell low (tip)', - 1, + new InstrumentArticulation( + 'cowbell', + 1, + 56, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ) + ], + [ 100, + new InstrumentArticulation( + 'cowbell', + 1, + 56, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ) + ], + [ 56, - 'stick.hit.tip', - 'CowbellBig-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ), - new InstrumentArticulation( - 'Cowbell Medium', - 'cowbell', - 'Cowbell medium (hit)', - 0, - 56, - 56, - 'stick.hit.hit', - 'CowbellMid-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ), - new InstrumentArticulation( - 'Cowbell Medium', - 'cowbell', - 'Cowbell medium (tip)', - 0, + new InstrumentArticulation( + 'cowbell', + 0, + 56, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ) + ], + [ 101, - 56, - 'stick.hit.tip', - 'CowbellMid-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ), - new InstrumentArticulation( - 'Cowbell High', - 'cowbell', - 'Cowbell high (hit)', - -1, + new InstrumentArticulation( + 'cowbell', + 0, + 56, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ) + ], + [ 102, - 56, - 'stick.hit.hit', - 'CowbellSmall-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpHalf, - MusicFontSymbol.NoteheadTriangleUpWhole - ), - new InstrumentArticulation( - 'Cowbell High', - 'cowbell', - 'Cowbell high (tip)', - -1, + new InstrumentArticulation( + 'cowbell', + -1, + 56, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpHalf, + MusicFontSymbol.NoteheadTriangleUpWhole + ) + ], + [ 103, - 56, - 'stick.hit.tip', - 'CowbellSmall-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXHalf, - MusicFontSymbol.NoteheadXWhole - ), - new InstrumentArticulation( - 'Woodblock Low', - 'woodblock', - 'Woodblock low (hit)', - -9, - 77, + new InstrumentArticulation( + 'cowbell', + -1, + 56, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXHalf, + MusicFontSymbol.NoteheadXWhole + ) + ], + [ 77, - 'stick.hit.hit', - 'WoodblockLow-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ), - new InstrumentArticulation( - 'Woodblock High', - 'woodblock', - 'Woodblock high (hit)', - -10, + new InstrumentArticulation( + 'woodblock', + -9, + 77, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ) + ], + [ 76, - 76, - 'stick.hit.hit', - 'WoodblockHigh-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ), - new InstrumentArticulation( - 'Bongo High', - 'bongo', - 'Bongo High (hit)', - -4, - 60, + new InstrumentArticulation( + 'woodblock', + -10, + 76, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ) + ], + [ 60, - 'hand.hit.hit', - 'BongoHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Bongo High', - 'bongo', - 'Bongo High (mute)', - -5, + new InstrumentArticulation( + 'bongo', + -4, + 60, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 104, - 60, - 'hand.hit.mute', - 'BongoHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Bongo High', - 'bongo', - 'Bongo High (slap)', - -6, + new InstrumentArticulation( + 'bongo', + -5, + 60, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 105, - 60, - 'hand.hit.slap', - 'BongoHigh-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Bongo Low', - 'bongo', - 'Bongo Low (hit)', - -7, - 61, + new InstrumentArticulation( + 'bongo', + -6, + 60, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 61, - 'hand.hit.hit', - 'BongoLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Bongo Low', - 'bongo', - 'Bongo Low (mute)', - -8, + new InstrumentArticulation( + 'bongo', + -7, + 61, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 106, - 61, - 'hand.hit.mute', - 'BongoLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Bongo Low', - 'bongo', - 'Bongo Low (slap)', - -16, + new InstrumentArticulation( + 'bongo', + -8, + 61, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 107, - 61, - 'hand.hit.slap', - 'BongoLow-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Timbale Low', - 'timbale', - 'Timbale low (hit)', - 10, - 66, + new InstrumentArticulation( + 'bongo', + -16, + 61, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 66, - 'stick.hit.hit', - 'TimbaleLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Timbale High', - 'timbale', - 'Timbale high (hit)', - 9, + new InstrumentArticulation( + 'timbale', + 10, + 66, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 65, - 65, - 'stick.hit.hit', - 'TimbaleHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Agogo Low', - 'agogo', - 'Agogo low (hit)', - 12, - 68, + new InstrumentArticulation( + 'timbale', + 9, + 65, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 68, - 'stick.hit.hit', - 'AgogoLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Agogo High', - 'agogo', - 'Agogo high (hit)', - 11, + new InstrumentArticulation( + 'agogo', + 12, + 68, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 67, - 67, - 'stick.hit.hit', - 'AgogoHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Conga Low', - 'conga', - 'Conga low (hit)', - 17, - 64, + new InstrumentArticulation( + 'agogo', + 11, + 67, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 64, - 'hand.hit.hit', - 'CongaLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Conga Low', - 'conga', - 'Conga low (slap)', - 16, + new InstrumentArticulation( + 'conga', + 17, + 64, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 108, - 64, - 'hand.hit.slap', - 'CongaLow-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Conga Low', - 'conga', - 'Conga low (mute)', - 15, + new InstrumentArticulation( + 'conga', + 16, + 64, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 109, - 64, - 'hand.hit.mute', - 'CongaLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Conga High', - 'conga', - 'Conga high (hit)', - 14, - 63, + new InstrumentArticulation( + 'conga', + 15, + 64, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 63, - 'hand.hit.hit', - 'CongaHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Conga High', - 'conga', - 'Conga high (slap)', - 13, + new InstrumentArticulation( + 'conga', + 14, + 63, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 110, - 63, - 'hand.hit.slap', - 'CongaHigh-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Conga High', - 'conga', - 'Conga high (mute)', - 19, + new InstrumentArticulation( + 'conga', + 13, + 63, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 62, - 62, - 'hand.hit.mute', - 'CongaHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Whistle Low', - 'whistle', - 'Whistle low (hit)', - -11, - 72, + new InstrumentArticulation( + 'conga', + 19, + 62, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 72, - 'blow.hit.hit', - 'WhistleLow-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Whistle High', - 'whistle', - 'Whistle high (hit)', - -17, - 71, + new InstrumentArticulation( + 'whistle', + -11, + 72, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 71, - 'blow.hit.hit', - 'WhistleHigh-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Guiro', - 'guiro', - 'Guiro (hit)', - 38, - 73, + new InstrumentArticulation( + 'whistle', + -17, + 71, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 73, - 'stick.hit.hit', - 'Guiro-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Guiro', - 'guiro', - 'Guiro (scrap-return)', - 37, - 74, + new InstrumentArticulation( + 'guiro', + 38, + 73, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 74, - 'stick.scrape.return', - 'Guiro-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Surdo', - 'surdo', - 'Surdo (hit)', - 36, - 86, + new InstrumentArticulation( + 'guiro', + 37, + 74, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 86, - 'brush.hit.hit', - 'Surdo-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Surdo', - 'surdo', - 'Surdo (mute)', - 35, + new InstrumentArticulation( + 'surdo', + 36, + 86, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 87, - 87, - 'brush.hit.mute', - 'Surdo-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Tambourine', - 'tambourine', - 'Tambourine (hit)', - 3, - 54, + new InstrumentArticulation( + 'surdo', + 35, + 87, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 54, - 'hand.hit.hit', - 'Tambourine-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack - ), - new InstrumentArticulation( - 'Tambourine', - 'tambourine', - 'Tambourine (return)', - 2, + new InstrumentArticulation( + 'tambourine', + 3, + 54, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack + ) + ], + [ 111, - 54, - 'hand.hit.return', - 'Tambourine-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'Tambourine', - 'tambourine', - 'Tambourine (roll)', - 1, + new InstrumentArticulation( + 'tambourine', + 2, + 54, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 112, - 54, - 'hand.hit.roll', - 'Tambourine-Percu', - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.NoteheadTriangleUpBlack, - MusicFontSymbol.StringsDownBow, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'Tambourine', - 'tambourine', - 'Tambourine (hand)', - -7, + new InstrumentArticulation( + 'tambourine', + 1, + 54, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.NoteheadTriangleUpBlack, + MusicFontSymbol.StringsDownBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 113, - 54, - 'hand.hit.handhit', - 'Tambourine-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Cuica', - 'cuica', - 'Cuica (open)', - 30, + new InstrumentArticulation( + 'tambourine', + -7, + 54, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 79, - 79, - 'hand.hit.hit', - 'Cuica-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Cuica', - 'cuica', - 'Cuica (mute)', - 29, + new InstrumentArticulation( + 'cuica', + 30, + 79, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 78, - 78, - 'hand.hit.mute', - 'Cuica-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Vibraslap', - 'vibraslap', - 'Vibraslap (hit)', - 28, - 58, + new InstrumentArticulation( + 'cuica', + 29, + 78, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 58, - 'hand.hit.hit', - 'Vibraslap-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Triangle', - 'triangle', - 'Triangle (hit)', - 27, + new InstrumentArticulation( + 'vibraslap', + 28, + 58, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 81, - 81, - 'stick.hit.hit', - 'Triangle-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Triangle', - 'triangle', - 'Triangle (mute)', - 26, - 80, + new InstrumentArticulation( + 'triangle', + 27, + 81, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 80, - 'stick.hit.mute', - 'Triangle-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadParenthesis, - TechniqueSymbolPlacement.Inside - ), - new InstrumentArticulation( - 'Grancassa', - 'grancassa', - 'Grancassa (hit)', - 25, + new InstrumentArticulation( + 'triangle', + 26, + 80, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadParenthesis, + TechniqueSymbolPlacement.Inside + ) + ], + [ 114, - 43, - 'mallet.hit.hit', - 'Grancassa-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Piatti', - 'piatti', - 'Piatti (hit)', - 18, + new InstrumentArticulation( + 'grancassa', + 25, + 43, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 115, - 49, - 'hand.hit.hit', - 'Piatti-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Piatti', - 'piatti', - 'Piatti (hand)', - 24, + new InstrumentArticulation( + 'piatti', + 18, + 49, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 116, - 49, - 'hand.hit.hit', - 'Piatti-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Cabasa', - 'cabasa', - 'Cabasa (hit)', - 23, - 69, + new InstrumentArticulation( + 'piatti', + 24, + 49, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 69, - 'hand.hit.hit', - 'Cabasa-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Cabasa', - 'cabasa', - 'Cabasa (return)', - 22, + new InstrumentArticulation( + 'cabasa', + 23, + 69, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 117, - 69, - 'hand.hit.return', - 'Cabasa-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Castanets', - 'castanets', - 'Castanets (hit)', - 21, - 85, + new InstrumentArticulation( + 'cabasa', + 22, + 69, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 85, - 'hand.hit.hit', - 'Castanets-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Claves', - 'claves', - 'Claves (hit)', - 20, - 75, + new InstrumentArticulation( + 'castanets', + 21, + 85, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 75, - 'stick.hit.hit', - 'Claves-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Left Maraca', - 'maraca', - 'Left Maraca (hit)', - -12, + new InstrumentArticulation( + 'claves', + 20, + 75, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 70, - 70, - 'hand.hit.hit', - 'Maracas-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Left Maraca', - 'maraca', - 'Left Maraca (return)', - -13, + new InstrumentArticulation( + 'maraca', + -12, + 70, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 118, - 70, - 'hand.hit.return', - 'Maracas-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Right Maraca', - 'maraca', - 'Right Maraca (hit)', - -14, + new InstrumentArticulation( + 'maraca', + -13, + 70, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 119, - 70, - 'hand.hit.hit', - 'Maracas-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Right Maraca', - 'maraca', - 'Right Maraca (return)', - -15, + new InstrumentArticulation( + 'maraca', + -14, + 70, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 120, - 70, - 'hand.hit.return', - 'Maracas-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Shaker', - 'shaker', - 'Shaker (hit)', - -23, + new InstrumentArticulation( + 'maraca', + -15, + 70, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 82, - 82, - 'hand.hit.hit', - 'ShakerStudio-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Shaker', - 'shaker', - 'Shaker (return)', - -24, + new InstrumentArticulation( + 'shaker', + -23, + 54, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 122, - 82, - 'hand.hit.return', - 'ShakerStudio-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Bell Tree', - 'bellTree', - 'Bell Tree (hit)', - -18, + new InstrumentArticulation( + 'shaker', + -24, + 54, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 84, - 53, - 'stick.hit.hit', - 'BellTree-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Bell Tree', - 'bellTree', - 'Bell Tree (return)', - -19, + new InstrumentArticulation( + 'bellTree', + -18, + 53, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 123, - 53, - 'stick.hit.return', - 'BellTree-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole, - MusicFontSymbol.StringsUpBow, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Jingle Bell', - 'jingleBell', - 'Jingle Bell (hit)', - -20, + new InstrumentArticulation( + 'bellTree', + -19, + 53, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.StringsUpBow, + TechniqueSymbolPlacement.Below + ) + ], + [ 83, - 53, - 'stick.hit.hit', - 'JingleBell-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Golpe', - 'unpitched', - 'Golpe (thumb)', - -21, + new InstrumentArticulation( + 'jingleBell', + -20, + 53, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 124, - 62, - 'thumb.hit.body', - 'Golpe-Percu', - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.GuitarGolpe, - TechniqueSymbolPlacement.Below - ), - new InstrumentArticulation( - 'Golpe', - 'unpitched', - 'Golpe (finger)', - -22, + new InstrumentArticulation( + 'unpitched', + -21, + 62, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.GuitarGolpe, + TechniqueSymbolPlacement.Above + ) + ], + [ 125, - 62, - 'finger4.hit.body', - 'Golpe-Percu', - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.NoteheadNull, - MusicFontSymbol.GuitarGolpe, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'Hand Clap', - 'handClap', - 'Hand Clap (hit)', - 3, - 39, + new InstrumentArticulation( + 'unpitched', + -22, + 62, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.NoteheadNull, + MusicFontSymbol.GuitarGolpe, + TechniqueSymbolPlacement.Below + ) + ], + [ 39, - 'hand.hit.hit', - 'GroupHandClap-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Electric Snare', - 'snare', - 'Electric Snare (hit)', - 3, - 40, + new InstrumentArticulation( + 'handClap', + 3, + 39, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 40, - 'stick.hit.hit', - 'ElectricSnare-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Sticks', - 'snare', - 'Snare (side stick)', - 3, + new InstrumentArticulation( + 'snare', + 3, + 40, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 31, - 40, - 'stick.hit.sidestick', - 'Stick-Percu', - MusicFontSymbol.NoteheadSlashedBlack2, - MusicFontSymbol.NoteheadSlashedBlack2, - MusicFontSymbol.NoteheadSlashedBlack2 - ), - new InstrumentArticulation( - 'Very Low Floor Tom', - 'tom', - 'Low Floor Tom (hit)', - 5, - 41, + new InstrumentArticulation( + 'snare', + 3, + 40, + MusicFontSymbol.NoteheadSlashedBlack2, + MusicFontSymbol.NoteheadSlashedBlack2, + MusicFontSymbol.NoteheadSlashedBlack2 + ) + ], + [ 41, - 'stick.hit.hit', - 'LowFloorTom-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadHalf, - MusicFontSymbol.NoteheadWhole - ), - new InstrumentArticulation( - 'Ride Cymbal 2', - 'ride', - 'Ride (edge)', - 2, - 59, + new InstrumentArticulation( + 'tom', + 5, + 41, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadWhole + ) + ], + [ 59, - 'stick.hit.edge', - 'Ride-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.PictEdgeOfCymbal, - TechniqueSymbolPlacement.Above - ), - new InstrumentArticulation( - 'Ride Cymbal 2', - 'ride', - 'Ride (middle)', - 2, + new InstrumentArticulation( + 'ride', + 2, + 59, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.PictEdgeOfCymbal, + TechniqueSymbolPlacement.Below + ) + ], + [ 126, - 59, - 'stick.hit.mid', - 'Ride-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Ride Cymbal 2', - 'ride', - 'Ride (bell)', - 2, + new InstrumentArticulation( + 'ride', + 2, + 59, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 127, - 59, - 'stick.hit.bell', - 'Ride-Percu', - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite, - MusicFontSymbol.NoteheadDiamondWhite - ), - new InstrumentArticulation( - 'Ride Cymbal 2', - 'ride', - 'Ride (choke)', - 2, + new InstrumentArticulation( + 'ride', + 2, + 59, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite, + MusicFontSymbol.NoteheadDiamondWhite + ) + ], + [ 29, - 59, - 'stick.hit.choke', - 'Ride-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.ArticStaccatoAbove, - TechniqueSymbolPlacement.Outside - ), - new InstrumentArticulation( - 'Reverse Cymbal', - 'crash', - 'Reverse Cymbal (hit)', - -3, + new InstrumentArticulation( + 'ride', + 2, + 59, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.ArticStaccatoAbove, + TechniqueSymbolPlacement.Above + ) + ], + [ 30, - 49, - 'stick.hit.hit', - 'Reverse-Cymbal', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Metronome', - 'snare', - 'Metronome (hit)', - 3, + new InstrumentArticulation( + 'crash', + -3, + 49, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 33, - 37, - 'stick.hit.sidestick', - 'Metronome-Percu', - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack, - MusicFontSymbol.NoteheadXBlack - ), - new InstrumentArticulation( - 'Metronome', - 'snare', - 'Metronome (bell)', - 3, + new InstrumentArticulation( + 'snare', + 3, + 37, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack, + MusicFontSymbol.NoteheadXBlack + ) + ], + [ 34, - 38, - 'stick.hit.hit', - 'Metronome-Percu', - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadBlack, - MusicFontSymbol.NoteheadBlack - ), - ].map(articulation => [articulation.inputMidiNumber, articulation])); + new InstrumentArticulation( + 'snare', + 3, + 38, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadBlack, + MusicFontSymbol.NoteheadBlack + ) + ] + ]); // these are manually defined names/identifiers for the articulation list above. // they are currently only used in the AlphaTex importer when using default articulations @@ -1487,10 +1261,6 @@ export class PercussionMapper { public static getArticulationName(n: Note): string { const articulation = PercussionMapper.getArticulation(n); - if(articulation && articulation.articulationName !== '') { - return articulation.articulationName; - } - let input = n.percussionArticulation; if (articulation) { input = articulation.outputMidiNumber; From 97c8f8d4652711a369b1360abe14c040ebfa75d7 Mon Sep 17 00:00:00 2001 From: L-Sun Date: Sat, 3 Jan 2026 02:55:30 +0800 Subject: [PATCH 5/5] refactor(exporter): move gp related info from PercussionMapper to GpifWriter --- packages/alphatab/src/exporter/GpifWriter.ts | 165 ++++- .../src/generated/DisplaySettingsJson.ts | 1 + .../model/InstrumentArticulationSerializer.ts | 4 + .../alphatab/src/importer/MusicXmlImporter.ts | 2 + .../src/model/InstrumentArticulation.ts | 6 + .../alphatab/src/model/PercussionMapper.ts | 568 ++++++------------ 6 files changed, 348 insertions(+), 398 deletions(-) diff --git a/packages/alphatab/src/exporter/GpifWriter.ts b/packages/alphatab/src/exporter/GpifWriter.ts index a01ed2701..74d9241dc 100644 --- a/packages/alphatab/src/exporter/GpifWriter.ts +++ b/packages/alphatab/src/exporter/GpifWriter.ts @@ -105,6 +105,32 @@ class GpifMidiProgramInfo { } } +/** + * @internal + */ +class GpifArticulationInfo { + public inputMidiNumber: number + public elementName: string + public articulationName: string + public outputRSESound: string + public soundbankName: string + + constructor(inputMidiNumber: number, elementName: string, outputRSESound: string, soundbankName: string) { + this.inputMidiNumber = inputMidiNumber; + this.elementName = elementName; + this.outputRSESound = outputRSESound; + this.soundbankName = soundbankName; + + let articulationName = this.elementName + for (const [name, inputMidi] of PercussionMapper.instrumentArticulationNames) { + if (inputMidiNumber === inputMidi) { + articulationName = name; + } + } + this.articulationName = articulationName + } +} + /** * This class can write a score.gpif XML from a given score model. * @internal @@ -246,6 +272,102 @@ export class GpifWriter { [126, new GpifMidiProgramInfo(GpifIconIds.Fx, 'Recorder')], [127, new GpifMidiProgramInfo(GpifIconIds.Fx, 'Timpani')] ]); + private static _articulationExtraInfoLookup: Map = new Map([ + new GpifArticulationInfo(38, "Snare", "stick.hit.hit", "Master-Snare"), + new GpifArticulationInfo(37, "Snare", "stick.hit.sidestick", "Master-Snare"), + new GpifArticulationInfo(91, "Snare", "stick.hit.rimshot", "Master-Snare"), + new GpifArticulationInfo(42, "Charley", "stick.hit.closed", "Master-Hihat"), + new GpifArticulationInfo(92, "Charley", "stick.hit.half", "Master-Hihat"), + new GpifArticulationInfo(46, "Charley", "stick.hit.open", "Master-Hihat"), + new GpifArticulationInfo(44, "Charley", "pedal.hit.pedal", "Master-Hihat"), + new GpifArticulationInfo(35, "Acoustic Kick Drum", "pedal.hit.hit", "AcousticKick-Percu"), + new GpifArticulationInfo(36, "Kick Drum", "pedal.hit.hit", "Master-Kick"), + new GpifArticulationInfo(50, "Tom Very High", "stick.hit.hit", "Master-Tom05"), + new GpifArticulationInfo(48, "Tom High", "stick.hit.hit", "Master-Tom04"), + new GpifArticulationInfo(47, "Tom Medium", "stick.hit.hit", "Master-Tom03"), + new GpifArticulationInfo(45, "Tom Low", "stick.hit.hit", "Master-Tom02"), + new GpifArticulationInfo(43, "Tom Very Low", "stick.hit.hit", "Master-Tom01"), + new GpifArticulationInfo(93, "Ride", "stick.hit.edge", "Master-Ride"), + new GpifArticulationInfo(51, "Ride", "stick.hit.mid", "Master-Ride"), + new GpifArticulationInfo(53, "Ride", "stick.hit.bell", "Master-Ride"), + new GpifArticulationInfo(94, "Ride", "stick.hit.choke", "Master-Ride"), + new GpifArticulationInfo(55, "Splash", "stick.hit.hit", "Master-Splash"), + new GpifArticulationInfo(95, "Splash", "stick.hit.choke", "Master-Splash"), + new GpifArticulationInfo(52, "China", "stick.hit.hit", "Master-China"), + new GpifArticulationInfo(96, "China", "stick.hit.choke", "Master-China"), + new GpifArticulationInfo(49, "Crash High", "stick.hit.hit", "Master-Crash02"), + new GpifArticulationInfo(97, "Crash High", "stick.hit.choke", "Master-Crash02"), + new GpifArticulationInfo(57, "Crash Medium", "stick.hit.hit", "Master-Crash01"), + new GpifArticulationInfo(98, "Crash Medium", "stick.hit.choke", "Master-Crash01"), + new GpifArticulationInfo(99, "Cowbell Low", "stick.hit.hit", "CowbellBig-Percu"), + new GpifArticulationInfo(100, "Cowbell Low", "stick.hit.tip", "CowbellBig-Percu"), + new GpifArticulationInfo(56, "Cowbell Medium", "stick.hit.hit", "CowbellMid-Percu"), + new GpifArticulationInfo(101, "Cowbell Medium", "stick.hit.tip", "CowbellMid-Percu"), + new GpifArticulationInfo(102, "Cowbell High", "stick.hit.hit", "CowbellSmall-Percu"), + new GpifArticulationInfo(103, "Cowbell High", "stick.hit.tip", "CowbellSmall-Percu"), + new GpifArticulationInfo(77, "Woodblock Low", "stick.hit.hit", "WoodblockLow-Percu"), + new GpifArticulationInfo(76, "Woodblock High", "stick.hit.hit", "WoodblockHigh-Percu"), + new GpifArticulationInfo(60, "Bongo High", "hand.hit.hit", "BongoHigh-Percu"), + new GpifArticulationInfo(104, "Bongo High", "hand.hit.mute", "BongoHigh-Percu"), + new GpifArticulationInfo(105, "Bongo High", "hand.hit.slap", "BongoHigh-Percu"), + new GpifArticulationInfo(61, "Bongo Low", "hand.hit.hit", "BongoLow-Percu"), + new GpifArticulationInfo(106, "Bongo Low", "hand.hit.mute", "BongoLow-Percu"), + new GpifArticulationInfo(107, "Bongo Low", "hand.hit.slap", "BongoLow-Percu"), + new GpifArticulationInfo(66, "Timbale Low", "stick.hit.hit", "TimbaleLow-Percu"), + new GpifArticulationInfo(65, "Timbale High", "stick.hit.hit", "TimbaleHigh-Percu"), + new GpifArticulationInfo(68, "Agogo Low", "stick.hit.hit", "AgogoLow-Percu"), + new GpifArticulationInfo(67, "Agogo High", "stick.hit.hit", "AgogoHigh-Percu"), + new GpifArticulationInfo(64, "Conga Low", "hand.hit.hit", "CongaLow-Percu"), + new GpifArticulationInfo(108, "Conga Low", "hand.hit.slap", "CongaLow-Percu"), + new GpifArticulationInfo(109, "Conga Low", "hand.hit.mute", "CongaLow-Percu"), + new GpifArticulationInfo(63, "Conga High", "hand.hit.hit", "CongaHigh-Percu"), + new GpifArticulationInfo(110, "Conga High", "hand.hit.slap", "CongaHigh-Percu"), + new GpifArticulationInfo(62, "Conga High", "hand.hit.mute", "CongaHigh-Percu"), + new GpifArticulationInfo(72, "Whistle Low", "blow.hit.hit", "WhistleLow-Percu"), + new GpifArticulationInfo(71, "Whistle High", "blow.hit.hit", "WhistleHigh-Percu"), + new GpifArticulationInfo(73, "Guiro", "stick.hit.hit", "Guiro-Percu"), + new GpifArticulationInfo(74, "Guiro", "stick.scrape.return", "Guiro-Percu"), + new GpifArticulationInfo(86, "Surdo", "brush.hit.hit", "Surdo-Percu"), + new GpifArticulationInfo(87, "Surdo", "brush.hit.mute", "Surdo-Percu"), + new GpifArticulationInfo(54, "Tambourine", "hand.hit.hit", "Tambourine-Percu"), + new GpifArticulationInfo(111, "Tambourine", "hand.hit.return", "Tambourine-Percu"), + new GpifArticulationInfo(112, "Tambourine", "hand.hit.roll", "Tambourine-Percu"), + new GpifArticulationInfo(113, "Tambourine", "hand.hit.handhit", "Tambourine-Percu"), + new GpifArticulationInfo(79, "Cuica", "hand.hit.hit", "Cuica-Percu"), + new GpifArticulationInfo(78, "Cuica", "hand.hit.mute", "Cuica-Percu"), + new GpifArticulationInfo(58, "Vibraslap", "hand.hit.hit", "Vibraslap-Percu"), + new GpifArticulationInfo(81, "Triangle", "stick.hit.hit", "Triangle-Percu"), + new GpifArticulationInfo(80, "Triangle", "stick.hit.mute", "Triangle-Percu"), + new GpifArticulationInfo(114, "Grancassa", "mallet.hit.hit", "Grancassa-Percu"), + new GpifArticulationInfo(115, "Piatti", "hand.hit.hit", "Piatti-Percu"), + new GpifArticulationInfo(116, "Piatti", "hand.hit.hit", "Piatti-Percu"), + new GpifArticulationInfo(69, "Cabasa", "hand.hit.hit", "Cabasa-Percu"), + new GpifArticulationInfo(117, "Cabasa", "hand.hit.return", "Cabasa-Percu"), + new GpifArticulationInfo(85, "Castanets", "hand.hit.hit", "Castanets-Percu"), + new GpifArticulationInfo(75, "Claves", "stick.hit.hit", "Claves-Percu"), + new GpifArticulationInfo(70, "Left Maraca", "hand.hit.hit", "Maracas-Percu"), + new GpifArticulationInfo(118, "Left Maraca", "hand.hit.return", "Maracas-Percu"), + new GpifArticulationInfo(119, "Right Maraca", "hand.hit.hit", "Maracas-Percu"), + new GpifArticulationInfo(120, "Right Maraca", "hand.hit.return", "Maracas-Percu"), + new GpifArticulationInfo(82, "Shaker", "hand.hit.hit", "ShakerStudio-Percu"), + new GpifArticulationInfo(122, "Shaker", "hand.hit.return", "ShakerStudio-Percu"), + new GpifArticulationInfo(84, "Bell Tree", "stick.hit.hit", "BellTree-Percu"), + new GpifArticulationInfo(123, "Bell Tree", "stick.hit.return", "BellTree-Percu"), + new GpifArticulationInfo(83, "Jingle Bell", "stick.hit.hit", "JingleBell-Percu"), + new GpifArticulationInfo(124, "Golpe", "thumb.hit.body", "Golpe-Percu"), + new GpifArticulationInfo(125, "Golpe", "finger4.hit.body", "Golpe-Percu"), + new GpifArticulationInfo(39, "Hand Clap", "hand.hit.hit", "GroupHandClap-Percu"), + new GpifArticulationInfo(40, "Electric Snare", "stick.hit.hit", "ElectricSnare-Percu"), + new GpifArticulationInfo(31, "Sticks", "stick.hit.sidestick", "Stick-Percu"), + new GpifArticulationInfo(41, "Very Low Floor Tom", "stick.hit.hit", "LowFloorTom-Percu"), + new GpifArticulationInfo(59, "Ride Cymbal 2", "stick.hit.edge", "Ride-Percu"), + new GpifArticulationInfo(126, "Ride Cymbal 2", "stick.hit.mid", "Ride-Percu"), + new GpifArticulationInfo(127, "Ride Cymbal 2", "stick.hit.bell", "Ride-Percu"), + new GpifArticulationInfo(29, "Ride Cymbal 2", "stick.hit.choke", "Ride-Percu"), + new GpifArticulationInfo(30, "Reverse Cymbal", "stick.hit.hit", "Reverse-Cymbal"), + new GpifArticulationInfo(33, "Metronome", "stick.hit.sidestick", "Metronome-Percu"), + new GpifArticulationInfo(34, "Metronome", "stick.hit.hit", "Metronome-Percu"), + ].map(info=> [info.inputMidiNumber, info])) private static _drumKitProgramInfo: GpifMidiProgramInfo = new GpifMidiProgramInfo( GpifIconIds.PercussionKit, @@ -1739,34 +1861,33 @@ 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(); 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; + const extraArticulationInfo = GpifWriter._articulationExtraInfoLookup.get(articulation.inputMidiNumber); + + // Group by elementName (e.g., 'Snare', 'Charley', 'Kick Drum') + // If elementName is not set, fall back to elementType + const elementNameToUse = extraArticulationInfo?.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 = extraArticulationInfo?.soundbankName || ''; currentArticulations = currentElement.addElement('Articulations'); } const articulationNode = currentArticulations.addElement('Articulation'); - articulationNode.addElement('Name').innerText = - `${currentElementName} ${currentArticulations.childNodes.length}`; + // Use articulationName if available, otherwise generate a name + + articulationNode.addElement('Name').innerText = extraArticulationInfo?.articulationName || ''; articulationNode.addElement('StaffLine').innerText = articulation.staffLine.toString(); articulationNode.addElement('Noteheads').innerText = [ this._mapMusicSymbol(articulation.noteHeadDefault), @@ -1791,10 +1912,14 @@ 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 = extraArticulationInfo?.outputRSESound || ''; articulationNode.addElement('OutputMidiNumber').innerText = articulation.outputMidiNumber.toString(); } - } else { + } else { const programInfo = GpifWriter._midiProgramInfoLookup.has(track.playbackInfo.program) ? GpifWriter._midiProgramInfoLookup.get(track.playbackInfo.program)! : GpifWriter._midiProgramInfoLookup.get(0)!; diff --git a/packages/alphatab/src/generated/DisplaySettingsJson.ts b/packages/alphatab/src/generated/DisplaySettingsJson.ts index cdbaf34b1..8b3febfa4 100644 --- a/packages/alphatab/src/generated/DisplaySettingsJson.ts +++ b/packages/alphatab/src/generated/DisplaySettingsJson.ts @@ -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; } diff --git a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts index 2e91ec8b8..3b695eeec 100644 --- a/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts +++ b/packages/alphatab/src/generated/model/InstrumentArticulationSerializer.ts @@ -29,6 +29,7 @@ export class InstrumentArticulationSerializer { o.set("noteheadwhole", obj.noteHeadWhole as number); o.set("techniquesymbol", obj.techniqueSymbol as number); o.set("techniquesymbolplacement", obj.techniqueSymbolPlacement as number); + o.set("inputmidinumber", obj.inputMidiNumber); o.set("outputmidinumber", obj.outputMidiNumber); return o; } @@ -55,6 +56,9 @@ export class InstrumentArticulationSerializer { case "techniquesymbolplacement": obj.techniqueSymbolPlacement = JsonHelper.parseEnum(v, TechniqueSymbolPlacement)!; return true; + case "inputmidinumber": + obj.inputMidiNumber = v! as number; + return true; case "outputmidinumber": obj.outputMidiNumber = v! as number; return true; diff --git a/packages/alphatab/src/importer/MusicXmlImporter.ts b/packages/alphatab/src/importer/MusicXmlImporter.ts index 51c1ef281..aa2e1bc85 100644 --- a/packages/alphatab/src/importer/MusicXmlImporter.ts +++ b/packages/alphatab/src/importer/MusicXmlImporter.ts @@ -130,6 +130,7 @@ class TrackInfo { 'Default', 0, 0, + 0, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole @@ -171,6 +172,7 @@ class TrackInfo { const newArticulation = new InstrumentArticulation( articulation.elementType, staffLine, + articulation.inputMidiNumber, articulation.outputMidiNumber, articulation.noteHeadDefault, articulation.noteHeadHalf, diff --git a/packages/alphatab/src/model/InstrumentArticulation.ts b/packages/alphatab/src/model/InstrumentArticulation.ts index 47d1415aa..dbfcfe236 100644 --- a/packages/alphatab/src/model/InstrumentArticulation.ts +++ b/packages/alphatab/src/model/InstrumentArticulation.ts @@ -67,6 +67,10 @@ export class InstrumentArticulation { */ public techniqueSymbolPlacement: TechniqueSymbolPlacement; + /** + * Gets or sets which midi key to use when playing the note. + */ + public inputMidiNumber: number; /** * Gets or sets which midi key to use when playing the note. */ @@ -75,6 +79,7 @@ export class InstrumentArticulation { public constructor( elementType: string = '', staffLine: number = 0, + inputMidiNumber: number = 0, outputMidiNumber: number = 0, noteHeadDefault: MusicFontSymbol = MusicFontSymbol.None, noteHeadHalf: MusicFontSymbol = MusicFontSymbol.None, @@ -83,6 +88,7 @@ export class InstrumentArticulation { techniqueSymbolPlacement: TechniqueSymbolPlacement = TechniqueSymbolPlacement.Inside ) { this.elementType = elementType; + this.inputMidiNumber = inputMidiNumber; this.outputMidiNumber = outputMidiNumber; this.staffLine = staffLine; this.noteHeadDefault = noteHeadDefault; diff --git a/packages/alphatab/src/model/PercussionMapper.ts b/packages/alphatab/src/model/PercussionMapper.ts index 6654fce0f..e18677b6d 100644 --- a/packages/alphatab/src/model/PercussionMapper.ts +++ b/packages/alphatab/src/model/PercussionMapper.ts @@ -64,10 +64,10 @@ export class PercussionMapper { * const noteHeads = articulation.getElementsByTagName('Noteheads')[0].textContent.split(' ').map(n=>n = 'MusicFontSymbol.' + n); * if(!existingArticulations.has(midi)) { * if(techniqueSymbol) { - * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]}, ${techniqueSymbol}, ${techniquePlacement})],\r\n`; + * s += `new InstrumentArticulation(${staffLine}, ${midi}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]}, ${techniqueSymbol}, ${techniquePlacement}),\r\n`; * } * else { - * s += `['${elementType}', ${midi}, new InstrumentArticulation(${staffLine}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]})],\r\n`; + * s += `new InstrumentArticulation(${staffLine}, ${midi}, ${outputMidiNumber}, ${noteHeads[0]}, ${noteHeads[1]}, ${noteHeads[2]}),\r\n`; * } * existingArticulations.set(midi, true); * } @@ -76,1085 +76,897 @@ export class PercussionMapper { * copy(s) */ public static instrumentArticulations: Map = new Map([ - [ - 38, new InstrumentArticulation( 'snare', 3, 38, + 38, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 37, + ), new InstrumentArticulation( 'snare', 3, 37, + 37, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 91, + ), new InstrumentArticulation( 'snare', 3, + 91, 38, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 42, + ), new InstrumentArticulation( 'hiHat', -1, 42, + 42, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 92, + ), new InstrumentArticulation( 'hiHat', -1, + 92, 46, MusicFontSymbol.NoteheadCircleSlash, MusicFontSymbol.NoteheadCircleSlash, MusicFontSymbol.NoteheadCircleSlash - ) - ], - [ - 46, + ), new InstrumentArticulation( 'hiHat', -1, 46, + 46, MusicFontSymbol.NoteheadCircleX, MusicFontSymbol.NoteheadCircleX, MusicFontSymbol.NoteheadCircleX - ) - ], - [ - 44, + ), new InstrumentArticulation( 'hiHat', 9, 44, + 44, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 35, + ), new InstrumentArticulation( 'kickDrum', 8, 35, + 35, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 36, + ), new InstrumentArticulation( 'kickDrum', 7, 36, + 36, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 50, + ), new InstrumentArticulation( 'tom', 1, 50, + 50, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 48, + ), new InstrumentArticulation( 'tom', 2, 48, + 48, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 47, + ), new InstrumentArticulation( 'tom', 4, 47, + 47, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 45, + ), new InstrumentArticulation( 'tom', 5, 45, + 45, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 43, + ), new InstrumentArticulation( 'tom', 6, 43, + 43, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 93, + ), new InstrumentArticulation( 'ride', 0, + 93, 51, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.PictEdgeOfCymbal, TechniqueSymbolPlacement.Below - ) - ], - [ - 51, + ), new InstrumentArticulation( 'ride', 0, 51, + 51, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 53, + ), new InstrumentArticulation( 'ride', 0, 53, + 53, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 94, + ), new InstrumentArticulation( 'ride', 0, + 94, 51, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Above - ) - ], - [ - 55, + ), new InstrumentArticulation( 'splash', -2, 55, + 55, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 95, + ), new InstrumentArticulation( 'splash', -2, + 95, 55, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Below - ) - ], - [ - 52, + ), new InstrumentArticulation( 'china', -3, 52, + 52, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat - ) - ], - [ - 96, + ), new InstrumentArticulation( 'china', -3, + 96, 52, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat, MusicFontSymbol.NoteheadHeavyXHat - ) - ], - [ - 49, + ), new InstrumentArticulation( 'crash', -2, 49, + 49, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX - ) - ], - [ - 97, + ), new InstrumentArticulation( 'crash', -2, + 97, 49, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Below - ) - ], - [ - 57, + ), new InstrumentArticulation( 'crash', -1, 57, + 57, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX - ) - ], - [ - 98, + ), new InstrumentArticulation( 'crash', -1, + 98, 57, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.NoteheadHeavyX, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Below - ) - ], - [ - 99, + ), new InstrumentArticulation( 'cowbell', 1, + 99, 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 100, + ), new InstrumentArticulation( 'cowbell', 1, + 100, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 56, + ), new InstrumentArticulation( 'cowbell', 0, 56, + 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 101, + ), new InstrumentArticulation( 'cowbell', 0, + 101, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 102, + ), new InstrumentArticulation( 'cowbell', -1, + 102, 56, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpHalf, MusicFontSymbol.NoteheadTriangleUpWhole - ) - ], - [ - 103, + ), new InstrumentArticulation( 'cowbell', -1, + 103, 56, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXHalf, MusicFontSymbol.NoteheadXWhole - ) - ], - [ - 77, + ), new InstrumentArticulation( 'woodblock', -9, 77, + 77, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 76, + ), new InstrumentArticulation( 'woodblock', -10, 76, + 76, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 60, + ), new InstrumentArticulation( 'bongo', -4, 60, + 60, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 104, + ), new InstrumentArticulation( 'bongo', -5, + 104, 60, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 105, + ), new InstrumentArticulation( 'bongo', -6, + 105, 60, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 61, + ), new InstrumentArticulation( 'bongo', -7, 61, + 61, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 106, + ), new InstrumentArticulation( 'bongo', -8, + 106, 61, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 107, + ), new InstrumentArticulation( 'bongo', -16, + 107, 61, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 66, + ), new InstrumentArticulation( 'timbale', 10, 66, + 66, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 65, + ), new InstrumentArticulation( 'timbale', 9, 65, + 65, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 68, + ), new InstrumentArticulation( 'agogo', 12, 68, + 68, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 67, + ), new InstrumentArticulation( 'agogo', 11, 67, + 67, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 64, + ), new InstrumentArticulation( 'conga', 17, 64, + 64, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 108, + ), new InstrumentArticulation( 'conga', 16, + 108, 64, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 109, + ), new InstrumentArticulation( 'conga', 15, + 109, 64, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 63, + ), new InstrumentArticulation( 'conga', 14, 63, + 63, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 110, + ), new InstrumentArticulation( 'conga', 13, + 110, 63, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 62, + ), new InstrumentArticulation( 'conga', 19, 62, + 62, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 72, + ), new InstrumentArticulation( 'whistle', -11, 72, + 72, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 71, + ), new InstrumentArticulation( 'whistle', -17, 71, + 71, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 73, + ), new InstrumentArticulation( 'guiro', 38, 73, + 73, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 74, + ), new InstrumentArticulation( 'guiro', 37, 74, + 74, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 86, + ), new InstrumentArticulation( 'surdo', 36, 86, + 86, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 87, + ), new InstrumentArticulation( 'surdo', 35, 87, + 87, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 54, + ), new InstrumentArticulation( 'tambourine', 3, 54, + 54, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack - ) - ], - [ - 111, + ), new InstrumentArticulation( 'tambourine', 2, + 111, 54, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 112, + ), new InstrumentArticulation( 'tambourine', 1, + 112, 54, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.NoteheadTriangleUpBlack, MusicFontSymbol.StringsDownBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 113, + ), new InstrumentArticulation( 'tambourine', -7, + 113, 54, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 79, + ), new InstrumentArticulation( 'cuica', 30, 79, + 79, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 78, + ), new InstrumentArticulation( 'cuica', 29, 78, + 78, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 58, + ), new InstrumentArticulation( 'vibraslap', 28, 58, + 58, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 81, + ), new InstrumentArticulation( 'triangle', 27, 81, + 81, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 80, + ), new InstrumentArticulation( 'triangle', 26, 80, + 80, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadParenthesis, TechniqueSymbolPlacement.Inside - ) - ], - [ - 114, + ), new InstrumentArticulation( 'grancassa', 25, + 114, 43, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 115, + ), new InstrumentArticulation( 'piatti', 18, + 115, 49, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 116, + ), new InstrumentArticulation( 'piatti', 24, + 116, 49, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 69, + ), new InstrumentArticulation( 'cabasa', 23, 69, + 69, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 117, + ), new InstrumentArticulation( 'cabasa', 22, + 117, 69, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 85, + ), new InstrumentArticulation( 'castanets', 21, 85, + 85, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 75, + ), new InstrumentArticulation( 'claves', 20, 75, + 75, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 70, + ), new InstrumentArticulation( 'maraca', -12, 70, + 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 118, + ), new InstrumentArticulation( 'maraca', -13, + 118, 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 119, + ), new InstrumentArticulation( 'maraca', -14, + 119, 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 120, + ), new InstrumentArticulation( 'maraca', -15, + 120, 70, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 82, + ), new InstrumentArticulation( 'shaker', -23, + 82, 54, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 122, + ), new InstrumentArticulation( 'shaker', -24, + 122, 54, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 84, + ), new InstrumentArticulation( 'bellTree', -18, + 84, 53, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 123, + ), new InstrumentArticulation( 'bellTree', -19, + 123, 53, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole, MusicFontSymbol.StringsUpBow, TechniqueSymbolPlacement.Below - ) - ], - [ - 83, + ), new InstrumentArticulation( 'jingleBell', -20, + 83, 53, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 124, + ), new InstrumentArticulation( 'unpitched', -21, + 124, 62, MusicFontSymbol.NoteheadNull, MusicFontSymbol.NoteheadNull, MusicFontSymbol.NoteheadNull, MusicFontSymbol.GuitarGolpe, TechniqueSymbolPlacement.Above - ) - ], - [ - 125, + ), new InstrumentArticulation( 'unpitched', -22, + 125, 62, MusicFontSymbol.NoteheadNull, MusicFontSymbol.NoteheadNull, MusicFontSymbol.NoteheadNull, MusicFontSymbol.GuitarGolpe, TechniqueSymbolPlacement.Below - ) - ], - [ - 39, + ), new InstrumentArticulation( 'handClap', 3, 39, + 39, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 40, + ), new InstrumentArticulation( 'snare', 3, 40, + 40, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 31, + ), new InstrumentArticulation( 'snare', 3, + 31, 40, MusicFontSymbol.NoteheadSlashedBlack2, MusicFontSymbol.NoteheadSlashedBlack2, MusicFontSymbol.NoteheadSlashedBlack2 - ) - ], - [ - 41, + ), new InstrumentArticulation( 'tom', 5, 41, + 41, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadHalf, MusicFontSymbol.NoteheadWhole - ) - ], - [ - 59, + ), new InstrumentArticulation( 'ride', 2, 59, + 59, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.PictEdgeOfCymbal, TechniqueSymbolPlacement.Below - ) - ], - [ - 126, + ), new InstrumentArticulation( 'ride', 2, + 126, 59, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 127, + ), new InstrumentArticulation( 'ride', 2, + 127, 59, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite, MusicFontSymbol.NoteheadDiamondWhite - ) - ], - [ - 29, + ), new InstrumentArticulation( 'ride', 2, + 29, 59, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.ArticStaccatoAbove, TechniqueSymbolPlacement.Above - ) - ], - [ - 30, + ), new InstrumentArticulation( 'crash', -3, + 30, 49, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 33, + ), new InstrumentArticulation( 'snare', 3, + 33, 37, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack, MusicFontSymbol.NoteheadXBlack - ) - ], - [ - 34, + ), new InstrumentArticulation( 'snare', 3, + 34, 38, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadBlack, MusicFontSymbol.NoteheadBlack ) - ] - ]); + ].map(articulation => [articulation.inputMidiNumber, articulation])); // these are manually defined names/identifiers for the articulation list above. // they are currently only used in the AlphaTex importer when using default articulations