This is a description/specification of GITI (variant E) – Guitar Instrument Text Interface (electric) – version 4.1: an electric guitar music notation text format.
GITI is concise, expressive, and usable by both humans and software. The format is in ASCII text (so also UTF-8). (File-name suffix could be: .giti or: .giti.txt .).
Traditional musical notation is powerful and general, but rather mechanically complex and demanding (despite its aesthetic recompense). Guitar tabs are better focused, but with obvious weaknesses and still awkward to read automatically and write manually. GITI follows the specialisation of tabs but flattens them into a more manipulable word-like form, and redeems the larger shortfall by adding a traditional kind of time information – all somewhat inspired by the event-packet basic form of MIDI. But it can also be rendered in familiar quasi-graphic tab form.
This version does not cover vibrato-bridge use or complex parallelism. The former might be an easy addition, but the latter would need more design and adjustment.
A whole Piece is a string of Sounds, Indicators, Annotations, and Comments. Sounds and indicators are blank-separated tokens, and annotations and comments are special lines.
As a brief overview, consider this ordinary tab:
Black Sabbath ‘Black Sabbath’, main riff |--------|-------------| |--------|-------------| |--------|-------------| |------5-|-------------| |-5------|-4r1----4/10-| |-3------|-------------|
In GITI it is (note first how the 3, 5, 4 fret-numbers are prepended with their string-number):
# Black Sabbath ‘Black Sabbath’, main riff @ giti:e-4.1 tuning:std tempo:3.603 |4 63=55:2 ' 45 | | 54r1:2**e s:54/10:8s |
The format also allows degrees of simplification: omitting chords, ornament, articulation (second line), and time, down to only pitch (third line):
63=55:2 45 54r1:2**e s:54/10:8s 63:2 45 54:1 63 45 54
And GITI can also be rendered back into tab-form including all its extras (actuation above, time below):
# Black Sabbath ‘Black Sabbath’, main riff @ giti:e-4.1 tuning:std tempo:3.603 #= s #= |---------|-----------| #= |---------|-----------| #= |---------|-----------| #= |-------5-|-----------| #= |---5-----|-4r1--4/10-| #= |---3-----|-----------| #= |4: 2 ' 2 2**e 8s
The following sections will explain the details.
SBNF:
(piece
(* (| content
annotation
metadata
comment
blankline)))
(content
(, (* blank)
(+ (| sound
indicator)
(+ blank))
(* blank)
newline))
A Sound has three parts:
separated by colons. For example: pluck string 5 fret 4 with vibrato for a quarter-note:
p:54v:4
Or more complex: a unison-bend, into a slide:
p:314>2=212:4e s:314/21
Simplified uses can omit either or both act and time:
p:54:4 54:4 p:54 54
(Two other, secondary, sound forms – continuation and rest – will be described later in the time sub-section.).
SBNF:
(sound
(| ordinary
continuation
rest))
(ordinary
(, (? (, act ":"))
pitch
(? (, ":" time))))
(continuation
(, "&" (? (, ":" time))))
(rest
(, "." (? (, ":" time))))
An act has two parts: basic and extra:
Basics (optional, one of):
Extras (optional, combination):
A sound can omit its act entirely, or either of its parts, which default to 'p' and none. (So if the act is omitted, the sound has the act 'p(none)'.).
SBNF:
(act
(, (? actbasic)
(? actextra)))
(actbasic
(| "p" "h" "u" "w" "s" "t" "i" "f" "b" "e" "m"))
(actextra
(, (? (| "$" "%"))
(? (| "+" "-"))
(? (| "<" ">"))))
A pitch has two parts: basic and extra:
Basics (required, one of):
Extras (optional, combination):
Chords have multiple pitchs separated by ‘=’:
p:63=55:4
(Pitchs do not have a default.).
SBNF:
(pitch
(+ (, pitchbasic
pitchextra)
"="))
(pitchbasic
(| stringfret
scorenote))
(stringfret
(, int1-9 int0-24))
(scorenote
(, (| "A" "B" "C" "D" "E" "F" "G")
(? (| "#" "b"))
int0-8))
(pitchextra
(, (? (| (, ">" (| "?"
(, int1-5 (? "?"))))
(, "<" (| "?"
(, int1-5 (? "?"))))
(, "/" int0-24)
(, "\\" int0-24)))
(? (| "v"
(, "r" (? (, (? "-")
int1-9
(? int1-9))))))
(? (| "h"
"i"))))
A time has two parts: basic and extra:
Basics (optional):
(E.g.: whole note = 1, 1/4 note = 4, 1/3 note = 3, dotted 1/4 note = 4-8, double-dotted 1/2 note = 2**, grace note = 0.)
Extras (optional, one of):
There are two special sound forms: Continuation and Rest. Continuation sounds are merely a shorthand for a tied note, and have a ‘&’ and time, instead of act and pitch:
&:2
and Rests have a ‘.’ and time, instead of act and pitch:
.:2
A sound (including continuations and rests) can omit its time entirely, or either of its main two parts. Basic defaults to the previous sound's (a special, ‘carry-on’, default (with the ultimate default being the last annotation tempo fractional note)), and extra defaults to none (so the extra is not carried-on: it must always be explicitly stated).
SBNF:
(time
(, (? timebasic)
(? timeextra)))
(timebasic
(, (? "-")
int0-999
(| (* "*")
(* (, "-" int1-999)))
(? "-")))
(timeextra
(| "e" "s"))
Indicators are of three kinds: bar, segment, and tuplet. They are optional: all timing information is in sounds, but indicators help human users.
Bars can be indicated with lines, and optional suffix numbers for time division:
|3 | | | || ||
Segments of a bar can be indicated by a quote (to give a sort-of ersatz beaming):
|4 61:4 ' 61:4 ' 61:8 62:8 ' 61:4 |
Tuplets can be indicated with parentheses and suffix number:
|4 .:2-4 ' (3 45:6 43:12 ) |
(NB: tuplet parentheses, like segments and bars, must be tokens – surrounded by blanks, not immediately abutting any other chars.).
SBNF:
(indicator
(| bar
tuplet
segment))
(bar
(, (+ "|") (? int1-9)))
(tuplet
(| (, (+ "(") (? int1-9))
(+ ")")))
(segment
(+ "'"))
An Annotation is a line starting with @, containing three possible kinds of data: version, tuning, and/or tempo.
Version (giti), followed by:
Tuning, followed by one of:
Tempo, followed by either:
For example:
@ giti:e-4.1 tuning:-2 tuning:6D2=5F2 tempo:1.824
SBNF:
(annotation
(, "@"
(* blank)
(* (| version
tuning
tempo)
(+ blank))
newline))
(version
(, "giti:"
(* non-blank)))
(tuning
(, "tuning:"
(| "std"
(, (| "-" "+") int0-12 (? "?"))
(+ (, int1-9
(| "A" "B" "C" "D" "E" "F" "G")
(? (| "#" "b"))
(? (| "-" "+"))
int0-8)
"="))))
(tempo
(, "tempo:"
(| (, int0-99 "." int0-999)
(, int1-99 "=" int1-999))))
Metadata is a line starting with !, containing a name and a value (preferably according to Dublin Core).
Name – a single word (containing no space)
Value – arbitrary text (but space at ends is ignored)
Separated by an =, and with optional surrounding spaces.
For example:
! title = Opus 3 Concerto 4 ! date = 2016-07-29 ! language = en-GB
SBNF:
(metadata
(, "!"
(* blank) name (* blank)
=
(* blank) value newline))
(name
(+ non-blank))
(value
(, non-blank
(* non-newline)))
A Comment is a line starting with #, containing arbitrary text.
GITI translates very directly to familiar old quasi-graphic tab form, but it brings a more appreciable structure with the modularity of act, pitch, and time.
The original example:
# Black Sabbath ‘Black Sabbath’, main riff @ giti:e-4.1 tuning:std tempo:3.603 |4 63=55:2 ' 45 | 54r1:2**e s:54/10:8s |
can be rendered as:
# Black Sabbath ‘Black Sabbath’, main riff @ giti:e-4.1 tuning:std tempo:3.603 #= s #= |---------|-----------| #= |---------|-----------| #= |---------|-----------| #= |-------5-|-----------| #= |---5-----|-4r1--4/10-| #= |---3-----|-----------| #= |4: 2 ' 2 2**e 8s
Acts go along the top, times along the bottom, and pitches in the middle, with the first digit removed (and chords across lines). And as with word-form GITI, acts and times can be omitted to simplify down to pitches, and the main tab lines, alone. It is basically a 2D transpose, and a lossless conversion (in either direction).
Other details follow intuitively:
Validator and reformatter: OCaml source-code.
From GITI 4:
From GITI 3.3:
DC:` title:`GITI - Electric guitar music text format` creator:`Harrison Ainsworth / HXA7241` date:`2017-12-11` date:`2016-10-20` date:`2015-01-17` date:`2013-06-30` date:`2013-01-21` description:`Description/specification of GITI (variant E) version 4.1: an electric guitar music notation text format.` subject:`guitar, electric-guitar, music, notation, text, format` language:`en-GB` type:`technical article` identifier:`urn:uuid:629CB8C7-A007-470C-BA90-2DC6BD9BDA41` relation:`http://www.hxa.name/giti/` rights:`Creative Commons BY-SA 4.0 License.` `