Memory Layout
=============
unsigned char matrix[4096][16][8];
----------------------------------
"track 0" (durations) track 1 track F
----------------------- --------------- ~~~ ---------------
0x000 [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
0x001 [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
0x002 [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
0x003 [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
0x004 [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
..... ~.. .. .. .. .. .. .. ..~ ~. . . . . . . .~ ~~~ ~. . . . . . . .~
0xFFE [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
0xFFF [?D DD DD DD DD DD DD DD] [P P P P P P P P] ... [P P P P P P P P]
| ----------------------- --------------- ~~~ ---------------
| 01 23 45 67 89 AB CD EF 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
| \__________ __________/ \______ ______/ \______ ______/
V V V V
index track # voice # voice #
? = one nibble
always zero; reserved for future use
D = one nibble (highest bit always zero)
0: EOT end-of-track 4: 1/8 eighth note
1: 1 whole note 5: 1/16 sixteenth note
2: 1/2 half note 6: 1/32 thirdy-second note
3: 1/4 quarter note 7: 1/64 sixty-fourth note
P = one byte
0x00: silence 0x80:\
0x01: sustain ....: > attack -> MIDI pitch = P & ~0x80 + 12
0x02:\ 0xE3:/
....: > invalid 0xE4:\
0x7F:/ ....: > invalid
0xFF:/
char map[32][32];
-----------------
|<----- 32 bytes ---->|
---------------------
0x00 [T K ... 0 V ... 0 ...]
0x01 [T K ... 0 V ... 0 ...]
0x02 [T K ... 0 V ... 0 ...]
.... ~. . ~~~ . . ~~~ . ~~~~
0x1E [T K ... 0 V ... 0 ...]
0x1F [T K ... 0 V ... 0 ...]
| ---------------------
| | \__ __/ \__ __/
| V V V
| type key value
|
+-> record #
type = one byte
'@': track name
'#': metadata
NUL: empty
key = NUL-terminated string
value = NUL-terminated string
key and value may have any length as long as the following holds
strlen(key) + strlen(value) + 3 <= 32