Skip to content

Techniques: The Base Set

Techniques: The Base Set

Techniques::Technique (in src/public/techniques/Technique.h) enumerates every performance modifier the engine can detect from MusicXML and emit as a keyswitch. The list is intentionally curated — every value carries weight in profile JSON and the editor’s keyswitch grid, so adding members costs real estate.

The Base Set (post-Phase 16)

TechniqueCategoryXML Element / DetectionKeyswitch Semantics
MutingSustained<mute>palm</mute> or <mute>straight</mute>Variant: Open/Semi-Closed/Closed/Dead
VibratoSustained<vibrato/> (with type attr in GP)Held for the duration of the note
VibratoWTremBarSustainedGP-PI <vibratoWTremBar/> (with type attr)Held for the duration of the note
NaturalHarmonicPerNote<harmonic><natural/></harmonic> in <technical>Single-shot at the note’s onset
PinchHarmonicPerNote<harmonic/> without <natural/> in <technical>Single-shot at the note’s onset
FingerPluckOpenPerNote<pluck> in <technical>Single-shot at the note’s onset
FingerPluckDeadPerNote<pluck> + <mute>straight</mute> or x-noteheadSingle-shot at the note’s onset
TremoloPickPerNote<tremolo> in <ornaments>Single-shot at the note’s onset
ThumbSlapPerNoteGP-PI <bass-attack type="slap"/>Single-shot at the note’s onset
PopPerNoteGP-PI <bass-attack type="pop"/>Single-shot at the note’s onset
TapPerNote<tap/>Single-shot at the note’s onset
LhTapPerNoteGP-PI <lhtapping/>Single-shot at the note’s onset
ChokedNotePerNote<other-technical type="choked-note"/>Single-shot at the note’s onset
PickScrapePerNoteGP Slide property bit 0x40 (or 0x80 GP8 quirk)Single-shot; routes to a dedicated keyswitch
AutoSlidePerNoteGP Slide property bit 0x01 (Phase 22 addition)“Host-decides-direction” legato slide-in
HammerOnSpan<hammer-on type="start"/><.../type="stop"/>Held from first note onset to last note end
PullOffSpan<hammer-on> span where second pitch < firstHeld from first note onset to last note end
SlurSpan<slur type="start"/><.../type="stop"/>Held; legato (hammer-on / pull-off by pitch)
SlideSpan<slide type="start"/><.../type="stop"/>Held; pitch glide along the run
SlideInFromAbovePerNote<plop/> in <articulations>Single-shot at the note’s onset
SlideInFromBelowPerNote<scoop/> in <articulations>Single-shot at the note’s onset
SlideOutDownPerNote<falloff/> in <articulations>Single-shot at the note’s onset
SlideOutUpPerNote<doit/> in <articulations>Single-shot at the note’s onset
BendSpan<bend> (single-note span)Single-note span; pitch wheel envelope

kNumTechniques is the count of enumerators (currently 24) and is anchored by a static_assert. Techniques::getCategory(t) returns the Sustained / PerNote / Span classification used by the injector.

PickScrape and AutoSlide are only detected by the native Guitar Pro importers (.gp / .gpx) — MusicXML has no standard encoding for either, so the MusicXML parser leaves both flags clear.

Removed techniques

  • LetRing — removed (no VST supports it via keyswitch)
  • Scoop — consolidated into SlideInFromBelow
  • ClosedPalmMute, SemiClosedPalmMute, DeadMute — consolidated as variant children of Muting

Adding a New Technique

The cadence is one commit per enum value, never a sweeping rewrite. Each new value lands with:

  1. The enumerator added to Technique (in enumeration order matching its category bucket: Sustained -> PerNote -> Span).
  2. kNumTechniques bumped; the static_assert anchors the new count.
  3. An entry added to the kTable array in TechniqueCoding.cpp:
    • JSON name (PascalCase), XML name (kebab-case), human-readable label, category, and universal flag.
  4. Parser detection rule — usually <other-technical type="..."> mapped via techniqueFromXML, or a dedicated <element/> match.
  5. Test in tests/TechniqueParserTests.cpp driving a synthetic XML fixture that triggers the new detection path.
  6. A row added to kExpectedEntries in tests/TechniqueCodingTests.cpp covering JSON / XML / category.
  7. This document updated with the new row in the table above.