enum play_state { MPS_BEGIN, MPS_PLAYING, MPS_DONE }; struct track { unsigned char huge *data; unsigned char huge *playp; unsigned long position; unsigned long length; unsigned long play_time; unsigned char status; enum play_state play_state; struct track *next_track; }; /* definitions for MIDI file parsing code */ struct MIDILIB { int (*Mf_getc)(void); void (*Mf_error)(char *); void (*Mf_header)(int, int, int); void (*Mp_reset_tick_counter)(void); void (*Mp_set_tempo)(unsigned long, short); int (*Mp_wait_for)(unsigned long); void (*Mp_init_timers)(void); void (*Mp_cleanup_timers)(void); int (*Mp_reset_midi)(void); int (*Mp_note_on)(int, int, int); void (*Mp_note_off)(int, int, int); void (*Mp_pressure)(int, int, int); void (*Mp_parameter)(int, int, int); void (*Mp_pitch_bend)(int, int, int); void (*Mp_program)(int, int); void (*Mp_chanpressure)(int, int, int); int (*Mp_init_hardware)(struct MIDILIB *); void (*Mp_cleanup)(void); struct track *Mp_tracks; int tracknum; int Mp_master_volume; int Mf_nomerge; long Mf_toberead; unsigned long Mp_next_event_time; }; struct header_type { short format; short ntrks; union { short quarter_note; struct{ char format; char resolution; } smpte; } division; }; /* MIDI status commands most significant bit is 1 */ #define note_off 0x80 #define note_on 0x90 #define poly_aftertouch 0xa0 #define control_change 0xb0 #define program_chng 0xc0 #define channel_aftertouch 0xd0 #define pitch_wheel 0xe0 #define system_exclusive 0xf0 #define sysex_continue 0xf7 #define delay_packet (1111) /* 7 bit controllers */ #define C_damper_pedal 0x40 #define C_portamento 0x41 #define C_sostenuto 0x42 #define C_soft_pedal 0x43 #define C_general_4 0x44 #define C_hold_2 0x45 #define C_general_5 0x50 #define C_general_6 0x51 #define C_general_7 0x52 #define C_general_8 0x53 #define C_tremolo_depth 0x5c #define C_chorus_depth 0x5d #define C_detune 0x5e #define C_phaser_depth 0x5f /* parameter values */ #define data_inc 0x60 #define data_dec 0x61 /* parameter selection */ #define non_reg_lsb 0x62 #define non_reg_msb 0x63 #define reg_lsb 0x64 #define reg_msb 0x65 /* Standard MIDI Files meta event definitions */ #define MT_meta_event 0xff #define MT_sequence_number 0x00 #define MT_text_event 0x01 #define MT_copyright_notice 0x02 #define MT_sequence_name 0x03 #define MT_instrument_name 0x04 #define MT_lyric 0x05 #define MT_marker 0x06 #define MT_cue_point 0x07 #define MT_channel_prefix 0x20 #define MT_end_of_track 0x2f #define MT_set_tempo 0x51 #define MT_smpte_offset 0x54 #define MT_time_signature 0x58 #define MT_key_signature 0x59 #define MT_sequencer_specific 0x74 struct MIDILIB *mfinit(void (*errorfunc)(char *)); void mfclose(struct MIDILIB **ml); void mfread(struct MIDILIB *ml); void mfcleanup(struct MIDILIB *ml); int midi_getc(struct track *track); void midi_out(struct MIDILIB *ml); void midi_get_next_time(struct MIDILIB *ml, struct track *track); void midi_error(char *fmt, ...); void midi_message(char *fmt, ...);