Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/fluidsynth/src/sfloader/fluid_sffile.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_SFFILE_H
25
#define _FLUID_SFFILE_H
26
27
28
#include "fluid_gen.h"
29
#include "fluid_list.h"
30
#include "fluid_mod.h"
31
#include "fluidsynth.h"
32
#include "fluid_sys.h"
33
34
35
/* Sound Font structure defines */
36
37
/* Forward declarations */
38
typedef union _SFGenAmount SFGenAmount;
39
typedef struct _SFVersion SFVersion;
40
typedef struct _SFMod SFMod;
41
typedef struct _SFGen SFGen;
42
typedef struct _SFZone SFZone;
43
typedef struct _SFSample SFSample;
44
typedef struct _SFInst SFInst;
45
typedef struct _SFPreset SFPreset;
46
typedef struct _SFData SFData;
47
typedef struct _SFChunk SFChunk;
48
49
50
struct _SFVersion
51
{
52
/* version structure */
53
unsigned short major;
54
unsigned short minor;
55
};
56
57
struct _SFMod
58
{
59
/* Modulator structure */
60
unsigned short src; /* source modulator */
61
unsigned short dest; /* destination generator */
62
signed short amount; /* signed, degree of modulation */
63
unsigned short amtsrc; /* second source controls amnt of first */
64
unsigned short trans; /* transform applied to source */
65
};
66
67
union _SFGenAmount /* Generator amount structure */
68
{
69
signed short sword; /* signed 16 bit value */
70
unsigned short uword; /* unsigned 16 bit value */
71
struct
72
{
73
unsigned char lo; /* low value for ranges */
74
unsigned char hi; /* high value for ranges */
75
} range;
76
};
77
78
struct _SFGen
79
{
80
/* Generator structure */
81
unsigned short id; /* generator ID */
82
SFGenAmount amount; /* generator value */
83
};
84
85
struct _SFZone
86
{
87
/* Sample/instrument zone structure */
88
fluid_list_t *gen; /* list of generators */
89
fluid_list_t *mod; /* list of modulators */
90
};
91
92
struct _SFSample
93
{
94
/* Sample structure */
95
char name[21]; /* Name of sample */
96
int idx; /* Index of this instrument in the Soundfont */
97
unsigned int start; /* Offset in sample area to start of sample */
98
unsigned int end; /* Offset from start to end of sample,
99
this is the last point of the
100
sample, the SF spec has this as the
101
1st point after, corrected on
102
load/save */
103
unsigned int loopstart; /* Offset from start to start of loop */
104
unsigned int loopend; /* Offset from start to end of loop,
105
marks the first point after loop,
106
whose sample value is ideally
107
equivalent to loopstart */
108
unsigned int samplerate; /* Sample rate recorded at */
109
unsigned char origpitch; /* root midi key number */
110
signed char pitchadj; /* pitch correction in cents */
111
unsigned short sampletype; /* 1 mono,2 right,4 left,linked 8,0x8000=ROM */
112
fluid_sample_t *fluid_sample; /* Imported sample (fixed up in fluid_defsfont_load) */
113
};
114
115
struct _SFInst
116
{
117
/* Instrument structure */
118
char name[21]; /* Name of instrument */
119
int idx; /* Index of this instrument in the Soundfont */
120
fluid_list_t *zone; /* list of instrument zones */
121
};
122
123
struct _SFPreset
124
{
125
/* Preset structure */
126
char name[21]; /* preset name */
127
unsigned short prenum; /* preset number */
128
unsigned short bank; /* bank number */
129
fluid_list_t *zone; /* list of preset zones */
130
};
131
132
/* NOTE: sffd is also used to determine if sound font is new (NULL) */
133
struct _SFData
134
{
135
/* Sound font data structure */
136
SFVersion version; /* sound font version */
137
SFVersion romver; /* ROM version */
138
139
unsigned int filesize;
140
141
unsigned int samplepos; /* position within sffd of the sample chunk */
142
unsigned int samplesize; /* length within sffd of the sample chunk */
143
144
unsigned int sample24pos; /* position within sffd of the sm24 chunk, set to zero if no 24 bit
145
sample support */
146
unsigned int sample24size; /* length within sffd of the sm24 chunk */
147
148
unsigned int hydrapos;
149
unsigned int hydrasize;
150
151
char *fname; /* file name */
152
FILE *sffd; /* loaded sfont file descriptor */
153
const fluid_file_callbacks_t *fcbs; /* file callbacks used to read this file */
154
155
fluid_rec_mutex_t mtx; /* this mutex can be used to synchronize calls to fcbs when using multiple threads (e.g. SF3 loading) */
156
157
fluid_list_t *info; /* linked list of info strings (1st byte is ID) */
158
fluid_list_t *preset; /* linked list of preset info */
159
fluid_list_t *inst; /* linked list of instrument info */
160
fluid_list_t *sample; /* linked list of sample info */
161
};
162
163
/* functions */
164
165
166
/*-----------------------------------sffile.h----------------------------*/
167
/*
168
File structures and routines (used to be in sffile.h)
169
*/
170
171
/* sfont file data structures */
172
struct _SFChunk
173
{
174
/* RIFF file chunk structure */
175
unsigned int id; /* chunk id */
176
unsigned int size; /* size of the following chunk */
177
};
178
179
/* Public functions */
180
SFData *fluid_sffile_open(const char *fname, const fluid_file_callbacks_t *fcbs);
181
void fluid_sffile_close(SFData *sf);
182
int fluid_sffile_parse_presets(SFData *sf);
183
int fluid_sffile_read_sample_data(SFData *sf, unsigned int sample_start, unsigned int sample_end,
184
int sample_type, short **data, char **data24);
185
186
187
/* extern only for unit test purposes */
188
int load_igen(SFData *sf, int size);
189
int load_pgen(SFData *sf, int size);
190
void delete_preset(SFPreset *preset);
191
void delete_inst(SFInst *inst);
192
void delete_zone(SFZone *zone);
193
194
#endif /* _FLUID_SFFILE_H */
195
196