Windows. JAZZ++ offers a lot of functions normally only found in expensive sequencer software, and is used by professionals and hobby musicians all over the world.
122 lines
4.8 KiB
Text
122 lines
4.8 KiB
Text
$NetBSD: patch-ak,v 1.1.1.1 2003/05/21 14:57:50 bencollver Exp $
|
|
|
|
--- src/player.h.orig Fri Mar 3 12:21:57 2000
|
|
+++ src/player.h
|
|
@@ -466,7 +466,117 @@ class tNullPlayer : public tPlayer
|
|
|
|
#if defined DEV_SEQUENCER2
|
|
|
|
+#ifdef __NetBSD__
|
|
+#include <soundcard.h>
|
|
+#include <sys/midiio.h>
|
|
+void seqbuf_dump(void);
|
|
+#define CTRL_PITCH_BENDER 255
|
|
+#define CTRL_PITCH_BENDER_RANGE 254
|
|
+#define CTL_PAN 0x0a
|
|
+#define SNDCTL_SEQ_OUTOFBAND SEQUENCER_OUTOFBAND
|
|
+#define SNDCTL_SEQ_RESET SEQUENCER_RESET
|
|
+#define SNDCTL_TMR_TIMEBASE SEQUENCER_TMR_TIMEBASE
|
|
+#define SNDCTL_TMR_TEMPO SEQUENCER_TMR_TEMPO
|
|
+#define EV_CHN_COMMON SEQ_CHN_COMMON
|
|
+#define EV_CHN_VOICE SEQ_CHN_VOICE
|
|
+#define EV_TIMING SEQ_TIMING
|
|
+#define EV_SYSEX 0x94
|
|
+#define SEQ_CONTROLLER SEQOLD_CONTROLLER
|
|
+#define SEQ_EXTENDED SEQOLD_EXTENDED
|
|
+#define SNDCTL_SYNTH_INFO SEQUENCER_INFO
|
|
+#define SNDCARD_MPU401 SYNTH_SUB_MIDI_TYPE_MPU401
|
|
+#define SNDCTL_SEQ_NRSYNTHS SEQUENCER_NRSYNTHS
|
|
+#define SYSEX_PATCH SEQ_SYSEX_PATCH
|
|
+#define TMR_INTERNAL SEQUENCER_TMR_INTERNAL
|
|
+#define TMR_EXTERNAL 0x00000002
|
|
+#define TMR_MODE_MIDI 0x00000010
|
|
+#define TMR_MODE_FSK 0x00000020
|
|
+#define SNDCTL_TMR_SOURCE SEQUENCER_TMR_SOURCE
|
|
+#define SNDCTL_SEQ_SYNC SEQUENCER_SYNC
|
|
+#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0
|
|
+#define SEQ_USE_EXTBUF() extern unsigned char _seqbuf[]; extern int _seqbuflen;extern int _seqbufptr
|
|
+#define _SEQ_ADVBUF(len) _seqbufptr += len
|
|
+#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
|
|
+#define SEQ_DUMPBUF seqbuf_dump
|
|
+#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \
|
|
+ {_SEQ_NEEDBUF(8);\
|
|
+ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\
|
|
+ _seqbuf[_seqbufptr+1] = (dev);\
|
|
+ _seqbuf[_seqbufptr+2] = (event);\
|
|
+ _seqbuf[_seqbufptr+3] = (chn);\
|
|
+ _seqbuf[_seqbufptr+4] = (p1);\
|
|
+ _seqbuf[_seqbufptr+5] = (p2);\
|
|
+ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\
|
|
+ _SEQ_ADVBUF(8);}
|
|
+#define _CHN_VOICE(dev, event, chn, note, parm) \
|
|
+ {_SEQ_NEEDBUF(8);\
|
|
+ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\
|
|
+ _seqbuf[_seqbufptr+1] = (dev);\
|
|
+ _seqbuf[_seqbufptr+2] = (event);\
|
|
+ _seqbuf[_seqbufptr+3] = (chn);\
|
|
+ _seqbuf[_seqbufptr+4] = (note);\
|
|
+ _seqbuf[_seqbufptr+5] = (parm);\
|
|
+ _seqbuf[_seqbufptr+6] = (0);\
|
|
+ _seqbuf[_seqbufptr+7] = 0;\
|
|
+ _SEQ_ADVBUF(8);}
|
|
+#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
|
|
+ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
|
|
+ _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER; \
|
|
+ _seqbuf[_seqbufptr+2] = (dev);\
|
|
+ _seqbuf[_seqbufptr+3] = (voice);\
|
|
+ _seqbuf[_seqbufptr+4] = (controller);\
|
|
+ _seqbuf[_seqbufptr+5] = ((value)&0xff); \
|
|
+ _seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\
|
|
+ _seqbuf[_seqbufptr+7] = 0;\
|
|
+ _SEQ_ADVBUF(8);}
|
|
+#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\
|
|
+ _seqbuf[_seqbufptr+0] = EV_TIMING; \
|
|
+ _seqbuf[_seqbufptr+1] = (ev); \
|
|
+ _seqbuf[_seqbufptr+2] = 0;\
|
|
+ _seqbuf[_seqbufptr+3] = 0;\
|
|
+ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
|
|
+ _SEQ_ADVBUF(8);}
|
|
+#undef SEQ_SYSEX
|
|
+#define SEQ_SYSEX(dev, buf, len) \
|
|
+ {int ii, ll=(len); \
|
|
+ unsigned char *bufp=buf;\
|
|
+ if (ll>6)ll=6;\
|
|
+ _SEQ_NEEDBUF(8);\
|
|
+ _seqbuf[_seqbufptr] = EV_SYSEX;\
|
|
+ _seqbuf[_seqbufptr+1] = (dev);\
|
|
+ for(ii=0;ii<ll;ii++)\
|
|
+ _seqbuf[_seqbufptr+ii+2] = bufp[ii];\
|
|
+ for(ii=ll;ii<6;ii++)\
|
|
+ _seqbuf[_seqbufptr+ii+2] = 0xff;\
|
|
+ _SEQ_ADVBUF(8);}
|
|
+#define SEQ_PGM_CHANGE(dev, chn, patch) \
|
|
+ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
|
|
+#define SEQ_START_NOTE(dev, chn, note, vol) \
|
|
+ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)
|
|
+#define SEQ_STOP_NOTE(dev, chn, note, vol) \
|
|
+ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)
|
|
+#define SEQ_SET_PATCH SEQ_PGM_CHANGE
|
|
+#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \
|
|
+ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)
|
|
+#define SEQ_CHN_PRESSURE(dev, chn, pressure) \
|
|
+ _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
|
|
+#define SEQ_CONTROL(dev, chn, controller, value) \
|
|
+ _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
|
|
+#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
|
|
+#define SEQ_BENDER(dev, chn, value) \
|
|
+ _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
|
|
+#define SEQ_WRPATCH(patchx, len) \
|
|
+ {if (_seqbufptr) SEQ_DUMPBUF();\
|
|
+ if (write(seqfd, (char*)(patchx), len)==-1) \
|
|
+ perror("Write patch: /dev/sequencer");}
|
|
+#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0)
|
|
+#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0)
|
|
+#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key)
|
|
+#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value)
|
|
+#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks)
|
|
+#else
|
|
#include <sys/soundcard.h>
|
|
+#endif
|
|
|
|
SEQ_USE_EXTBUF();
|
|
extern int seqfd;
|