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