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)
| Technique | Category | XML Element / Detection | Keyswitch Semantics |
|---|---|---|---|
Muting | Sustained | <mute>palm</mute> or <mute>straight</mute> | Variant: Open/Semi-Closed/Closed/Dead |
Vibrato | Sustained | <vibrato/> (with type attr in GP) | Held for the duration of the note |
VibratoWTremBar | Sustained | GP-PI <vibratoWTremBar/> (with type attr) | Held for the duration of the note |
NaturalHarmonic | PerNote | <harmonic><natural/></harmonic> in <technical> | Single-shot at the note’s onset |
PinchHarmonic | PerNote | <harmonic/> without <natural/> in <technical> | Single-shot at the note’s onset |
FingerPluckOpen | PerNote | <pluck> in <technical> | Single-shot at the note’s onset |
FingerPluckDead | PerNote | <pluck> + <mute>straight</mute> or x-notehead | Single-shot at the note’s onset |
TremoloPick | PerNote | <tremolo> in <ornaments> | Single-shot at the note’s onset |
ThumbSlap | PerNote | GP-PI <bass-attack type="slap"/> | Single-shot at the note’s onset |
Pop | PerNote | GP-PI <bass-attack type="pop"/> | Single-shot at the note’s onset |
Tap | PerNote | <tap/> | Single-shot at the note’s onset |
LhTap | PerNote | GP-PI <lhtapping/> | Single-shot at the note’s onset |
ChokedNote | PerNote | <other-technical type="choked-note"/> | Single-shot at the note’s onset |
PickScrape | PerNote | GP Slide property bit 0x40 (or 0x80 GP8 quirk) | Single-shot; routes to a dedicated keyswitch |
AutoSlide | PerNote | GP Slide property bit 0x01 (Phase 22 addition) | “Host-decides-direction” legato slide-in |
HammerOn | Span | <hammer-on type="start"/> … <.../type="stop"/> | Held from first note onset to last note end |
PullOff | Span | <hammer-on> span where second pitch < first | Held from first note onset to last note end |
Slur | Span | <slur type="start"/> … <.../type="stop"/> | Held; legato (hammer-on / pull-off by pitch) |
Slide | Span | <slide type="start"/> … <.../type="stop"/> | Held; pitch glide along the run |
SlideInFromAbove | PerNote | <plop/> in <articulations> | Single-shot at the note’s onset |
SlideInFromBelow | PerNote | <scoop/> in <articulations> | Single-shot at the note’s onset |
SlideOutDown | PerNote | <falloff/> in <articulations> | Single-shot at the note’s onset |
SlideOutUp | PerNote | <doit/> in <articulations> | Single-shot at the note’s onset |
Bend | Span | <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 intoSlideInFromBelowClosedPalmMute,SemiClosedPalmMute,DeadMute— consolidated as variant children ofMuting
Adding a New Technique
The cadence is one commit per enum value, never a sweeping rewrite. Each new value lands with:
- The enumerator added to
Technique(in enumeration order matching its category bucket: Sustained -> PerNote -> Span). kNumTechniquesbumped; the static_assert anchors the new count.- An entry added to the
kTablearray inTechniqueCoding.cpp:- JSON name (PascalCase), XML name (kebab-case), human-readable label, category, and universal flag.
- Parser detection rule — usually
<other-technical type="...">mapped viatechniqueFromXML, or a dedicated<element/>match. - Test in
tests/TechniqueParserTests.cppdriving a synthetic XML fixture that triggers the new detection path. - A row added to
kExpectedEntriesintests/TechniqueCodingTests.cppcovering JSON / XML / category. - This document updated with the new row in the table above.