Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/fluidsynth/src/sfloader/fluid_sfont.h
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
#ifndef _PRIV_FLUID_SFONT_H
23
#define _PRIV_FLUID_SFONT_H
24
25
#include "fluidsynth.h"
26
27
int fluid_sample_validate(fluid_sample_t *sample, unsigned int max_end);
28
int fluid_sample_sanitize_loop(fluid_sample_t *sample, unsigned int max_end);
29
30
/*
31
* Utility macros to access soundfonts, presets, and samples
32
*/
33
34
#define fluid_sfloader_delete(_loader) { if ((_loader) && (_loader)->free) (*(_loader)->free)(_loader); }
35
#define fluid_sfloader_load(_loader, _filename) (*(_loader)->load)(_loader, _filename)
36
37
38
#define fluid_sfont_delete_internal(_sf) ( ((_sf) && (_sf)->free)? (*(_sf)->free)(_sf) : 0)
39
40
41
#define fluid_preset_delete_internal(_preset) \
42
{ if ((_preset) && (_preset)->free) { (*(_preset)->free)(_preset); }}
43
44
#define fluid_preset_noteon(_preset,_synth,_ch,_key,_vel) \
45
(*(_preset)->noteon)(_preset,_synth,_ch,_key,_vel)
46
47
#define fluid_preset_notify(_preset,_reason,_chan) \
48
( ((_preset) && (_preset)->notify) ? (*(_preset)->notify)(_preset,_reason,_chan) : FLUID_OK )
49
50
51
#define fluid_sample_incr_ref(_sample) { (_sample)->refcount++; }
52
53
#define fluid_sample_decr_ref(_sample) \
54
(_sample)->refcount--; \
55
if (((_sample)->refcount == 0) && ((_sample)->notify)) \
56
(*(_sample)->notify)(_sample, FLUID_SAMPLE_DONE);
57
58
59
60
/**
61
* File callback structure to enable custom soundfont loading (e.g. from memory).
62
*/
63
struct _fluid_file_callbacks_t
64
{
65
fluid_sfloader_callback_open_t fopen;
66
fluid_sfloader_callback_read_t fread;
67
fluid_sfloader_callback_seek_t fseek;
68
fluid_sfloader_callback_close_t fclose;
69
fluid_sfloader_callback_tell_t ftell;
70
};
71
72
/**
73
* SoundFont loader structure.
74
*/
75
struct _fluid_sfloader_t
76
{
77
void *data; /**< User defined data pointer used by _fluid_sfloader_t::load() */
78
79
/** Callback structure specifying file operations used during soundfont loading to allow custom loading, such as from memory */
80
fluid_file_callbacks_t file_callbacks;
81
82
fluid_sfloader_free_t free;
83
84
fluid_sfloader_load_t load;
85
};
86
87
/**
88
* Virtual SoundFont instance structure.
89
*/
90
struct _fluid_sfont_t
91
{
92
void *data; /**< User defined data */
93
int id; /**< SoundFont ID */
94
int refcount; /**< SoundFont reference count (1 if no presets referencing it) */
95
int bankofs; /**< Bank offset */
96
97
fluid_sfont_free_t free;
98
99
fluid_sfont_get_name_t get_name;
100
101
fluid_sfont_get_preset_t get_preset;
102
103
fluid_sfont_iteration_start_t iteration_start;
104
105
fluid_sfont_iteration_next_t iteration_next;
106
};
107
108
/**
109
* Virtual SoundFont preset.
110
*/
111
struct _fluid_preset_t
112
{
113
void *data; /**< User supplied data */
114
fluid_sfont_t *sfont; /**< Parent virtual SoundFont */
115
116
fluid_preset_free_t free;
117
118
fluid_preset_get_name_t get_name;
119
120
fluid_preset_get_banknum_t get_banknum;
121
122
fluid_preset_get_num_t get_num;
123
124
fluid_preset_noteon_t noteon;
125
126
/**
127
* Virtual SoundFont preset notify method.
128
* @param preset Virtual SoundFont preset
129
* @param reason #FLUID_PRESET_SELECTED or #FLUID_PRESET_UNSELECTED
130
* @param chan MIDI channel number
131
* @return Should return #FLUID_OK
132
*
133
* Implement this optional method if the preset needs to be notified about
134
* preset select and unselect events.
135
*
136
* This method may be called from within synthesis context and therefore
137
* should be as efficient as possible and not perform any operations considered
138
* bad for realtime audio output (memory allocations and other OS calls).
139
*/
140
int (*notify)(fluid_preset_t *preset, int reason, int chan);
141
};
142
143
/**
144
* Virtual SoundFont sample.
145
*/
146
struct _fluid_sample_t
147
{
148
char name[21]; /**< Sample name */
149
150
/* The following four sample pointers store the original pointers from the Soundfont
151
* file. They are never changed after loading and are used to re-create the
152
* actual sample pointers after a sample has been unloaded and loaded again. The
153
* actual sample pointers get modified during loading for SF3 (compressed) samples
154
* and individually loaded SF2 samples. */
155
unsigned int source_start;
156
unsigned int source_end;
157
unsigned int source_loopstart;
158
unsigned int source_loopend;
159
160
unsigned int start; /**< Start index */
161
unsigned int end; /**< End index, index of last valid sample point (contrary to SF spec) */
162
unsigned int loopstart; /**< Loop start index */
163
unsigned int loopend; /**< Loop end index, first point following the loop (superimposed on loopstart) */
164
165
unsigned int samplerate; /**< Sample rate */
166
int origpitch; /**< Original pitch (MIDI note number, 0-127) */
167
int pitchadj; /**< Fine pitch adjustment (+/- 99 cents) */
168
int sampletype; /**< Specifies the type of this sample as indicated by the #fluid_sample_type enum */
169
int auto_free; /**< TRUE if _fluid_sample_t::data and _fluid_sample_t::data24 should be freed upon sample destruction */
170
short *data; /**< Pointer to the sample's 16 bit PCM data */
171
char *data24; /**< If not NULL, pointer to the least significant byte counterparts of each sample data point in order to create 24 bit audio samples */
172
173
int amplitude_that_reaches_noise_floor_is_valid; /**< Indicates if \a amplitude_that_reaches_noise_floor is valid (TRUE), set to FALSE initially to calculate. */
174
double amplitude_that_reaches_noise_floor; /**< The amplitude at which the sample's loop will be below the noise floor. For voice off optimization, calculated automatically. */
175
176
unsigned int refcount; /**< Count of voices using this sample */
177
int preset_count; /**< Count of selected presets using this sample (used for dynamic sample loading) */
178
179
/**
180
* Implement this function to receive notification when sample is no longer used.
181
* @param sample Virtual SoundFont sample
182
* @param reason #FLUID_SAMPLE_DONE only currently
183
* @return Should return #FLUID_OK
184
*/
185
int (*notify)(fluid_sample_t *sample, int reason);
186
};
187
188
189
#endif /* _PRIV_FLUID_SFONT_H */
190
191