login

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