Path: blob/master/libs/fluidsynth/src/synth/fluid_gen.c
4396 views
/* FluidSynth - A Software Synthesizer1*2* Copyright (C) 2003 Peter Hanappe and others.3*4* This library is free software; you can redistribute it and/or5* modify it under the terms of the GNU Lesser General Public License6* as published by the Free Software Foundation; either version 2.1 of7* the License, or (at your option) any later version.8*9* This library is distributed in the hope that it will be useful, but10* WITHOUT ANY WARRANTY; without even the implied warranty of11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU12* Lesser General Public License for more details.13*14* You should have received a copy of the GNU Lesser General Public15* License along with this library; if not, write to the Free16* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA17* 02110-1301, USA18*/192021#include "fluid_gen.h"22#include "fluid_chan.h"232425#define _GEN(_name) GEN_ ## _name, #_name262728/* See SFSpec21 $8.1.3 */29static const fluid_gen_info_t fluid_gen_info[] =30{31/* number/name init nrpn-scale min max def */32{ _GEN(STARTADDROFS), 1, 1, 0.0f, 1e10f, 0.0f },33{ _GEN(ENDADDROFS), 1, 1, -1e10f, 0.0f, 0.0f },34{ _GEN(STARTLOOPADDROFS), 1, 1, -1e10f, 1e10f, 0.0f },35{ _GEN(ENDLOOPADDROFS), 1, 1, -1e10f, 1e10f, 0.0f },36{ _GEN(STARTADDRCOARSEOFS), 0, 1, 0.0f, 1e10f, 0.0f },37{ _GEN(MODLFOTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },38{ _GEN(VIBLFOTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },39{ _GEN(MODENVTOPITCH), 1, 2, -12000.0f, 12000.0f, 0.0f },40{ _GEN(FILTERFC), 1, 2, 1500.0f, 13500.0f, 13500.0f },41{ _GEN(FILTERQ), 1, 1, 0.0f, 960.0f, 0.0f },42{ _GEN(MODLFOTOFILTERFC), 1, 2, -12000.0f, 12000.0f, 0.0f },43{ _GEN(MODENVTOFILTERFC), 1, 2, -12000.0f, 12000.0f, 0.0f },44{ _GEN(ENDADDRCOARSEOFS), 0, 1, -1e10f, 0.0f, 0.0f },45{ _GEN(MODLFOTOVOL), 1, 1, -960.0f, 960.0f, 0.0f },46{ _GEN(UNUSED1), 0, 0, 0.0f, 0.0f, 0.0f },47{ _GEN(CHORUSSEND), 1, 1, 0.0f, 1000.0f, 0.0f },48{ _GEN(REVERBSEND), 1, 1, 0.0f, 1000.0f, 0.0f },49{ _GEN(PAN), 1, 1, -500.0f, 500.0f, 0.0f },50{ _GEN(UNUSED2), 0, 0, 0.0f, 0.0f, 0.0f },51{ _GEN(UNUSED3), 0, 0, 0.0f, 0.0f, 0.0f },52{ _GEN(UNUSED4), 0, 0, 0.0f, 0.0f, 0.0f },53{ _GEN(MODLFODELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },54{ _GEN(MODLFOFREQ), 1, 4, -16000.0f, 4500.0f, 0.0f },55{ _GEN(VIBLFODELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },56{ _GEN(VIBLFOFREQ), 1, 4, -16000.0f, 4500.0f, 0.0f },57{ _GEN(MODENVDELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },58{ _GEN(MODENVATTACK), 1, 2, -12000.0f, 8000.0f, -12000.0f },59{ _GEN(MODENVHOLD), 1, 2, -12000.0f, 5000.0f, -12000.0f },60{ _GEN(MODENVDECAY), 1, 2, -12000.0f, 8000.0f, -12000.0f },61{ _GEN(MODENVSUSTAIN), 0, 1, 0.0f, 1000.0f, 0.0f },62{ _GEN(MODENVRELEASE), 1, 2, -12000.0f, 8000.0f, -12000.0f },63{ _GEN(KEYTOMODENVHOLD), 0, 1, -1200.0f, 1200.0f, 0.0f },64{ _GEN(KEYTOMODENVDECAY), 0, 1, -1200.0f, 1200.0f, 0.0f },65{ _GEN(VOLENVDELAY), 1, 2, -12000.0f, 5000.0f, -12000.0f },66{ _GEN(VOLENVATTACK), 1, 2, -12000.0f, 8000.0f, -12000.0f },67{ _GEN(VOLENVHOLD), 1, 2, -12000.0f, 5000.0f, -12000.0f },68{ _GEN(VOLENVDECAY), 1, 2, -12000.0f, 8000.0f, -12000.0f },69{ _GEN(VOLENVSUSTAIN), 0, 1, 0.0f, 1440.0f, 0.0f },70{ _GEN(VOLENVRELEASE), 1, 2, -12000.0f, 8000.0f, -12000.0f },71{ _GEN(KEYTOVOLENVHOLD), 0, 1, -1200.0f, 1200.0f, 0.0f },72{ _GEN(KEYTOVOLENVDECAY), 0, 1, -1200.0f, 1200.0f, 0.0f },73{ _GEN(INSTRUMENT), 0, 0, 0.0f, 0.0f, 0.0f },74{ _GEN(RESERVED1), 0, 0, 0.0f, 0.0f, 0.0f },75{ _GEN(KEYRANGE), 0, 0, 0.0f, 127.0f, 0.0f },76{ _GEN(VELRANGE), 0, 0, 0.0f, 127.0f, 0.0f },77{ _GEN(STARTLOOPADDRCOARSEOFS), 0, 1, -1e10f, 1e10f, 0.0f },78{ _GEN(KEYNUM), 1, 0, 0.0f, 127.0f, -1.0f },79{ _GEN(VELOCITY), 1, 1, 0.0f, 127.0f, -1.0f },80{ _GEN(ATTENUATION), 1, 1, 0.0f, 1440.0f, 0.0f },81{ _GEN(RESERVED2), 0, 0, 0.0f, 0.0f, 0.0f },82{ _GEN(ENDLOOPADDRCOARSEOFS), 0, 1, -1e10f, 1e10f, 0.0f },83{ _GEN(COARSETUNE), 0, 1, -120.0f, 120.0f, 0.0f },84{ _GEN(FINETUNE), 0, 1, -99.0f, 99.0f, 0.0f },85{ _GEN(SAMPLEID), 0, 0, 0.0f, 0.0f, 0.0f },86{ _GEN(SAMPLEMODE), 0, 0, 0.0f, 0.0f, 0.0f },87{ _GEN(RESERVED3), 0, 0, 0.0f, 0.0f, 0.0f },88{ _GEN(SCALETUNE), 0, 1, 0.0f, 1200.0f, 100.0f },89{ _GEN(EXCLUSIVECLASS), 0, 0, 0.0f, 0.0f, 0.0f },90{ _GEN(OVERRIDEROOTKEY), 1, 0, 0.0f, 127.0f, -1.0f },91{ _GEN(PITCH), 1, 0, 0.0f, 127.0f, 0.0f },92{ _GEN(CUSTOM_BALANCE), 1, 0, -960.0f, 960.0f, 0.0f },93{ _GEN(CUSTOM_FILTERFC), 1, 2, 0.0f, 22050.0f, 0.0f },94{ _GEN(CUSTOM_FILTERQ), 1, 1, 0.0f, 960.0f, 0.0f }95};9697/* fluid_gen_init98*99* Set an array of generators to their initial value100*/101void102fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel)103{104int i;105106for(i = 0; i < GEN_LAST; i++)107{108gen[i].flags = GEN_UNUSED;109gen[i].mod = 0.0;110gen[i].nrpn = (channel == NULL) ? 0.0 : fluid_channel_get_gen(channel, i);111#if 0 /* unused in Wine */112gen[i].val = fluid_gen_info[i].def;113#else114gen[i].val = 0.0;115#endif116}117}118119fluid_real_t fluid_gen_scale(int gen, float value)120{121return (fluid_gen_info[gen].min122+ value * (fluid_gen_info[gen].max - fluid_gen_info[gen].min));123}124125fluid_real_t fluid_gen_scale_nrpn(int gen, int data)126{127data = data - 8192;128fluid_clip(data, -8192, 8192);129return (fluid_real_t)(data * fluid_gen_info[gen].nrpn_scale);130}131132133const char *fluid_gen_name(int gen)134{135return fluid_gen_info[gen].name;136}137138139