questzdoom/Projects/Android/jni/SupportLibs/fluidsynth/fluid_midi_router.h
2021-04-20 21:09:02 +01:00

112 lines
4.2 KiB
C

/* FluidSynth - A Software Synthesizer
*
* Copyright (C) 2003 Peter Hanappe and others.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307, USA
*/
/* Author: Markus Nentwig, nentwig@users.sourceforge.net
*/
#ifndef _FLUID_MIDIROUTER_H
#define _FLUID_MIDIROUTER_H
#include "fluidsynth_priv.h"
#include "fluid_midi.h"
#include "fluid_sys.h"
void fluid_midi_router_destroy_all_rules(fluid_midi_router_t* router);
fluid_midi_router_rule_t* new_fluid_midi_router_rule(void);
int fluid_midi_router_handle_clear(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_default(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_begin(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_chan(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_par1(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_par2(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_handle_end(fluid_synth_t* synth, int ac, char** av, fluid_ostream_t out);
int fluid_midi_router_begin(fluid_midi_router_t* router, fluid_midi_router_rule_t** dest);
int fluid_midi_router_end(fluid_midi_router_t* router);
int fluid_midi_router_create_default_rules(fluid_midi_router_t* router);
void fluid_midi_router_disable_all_rules(fluid_midi_router_t* router);
void fluid_midi_router_free_unused_rules(fluid_midi_router_t* router);
/*
* fluid_midi_router
*/
struct _fluid_midi_router_t {
fluid_synth_t* synth;
fluid_midi_router_rule_t* note_rules;
fluid_midi_router_rule_t* cc_rules;
fluid_midi_router_rule_t* progchange_rules;
fluid_midi_router_rule_t* pitchbend_rules;
fluid_midi_router_rule_t* channel_pressure_rules;
fluid_midi_router_rule_t* key_pressure_rules;
int new_rule_chan_min;
int new_rule_chan_max;
double new_rule_chan_mul;
int new_rule_chan_add;
int new_rule_par1_min;
int new_rule_par1_max;
double new_rule_par1_mul;
int new_rule_par1_add;
int new_rule_par2_min;
int new_rule_par2_max;
double new_rule_par2_mul;
int new_rule_par2_add;
fluid_midi_router_rule_t** dest;
handle_midi_event_func_t event_handler; /* Callback function for generated events */
void* event_handler_data; /* One arg for the callback */
int nr_midi_channels; /* For clipping the midi channel */
fluid_mutex_t ruletables_mutex;
};
struct _fluid_midi_router_rule_t {
int chan_min; /* Channel window, for which this rule is valid */
int chan_max;
fluid_real_t chan_mul; /* Channel multiplier (usually 0 or 1) */
int chan_add; /* Channel offset */
int par1_min; /* Parameter 1 window, for which this rule is valid */
int par1_max;
fluid_real_t par1_mul;
int par1_add;
int par2_min; /* Parameter 2 window, for which this rule is valid */
int par2_max;
fluid_real_t par2_mul;
int par2_add;
int pending_events; /* In case of noteon: How many keys are still down? */
char keys_cc[128]; /* Flags, whether a key is down / controller is set (sustain) */
fluid_midi_router_rule_t* next; /* next entry */
int state; /* Does this rule expire, as soon as (for example) all keys are up? */
};
enum fluid_midirule_state {
MIDIRULE_ACTIVE = 0x00,
MIDIRULE_WAITING,
MIDIRULE_DONE
};
#endif