Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/fluidsynth/src/sfloader/fluid_defsfont.h
4396 views
1
/* FluidSynth - A Software Synthesizer
2
*
3
* Copyright (C) 2003 Peter Hanappe and others.
4
*
5
* SoundFont loading code borrowed from Smurf SoundFont Editor by Josh Green
6
*
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public License
9
* as published by the Free Software Foundation; either version 2.1 of
10
* the License, or (at your option) any later version.
11
*
12
* This library is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free
19
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20
* 02110-1301, USA
21
*/
22
23
24
#ifndef _FLUID_DEFSFONT_H
25
#define _FLUID_DEFSFONT_H
26
27
28
#include "fluidsynth.h"
29
#include "fluidsynth_priv.h"
30
#include "fluid_sffile.h"
31
#include "fluid_list.h"
32
#include "fluid_mod.h"
33
#include "fluid_gen.h"
34
35
36
37
/*-----------------------------------sfont.h----------------------------*/
38
39
#define SF_SAMPMODES_LOOP 1
40
#define SF_SAMPMODES_UNROLL 2
41
42
#define SF_MIN_SAMPLERATE 400
43
#define SF_MAX_SAMPLERATE 50000
44
45
#define SF_MIN_SAMPLE_LENGTH 32
46
47
/***************************************************************
48
*
49
* FORWARD DECLARATIONS
50
*/
51
typedef struct _fluid_defsfont_t fluid_defsfont_t;
52
typedef struct _fluid_defpreset_t fluid_defpreset_t;
53
typedef struct _fluid_preset_zone_t fluid_preset_zone_t;
54
typedef struct _fluid_inst_t fluid_inst_t;
55
typedef struct _fluid_inst_zone_t fluid_inst_zone_t; /**< Soundfont Instrument Zone */
56
typedef struct _fluid_voice_zone_t fluid_voice_zone_t;
57
58
/* defines the velocity and key range for a zone */
59
struct _fluid_zone_range_t
60
{
61
int keylo;
62
int keyhi;
63
int vello;
64
int velhi;
65
unsigned char ignore; /* set to TRUE for legato playing to ignore this range zone */
66
};
67
68
/* Stored on a preset zone to keep track of the inst zones that could start a voice
69
* and their combined preset zone/instrument zone ranges */
70
struct _fluid_voice_zone_t
71
{
72
fluid_inst_zone_t *inst_zone;
73
fluid_zone_range_t range;
74
};
75
76
/*
77
78
Public interface
79
80
*/
81
82
fluid_sfont_t *fluid_defsfloader_load(fluid_sfloader_t *loader, const char *filename);
83
84
85
int fluid_defsfont_sfont_delete(fluid_sfont_t *sfont);
86
const char *fluid_defsfont_sfont_get_name(fluid_sfont_t *sfont);
87
fluid_preset_t *fluid_defsfont_sfont_get_preset(fluid_sfont_t *sfont, int bank, int prenum);
88
void fluid_defsfont_sfont_iteration_start(fluid_sfont_t *sfont);
89
fluid_preset_t *fluid_defsfont_sfont_iteration_next(fluid_sfont_t *sfont);
90
91
92
void fluid_defpreset_preset_delete(fluid_preset_t *preset);
93
const char *fluid_defpreset_preset_get_name(fluid_preset_t *preset);
94
int fluid_defpreset_preset_get_banknum(fluid_preset_t *preset);
95
int fluid_defpreset_preset_get_num(fluid_preset_t *preset);
96
int fluid_defpreset_preset_noteon(fluid_preset_t *preset, fluid_synth_t *synth, int chan, int key, int vel);
97
98
int fluid_zone_inside_range(fluid_zone_range_t *zone_range, int key, int vel);
99
100
/*
101
* fluid_defsfont_t
102
*/
103
struct _fluid_defsfont_t
104
{
105
const fluid_file_callbacks_t *fcbs; /* the file callbacks used to load this Soundfont */
106
char *filename; /* the filename of this soundfont */
107
unsigned int samplepos; /* the position in the file at which the sample data starts */
108
unsigned int samplesize; /* the size of the sample data in bytes */
109
short *sampledata; /* the sample data, loaded in ram */
110
111
unsigned int sample24pos; /* position within sffd of the sm24 chunk, set to zero if no 24 bit sample support */
112
unsigned int sample24size; /* length within sffd of the sm24 chunk */
113
char *sample24data; /* if not NULL, the least significant byte of the 24bit sample data, loaded in ram */
114
115
fluid_sfont_t *sfont; /* pointer to parent sfont */
116
fluid_list_t *sample; /* the samples in this soundfont */
117
fluid_list_t *preset; /* the presets of this soundfont */
118
fluid_list_t *inst; /* the instruments of this soundfont */
119
int mlock; /* Should we try memlock (avoid swapping)? */
120
int dynamic_samples; /* Enables dynamic sample loading if set */
121
122
fluid_list_t *preset_iter_cur; /* the current preset in the iteration */
123
};
124
125
126
fluid_defsfont_t *new_fluid_defsfont(fluid_settings_t *settings);
127
int delete_fluid_defsfont(fluid_defsfont_t *defsfont);
128
int fluid_defsfont_load(fluid_defsfont_t *defsfont, const fluid_file_callbacks_t *file_callbacks, const char *file);
129
const char *fluid_defsfont_get_name(fluid_defsfont_t *defsfont);
130
fluid_preset_t *fluid_defsfont_get_preset(fluid_defsfont_t *defsfont, int bank, int prenum);
131
void fluid_defsfont_iteration_start(fluid_defsfont_t *defsfont);
132
fluid_preset_t *fluid_defsfont_iteration_next(fluid_defsfont_t *defsfont);
133
int fluid_defsfont_load_sampledata(fluid_defsfont_t *defsfont, SFData *sfdata, fluid_sample_t *sample);
134
int fluid_defsfont_load_all_sampledata(fluid_defsfont_t *defsfont, SFData *sfdata);
135
136
int fluid_defsfont_add_sample(fluid_defsfont_t *defsfont, fluid_sample_t *sample);
137
int fluid_defsfont_add_preset(fluid_defsfont_t *defsfont, fluid_defpreset_t *defpreset);
138
139
140
/*
141
* fluid_preset_t
142
*/
143
struct _fluid_defpreset_t
144
{
145
fluid_defpreset_t *next;
146
char name[21]; /* the name of the preset */
147
unsigned int bank; /* the bank number */
148
unsigned int num; /* the preset number */
149
fluid_preset_zone_t *global_zone; /* the global zone of the preset */
150
fluid_preset_zone_t *zone; /* the chained list of preset zones */
151
int pinned; /* preset samples pinned to sample cache? */
152
};
153
154
fluid_defpreset_t *new_fluid_defpreset(void);
155
void delete_fluid_defpreset(fluid_defpreset_t *defpreset);
156
fluid_defpreset_t *fluid_defpreset_next(fluid_defpreset_t *defpreset);
157
int fluid_defpreset_import_sfont(fluid_defpreset_t *defpreset, SFPreset *sfpreset, fluid_defsfont_t *defsfont, SFData *sfdata);
158
int fluid_defpreset_set_global_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);
159
int fluid_defpreset_add_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);
160
fluid_preset_zone_t *fluid_defpreset_get_zone(fluid_defpreset_t *defpreset);
161
fluid_preset_zone_t *fluid_defpreset_get_global_zone(fluid_defpreset_t *defpreset);
162
int fluid_defpreset_get_banknum(fluid_defpreset_t *defpreset);
163
int fluid_defpreset_get_num(fluid_defpreset_t *defpreset);
164
const char *fluid_defpreset_get_name(fluid_defpreset_t *defpreset);
165
int fluid_defpreset_noteon(fluid_defpreset_t *defpreset, fluid_synth_t *synth, int chan, int key, int vel);
166
167
/*
168
* fluid_preset_zone
169
*/
170
struct _fluid_preset_zone_t
171
{
172
fluid_preset_zone_t *next;
173
char *name;
174
fluid_inst_t *inst;
175
fluid_list_t *voice_zone;
176
fluid_zone_range_t range;
177
fluid_gen_t gen[GEN_LAST];
178
fluid_mod_t *mod; /* List of modulators */
179
};
180
181
fluid_preset_zone_t *new_fluid_preset_zone(char *name);
182
void delete_fluid_list_mod(fluid_mod_t *mod);
183
void delete_fluid_preset_zone(fluid_preset_zone_t *zone);
184
fluid_preset_zone_t *fluid_preset_zone_next(fluid_preset_zone_t *zone);
185
int fluid_preset_zone_import_sfont(fluid_preset_zone_t *zone, fluid_preset_zone_t *global_zone, SFZone *sfzone, fluid_defsfont_t *defssfont, SFData *sfdata);
186
fluid_inst_t *fluid_preset_zone_get_inst(fluid_preset_zone_t *zone);
187
188
/*
189
* fluid_inst_t
190
*/
191
struct _fluid_inst_t
192
{
193
char name[21];
194
int source_idx; /* Index of instrument in source Soundfont */
195
fluid_inst_zone_t *global_zone;
196
fluid_inst_zone_t *zone;
197
};
198
199
fluid_inst_t *new_fluid_inst(void);
200
fluid_inst_t *fluid_inst_import_sfont(int inst_idx, fluid_defsfont_t *defsfont, SFData *sfdata);
201
void delete_fluid_inst(fluid_inst_t *inst);
202
int fluid_inst_set_global_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
203
int fluid_inst_add_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
204
fluid_inst_zone_t *fluid_inst_get_zone(fluid_inst_t *inst);
205
fluid_inst_zone_t *fluid_inst_get_global_zone(fluid_inst_t *inst);
206
207
/*
208
* fluid_inst_zone_t
209
*/
210
struct _fluid_inst_zone_t
211
{
212
fluid_inst_zone_t *next;
213
char *name;
214
fluid_sample_t *sample;
215
fluid_zone_range_t range;
216
fluid_gen_t gen[GEN_LAST];
217
fluid_mod_t *mod; /* List of modulators */
218
};
219
220
221
fluid_inst_zone_t *new_fluid_inst_zone(char *name);
222
void delete_fluid_inst_zone(fluid_inst_zone_t *zone);
223
fluid_inst_zone_t *fluid_inst_zone_next(fluid_inst_zone_t *zone);
224
int fluid_inst_zone_import_sfont(fluid_inst_zone_t *inst_zone, fluid_inst_zone_t *global_inst_zone, SFZone *sfzone, fluid_defsfont_t *defsfont, SFData *sfdata);
225
fluid_sample_t *fluid_inst_zone_get_sample(fluid_inst_zone_t *zone);
226
227
228
int fluid_sample_import_sfont(fluid_sample_t *sample, SFSample *sfsample, fluid_defsfont_t *defsfont);
229
int fluid_sample_in_rom(fluid_sample_t *sample);
230
231
232
#endif /* _FLUID_SFONT_H */
233
234