summaryrefslogtreecommitdiff
path: root/src/sheet/sheet grammar.abnf
blob: b7b842e096076035c78c37275591a43f0efdd87e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
; This file documents the custom formal grammar used for the sheet.
;
; This grammar is subject to changes in the future, by the way.

; The sheet consists of a sequence of blocks, or if there is only one
; block, a sequence of groups.
sheet = 1*block / 1* group

; A block consists of a sequence of groups enclosed in curly braces.
block = "{" 1*group "}"

; A group either has several units enclosed in patentheses or one unit
; alone.
group = "(" 1*unit ")" cram-repetition / unit

; A unit is either an instruction or a note.
unit = instruction / note

; An instruction is either a volume changing one, a bpm changing one,
; or an instrument changing one.
instruction = "i" ( volume / bpm / instrument )

; A volume changing instruction follows "v"
volume = "v" 1*DIGIT *1("." 1*DIGIT)

; A bpm changing instruction is similar to a volume changing
; instruction.
bpm = "b" 1*DIGIT

; An instrument changing instruction follows "i"
instrument = "i" ( "piano" / "violin" )

; A note has three parts: octave, tone, and duration.
note = *1octave tone *1duration

octave = "o" 1*DIGIT

tone = ( "a" / "b" / "c" / "d" "e" / "f" / "g" ) *tone-shift

; Shifts the tone by some number of semitones
tone-shift = "+" / "-"

; A duration is either in the standard sheet notation or a precise
; duration.
;
; There are no overlaps between the two variants.
duration =  1*DIGIT *"." / "p" 1*DIGIT *1("." 1* DIGIT)

cram-repetition = *1cram *1repetition

cram = duration

repetition = "*" 1*DIGIT