Update Fluidsynth to v2.0.7
[ardour.git] / libs / fluidsynth / src / fluid_defsfont.h
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/instument 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 };
152
153 fluid_defpreset_t *new_fluid_defpreset(void);
154 void delete_fluid_defpreset(fluid_defpreset_t *defpreset);
155 fluid_defpreset_t *fluid_defpreset_next(fluid_defpreset_t *defpreset);
156 int fluid_defpreset_import_sfont(fluid_defpreset_t *defpreset, SFPreset *sfpreset, fluid_defsfont_t *defsfont);
157 int fluid_defpreset_set_global_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);
158 int fluid_defpreset_add_zone(fluid_defpreset_t *defpreset, fluid_preset_zone_t *zone);
159 fluid_preset_zone_t *fluid_defpreset_get_zone(fluid_defpreset_t *defpreset);
160 fluid_preset_zone_t *fluid_defpreset_get_global_zone(fluid_defpreset_t *defpreset);
161 int fluid_defpreset_get_banknum(fluid_defpreset_t *defpreset);
162 int fluid_defpreset_get_num(fluid_defpreset_t *defpreset);
163 const char *fluid_defpreset_get_name(fluid_defpreset_t *defpreset);
164 int fluid_defpreset_noteon(fluid_defpreset_t *defpreset, fluid_synth_t *synth, int chan, int key, int vel);
165
166 /*
167  * fluid_preset_zone
168  */
169 struct _fluid_preset_zone_t
170 {
171     fluid_preset_zone_t *next;
172     char *name;
173     fluid_inst_t *inst;
174     fluid_list_t *voice_zone;
175     fluid_zone_range_t range;
176     fluid_gen_t gen[GEN_LAST];
177     fluid_mod_t *mod;  /* List of modulators */
178 };
179
180 fluid_preset_zone_t *new_fluid_preset_zone(char *name);
181 void delete_fluid_list_mod(fluid_mod_t *mod);
182 void delete_fluid_preset_zone(fluid_preset_zone_t *zone);
183 fluid_preset_zone_t *fluid_preset_zone_next(fluid_preset_zone_t *zone);
184 int fluid_preset_zone_import_sfont(fluid_preset_zone_t *zone, SFZone *sfzone, fluid_defsfont_t *defssfont);
185 fluid_inst_t *fluid_preset_zone_get_inst(fluid_preset_zone_t *zone);
186
187 /*
188  * fluid_inst_t
189  */
190 struct _fluid_inst_t
191 {
192     char name[21];
193     int source_idx; /* Index of instrument in source Soundfont */
194     fluid_inst_zone_t *global_zone;
195     fluid_inst_zone_t *zone;
196 };
197
198 fluid_inst_t *new_fluid_inst(void);
199 fluid_inst_t *fluid_inst_import_sfont(SFInst *sfinst, fluid_defsfont_t *defsfont);
200 void delete_fluid_inst(fluid_inst_t *inst);
201 int fluid_inst_set_global_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
202 int fluid_inst_add_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
203 fluid_inst_zone_t *fluid_inst_get_zone(fluid_inst_t *inst);
204 fluid_inst_zone_t *fluid_inst_get_global_zone(fluid_inst_t *inst);
205
206 /*
207  * fluid_inst_zone_t
208  */
209 struct _fluid_inst_zone_t
210 {
211     fluid_inst_zone_t *next;
212     char *name;
213     fluid_sample_t *sample;
214     fluid_zone_range_t range;
215     fluid_gen_t gen[GEN_LAST];
216     fluid_mod_t *mod;  /* List of modulators */
217 };
218
219
220 fluid_inst_zone_t *new_fluid_inst_zone(char *name);
221 void delete_fluid_inst_zone(fluid_inst_zone_t *zone);
222 fluid_inst_zone_t *fluid_inst_zone_next(fluid_inst_zone_t *zone);
223 int fluid_inst_zone_import_sfont(fluid_inst_zone_t *inst_zone, SFZone *sfzone, fluid_defsfont_t *defsfont);
224 fluid_sample_t *fluid_inst_zone_get_sample(fluid_inst_zone_t *zone);
225
226
227 int fluid_sample_import_sfont(fluid_sample_t *sample, SFSample *sfsample, fluid_defsfont_t *defsfont);
228 int fluid_sample_in_rom(fluid_sample_t *sample);
229
230
231 #endif  /* _FLUID_SFONT_H */