13
0
livetrax/libs/fluidsynth/src/fluid_gen.c

134 lines
7.0 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 Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA
*/
#include "fluid_gen.h"
#include "fluid_chan.h"
#define _GEN(_name) GEN_ ## _name, #_name
/* See SFSpec21 $8.1.3 */
static const fluid_gen_info_t fluid_gen_info[] =
{
/* number/name init nrpn-scale min max def */
{ _GEN(STARTADDROFS), 1, 1, 0.0f, 1e10f, 0.0f },
{ _GEN(ENDADDROFS), 1, 1, -1e10f, 0.0f, 0.0f },
{ _GEN(STARTLOOPADDROFS), 1, 1, -1e10f, 1e10f, 0.0f },
{ _GEN(ENDLOOPADDROFS), 1, 1, -1e10f, 1e10f, 0.0f },
{ _GEN(STARTADDRCOARSEOFS), 0, 1, 0.0f, 1e10f, 0.0f },
{ _GEN(MODLFOTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },
{ _GEN(VIBLFOTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },
{ _GEN(MODENVTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },
{ _GEN(FILTERFC), 1, 2, 1500.0f, 13500.0f, 13500.0f },
{ _GEN(FILTERQ), 1, 1, 0.0f, 960.0f, 0.0f },
{ _GEN(MODLFOTOFILTERFC), 1, 2, -12000.0f, 12000.0f, 0.0f },
{ _GEN(MODENVTOFILTERFC), 1, 2, -12000.0f, 12000.0f, 0.0f },
{ _GEN(ENDADDRCOARSEOFS), 0, 1, -1e10f, 0.0f, 0.0f },
{ _GEN(MODLFOTOVOL), 1, 1, -960.0f, 960.0f, 0.0f },
{ _GEN(UNUSED1), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(CHORUSSEND), 1, 1, 0.0f, 1000.0f, 0.0f },
{ _GEN(REVERBSEND), 1, 1, 0.0f, 1000.0f, 0.0f },
{ _GEN(PAN), 1, 1, -500.0f, 500.0f, 0.0f },
{ _GEN(UNUSED2), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(UNUSED3), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(UNUSED4), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(MODLFODELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(MODLFOFREQ), 1, 4, -16000.0f, 4500.0f, 0.0f },
{ _GEN(VIBLFODELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(VIBLFOFREQ), 1, 4, -16000.0f, 4500.0f, 0.0f },
{ _GEN(MODENVDELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(MODENVATTACK), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(MODENVHOLD), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(MODENVDECAY), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(MODENVSUSTAIN), 0, 1, 0.0f, 1000.0f, 0.0f },
{ _GEN(MODENVRELEASE), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(KEYTOMODENVHOLD), 0, 1, -1200.0f, 1200.0f, 0.0f },
{ _GEN(KEYTOMODENVDECAY), 0, 1, -1200.0f, 1200.0f, 0.0f },
{ _GEN(VOLENVDELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(VOLENVATTACK), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(VOLENVHOLD), 1, 2, -12000.0f, 5000.0f, -12000.0f },
{ _GEN(VOLENVDECAY), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(VOLENVSUSTAIN), 0, 1, 0.0f, 1440.0f, 0.0f },
{ _GEN(VOLENVRELEASE), 1, 2, -12000.0f, 8000.0f, -12000.0f },
{ _GEN(KEYTOVOLENVHOLD), 0, 1, -1200.0f, 1200.0f, 0.0f },
{ _GEN(KEYTOVOLENVDECAY), 0, 1, -1200.0f, 1200.0f, 0.0f },
{ _GEN(INSTRUMENT), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(RESERVED1), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(KEYRANGE), 0, 0, 0.0f, 127.0f, 0.0f },
{ _GEN(VELRANGE), 0, 0, 0.0f, 127.0f, 0.0f },
{ _GEN(STARTLOOPADDRCOARSEOFS), 0, 1, -1e10f, 1e10f, 0.0f },
{ _GEN(KEYNUM), 1, 0, 0.0f, 127.0f, -1.0f },
{ _GEN(VELOCITY), 1, 1, 0.0f, 127.0f, -1.0f },
{ _GEN(ATTENUATION), 1, 1, 0.0f, 1440.0f, 0.0f },
{ _GEN(RESERVED2), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(ENDLOOPADDRCOARSEOFS), 0, 1, -1e10f, 1e10f, 0.0f },
{ _GEN(COARSETUNE), 0, 1, -120.0f, 120.0f, 0.0f },
{ _GEN(FINETUNE), 0, 1, -99.0f, 99.0f, 0.0f },
{ _GEN(SAMPLEID), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(SAMPLEMODE), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(RESERVED3), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(SCALETUNE), 0, 1, 0.0f, 1200.0f, 100.0f },
{ _GEN(EXCLUSIVECLASS), 0, 0, 0.0f, 0.0f, 0.0f },
{ _GEN(OVERRIDEROOTKEY), 1, 0, 0.0f, 127.0f, -1.0f },
{ _GEN(PITCH), 1, 0, 0.0f, 127.0f, 0.0f },
{ _GEN(CUSTOM_BALANCE), 1, 0, -960.0f, 960.0f, 0.0f },
{ _GEN(CUSTOM_FILTERFC), 1, 2, 0.0f, 22050.0f, 0.0f },
{ _GEN(CUSTOM_FILTERQ), 1, 1, 0.0f, 960.0f, 0.0f }
};
/* fluid_gen_init
*
* Set an array of generators to their initial value
*/
void
fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel)
{
int i;
for(i = 0; i < GEN_LAST; i++)
{
gen[i].flags = GEN_UNUSED;
gen[i].mod = 0.0;
gen[i].nrpn = (channel == NULL) ? 0.0 : fluid_channel_get_gen(channel, i);
gen[i].val = fluid_gen_info[i].def;
}
}
fluid_real_t fluid_gen_scale(int gen, float value)
{
return (fluid_gen_info[gen].min
+ value * (fluid_gen_info[gen].max - fluid_gen_info[gen].min));
}
fluid_real_t fluid_gen_scale_nrpn(int gen, int data)
{
data = data - 8192;
fluid_clip(data, -8192, 8192);
return (fluid_real_t)(data * fluid_gen_info[gen].nrpn_scale);
}
const char *fluid_gen_name(int gen)
{
return fluid_gen_info[gen].name;
}