From 78f8fce7f286fd0c71774e2567404ed51f24fef3 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Fri, 26 May 2017 21:51:04 -0700 Subject: *: initial commit of stripped schism stuff Forking schism tracker's IT playback stuff into a little playback library for embedding in demos. --- src/include/midi.h | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/include/midi.h (limited to 'src/include/midi.h') diff --git a/src/include/midi.h b/src/include/midi.h new file mode 100644 index 0000000..9edb867 --- /dev/null +++ b/src/include/midi.h @@ -0,0 +1,162 @@ +/* + * Schism Tracker - a cross-platform Impulse Tracker clone + * copyright (c) 2003-2005 Storlek + * copyright (c) 2005-2008 Mrs. Brisby + * copyright (c) 2009 Storlek & Mrs. Brisby + * copyright (c) 2010-2012 Storlek + * URL: http://schismtracker.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef MIDI_H +#define MIDI_H + +struct midi_provider; +struct midi_port; + +#define MIDI_PORT_CAN_SCHEDULE 1 +struct midi_driver { + unsigned int flags; + + void (*poll)(struct midi_provider *m); + int (*thread)(struct midi_provider *m); + + int (*enable)(struct midi_port *d); + int (*disable)(struct midi_port *d); + + void (*send)(struct midi_port *d, + const unsigned char *seq, unsigned int len, unsigned int delay); + void (*drain)(struct midi_port *d); +}; + +struct midi_provider { + char *name; + void (*poll)(struct midi_provider *); + void *thread; /*actually SDL_Thread* */ + + struct midi_provider *next; + + /* forwarded; don't touch */ + int (*enable)(struct midi_port *d); + int (*disable)(struct midi_port *d); + + void (*send_now)(struct midi_port *d, + const unsigned char *seq, unsigned int len, unsigned int delay); + void (*send_later)(struct midi_port *d, + const unsigned char *seq, unsigned int len, unsigned int delay); + void (*drain)(struct midi_port *d); +}; + +#define MIDI_INPUT 1 +#define MIDI_OUTPUT 2 +struct midi_port { + int io, iocap; + char *name; + int num; + + void *userdata; + int free_userdata; + int (*enable)(struct midi_port *d); + int (*disable)(struct midi_port *d); + void (*send_now)(struct midi_port *d, + const unsigned char *seq, unsigned int len, unsigned int delay); + void (*send_later)(struct midi_port *d, + const unsigned char *seq, unsigned int len, unsigned int delay); + void (*drain)(struct midi_port *d); + + struct midi_provider *provider; +}; + + +/* schism calls these directly */ +int midi_engine_start(void); +void midi_engine_reset(void); +void midi_engine_stop(void); +void midi_engine_poll_ports(void); + +/* some parts of schism call this; it means "immediately" */ +void midi_send_now(const unsigned char *seq, unsigned int len); + +/* ... but the player calls this */ +void midi_send_buffer(const unsigned char *data, unsigned int len, unsigned int pos); +void midi_send_flush(void); + +/* used by the audio thread */ +int midi_need_flush(void); + +/* from the SDL event mechanism (x is really SDL_Event) */ +int midi_engine_handle_event(void *x); + +struct midi_port *midi_engine_port(int n, const char **name); +int midi_engine_port_count(void); + +/* midi engines register a provider (one each!) */ +struct midi_provider *midi_provider_register(const char *name, struct midi_driver *f); + + +/* midi engines list ports this way */ +int midi_port_register(struct midi_provider *p, +int inout, const char *name, void *userdata, int free_userdata); + +int midi_port_foreach(struct midi_provider *p, struct midi_port **cursor); +void midi_port_unregister(int num); + +/* only call these if the event isn't really MIDI but you want most of the system + to act like it is... + + midi drivers should never all these... +*/ +enum midi_note { + MIDI_NOTEOFF, + MIDI_NOTEON, + MIDI_KEYPRESS, +}; +void midi_event_note(enum midi_note mnstatus, int channel, int note, int velocity); +void midi_event_controller(int channel, int param, int value); +void midi_event_program(int channel, int value); +void midi_event_aftertouch(int channel, int value); +void midi_event_pitchbend(int channel, int value); +void midi_event_tick(void); +void midi_event_sysex(const unsigned char *data, unsigned int len); +void midi_event_system(int argv, int param); + +/* midi drivers call this when they received an event */ +void midi_received_cb(struct midi_port *src, unsigned char *data, unsigned int len); + + +int ip_midi_setup(void); // USE_NETWORK +void ip_midi_setports(int n); // USE_NETWORK +int ip_midi_getports(void); // USE_NETWORK + +int oss_midi_setup(void); // USE_OSS +int alsa_midi_setup(void); // USE_ALSA +int win32mm_midi_setup(void); // WIN32 +int macosx_midi_setup(void); // MACOSX + + +/* MIDI_PITCH_BEND is defined by OSS -- maybe these need more specific names? */ +#define MIDI_TICK_QUANTIZE 0x00000001 +#define MIDI_BASE_PROGRAM1 0x00000002 +#define MIDI_RECORD_NOTEOFF 0x00000004 +#define MIDI_RECORD_VELOCITY 0x00000008 +#define MIDI_RECORD_AFTERTOUCH 0x00000010 +#define MIDI_CUT_NOTE_OFF 0x00000020 +#define MIDI_PITCHBEND 0x00000040 +#define MIDI_DISABLE_RECORD 0x00010000 + +extern int midi_flags, midi_pitch_depth, midi_amplification, midi_c5note; + +#endif -- cgit v1.2.3