diff src/modplug/midi.h @ 2337:107c1fed3d92

Port Schism modplug core.
author "Tony Vroon <chainsaw@gentoo.org>"
date Thu, 24 Jan 2008 12:05:59 +0000
parents
children f1b6f1b2cdb3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/modplug/midi.h	Thu Jan 24 12:05:59 2008 +0000
@@ -0,0 +1,185 @@
+/*
+ * Schism Tracker - a cross-platform Impulse Tracker clone
+ * copyright (c) 2003-2005 chisel <schism@chisel.cjb.net>
+ * copyright (c) 2005-2006 Mrs. Brisby <mrs.brisby@nimh.org>
+ * URL: http://nimh.org/schism/
+ * URL: http://rigelseven.com/schism/
+ *
+ * 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
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct midi_provider;
+struct midi_port;
+
+struct midi_driver {
+	unsigned int flags;
+#define MIDI_PORT_CAN_SCHEDULE	1
+
+	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,
+			unsigned char *seq, unsigned int len, unsigned int delay);
+	void (*drain)(struct midi_port *d);
+};
+
+struct midi_provider {
+	const 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,
+			unsigned char *seq, unsigned int len, unsigned int delay);
+	void (*send_later)(struct midi_port *d,
+			unsigned char *seq, unsigned int len, unsigned int delay);
+	void (*drain)(struct midi_port *d);
+};
+struct midi_port {
+	int io, iocap;
+#define MIDI_INPUT	1
+#define MIDI_OUTPUT	2
+	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,
+			unsigned char *seq, unsigned int len, unsigned int delay);
+	void (*send_later)(struct midi_port *d,
+			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(unsigned char *seq, unsigned int len);
+
+/* ... but the player calls this */
+void midi_send_buffer(unsigned char *data, unsigned int len, unsigned int pos);
+void midi_send_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);
+
+
+#ifdef USE_NETWORK
+int ip_midi_setup(void);
+#endif
+#ifdef USE_OSS
+int oss_midi_setup(void);
+#endif
+#ifdef USE_ALSA
+int alsa_midi_setup(void);
+#endif
+#ifdef USE_WIN32MM
+int win32mm_midi_setup(void);
+#endif
+#ifdef MACOSX
+int macosx_midi_setup(void);
+#endif
+
+
+
+#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_PITCH_BEND		0x00000040
+#define MIDI_EMBED_DATA		0x00000080
+#define MIDI_RECORD_SDX		0x00000100
+#define MIDI_DISABLE_RECORD	0x00010000
+
+/* configurable midi stuff */
+int midi_flags = MIDI_TICK_QUANTIZE | MIDI_RECORD_NOTEOFF
+                | MIDI_RECORD_VELOCITY | MIDI_RECORD_AFTERTOUCH
+                | MIDI_PITCH_BEND;
+
+int midi_pitch_depth = 12;
+int midi_amplification = 100;
+int midi_c5note = 60;
+
+/* only available with networks */
+void ip_midi_setports(int n);
+int ip_midi_getports(void);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif