dart_gp_tab_reader 0.4.0
dart_gp_tab_reader: ^0.4.0 copied to clipboard
Pure-Dart, read-only reader for Guitar Pro tablature files (GP3, GP4, GP5, GP6 .gpx and GP7/GP8 .gp). Parses them into a Song > Track > Measure > Voice > Beat > Note tree.
0.4.0 #
- Vibrato keeps its written width.
NoteEffect.vibratoandBeatEffect.vibratochanged fromboolto the newVibratoKind(none/slight/wide) — BREAKING for anyone reading those fields. GP6/7/8 write the width out (<Vibrato>Slight</Vibrato>/<Vibrato>Wide</Vibrato>, and<Strength>inside the beat'sVibratoWTremBarproperty) and it was thrown away: every vibrato read as one undifferentiated flag. The GP3-5 binaries have no strength byte, so their note flag reads asslightand their beat flag — the trem-bar vibrato — aswide, which is what those flags mean. BeatEffect.vibratois now documented for what it is: vibrato played with the TREMOLO BAR across the whole beat, not the fretting hand's~(NoteEffect.vibrato).- GPIF reader: the pickup (anacrusis) bar is no longer timed as a full one.
GP7/8 flags it once on the
<MasterTrack>(<Anacrusis/>), meaning "the first bar is a pickup"; the reader only looked for the flag inside a<MasterBar>(where older writers put it), so a half-note pickup notated in 4/4 kept the full four beats. Everything after the pickup was pushed late by the unplayed rest — a two-beat gap after the intro note, and a bar grid offset from the music for the whole song.
0.3.4 #
- GPIF reader: mid-bar automations are no longer dropped. An
<Automation>'s<Position>is an offset in QUARTER NOTES from the bar's start (2.5= the "and" of beat 3 in a 4/4 bar); it was read as a 0..1 fraction of the bar, which sent every off-downbeat automation past the end of its own bar, where no beat matched and the change was silently skipped. OnlyPosition 0automations survived. So a mid-barSoundswitch — the usual clean → distortion change, which players write on the upbeat going into the riff — never reachedMixTableChange.instrument, and mid-bar tempo changes were lost the same way.
0.3.3 #
- GPIF reader: natural harmonics keep their
HFrettouch node.NaturalHarmonicgained an optionalfretfield (absolute node position in frets above the nut, e.g.5.8= seventh-partial node). Previously the node was dropped for natural harmonics, so consumers could only guess the sounding partial from the notated fret — which is ambiguous (a harmonic notated at fret 6 is the 5.8 node, two-octaves-and-a-seventh above the open string, not an octave). GP3-5 files still producefret == null(the binary formats carry no node).
0.3.2 #
- GPIF reader: multi-point bend curves. The full
BendOrigin/Middle/Destination{Value,Offset}property set is now read (mirroring alphaTab's mapping), so bend-releases, pre-bends and held bends keep their real shape — previously every bend was flattened to a single0 → destinationlinear ramp. - GPIF reader: whammy bar. Both the GP7/8
WhammyBar*beat properties and the GP6<Whammy>attribute form now land onBeatEffect.tremoloBarwith the same multi-point curve; whammy gestures in.gp/.gpxfiles were previously dropped entirely. - GPIF reader: tremolo picking (
<Tremolo>1/2|1/4|1/8</Tremolo>beat element →NoteEffect.tremoloPickingat eighth/16th/32nd strokes), trills (<Trill>note element, MIDI value converted to a fret on the note's string, 16th period) and accent flags (<Accent>bit field: 0x01 staccato, 0x04 heavy accent, 0x08 accent) are now read — all were previously dropped. - GPIF reader: grace notes. A
<GraceNotes>beat's notes now becomeGraceEffects on the matching notes of the following real beat (fret, velocity, duration, on/before-beat placement, hammered/slid transition) instead of being skipped outright. Bar timing is unchanged (a grace beat still consumes no bar time).
0.3.1 #
- GPIF reader:
HarmonicTypevalues are now matched case-insensitively — some GPIF writers emitartificial/naturallowercase, which previously dropped the harmonic entirely. A note with an enabledHarmonicproperty but no recognized type now falls back to a natural harmonic instead of none. - GPIF reader: the
HarmonicFrettouch-node distance is now read — artificial harmonics carry it in the newArtificialHarmonic.fretfield, tapped harmonics resolve it to their absolute tap fret (TappedHarmonic.fret), matching the GP4/5 readers.
0.3.0 #
- Guitar Pro 6 (
.gpx) support.parseGpnow decodes the proprietary BCFS/BCFZ container (lib/src/gpx_reader.dart, bit-level LZ decompressor + sector filesystem, ported from alphaTab'sGpxFileSystem) and feeds the innerscore.gpifto the GPIF reader. New export:parseGpx. - GPIF reader: GP6 percussion notes (
Element/Variationproperties) are now mapped to GM drum keys, matching the GP7/8 articulation handling.
0.2.0 #
- Guitar Pro 7/8 (
.gp) support.parseGpnow detects the zip-based.gpcontainer by its bytes and parses theContent/score.gpifGPIF XML score into the sameSongtree as the GP3–5 readers. Covered: metadata, tempo (incl. mid-song tempo automations, mapped toMixTableChange.tempo), per-track tuning/capo/GM program/volume/pan, mid-song sound switches (Soundautomations →MixTableChange.instrument), percussion articulation mapping to GM drum keys, time signatures, repeats, section markers, anacrusis (pickup) bars, rests, ties, dead/ghost notes, palm mute, let ring, hammer-on/pull-off, slides, bends, harmonics, vibrato, slap/pop/tap and dynamics. Grace beats are skipped (they carry no bar time in GPIF). - New exports:
parseGp7(zip container) andparseGpif(barescore.gpifXML, useful for GP6.gpxpayloads unpacked by other means). - GP6
.gpx(BCFS/BCFZ container) is still not decoded, but is now rejected with a clearGpExceptioninstead of an "unsupported version" error. - New dependencies:
archive,xml.
0.1.1 #
- Added dartdoc comments across the public API (
models.dart): every model class, enum, constructor and key field is now documented (≈99% coverage). - No functional changes.
0.1.0 #
- Initial release.
- Pure-Dart, read-only reader for Guitar Pro GP3, GP4 and GP5 files.
- Parses into a
Song→Track→Measure→Voice→Beat→Notetree. - Dart port of PyGuitarPro; the binary parsing logic mirrors it closely. Test fixtures and the reference dump are taken from the PyGuitarPro test suite.