2000-07-11 11:49:33 +00:00
|
|
|
/*
|
|
|
|
* include file for midi synthesizer interface.
|
|
|
|
*
|
|
|
|
* Copyright by Seigo Tanimura 1999.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SYNTH_MAX_VOICES 32
|
|
|
|
|
|
|
|
/* This is the voice allocation state for a synthesizer. */
|
|
|
|
struct voice_alloc_info {
|
|
|
|
int max_voice;
|
|
|
|
int used_voices;
|
|
|
|
int ptr; /* For device specific use */
|
|
|
|
u_short map[SYNTH_MAX_VOICES]; /* (ch << 8) | (note+1) */
|
|
|
|
int timestamp;
|
|
|
|
int alloc_times[SYNTH_MAX_VOICES];
|
|
|
|
};
|
|
|
|
|
|
|
|
/* This is the channel information for a synthesizer. */
|
|
|
|
struct channel_info {
|
|
|
|
int pgm_num;
|
|
|
|
int bender_value;
|
|
|
|
u_char controllers[128];
|
|
|
|
};
|
|
|
|
|
|
|
|
/* These are the function types for a midi synthesizer interface. */
|
|
|
|
typedef int (mdsy_killnote_t)(mididev_info *md, int chn, int note, int vel);
|
|
|
|
typedef int (mdsy_setinstr_t)(mididev_info *md, int chn, int instr);
|
|
|
|
typedef int (mdsy_startnote_t)(mididev_info *md, int chn, int note, int vel);
|
|
|
|
typedef int (mdsy_reset_t)(mididev_info *md);
|
|
|
|
typedef int (mdsy_hwcontrol_t)(mididev_info *md, u_char *event);
|
|
|
|
typedef int (mdsy_loadpatch_t)(mididev_info *md, int format, struct uio *buf, int offs, int count, int pmgr_flag);
|
|
|
|
typedef int (mdsy_panning_t)(mididev_info *md, int chn, int pan);
|
|
|
|
typedef int (mdsy_aftertouch_t)(mididev_info *md, int chn, int press);
|
|
|
|
typedef int (mdsy_controller_t)(mididev_info *md, int chn, int ctrlnum, int val);
|
|
|
|
typedef int (mdsy_patchmgr_t)(mididev_info *md, struct patmgr_info *rec);
|
|
|
|
typedef int (mdsy_bender_t)(mididev_info *md, int chn, int val);
|
|
|
|
typedef int (mdsy_allocvoice_t)(mididev_info *md, int chn, int note, struct voice_alloc_info *alloc);
|
|
|
|
typedef int (mdsy_setupvoice_t)(mididev_info *md, int voice, int chn);
|
|
|
|
typedef int (mdsy_sendsysex_t)(mididev_info *md, u_char *sysex, int len);
|
|
|
|
typedef int (mdsy_prefixcmd_t)(mididev_info *md, int status);
|
|
|
|
typedef int (mdsy_volumemethod_t)(mididev_info *md, int mode);
|
|
|
|
typedef int (mdsy_readraw_t)(mididev_info *md, u_char *buf, int len, int nonblock);
|
|
|
|
typedef int (mdsy_writeraw_t)(mididev_info *md, u_char *buf, int len, int nonblock);
|
|
|
|
|
2001-02-26 07:36:24 +00:00
|
|
|
/*
|
|
|
|
* The order of mutex lock (from the first to the last)
|
|
|
|
*
|
|
|
|
* 1. sequencer flags, queues, timer and devlice list
|
|
|
|
* 2. midi synth voice and channel
|
|
|
|
* 3. midi synth status
|
|
|
|
* 4. generic midi flags and queues
|
|
|
|
* 5. midi device
|
|
|
|
*/
|
|
|
|
|
2000-07-11 11:49:33 +00:00
|
|
|
/* This is a midi synthesizer interface and state. */
|
|
|
|
struct _synthdev_info {
|
|
|
|
mdsy_killnote_t *killnote;
|
|
|
|
mdsy_setinstr_t *setinstr;
|
|
|
|
mdsy_startnote_t *startnote;
|
|
|
|
mdsy_reset_t *reset;
|
|
|
|
mdsy_hwcontrol_t *hwcontrol;
|
|
|
|
mdsy_loadpatch_t *loadpatch;
|
|
|
|
mdsy_panning_t *panning;
|
|
|
|
mdsy_aftertouch_t *aftertouch;
|
|
|
|
mdsy_controller_t *controller;
|
|
|
|
mdsy_patchmgr_t *patchmgr;
|
|
|
|
mdsy_bender_t *bender;
|
|
|
|
mdsy_allocvoice_t *allocvoice;
|
|
|
|
mdsy_setupvoice_t *setupvoice;
|
|
|
|
mdsy_sendsysex_t *sendsysex;
|
|
|
|
mdsy_prefixcmd_t *prefixcmd;
|
|
|
|
mdsy_volumemethod_t *volumemethod;
|
|
|
|
mdsy_readraw_t *readraw;
|
|
|
|
mdsy_writeraw_t *writeraw;
|
|
|
|
|
2001-02-26 07:36:24 +00:00
|
|
|
/* Voice and channel */
|
|
|
|
struct mtx vc_mtx; /* Mutex to protect voice and channel. */
|
2000-07-11 11:49:33 +00:00
|
|
|
struct voice_alloc_info alloc; /* Voice allocation. */
|
|
|
|
struct channel_info chn_info[16]; /* Channel information. */
|
|
|
|
|
2001-02-26 07:36:24 +00:00
|
|
|
/* Status */
|
|
|
|
struct mtx status_mtx; /* Mutex to protect status. */
|
2000-07-11 11:49:33 +00:00
|
|
|
int sysex_state; /* State of sysex transmission. */
|
|
|
|
};
|
|
|
|
typedef struct _synthdev_info synthdev_info;
|