extension: .txt types: N: a decimal number represented in ASCII S: NUL-terminated string not containing ':' consts: SP = ' ' NL = '\n' SEP = ':' file = header, track* header = metadata metadata = kvpair* kvpair = key:S, SEP, val:S, NL track = name:S, NL, event* event = noteset | metaev noteset = durspec:N1, (SP, cell)*, NL cell = rest | cont | note:N2 rest = ".." cont = "==" metaev = kvpair notes: durspec = log2(denominator), e.g., 3 -> eighth note = MIDI - 12, e.g., 48 -> middle C