2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2016 by Christian Schoenebeck * |
* Copyright (C) 2003-2018 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
27 |
#include "DLS.h" |
#include "DLS.h" |
28 |
#include <vector> |
#include <vector> |
29 |
|
|
30 |
|
#ifndef __has_feature |
31 |
|
# define __has_feature(x) 0 |
32 |
|
#endif |
33 |
|
#ifndef HAVE_RTTI |
34 |
|
# if __GXX_RTTI || __has_feature(cxx_rtti) || _CPPRTTI |
35 |
|
# define HAVE_RTTI 1 |
36 |
|
# else |
37 |
|
# define HAVE_RTTI 0 |
38 |
|
# endif |
39 |
|
#endif |
40 |
|
#if HAVE_RTTI |
41 |
|
# include <typeinfo> |
42 |
|
#else |
43 |
|
# warning No RTTI available! |
44 |
|
#endif |
45 |
|
|
46 |
#if WORDS_BIGENDIAN |
#if WORDS_BIGENDIAN |
47 |
# define LIST_TYPE_3PRG 0x33707267 |
# define LIST_TYPE_3PRG 0x33707267 |
48 |
# define LIST_TYPE_3EWL 0x3365776C |
# define LIST_TYPE_3EWL 0x3365776C |
61 |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
62 |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
63 |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
64 |
# define CHUNK_ID_FFMT 0x46466D74 // own gig format extension |
# define CHUNK_ID_LSDE 0x4c534445 // own gig format extension |
65 |
#else // little endian |
#else // little endian |
66 |
# define LIST_TYPE_3PRG 0x67727033 |
# define LIST_TYPE_3PRG 0x67727033 |
67 |
# define LIST_TYPE_3EWL 0x6C776533 |
# define LIST_TYPE_3EWL 0x6C776533 |
80 |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
81 |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
82 |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
83 |
# define CHUNK_ID_FFMT 0x746D4646 // own gig format extension |
# define CHUNK_ID_LSDE 0x4544534c // own gig format extension |
84 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
85 |
|
|
86 |
|
#ifndef GIG_DECLARE_ENUM |
87 |
|
# define GIG_DECLARE_ENUM(type, ...) enum type { __VA_ARGS__ } |
88 |
|
#endif |
89 |
|
|
90 |
|
// just symbol prototyping (since Serialization.h not included by default here) |
91 |
|
namespace Serialization { class Archive; } |
92 |
|
|
93 |
/** Gigasampler/GigaStudio specific classes and definitions */ |
/** Gigasampler/GigaStudio specific classes and definitions */ |
94 |
namespace gig { |
namespace gig { |
95 |
|
|
115 |
} |
} |
116 |
}; |
}; |
117 |
|
|
118 |
/** Standard types of sample loops. */ |
/** Standard types of sample loops. |
119 |
typedef enum { |
* |
120 |
loop_type_normal = 0x00000000, ///< Loop forward (normal) |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
121 |
loop_type_bidirectional = 0x00000001, ///< Alternating loop (forward/backward, also known as Ping Pong) |
*/ |
122 |
loop_type_backward = 0x00000002 ///< Loop backward (reverse) |
GIG_DECLARE_ENUM(loop_type_t, |
123 |
} loop_type_t; |
loop_type_normal = 0x00000000, /**< Loop forward (normal) */ |
124 |
|
loop_type_bidirectional = 0x00000001, /**< Alternating loop (forward/backward, also known as Ping Pong) */ |
125 |
/** Society of Motion Pictures and Television E time format. */ |
loop_type_backward = 0x00000002 /**< Loop backward (reverse) */ |
126 |
typedef enum { |
); |
127 |
smpte_format_no_offset = 0x00000000, ///< no SMPTE offset |
|
128 |
smpte_format_24_frames = 0x00000018, ///< 24 frames per second |
/** Society of Motion Pictures and Television E time format. |
129 |
smpte_format_25_frames = 0x00000019, ///< 25 frames per second |
* |
130 |
smpte_format_30_frames_dropping = 0x0000001D, ///< 30 frames per second with frame dropping (30 drop) |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
131 |
smpte_format_30_frames = 0x0000001E ///< 30 frames per second |
*/ |
132 |
} smpte_format_t; |
GIG_DECLARE_ENUM(smpte_format_t, |
133 |
|
smpte_format_no_offset = 0x00000000, /**< no SMPTE offset */ |
134 |
/** Defines the shape of a function graph. */ |
smpte_format_24_frames = 0x00000018, /**< 24 frames per second */ |
135 |
typedef enum { |
smpte_format_25_frames = 0x00000019, /**< 25 frames per second */ |
136 |
curve_type_nonlinear = 0, |
smpte_format_30_frames_dropping = 0x0000001D, /**< 30 frames per second with frame dropping (30 drop) */ |
137 |
curve_type_linear = 1, |
smpte_format_30_frames = 0x0000001E /**< 30 frames per second */ |
138 |
curve_type_special = 2, |
); |
139 |
curve_type_unknown = 0xffffffff |
|
140 |
} curve_type_t; |
/** Defines the shape of a function graph. |
141 |
|
* |
142 |
/** Dimensions allow to bypass one of the following controllers. */ |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
143 |
typedef enum { |
*/ |
144 |
dim_bypass_ctrl_none, |
GIG_DECLARE_ENUM(curve_type_t, |
145 |
dim_bypass_ctrl_94, ///< Effect 4 Depth (MIDI Controller 94) |
curve_type_nonlinear = 0, /**< Non-linear curve type. */ |
146 |
dim_bypass_ctrl_95 ///< Effect 5 Depth (MIDI Controller 95) |
curve_type_linear = 1, /**< Linear curve type. */ |
147 |
} dim_bypass_ctrl_t; |
curve_type_special = 2, /**< Special curve type. */ |
148 |
|
curve_type_unknown = 0xffffffff /**< Unknown curve type. */ |
149 |
/** Defines how LFO3 is controlled by. */ |
); |
150 |
typedef enum { |
|
151 |
lfo3_ctrl_internal = 0x00, ///< Only internally controlled. |
/** Dimensions allow to bypass one of the following controllers. |
152 |
lfo3_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
* |
153 |
lfo3_ctrl_aftertouch = 0x02, ///< Only controlled by aftertouch controller. |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
154 |
lfo3_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
*/ |
155 |
lfo3_ctrl_internal_aftertouch = 0x04 ///< Controlled internally and by aftertouch controller. |
GIG_DECLARE_ENUM(dim_bypass_ctrl_t, |
156 |
} lfo3_ctrl_t; |
dim_bypass_ctrl_none, /**< No controller bypass. */ |
157 |
|
dim_bypass_ctrl_94, /**< Effect 4 Depth (MIDI Controller 94) */ |
158 |
/** Defines how LFO2 is controlled by. */ |
dim_bypass_ctrl_95 /**< Effect 5 Depth (MIDI Controller 95) */ |
159 |
typedef enum { |
); |
160 |
lfo2_ctrl_internal = 0x00, ///< Only internally controlled. |
|
161 |
lfo2_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
/** Defines how LFO3 is controlled by. |
162 |
lfo2_ctrl_foot = 0x02, ///< Only controlled by external foot controller. |
* |
163 |
lfo2_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
164 |
lfo2_ctrl_internal_foot = 0x04 ///< Controlled internally and by external foot controller. |
*/ |
165 |
} lfo2_ctrl_t; |
GIG_DECLARE_ENUM(lfo3_ctrl_t, |
166 |
|
lfo3_ctrl_internal = 0x00, /**< Only internally controlled. */ |
167 |
/** Defines how LFO1 is controlled by. */ |
lfo3_ctrl_modwheel = 0x01, /**< Only controlled by external modulation wheel. */ |
168 |
typedef enum { |
lfo3_ctrl_aftertouch = 0x02, /**< Only controlled by aftertouch controller. */ |
169 |
lfo1_ctrl_internal = 0x00, ///< Only internally controlled. |
lfo3_ctrl_internal_modwheel = 0x03, /**< Controlled internally and by external modulation wheel. */ |
170 |
lfo1_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
lfo3_ctrl_internal_aftertouch = 0x04 /**< Controlled internally and by aftertouch controller. */ |
171 |
lfo1_ctrl_breath = 0x02, ///< Only controlled by external breath controller. |
); |
172 |
lfo1_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
|
173 |
lfo1_ctrl_internal_breath = 0x04 ///< Controlled internally and by external breath controller. |
/** Defines how LFO2 is controlled by. |
174 |
} lfo1_ctrl_t; |
* |
175 |
|
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
176 |
/** Defines how the filter cutoff frequency is controlled by. */ |
*/ |
177 |
typedef enum { |
GIG_DECLARE_ENUM(lfo2_ctrl_t, |
178 |
vcf_cutoff_ctrl_none = 0x00, |
lfo2_ctrl_internal = 0x00, /**< Only internally controlled. */ |
179 |
vcf_cutoff_ctrl_none2 = 0x01, ///< The difference between none and none2 is unknown |
lfo2_ctrl_modwheel = 0x01, /**< Only controlled by external modulation wheel. */ |
180 |
vcf_cutoff_ctrl_modwheel = 0x81, ///< Modulation Wheel (MIDI Controller 1) |
lfo2_ctrl_foot = 0x02, /**< Only controlled by external foot controller. */ |
181 |
vcf_cutoff_ctrl_effect1 = 0x8c, ///< Effect Controller 1 (Coarse, MIDI Controller 12) |
lfo2_ctrl_internal_modwheel = 0x03, /**< Controlled internally and by external modulation wheel. */ |
182 |
vcf_cutoff_ctrl_effect2 = 0x8d, ///< Effect Controller 2 (Coarse, MIDI Controller 13) |
lfo2_ctrl_internal_foot = 0x04 /**< Controlled internally and by external foot controller. */ |
183 |
vcf_cutoff_ctrl_breath = 0x82, ///< Breath Controller (Coarse, MIDI Controller 2) |
); |
184 |
vcf_cutoff_ctrl_foot = 0x84, ///< Foot Pedal (Coarse, MIDI Controller 4) |
|
185 |
vcf_cutoff_ctrl_sustainpedal = 0xc0, ///< Sustain Pedal (MIDI Controller 64) |
/** Defines how LFO1 is controlled by. |
186 |
vcf_cutoff_ctrl_softpedal = 0xc3, ///< Soft Pedal (MIDI Controller 67) |
* |
187 |
vcf_cutoff_ctrl_genpurpose7 = 0xd2, ///< General Purpose Controller 7 (Button, MIDI Controller 82) |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
188 |
vcf_cutoff_ctrl_genpurpose8 = 0xd3, ///< General Purpose Controller 8 (Button, MIDI Controller 83) |
*/ |
189 |
vcf_cutoff_ctrl_aftertouch = 0x80 ///< Key Pressure |
GIG_DECLARE_ENUM(lfo1_ctrl_t, |
190 |
} vcf_cutoff_ctrl_t; |
lfo1_ctrl_internal = 0x00, /**< Only internally controlled. */ |
191 |
|
lfo1_ctrl_modwheel = 0x01, /**< Only controlled by external modulation wheel. */ |
192 |
/** Defines how the filter resonance is controlled by. */ |
lfo1_ctrl_breath = 0x02, /**< Only controlled by external breath controller. */ |
193 |
typedef enum { |
lfo1_ctrl_internal_modwheel = 0x03, /**< Controlled internally and by external modulation wheel. */ |
194 |
vcf_res_ctrl_none = 0xffffffff, |
lfo1_ctrl_internal_breath = 0x04 /**< Controlled internally and by external breath controller. */ |
195 |
vcf_res_ctrl_genpurpose3 = 0, ///< General Purpose Controller 3 (Slider, MIDI Controller 18) |
); |
196 |
vcf_res_ctrl_genpurpose4 = 1, ///< General Purpose Controller 4 (Slider, MIDI Controller 19) |
|
197 |
vcf_res_ctrl_genpurpose5 = 2, ///< General Purpose Controller 5 (Button, MIDI Controller 80) |
/** Defines how the filter cutoff frequency is controlled by. |
198 |
vcf_res_ctrl_genpurpose6 = 3 ///< General Purpose Controller 6 (Button, MIDI Controller 81) |
* |
199 |
} vcf_res_ctrl_t; |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
200 |
|
*/ |
201 |
|
GIG_DECLARE_ENUM(vcf_cutoff_ctrl_t, |
202 |
|
vcf_cutoff_ctrl_none = 0x00, /**< No MIDI controller assigned for filter cutoff frequency. */ |
203 |
|
vcf_cutoff_ctrl_none2 = 0x01, /**< The difference between none and none2 is unknown */ |
204 |
|
vcf_cutoff_ctrl_modwheel = 0x81, /**< Modulation Wheel (MIDI Controller 1) */ |
205 |
|
vcf_cutoff_ctrl_effect1 = 0x8c, /**< Effect Controller 1 (Coarse, MIDI Controller 12) */ |
206 |
|
vcf_cutoff_ctrl_effect2 = 0x8d, /**< Effect Controller 2 (Coarse, MIDI Controller 13) */ |
207 |
|
vcf_cutoff_ctrl_breath = 0x82, /**< Breath Controller (Coarse, MIDI Controller 2) */ |
208 |
|
vcf_cutoff_ctrl_foot = 0x84, /**< Foot Pedal (Coarse, MIDI Controller 4) */ |
209 |
|
vcf_cutoff_ctrl_sustainpedal = 0xc0, /**< Sustain Pedal (MIDI Controller 64) */ |
210 |
|
vcf_cutoff_ctrl_softpedal = 0xc3, /**< Soft Pedal (MIDI Controller 67) */ |
211 |
|
vcf_cutoff_ctrl_genpurpose7 = 0xd2, /**< General Purpose Controller 7 (Button, MIDI Controller 82) */ |
212 |
|
vcf_cutoff_ctrl_genpurpose8 = 0xd3, /**< General Purpose Controller 8 (Button, MIDI Controller 83) */ |
213 |
|
vcf_cutoff_ctrl_aftertouch = 0x80 /**< Key Pressure */ |
214 |
|
); |
215 |
|
|
216 |
|
/** Defines how the filter resonance is controlled by. |
217 |
|
* |
218 |
|
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
219 |
|
*/ |
220 |
|
GIG_DECLARE_ENUM(vcf_res_ctrl_t, |
221 |
|
vcf_res_ctrl_none = 0xffffffff, /**< No MIDI controller assigned for filter resonance. */ |
222 |
|
vcf_res_ctrl_genpurpose3 = 0, /**< General Purpose Controller 3 (Slider, MIDI Controller 18) */ |
223 |
|
vcf_res_ctrl_genpurpose4 = 1, /**< General Purpose Controller 4 (Slider, MIDI Controller 19) */ |
224 |
|
vcf_res_ctrl_genpurpose5 = 2, /**< General Purpose Controller 5 (Button, MIDI Controller 80) */ |
225 |
|
vcf_res_ctrl_genpurpose6 = 3 /**< General Purpose Controller 6 (Button, MIDI Controller 81) */ |
226 |
|
); |
227 |
|
|
228 |
/** |
/** |
229 |
* Defines a controller that has a certain contrained influence on a |
* Defines a controller that has a certain contrained influence on a |
234 |
* attenuation_ctrl_t, eg1_ctrl_t or eg2_ctrl_t) in your code! |
* attenuation_ctrl_t, eg1_ctrl_t or eg2_ctrl_t) in your code! |
235 |
*/ |
*/ |
236 |
struct leverage_ctrl_t { |
struct leverage_ctrl_t { |
237 |
typedef enum { |
/** Defines possible controllers. |
238 |
type_none = 0x00, ///< No controller defined |
* |
239 |
type_channelaftertouch = 0x2f, ///< Channel Key Pressure |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
240 |
type_velocity = 0xff, ///< Key Velocity |
*/ |
241 |
type_controlchange = 0xfe ///< Ordinary MIDI control change controller, see field 'controller_number' |
GIG_DECLARE_ENUM(type_t, |
242 |
} type_t; |
type_none = 0x00, /**< No controller defined */ |
243 |
|
type_channelaftertouch = 0x2f, /**< Channel Key Pressure */ |
244 |
|
type_velocity = 0xff, /**< Key Velocity */ |
245 |
|
type_controlchange = 0xfe /**< Ordinary MIDI control change controller, see field 'controller_number' */ |
246 |
|
); |
247 |
|
|
248 |
type_t type; ///< Controller type |
type_t type; ///< Controller type |
249 |
uint controller_number; ///< MIDI controller number if this controller is a control change controller, 0 otherwise |
uint controller_number; ///< MIDI controller number if this controller is a control change controller, 0 otherwise |
250 |
|
|
251 |
|
void serialize(Serialization::Archive* archive); |
252 |
}; |
}; |
253 |
|
|
254 |
/** |
/** |
278 |
* dimension zones is always a power of two. All dimensions can have up |
* dimension zones is always a power of two. All dimensions can have up |
279 |
* to 32 zones (except the layer dimension with only up to 8 zones and |
* to 32 zones (except the layer dimension with only up to 8 zones and |
280 |
* the samplechannel dimension which currently allows only 2 zones). |
* the samplechannel dimension which currently allows only 2 zones). |
281 |
|
* |
282 |
|
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
283 |
*/ |
*/ |
284 |
typedef enum { |
GIG_DECLARE_ENUM(dimension_t, |
285 |
dimension_none = 0x00, ///< Dimension not in use. |
dimension_none = 0x00, /**< Dimension not in use. */ |
286 |
dimension_samplechannel = 0x80, ///< If used sample has more than one channel (thus is not mono). |
dimension_samplechannel = 0x80, /**< If used sample has more than one channel (thus is not mono). */ |
287 |
dimension_layer = 0x81, ///< For layering of up to 8 instruments (and eventually crossfading of 2 or 4 layers). |
dimension_layer = 0x81, /**< For layering of up to 8 instruments (and eventually crossfading of 2 or 4 layers). */ |
288 |
dimension_velocity = 0x82, ///< Key Velocity (this is the only dimension in gig2 where the ranges can exactly be defined). |
dimension_velocity = 0x82, /**< Key Velocity (this is the only dimension in gig2 where the ranges can exactly be defined). */ |
289 |
dimension_channelaftertouch = 0x83, ///< Channel Key Pressure |
dimension_channelaftertouch = 0x83, /**< Channel Key Pressure */ |
290 |
dimension_releasetrigger = 0x84, ///< Special dimension for triggering samples on releasing a key. |
dimension_releasetrigger = 0x84, /**< Special dimension for triggering samples on releasing a key. */ |
291 |
dimension_keyboard = 0x85, ///< Dimension for keyswitching |
dimension_keyboard = 0x85, /**< Dimension for keyswitching */ |
292 |
dimension_roundrobin = 0x86, ///< Different samples triggered each time a note is played, dimension regions selected in sequence |
dimension_roundrobin = 0x86, /**< Different samples triggered each time a note is played, dimension regions selected in sequence */ |
293 |
dimension_random = 0x87, ///< Different samples triggered each time a note is played, random order |
dimension_random = 0x87, /**< Different samples triggered each time a note is played, random order */ |
294 |
dimension_smartmidi = 0x88, ///< For MIDI tools like legato and repetition mode |
dimension_smartmidi = 0x88, /**< For MIDI tools like legato and repetition mode */ |
295 |
dimension_roundrobinkeyboard = 0x89, ///< Different samples triggered each time a note is played, any key advances the counter |
dimension_roundrobinkeyboard = 0x89, /**< Different samples triggered each time a note is played, any key advances the counter */ |
296 |
dimension_modwheel = 0x01, ///< Modulation Wheel (MIDI Controller 1) |
dimension_modwheel = 0x01, /**< Modulation Wheel (MIDI Controller 1) */ |
297 |
dimension_breath = 0x02, ///< Breath Controller (Coarse, MIDI Controller 2) |
dimension_breath = 0x02, /**< Breath Controller (Coarse, MIDI Controller 2) */ |
298 |
dimension_foot = 0x04, ///< Foot Pedal (Coarse, MIDI Controller 4) |
dimension_foot = 0x04, /**< Foot Pedal (Coarse, MIDI Controller 4) */ |
299 |
dimension_portamentotime = 0x05, ///< Portamento Time (Coarse, MIDI Controller 5) |
dimension_portamentotime = 0x05, /**< Portamento Time (Coarse, MIDI Controller 5) */ |
300 |
dimension_effect1 = 0x0c, ///< Effect Controller 1 (Coarse, MIDI Controller 12) |
dimension_effect1 = 0x0c, /**< Effect Controller 1 (Coarse, MIDI Controller 12) */ |
301 |
dimension_effect2 = 0x0d, ///< Effect Controller 2 (Coarse, MIDI Controller 13) |
dimension_effect2 = 0x0d, /**< Effect Controller 2 (Coarse, MIDI Controller 13) */ |
302 |
dimension_genpurpose1 = 0x10, ///< General Purpose Controller 1 (Slider, MIDI Controller 16) |
dimension_genpurpose1 = 0x10, /**< General Purpose Controller 1 (Slider, MIDI Controller 16) */ |
303 |
dimension_genpurpose2 = 0x11, ///< General Purpose Controller 2 (Slider, MIDI Controller 17) |
dimension_genpurpose2 = 0x11, /**< General Purpose Controller 2 (Slider, MIDI Controller 17) */ |
304 |
dimension_genpurpose3 = 0x12, ///< General Purpose Controller 3 (Slider, MIDI Controller 18) |
dimension_genpurpose3 = 0x12, /**< General Purpose Controller 3 (Slider, MIDI Controller 18) */ |
305 |
dimension_genpurpose4 = 0x13, ///< General Purpose Controller 4 (Slider, MIDI Controller 19) |
dimension_genpurpose4 = 0x13, /**< General Purpose Controller 4 (Slider, MIDI Controller 19) */ |
306 |
dimension_sustainpedal = 0x40, ///< Sustain Pedal (MIDI Controller 64) |
dimension_sustainpedal = 0x40, /**< Sustain Pedal (MIDI Controller 64) */ |
307 |
dimension_portamento = 0x41, ///< Portamento (MIDI Controller 65) |
dimension_portamento = 0x41, /**< Portamento (MIDI Controller 65) */ |
308 |
dimension_sostenutopedal = 0x42, ///< Sostenuto Pedal (MIDI Controller 66) |
dimension_sostenutopedal = 0x42, /**< Sostenuto Pedal (MIDI Controller 66) */ |
309 |
dimension_softpedal = 0x43, ///< Soft Pedal (MIDI Controller 67) |
dimension_softpedal = 0x43, /**< Soft Pedal (MIDI Controller 67) */ |
310 |
dimension_genpurpose5 = 0x30, ///< General Purpose Controller 5 (Button, MIDI Controller 80) |
dimension_genpurpose5 = 0x30, /**< General Purpose Controller 5 (Button, MIDI Controller 80) */ |
311 |
dimension_genpurpose6 = 0x31, ///< General Purpose Controller 6 (Button, MIDI Controller 81) |
dimension_genpurpose6 = 0x31, /**< General Purpose Controller 6 (Button, MIDI Controller 81) */ |
312 |
dimension_genpurpose7 = 0x32, ///< General Purpose Controller 7 (Button, MIDI Controller 82) |
dimension_genpurpose7 = 0x32, /**< General Purpose Controller 7 (Button, MIDI Controller 82) */ |
313 |
dimension_genpurpose8 = 0x33, ///< General Purpose Controller 8 (Button, MIDI Controller 83) |
dimension_genpurpose8 = 0x33, /**< General Purpose Controller 8 (Button, MIDI Controller 83) */ |
314 |
dimension_effect1depth = 0x5b, ///< Effect 1 Depth (MIDI Controller 91) |
dimension_effect1depth = 0x5b, /**< Effect 1 Depth (MIDI Controller 91) */ |
315 |
dimension_effect2depth = 0x5c, ///< Effect 2 Depth (MIDI Controller 92) |
dimension_effect2depth = 0x5c, /**< Effect 2 Depth (MIDI Controller 92) */ |
316 |
dimension_effect3depth = 0x5d, ///< Effect 3 Depth (MIDI Controller 93) |
dimension_effect3depth = 0x5d, /**< Effect 3 Depth (MIDI Controller 93) */ |
317 |
dimension_effect4depth = 0x5e, ///< Effect 4 Depth (MIDI Controller 94) |
dimension_effect4depth = 0x5e, /**< Effect 4 Depth (MIDI Controller 94) */ |
318 |
dimension_effect5depth = 0x5f ///< Effect 5 Depth (MIDI Controller 95) |
dimension_effect5depth = 0x5f /**< Effect 5 Depth (MIDI Controller 95) */ |
319 |
} dimension_t; |
); |
320 |
|
|
321 |
/** |
/** |
322 |
* Intended for internal usage: will be used to convert a dimension value |
* Intended for internal usage: will be used to convert a dimension value |
323 |
* into the corresponding dimension bit number. |
* into the corresponding dimension bit number. |
324 |
|
* |
325 |
|
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
326 |
*/ |
*/ |
327 |
typedef enum { |
GIG_DECLARE_ENUM(split_type_t, |
328 |
split_type_normal, ///< dimension value between 0-127 |
split_type_normal, /**< dimension value between 0-127 */ |
329 |
split_type_bit ///< dimension values are already the sought bit number |
split_type_bit /**< dimension values are already the sought bit number */ |
330 |
} split_type_t; |
); |
331 |
|
|
332 |
/** General dimension definition. */ |
/** General dimension definition. */ |
333 |
struct dimension_def_t { |
struct dimension_def_t { |
338 |
float zone_size; ///< Intended for internal usage: reflects the size of each zone (128/zones) for normal split types only, 0 otherwise. |
float zone_size; ///< Intended for internal usage: reflects the size of each zone (128/zones) for normal split types only, 0 otherwise. |
339 |
}; |
}; |
340 |
|
|
341 |
/** Defines which frequencies are filtered by the VCF. */ |
/** Defines which frequencies are filtered by the VCF. |
342 |
typedef enum { |
* |
343 |
vcf_type_lowpass = 0x00, |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
344 |
vcf_type_lowpassturbo = 0xff, ///< More poles than normal lowpass |
*/ |
345 |
vcf_type_bandpass = 0x01, |
GIG_DECLARE_ENUM(vcf_type_t, |
346 |
vcf_type_highpass = 0x02, |
vcf_type_lowpass = 0x00, /**< Standard lowpass filter type. */ |
347 |
vcf_type_bandreject = 0x03 |
vcf_type_lowpassturbo = 0xff, /**< More poles than normal lowpass. */ |
348 |
} vcf_type_t; |
vcf_type_bandpass = 0x01, /**< Bandpass filter type. */ |
349 |
|
vcf_type_highpass = 0x02, /**< Highpass filter type. */ |
350 |
|
vcf_type_bandreject = 0x03 /**< Band reject filter type. */ |
351 |
|
); |
352 |
|
|
353 |
/** |
/** |
354 |
* Defines the envelope of a crossfade. |
* Defines the envelope of a crossfade. |
369 |
uint8_t out_start; ///< Start position of fade out. |
uint8_t out_start; ///< Start position of fade out. |
370 |
uint8_t out_end; ///< End postition of fade out. |
uint8_t out_end; ///< End postition of fade out. |
371 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
372 |
|
|
373 |
|
void serialize(Serialization::Archive* archive); |
374 |
}; |
}; |
375 |
|
|
376 |
/** Reflects the current playback state for a sample. */ |
/** Reflects the current playback state for a sample. */ |
380 |
file_offset_t loop_cycles_left; ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle. |
file_offset_t loop_cycles_left; ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle. |
381 |
}; |
}; |
382 |
|
|
383 |
|
/** |
384 |
|
* Defines behavior options for envelope generators (gig format extension). |
385 |
|
* |
386 |
|
* These options allow to override the precise default behavior of the |
387 |
|
* envelope generators' state machines. |
388 |
|
* |
389 |
|
* @b Note: These EG options are an extension to the original gig file |
390 |
|
* format, so these options are not available with the original |
391 |
|
* Gigasampler/GigaStudio software! Currently only LinuxSampler and gigedit |
392 |
|
* support these EG options! |
393 |
|
* |
394 |
|
* Adding these options to the original gig file format was necessary, |
395 |
|
* because the precise state machine behavior of envelope generators of the |
396 |
|
* gig format (and thus the default EG behavior if not explicitly overridden |
397 |
|
* here) deviates from common, expected behavior of envelope generators in |
398 |
|
* general, if i.e. compared with EGs of hardware synthesizers. For example |
399 |
|
* with the gig format, the attack and decay stages will be aborted as soon |
400 |
|
* as a note-off is received. Most other EG implementations in the industry |
401 |
|
* however always run the attack and decay stages to their full duration, |
402 |
|
* even if an early note-off arrives. The latter behavior is intentionally |
403 |
|
* implemented in most other products, because it is required to resemble |
404 |
|
* percussive sounds in a realistic manner. |
405 |
|
*/ |
406 |
|
struct eg_opt_t { |
407 |
|
bool AttackCancel; ///< Whether the "attack" stage is cancelled when receiving a note-off (default: @c true). |
408 |
|
bool AttackHoldCancel; ///< Whether the "attack hold" stage is cancelled when receiving a note-off (default: @c true). |
409 |
|
bool Decay1Cancel; ///< Whether the "decay 1" stage is cancelled when receiving a note-off (default: @c true). |
410 |
|
bool Decay2Cancel; ///< Whether the "decay 2" stage is cancelled when receiving a note-off (default: @c true). |
411 |
|
bool ReleaseCancel; ///< Whether the "release" stage is cancelled when receiving a note-on (default: @c true). |
412 |
|
|
413 |
|
eg_opt_t(); |
414 |
|
void serialize(Serialization::Archive* archive); |
415 |
|
}; |
416 |
|
|
417 |
// just symbol prototyping |
// just symbol prototyping |
418 |
class File; |
class File; |
419 |
class Instrument; |
class Instrument; |
552 |
uint16_t SampleStartOffset; ///< Number of samples the sample start should be moved (0 - 2000). |
uint16_t SampleStartOffset; ///< Number of samples the sample start should be moved (0 - 2000). |
553 |
double SampleAttenuation; ///< Sample volume (calculated from DLS::Sampler::Gain) |
double SampleAttenuation; ///< Sample volume (calculated from DLS::Sampler::Gain) |
554 |
uint8_t DimensionUpperLimits[8]; ///< gig3: defines the upper limit of the dimension values for this dimension region. In case you wondered why this is defined on DimensionRegion level and not on Region level: the zone sizes (upper limits) of the velocity dimension can indeed differ in the individual dimension regions, depending on which zones of the other dimension types are currently selected. So this is exceptional for the velocity dimension only. All other dimension types have the same dimension zone sizes for every single DimensionRegion (of the sample Region). |
uint8_t DimensionUpperLimits[8]; ///< gig3: defines the upper limit of the dimension values for this dimension region. In case you wondered why this is defined on DimensionRegion level and not on Region level: the zone sizes (upper limits) of the velocity dimension can indeed differ in the individual dimension regions, depending on which zones of the other dimension types are currently selected. So this is exceptional for the velocity dimension only. All other dimension types have the same dimension zone sizes for every single DimensionRegion (of the sample Region). |
555 |
|
eg_opt_t EG1Options; ///< [gig extension]: Behavior options which should be used for envelope generator 1 (volume amplitude EG). |
556 |
|
eg_opt_t EG2Options; ///< [gig extension]: Behavior options which should be used for envelope generator 2 (filter cutoff EG). |
557 |
|
|
558 |
// derived attributes from DLS::Sampler |
// derived attributes from DLS::Sampler |
559 |
using DLS::Sampler::UnityNote; |
using DLS::Sampler::UnityNote; |
589 |
DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src); |
DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src); |
590 |
~DimensionRegion(); |
~DimensionRegion(); |
591 |
void CopyAssign(const DimensionRegion* orig, const std::map<Sample*,Sample*>* mSamples); |
void CopyAssign(const DimensionRegion* orig, const std::map<Sample*,Sample*>* mSamples); |
592 |
|
void serialize(Serialization::Archive* archive); |
593 |
friend class Region; |
friend class Region; |
594 |
|
friend class Serialization::Archive; |
595 |
private: |
private: |
596 |
typedef enum { ///< Used to decode attenuation, EG1 and EG2 controller |
typedef enum { ///< Used to decode attenuation, EG1 and EG2 controller |
597 |
// official leverage controllers as they were defined in the original Gigasampler/GigaStudio format: |
// official leverage controllers as they were defined in the original Gigasampler/GigaStudio format: |
694 |
} _lev_ctrl_t; |
} _lev_ctrl_t; |
695 |
typedef std::map<uint32_t, double*> VelocityTableMap; |
typedef std::map<uint32_t, double*> VelocityTableMap; |
696 |
|
|
697 |
static uint Instances; ///< Number of DimensionRegion instances. |
static size_t Instances; ///< Number of DimensionRegion instances. |
698 |
static VelocityTableMap* pVelocityTables; ///< Contains the tables corresponding to the various velocity parameters (VelocityResponseCurve and VelocityResponseDepth). |
static VelocityTableMap* pVelocityTables; ///< Contains the tables corresponding to the various velocity parameters (VelocityResponseCurve and VelocityResponseDepth). |
699 |
double* pVelocityAttenuationTable; ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion. |
double* pVelocityAttenuationTable; ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion. |
700 |
double* pVelocityReleaseTable; ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion |
double* pVelocityReleaseTable; ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion |
766 |
static void DestroyDecompressionBuffer(buffer_t& DecompressionBuffer); |
static void DestroyDecompressionBuffer(buffer_t& DecompressionBuffer); |
767 |
// overridden methods |
// overridden methods |
768 |
void ReleaseSampleData(); |
void ReleaseSampleData(); |
769 |
void Resize(int iNewSize); |
void Resize(file_offset_t NewSize); |
770 |
file_offset_t SetPos(file_offset_t SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
file_offset_t SetPos(file_offset_t SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
771 |
file_offset_t GetPos() const; |
file_offset_t GetPos() const; |
772 |
file_offset_t Read(void* pBuffer, file_offset_t SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
file_offset_t Read(void* pBuffer, file_offset_t SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
776 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress); |
777 |
void CopyAssignMeta(const Sample* orig); |
void CopyAssignMeta(const Sample* orig); |
778 |
void CopyAssignWave(const Sample* orig); |
void CopyAssignWave(const Sample* orig); |
779 |
|
uint32_t GetWaveDataCRC32Checksum(); |
780 |
|
bool VerifyWaveData(uint32_t* pActually = NULL); |
781 |
protected: |
protected: |
782 |
static unsigned int Instances; ///< Number of instances of class Sample. |
static size_t Instances; ///< Number of instances of class Sample. |
783 |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples. |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples. |
784 |
Group* pGroup; ///< pointer to the Group this sample belongs to (always not-NULL) |
Group* pGroup; ///< pointer to the Group this sample belongs to (always not-NULL) |
785 |
file_offset_t FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
file_offset_t FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
792 |
unsigned long FileNo; ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig) |
unsigned long FileNo; ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig) |
793 |
RIFF::Chunk* pCk3gix; |
RIFF::Chunk* pCk3gix; |
794 |
RIFF::Chunk* pCkSmpl; |
RIFF::Chunk* pCkSmpl; |
795 |
uint32_t crc; ///< CRC-32 checksum of the raw sample data |
uint32_t crc; ///< Reflects CRC-32 checksum of the raw sample data at the last time when the sample's raw wave form data has been modified consciously by the user by calling Write(). |
796 |
|
|
797 |
Sample(File* pFile, RIFF::List* waveList, file_offset_t WavePoolOffset, unsigned long fileNo = 0); |
Sample(File* pFile, RIFF::List* waveList, file_offset_t WavePoolOffset, unsigned long fileNo = 0, int index = -1); |
798 |
~Sample(); |
~Sample(); |
799 |
|
uint32_t CalculateWaveDataChecksum(); |
800 |
|
|
801 |
// Guess size (in bytes) of a compressed sample |
// Guess size (in bytes) of a compressed sample |
802 |
inline file_offset_t GuessSize(file_offset_t samples) { |
inline file_offset_t GuessSize(file_offset_t samples) { |
1119 |
void SetScriptAsText(const String& text); |
void SetScriptAsText(const String& text); |
1120 |
void SetGroup(ScriptGroup* pGroup); |
void SetGroup(ScriptGroup* pGroup); |
1121 |
ScriptGroup* GetGroup() const; |
ScriptGroup* GetGroup() const; |
1122 |
|
void CopyAssign(const Script* orig); |
1123 |
protected: |
protected: |
1124 |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
1125 |
virtual ~Script(); |
virtual ~Script(); |
1342 |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
1343 |
Sample* GetSample(uint index); |
Sample* GetSample(uint index); |
1344 |
Sample* AddSample(); |
Sample* AddSample(); |
1345 |
|
size_t CountSamples(); |
1346 |
void DeleteSample(Sample* pSample); |
void DeleteSample(Sample* pSample); |
1347 |
Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
1348 |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
1349 |
Instrument* GetInstrument(uint index, progress_t* pProgress = NULL); |
Instrument* GetInstrument(uint index, progress_t* pProgress = NULL); |
1350 |
Instrument* AddInstrument(); |
Instrument* AddInstrument(); |
1351 |
Instrument* AddDuplicateInstrument(const Instrument* orig); |
Instrument* AddDuplicateInstrument(const Instrument* orig); |
1352 |
|
size_t CountInstruments(); |
1353 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
1354 |
Group* GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise. |
Group* GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise. |
1355 |
Group* GetNextGroup(); ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise. |
Group* GetNextGroup(); ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise. |
1378 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
1379 |
virtual void LoadScriptGroups(); |
virtual void LoadScriptGroups(); |
1380 |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
1381 |
uint GetFormatExtensionVersion() const; |
uint32_t GetSampleChecksum(Sample* pSample); |
1382 |
bool HasMonolithicLargeFilePolicy() const; |
uint32_t GetSampleChecksumByIndex(int index); |
1383 |
|
bool VerifySampleChecksumTable(); |
1384 |
|
bool RebuildSampleChecksumTable(); |
1385 |
|
int GetWaveTableIndexOf(gig::Sample* pSample); |
1386 |
friend class Region; |
friend class Region; |
1387 |
friend class Sample; |
friend class Sample; |
1388 |
friend class Instrument; |
friend class Instrument; |
1405 |
*/ |
*/ |
1406 |
class Exception : public DLS::Exception { |
class Exception : public DLS::Exception { |
1407 |
public: |
public: |
1408 |
Exception(String Message); |
Exception(String format, ...); |
1409 |
|
Exception(String format, va_list arg); |
1410 |
void PrintMessage(); |
void PrintMessage(); |
1411 |
|
protected: |
1412 |
|
Exception(); |
1413 |
}; |
}; |
1414 |
|
|
1415 |
|
#if HAVE_RTTI |
1416 |
|
size_t enumCount(const std::type_info& type); |
1417 |
|
const char* enumKey(const std::type_info& type, size_t value); |
1418 |
|
bool enumKey(const std::type_info& type, String key); |
1419 |
|
const char** enumKeys(const std::type_info& type); |
1420 |
|
#endif // HAVE_RTTI |
1421 |
|
size_t enumCount(String typeName); |
1422 |
|
const char* enumKey(String typeName, size_t value); |
1423 |
|
bool enumKey(String typeName, String key); |
1424 |
|
const char** enumKeys(String typeName); |
1425 |
|
size_t enumValue(String key); |
1426 |
|
|
1427 |
String libraryName(); |
String libraryName(); |
1428 |
String libraryVersion(); |
String libraryVersion(); |
1429 |
|
|