Here's a collection of the C type definitions in this memo. In the "struct" type definitions, fields are filed in the order shown. A UBYTE field is packed into an 8-bit byte. Programs should set all "pad" fields to 0. #define ID_SMUS MakeID('S', 'M', 'U', 'S') #define ID_SHDR MakeID('S', 'H', 'D', 'R') typedef struct { UWORD tempo; /* tempo, 128ths quarter note/minute */ UBYTE volume; /* overall playback volume 0 through 127 */ UBYTE ctTrack; /* count of tracks in the score */ } SScoreHeader; #define ID_NAME MakeID('N', 'A', 'M', 'E') /* NAME chunk contains a CHAR[], the musical score's name. */ #define ID_Copyright MakeID('(', 'c', ')', ' ') /* "(c) " chunk contains a CHAR[], the FORM's copyright notice. */ #define ID_AUTH MakeID('A', 'U', 'T', 'H') /* AUTH chunk contains a CHAR[], the name of the score's author. */ #define ID_ANNO MakeID('A', 'N', 'N', 'O') /* ANNO chunk contains a CHAR[], author's text annotations. */ #define ID_INS1 MakeID('I', 'N', 'S', '1') /* Values for the RefInstrument field "type". */ #define INS1_Name 0 /* just use the name; ignore data1, data2 */ #define INS1_MIDI 1 /* <data1, data2> = MIDI <channel, preset> */ typedef struct { UBYTE register; /* set this instrument register number */ UBYTE type; /* instrument reference type */ UBYTE data1, data2; /* depends on the "type" field */ CHAR name[]; /* instrument name */ } RefInstrument; #define ID_TRAK MakeID('T', 'R', 'A', 'K') /* TRAK chunk contains an SEvent[]. */ /* SEvent: Simple musical event. */ typedef struct { UBYTE sID; /* SEvent type code */ UBYTE data; /* sID-dependent data */ } SEvent; /* SEvent type codes "sID". */ #define SID_FirstNote 0 #define SID_LastNote 127 /* sIDs in the range SID_FirstNote through * SID_LastNote (sign bit = 0) are notes. * sID is the MIDI tone number (pitch). */ #define SID_Rest 128 /* a rest (same data format as a note). */ #define SID_Instrument 129 /* set instrument number for this track.*/ #define SID_TimeSig 130 /* set time signature for this track. */ #define SID_KeySig 131 /* set key signature for this track. */ #define SID_Dynamic 132 /* set volume for this track. */ #define SID_MIDI_Chnl 133 /* set MIDI channel number (sequencers) */ #define SID_MIDI_Preset 134 /* set MIDI preset number (sequencers) */ #define SID_Clef 135 /* inline clef change. * * 0=Treble, 1=Bass, 2=Alto, 3=Tenor. */ #define SID_Tempo 136 /* Inline tempo in beats per minute. */ /* SID values 144 through 159: reserved for Instant Music SEvents. */ /* Remaining sID values up through 254: reserved for future * standardization. */ #define SID_Mark 255 /* sID reserved for an end-mark in RAM. */ /* SID_FirstNote..SID_LastNote, SID_Rest SEvents */ typedef struct { UBYTE tone; /* MIDI tone number 0 to 127; 128 = rest */ unsigned chord :1, /* 1 = a chorded note */ tieOut :1, /* 1 = tied to the next note or chord */ nTuplet :2, /* 0 = none, 1 = triplet, 2 = quintuplet, * 3 = septuplet */ dot :1, /* dotted note; multiply duration by 3/2 */ division :3; /* basic note duration is 2-division: * 0 = whole note, 1 = half note, * 2 = quarter note, 7 = 128th note */ } SNote; #define noteChord (1<<7) /* note is chorded to next note */ #define noteTieOut (1<<6) /* tied to next note/chord */ #define noteNShift 4 /* shift count for nTuplet field */ #define noteN3 (1<<noteNShift) /* note is a triplet */ #define noteN5 (2<<noteNShift) /* note is a quintuplet */ #define noteN7 (3<<noteNShift) /* note is a septuplet */ #define noteNMask noteN7 /* bit mask for the nTuplet field */ #define noteDot (1<<3) /* note is dotted */ #define noteD1 0 /* whole note division */ #define noteD2 1 /* half note division */ #define noteD4 2 /* quarter note division */ #define noteD8 3 /* eighth note division */ #define noteD16 4 /* sixteenth note division */ #define noteD32 5 /* thirty-secondth note division */ #define noteD64 6 /* sixty-fourth note division */ #define noteD128 7 /* 1/128 note division */ #define noteDMask noteD128 /* bit mask for the division field */ #define noteDurMask 0x3F /* mask for combined duration fields */ /* SID_Instrument SEvent */ /* "data" value is an instrument register number 0 through 255. */ /* SID_TimeSig SEvent */ typedef struct { UBYTE type; /* = SID_TimeSig */ unsigned timeNSig :5, /* time sig. "numerator" is timeNSig + 1 */ timeDSig :3; /* time sig. "denominator" is 2^timeDSig: * * 0 = whole note, 1 = half note, 2 = * * quarter note,.... 7 = 128th note */ } STimeSig; #define timeNMask 0xF8 /* bit mask for the timeNSig field */ #define timeNShift 3 /* shift count for timeNSig field */ #define timeDMask 0x07 /* bit mask for the timeDSig field */ /* SID_KeySig SEvent */ /* "data" value 0 = Cmaj; 1 through 7 = G,D,A,E,B,F#,C#; * * 8 through 14 = F,Bb,Eb,Ab,Db,Gb,Cb. */ /* SID_Dynamic SEvent */ /* "data" value is a MIDI key velocity 0..127. */