2016-08-23 12:50:54 -04:00
|
|
|
/* FluidSynth - A Software Synthesizer
|
|
|
|
*
|
|
|
|
* Copyright (C) 2003 Peter Hanappe and others.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2018-10-17 18:41:02 -04:00
|
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2.1 of
|
2016-08-23 12:50:54 -04:00
|
|
|
* 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
|
2018-10-17 18:41:02 -04:00
|
|
|
* Lesser General Public License for more details.
|
2016-08-23 12:50:54 -04:00
|
|
|
*
|
2018-10-17 18:41:02 -04:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
2016-08-23 12:50:54 -04:00
|
|
|
* 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"
|
|
|
|
|
|
|
|
|
|
|
|
/* See SFSpec21 $8.1.3 */
|
2018-10-17 18:41:02 -04:00
|
|
|
static const fluid_gen_info_t fluid_gen_info[] =
|
|
|
|
{
|
2019-12-02 17:58:15 -05:00
|
|
|
/* number/name init nrpn-scale min max def */
|
2018-10-17 18:41:02 -04:00
|
|
|
{ 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 }
|
2016-08-23 12:50:54 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
/* fluid_gen_init
|
|
|
|
*
|
|
|
|
* Set an array of generators to their initial value
|
|
|
|
*/
|
2019-02-23 11:58:05 -05:00
|
|
|
void
|
2018-10-17 18:41:02 -04:00
|
|
|
fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel)
|
2016-08-23 12:50:54 -04:00
|
|
|
{
|
2018-10-17 18:41:02 -04:00
|
|
|
int i;
|
2016-08-23 12:50:54 -04:00
|
|
|
|
2018-10-17 18:41:02 -04:00
|
|
|
for(i = 0; i < GEN_LAST; i++)
|
|
|
|
{
|
2019-02-23 11:58:05 -05:00
|
|
|
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;
|
2018-10-17 18:41:02 -04:00
|
|
|
}
|
2016-08-23 12:50:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
fluid_real_t fluid_gen_scale(int gen, float value)
|
|
|
|
{
|
2018-10-17 18:41:02 -04:00
|
|
|
return (fluid_gen_info[gen].min
|
|
|
|
+ value * (fluid_gen_info[gen].max - fluid_gen_info[gen].min));
|
2016-08-23 12:50:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
fluid_real_t fluid_gen_scale_nrpn(int gen, int data)
|
|
|
|
{
|
2018-11-23 08:36:52 -05:00
|
|
|
data = data - 8192;
|
|
|
|
fluid_clip(data, -8192, 8192);
|
|
|
|
return (fluid_real_t)(data * fluid_gen_info[gen].nrpn_scale);
|
2016-08-23 12:50:54 -04:00
|
|
|
}
|