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-2015 by Christian Schoenebeck * |
* Copyright (C) 2003-2017 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 |
|
#endif |
43 |
|
|
44 |
#if WORDS_BIGENDIAN |
#if WORDS_BIGENDIAN |
45 |
# define LIST_TYPE_3PRG 0x33707267 |
# define LIST_TYPE_3PRG 0x33707267 |
46 |
# define LIST_TYPE_3EWL 0x3365776C |
# define LIST_TYPE_3EWL 0x3365776C |
79 |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
80 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
81 |
|
|
82 |
|
#ifndef GIG_DECLARE_ENUM |
83 |
|
# define GIG_DECLARE_ENUM(type, ...) enum type { __VA_ARGS__ } |
84 |
|
#endif |
85 |
|
|
86 |
|
// just symbol prototyping (since Serialization.h not included by default here) |
87 |
|
namespace Serialization { class Archive; } |
88 |
|
|
89 |
/** Gigasampler/GigaStudio specific classes and definitions */ |
/** Gigasampler/GigaStudio specific classes and definitions */ |
90 |
namespace gig { |
namespace gig { |
91 |
|
|
92 |
typedef std::string String; |
typedef std::string String; |
93 |
typedef RIFF::progress_t progress_t; |
typedef RIFF::progress_t progress_t; |
94 |
|
typedef RIFF::file_offset_t file_offset_t; |
95 |
|
|
96 |
/** Lower and upper limit of a range. */ |
/** Lower and upper limit of a range. */ |
97 |
struct range_t { |
struct range_t { |
102 |
/** Pointer address and size of a buffer. */ |
/** Pointer address and size of a buffer. */ |
103 |
struct buffer_t { |
struct buffer_t { |
104 |
void* pStart; ///< Points to the beginning of the buffer. |
void* pStart; ///< Points to the beginning of the buffer. |
105 |
unsigned long Size; ///< Size of the actual data in the buffer in bytes. |
file_offset_t Size; ///< Size of the actual data in the buffer in bytes. |
106 |
unsigned long NullExtensionSize; ///< The buffer might be bigger than the actual data, if that's the case that unused space at the end of the buffer is filled with NULLs and NullExtensionSize reflects that unused buffer space in bytes. Those NULL extensions are mandatory for differential algorithms that have to take the following data words into account, thus have to access past the buffer's boundary. If you don't know what I'm talking about, just forget this variable. :) |
file_offset_t NullExtensionSize; ///< The buffer might be bigger than the actual data, if that's the case that unused space at the end of the buffer is filled with NULLs and NullExtensionSize reflects that unused buffer space in bytes. Those NULL extensions are mandatory for differential algorithms that have to take the following data words into account, thus have to access past the buffer's boundary. If you don't know what I'm talking about, just forget this variable. :) |
107 |
buffer_t() { |
buffer_t() { |
108 |
pStart = NULL; |
pStart = NULL; |
109 |
Size = 0; |
Size = 0; |
111 |
} |
} |
112 |
}; |
}; |
113 |
|
|
114 |
/** Standard types of sample loops. */ |
/** Standard types of sample loops. |
115 |
typedef enum { |
* |
116 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
117 |
|
*/ |
118 |
|
GIG_DECLARE_ENUM(loop_type_t, |
119 |
loop_type_normal = 0x00000000, ///< Loop forward (normal) |
loop_type_normal = 0x00000000, ///< Loop forward (normal) |
120 |
loop_type_bidirectional = 0x00000001, ///< Alternating loop (forward/backward, also known as Ping Pong) |
loop_type_bidirectional = 0x00000001, ///< Alternating loop (forward/backward, also known as Ping Pong) |
121 |
loop_type_backward = 0x00000002 ///< Loop backward (reverse) |
loop_type_backward = 0x00000002 ///< Loop backward (reverse) |
122 |
} loop_type_t; |
); |
123 |
|
|
124 |
/** Society of Motion Pictures and Television E time format. */ |
/** Society of Motion Pictures and Television E time format. |
125 |
typedef enum { |
* |
126 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
127 |
|
*/ |
128 |
|
GIG_DECLARE_ENUM(smpte_format_t, |
129 |
smpte_format_no_offset = 0x00000000, ///< no SMPTE offset |
smpte_format_no_offset = 0x00000000, ///< no SMPTE offset |
130 |
smpte_format_24_frames = 0x00000018, ///< 24 frames per second |
smpte_format_24_frames = 0x00000018, ///< 24 frames per second |
131 |
smpte_format_25_frames = 0x00000019, ///< 25 frames per second |
smpte_format_25_frames = 0x00000019, ///< 25 frames per second |
132 |
smpte_format_30_frames_dropping = 0x0000001D, ///< 30 frames per second with frame dropping (30 drop) |
smpte_format_30_frames_dropping = 0x0000001D, ///< 30 frames per second with frame dropping (30 drop) |
133 |
smpte_format_30_frames = 0x0000001E ///< 30 frames per second |
smpte_format_30_frames = 0x0000001E ///< 30 frames per second |
134 |
} smpte_format_t; |
); |
135 |
|
|
136 |
/** Defines the shape of a function graph. */ |
/** Defines the shape of a function graph. |
137 |
typedef enum { |
* |
138 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
139 |
|
*/ |
140 |
|
GIG_DECLARE_ENUM(curve_type_t, |
141 |
curve_type_nonlinear = 0, |
curve_type_nonlinear = 0, |
142 |
curve_type_linear = 1, |
curve_type_linear = 1, |
143 |
curve_type_special = 2, |
curve_type_special = 2, |
144 |
curve_type_unknown = 0xffffffff |
curve_type_unknown = 0xffffffff |
145 |
} curve_type_t; |
); |
146 |
|
|
147 |
/** Dimensions allow to bypass one of the following controllers. */ |
/** Dimensions allow to bypass one of the following controllers. |
148 |
typedef enum { |
* |
149 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
150 |
|
*/ |
151 |
|
GIG_DECLARE_ENUM(dim_bypass_ctrl_t, |
152 |
dim_bypass_ctrl_none, |
dim_bypass_ctrl_none, |
153 |
dim_bypass_ctrl_94, ///< Effect 4 Depth (MIDI Controller 94) |
dim_bypass_ctrl_94, ///< Effect 4 Depth (MIDI Controller 94) |
154 |
dim_bypass_ctrl_95 ///< Effect 5 Depth (MIDI Controller 95) |
dim_bypass_ctrl_95 ///< Effect 5 Depth (MIDI Controller 95) |
155 |
} dim_bypass_ctrl_t; |
); |
156 |
|
|
157 |
/** Defines how LFO3 is controlled by. */ |
/** Defines how LFO3 is controlled by. |
158 |
typedef enum { |
* |
159 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
160 |
|
*/ |
161 |
|
GIG_DECLARE_ENUM(lfo3_ctrl_t, |
162 |
lfo3_ctrl_internal = 0x00, ///< Only internally controlled. |
lfo3_ctrl_internal = 0x00, ///< Only internally controlled. |
163 |
lfo3_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
lfo3_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
164 |
lfo3_ctrl_aftertouch = 0x02, ///< Only controlled by aftertouch controller. |
lfo3_ctrl_aftertouch = 0x02, ///< Only controlled by aftertouch controller. |
165 |
lfo3_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
lfo3_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
166 |
lfo3_ctrl_internal_aftertouch = 0x04 ///< Controlled internally and by aftertouch controller. |
lfo3_ctrl_internal_aftertouch = 0x04 ///< Controlled internally and by aftertouch controller. |
167 |
} lfo3_ctrl_t; |
); |
168 |
|
|
169 |
/** Defines how LFO2 is controlled by. */ |
/** Defines how LFO2 is controlled by. |
170 |
typedef enum { |
* |
171 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
172 |
|
*/ |
173 |
|
GIG_DECLARE_ENUM(lfo2_ctrl_t, |
174 |
lfo2_ctrl_internal = 0x00, ///< Only internally controlled. |
lfo2_ctrl_internal = 0x00, ///< Only internally controlled. |
175 |
lfo2_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
lfo2_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
176 |
lfo2_ctrl_foot = 0x02, ///< Only controlled by external foot controller. |
lfo2_ctrl_foot = 0x02, ///< Only controlled by external foot controller. |
177 |
lfo2_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
lfo2_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
178 |
lfo2_ctrl_internal_foot = 0x04 ///< Controlled internally and by external foot controller. |
lfo2_ctrl_internal_foot = 0x04 ///< Controlled internally and by external foot controller. |
179 |
} lfo2_ctrl_t; |
); |
180 |
|
|
181 |
/** Defines how LFO1 is controlled by. */ |
/** Defines how LFO1 is controlled by. |
182 |
typedef enum { |
* |
183 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
184 |
|
*/ |
185 |
|
GIG_DECLARE_ENUM(lfo1_ctrl_t, |
186 |
lfo1_ctrl_internal = 0x00, ///< Only internally controlled. |
lfo1_ctrl_internal = 0x00, ///< Only internally controlled. |
187 |
lfo1_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
lfo1_ctrl_modwheel = 0x01, ///< Only controlled by external modulation wheel. |
188 |
lfo1_ctrl_breath = 0x02, ///< Only controlled by external breath controller. |
lfo1_ctrl_breath = 0x02, ///< Only controlled by external breath controller. |
189 |
lfo1_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
lfo1_ctrl_internal_modwheel = 0x03, ///< Controlled internally and by external modulation wheel. |
190 |
lfo1_ctrl_internal_breath = 0x04 ///< Controlled internally and by external breath controller. |
lfo1_ctrl_internal_breath = 0x04 ///< Controlled internally and by external breath controller. |
191 |
} lfo1_ctrl_t; |
); |
192 |
|
|
193 |
/** Defines how the filter cutoff frequency is controlled by. */ |
/** Defines how the filter cutoff frequency is controlled by. |
194 |
typedef enum { |
* |
195 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
196 |
|
*/ |
197 |
|
GIG_DECLARE_ENUM(vcf_cutoff_ctrl_t, |
198 |
vcf_cutoff_ctrl_none = 0x00, |
vcf_cutoff_ctrl_none = 0x00, |
199 |
vcf_cutoff_ctrl_none2 = 0x01, ///< The difference between none and none2 is unknown |
vcf_cutoff_ctrl_none2 = 0x01, ///< The difference between none and none2 is unknown |
200 |
vcf_cutoff_ctrl_modwheel = 0x81, ///< Modulation Wheel (MIDI Controller 1) |
vcf_cutoff_ctrl_modwheel = 0x81, ///< Modulation Wheel (MIDI Controller 1) |
207 |
vcf_cutoff_ctrl_genpurpose7 = 0xd2, ///< General Purpose Controller 7 (Button, MIDI Controller 82) |
vcf_cutoff_ctrl_genpurpose7 = 0xd2, ///< General Purpose Controller 7 (Button, MIDI Controller 82) |
208 |
vcf_cutoff_ctrl_genpurpose8 = 0xd3, ///< General Purpose Controller 8 (Button, MIDI Controller 83) |
vcf_cutoff_ctrl_genpurpose8 = 0xd3, ///< General Purpose Controller 8 (Button, MIDI Controller 83) |
209 |
vcf_cutoff_ctrl_aftertouch = 0x80 ///< Key Pressure |
vcf_cutoff_ctrl_aftertouch = 0x80 ///< Key Pressure |
210 |
} vcf_cutoff_ctrl_t; |
); |
211 |
|
|
212 |
/** Defines how the filter resonance is controlled by. */ |
/** Defines how the filter resonance is controlled by. |
213 |
typedef enum { |
* |
214 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
215 |
|
*/ |
216 |
|
GIG_DECLARE_ENUM(vcf_res_ctrl_t, |
217 |
vcf_res_ctrl_none = 0xffffffff, |
vcf_res_ctrl_none = 0xffffffff, |
218 |
vcf_res_ctrl_genpurpose3 = 0, ///< General Purpose Controller 3 (Slider, MIDI Controller 18) |
vcf_res_ctrl_genpurpose3 = 0, ///< General Purpose Controller 3 (Slider, MIDI Controller 18) |
219 |
vcf_res_ctrl_genpurpose4 = 1, ///< General Purpose Controller 4 (Slider, MIDI Controller 19) |
vcf_res_ctrl_genpurpose4 = 1, ///< General Purpose Controller 4 (Slider, MIDI Controller 19) |
220 |
vcf_res_ctrl_genpurpose5 = 2, ///< General Purpose Controller 5 (Button, MIDI Controller 80) |
vcf_res_ctrl_genpurpose5 = 2, ///< General Purpose Controller 5 (Button, MIDI Controller 80) |
221 |
vcf_res_ctrl_genpurpose6 = 3 ///< General Purpose Controller 6 (Button, MIDI Controller 81) |
vcf_res_ctrl_genpurpose6 = 3 ///< General Purpose Controller 6 (Button, MIDI Controller 81) |
222 |
} vcf_res_ctrl_t; |
); |
223 |
|
|
224 |
/** |
/** |
225 |
* Defines a controller that has a certain contrained influence on a |
* Defines a controller that has a certain contrained influence on a |
230 |
* 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! |
231 |
*/ |
*/ |
232 |
struct leverage_ctrl_t { |
struct leverage_ctrl_t { |
233 |
typedef enum { |
/** Defines possible controllers. |
234 |
|
* |
235 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
236 |
|
*/ |
237 |
|
GIG_DECLARE_ENUM(type_t, |
238 |
type_none = 0x00, ///< No controller defined |
type_none = 0x00, ///< No controller defined |
239 |
type_channelaftertouch = 0x2f, ///< Channel Key Pressure |
type_channelaftertouch = 0x2f, ///< Channel Key Pressure |
240 |
type_velocity = 0xff, ///< Key Velocity |
type_velocity = 0xff, ///< Key Velocity |
241 |
type_controlchange = 0xfe ///< Ordinary MIDI control change controller, see field 'controller_number' |
type_controlchange = 0xfe ///< Ordinary MIDI control change controller, see field 'controller_number' |
242 |
} type_t; |
); |
243 |
|
|
244 |
type_t type; ///< Controller type |
type_t type; ///< Controller type |
245 |
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 |
246 |
|
|
247 |
|
void serialize(Serialization::Archive* archive); |
248 |
}; |
}; |
249 |
|
|
250 |
/** |
/** |
274 |
* 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 |
275 |
* 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 |
276 |
* the samplechannel dimension which currently allows only 2 zones). |
* the samplechannel dimension which currently allows only 2 zones). |
277 |
|
* |
278 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
279 |
*/ |
*/ |
280 |
typedef enum { |
GIG_DECLARE_ENUM(dimension_t, |
281 |
dimension_none = 0x00, ///< Dimension not in use. |
dimension_none = 0x00, ///< Dimension not in use. |
282 |
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). |
283 |
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). |
312 |
dimension_effect3depth = 0x5d, ///< Effect 3 Depth (MIDI Controller 93) |
dimension_effect3depth = 0x5d, ///< Effect 3 Depth (MIDI Controller 93) |
313 |
dimension_effect4depth = 0x5e, ///< Effect 4 Depth (MIDI Controller 94) |
dimension_effect4depth = 0x5e, ///< Effect 4 Depth (MIDI Controller 94) |
314 |
dimension_effect5depth = 0x5f ///< Effect 5 Depth (MIDI Controller 95) |
dimension_effect5depth = 0x5f ///< Effect 5 Depth (MIDI Controller 95) |
315 |
} dimension_t; |
); |
316 |
|
|
317 |
/** |
/** |
318 |
* Intended for internal usage: will be used to convert a dimension value |
* Intended for internal usage: will be used to convert a dimension value |
319 |
* into the corresponding dimension bit number. |
* into the corresponding dimension bit number. |
320 |
|
* |
321 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
322 |
*/ |
*/ |
323 |
typedef enum { |
GIG_DECLARE_ENUM(split_type_t, |
324 |
split_type_normal, ///< dimension value between 0-127 |
split_type_normal, ///< dimension value between 0-127 |
325 |
split_type_bit ///< dimension values are already the sought bit number |
split_type_bit ///< dimension values are already the sought bit number |
326 |
} split_type_t; |
); |
327 |
|
|
328 |
/** General dimension definition. */ |
/** General dimension definition. */ |
329 |
struct dimension_def_t { |
struct dimension_def_t { |
334 |
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. |
335 |
}; |
}; |
336 |
|
|
337 |
/** Defines which frequencies are filtered by the VCF. */ |
/** Defines which frequencies are filtered by the VCF. |
338 |
typedef enum { |
* |
339 |
|
* @see countEnum(), enumKey(), enumKeys(), enumValue() |
340 |
|
*/ |
341 |
|
GIG_DECLARE_ENUM(vcf_type_t, |
342 |
vcf_type_lowpass = 0x00, |
vcf_type_lowpass = 0x00, |
343 |
vcf_type_lowpassturbo = 0xff, ///< More poles than normal lowpass |
vcf_type_lowpassturbo = 0xff, ///< More poles than normal lowpass |
344 |
vcf_type_bandpass = 0x01, |
vcf_type_bandpass = 0x01, |
345 |
vcf_type_highpass = 0x02, |
vcf_type_highpass = 0x02, |
346 |
vcf_type_bandreject = 0x03 |
vcf_type_bandreject = 0x03 |
347 |
} vcf_type_t; |
); |
348 |
|
|
349 |
/** |
/** |
350 |
* Defines the envelope of a crossfade. |
* Defines the envelope of a crossfade. |
365 |
uint8_t out_start; ///< Start position of fade out. |
uint8_t out_start; ///< Start position of fade out. |
366 |
uint8_t out_end; ///< End postition of fade out. |
uint8_t out_end; ///< End postition of fade out. |
367 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
368 |
|
|
369 |
|
void serialize(Serialization::Archive* archive); |
370 |
}; |
}; |
371 |
|
|
372 |
/** Reflects the current playback state for a sample. */ |
/** Reflects the current playback state for a sample. */ |
373 |
struct playback_state_t { |
struct playback_state_t { |
374 |
unsigned long position; ///< Current position within the sample. |
file_offset_t position; ///< Current position within the sample. |
375 |
bool reverse; ///< If playback direction is currently backwards (in case there is a pingpong or reverse loop defined). |
bool reverse; ///< If playback direction is currently backwards (in case there is a pingpong or reverse loop defined). |
376 |
unsigned long 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. |
377 |
}; |
}; |
378 |
|
|
379 |
// just symbol prototyping |
// just symbol prototyping |
549 |
DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src); |
DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src); |
550 |
~DimensionRegion(); |
~DimensionRegion(); |
551 |
void CopyAssign(const DimensionRegion* orig, const std::map<Sample*,Sample*>* mSamples); |
void CopyAssign(const DimensionRegion* orig, const std::map<Sample*,Sample*>* mSamples); |
552 |
|
void serialize(Serialization::Archive* archive); |
553 |
friend class Region; |
friend class Region; |
554 |
|
friend class Serialization::Archive; |
555 |
private: |
private: |
556 |
typedef enum { ///< Used to decode attenuation, EG1 and EG2 controller |
typedef enum { ///< Used to decode attenuation, EG1 and EG2 controller |
557 |
// 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: |
654 |
} _lev_ctrl_t; |
} _lev_ctrl_t; |
655 |
typedef std::map<uint32_t, double*> VelocityTableMap; |
typedef std::map<uint32_t, double*> VelocityTableMap; |
656 |
|
|
657 |
static uint Instances; ///< Number of DimensionRegion instances. |
static size_t Instances; ///< Number of DimensionRegion instances. |
658 |
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). |
659 |
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. |
660 |
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 |
717 |
|
|
718 |
// own methods |
// own methods |
719 |
buffer_t LoadSampleData(); |
buffer_t LoadSampleData(); |
720 |
buffer_t LoadSampleData(unsigned long SampleCount); |
buffer_t LoadSampleData(file_offset_t SampleCount); |
721 |
buffer_t LoadSampleDataWithNullSamplesExtension(uint NullSamplesCount); |
buffer_t LoadSampleDataWithNullSamplesExtension(uint NullSamplesCount); |
722 |
buffer_t LoadSampleDataWithNullSamplesExtension(unsigned long SampleCount, uint NullSamplesCount); |
buffer_t LoadSampleDataWithNullSamplesExtension(file_offset_t SampleCount, uint NullSamplesCount); |
723 |
buffer_t GetCache(); |
buffer_t GetCache(); |
724 |
// own static methods |
// own static methods |
725 |
static buffer_t CreateDecompressionBuffer(unsigned long MaxReadSize); |
static buffer_t CreateDecompressionBuffer(file_offset_t MaxReadSize); |
726 |
static void DestroyDecompressionBuffer(buffer_t& DecompressionBuffer); |
static void DestroyDecompressionBuffer(buffer_t& DecompressionBuffer); |
727 |
// overridden methods |
// overridden methods |
728 |
void ReleaseSampleData(); |
void ReleaseSampleData(); |
729 |
void Resize(int iNewSize); |
void Resize(file_offset_t NewSize); |
730 |
unsigned long SetPos(unsigned long 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); |
731 |
unsigned long GetPos() const; |
file_offset_t GetPos() const; |
732 |
unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
file_offset_t Read(void* pBuffer, file_offset_t SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
733 |
unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
file_offset_t ReadAndLoop(void* pBuffer, file_offset_t SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
734 |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
file_offset_t Write(void* pBuffer, file_offset_t SampleCount); |
735 |
Group* GetGroup() const; |
Group* GetGroup() const; |
736 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress); |
737 |
void CopyAssignMeta(const Sample* orig); |
void CopyAssignMeta(const Sample* orig); |
738 |
void CopyAssignWave(const Sample* orig); |
void CopyAssignWave(const Sample* orig); |
739 |
|
uint32_t GetWaveDataCRC32Checksum(); |
740 |
|
bool VerifyWaveData(uint32_t* pActually = NULL); |
741 |
protected: |
protected: |
742 |
static unsigned int Instances; ///< Number of instances of class Sample. |
static size_t Instances; ///< Number of instances of class Sample. |
743 |
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. |
744 |
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) |
745 |
unsigned long 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). |
746 |
unsigned long* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
file_offset_t* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
747 |
unsigned long SamplePos; ///< For compressed samples only: stores the current position (in sample points). |
file_offset_t SamplePos; ///< For compressed samples only: stores the current position (in sample points). |
748 |
unsigned long SamplesInLastFrame; ///< For compressed samples only: length of the last sample frame. |
file_offset_t SamplesInLastFrame; ///< For compressed samples only: length of the last sample frame. |
749 |
unsigned long WorstCaseFrameSize; ///< For compressed samples only: size (in bytes) of the largest possible sample frame. |
file_offset_t WorstCaseFrameSize; ///< For compressed samples only: size (in bytes) of the largest possible sample frame. |
750 |
unsigned long SamplesPerFrame; ///< For compressed samples only: number of samples in a full sample frame. |
file_offset_t SamplesPerFrame; ///< For compressed samples only: number of samples in a full sample frame. |
751 |
buffer_t RAMCache; ///< Buffers samples (already uncompressed) in RAM. |
buffer_t RAMCache; ///< Buffers samples (already uncompressed) in RAM. |
752 |
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) |
753 |
RIFF::Chunk* pCk3gix; |
RIFF::Chunk* pCk3gix; |
754 |
RIFF::Chunk* pCkSmpl; |
RIFF::Chunk* pCkSmpl; |
755 |
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(). |
756 |
|
|
757 |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset, unsigned long fileNo = 0); |
Sample(File* pFile, RIFF::List* waveList, file_offset_t WavePoolOffset, unsigned long fileNo = 0, int index = -1); |
758 |
~Sample(); |
~Sample(); |
759 |
|
uint32_t CalculateWaveDataChecksum(); |
760 |
|
|
761 |
// Guess size (in bytes) of a compressed sample |
// Guess size (in bytes) of a compressed sample |
762 |
inline unsigned long GuessSize(unsigned long samples) { |
inline file_offset_t GuessSize(file_offset_t samples) { |
763 |
// 16 bit: assume all frames are compressed - 1 byte |
// 16 bit: assume all frames are compressed - 1 byte |
764 |
// per sample and 5 bytes header per 2048 samples |
// per sample and 5 bytes header per 2048 samples |
765 |
|
|
766 |
// 24 bit: assume next best compression rate - 1.5 |
// 24 bit: assume next best compression rate - 1.5 |
767 |
// bytes per sample and 13 bytes header per 256 |
// bytes per sample and 13 bytes header per 256 |
768 |
// samples |
// samples |
769 |
const unsigned long size = |
const file_offset_t size = |
770 |
BitDepth == 24 ? samples + (samples >> 1) + (samples >> 8) * 13 |
BitDepth == 24 ? samples + (samples >> 1) + (samples >> 8) * 13 |
771 |
: samples + (samples >> 10) * 5; |
: samples + (samples >> 10) * 5; |
772 |
// Double for stereo and add one worst case sample |
// Double for stereo and add one worst case sample |
776 |
|
|
777 |
// Worst case amount of sample points that can be read with the |
// Worst case amount of sample points that can be read with the |
778 |
// given decompression buffer. |
// given decompression buffer. |
779 |
inline unsigned long WorstCaseMaxSamples(buffer_t* pDecompressionBuffer) { |
inline file_offset_t WorstCaseMaxSamples(buffer_t* pDecompressionBuffer) { |
780 |
return (unsigned long) ((float)pDecompressionBuffer->Size / (float)WorstCaseFrameSize * (float)SamplesPerFrame); |
return (file_offset_t) ((float)pDecompressionBuffer->Size / (float)WorstCaseFrameSize * (float)SamplesPerFrame); |
781 |
} |
} |
782 |
private: |
private: |
783 |
void ScanCompressedSample(); |
void ScanCompressedSample(); |
1048 |
* not available in the GigaStudio 4 software. It is currently only |
* not available in the GigaStudio 4 software. It is currently only |
1049 |
* supported by LinuxSampler and gigedit. Scripts will not load with the |
* supported by LinuxSampler and gigedit. Scripts will not load with the |
1050 |
* original GigaStudio software. |
* original GigaStudio software. |
1051 |
|
* |
1052 |
|
* You find more informations about Instrument Scripts on the LinuxSampler |
1053 |
|
* documentation site: |
1054 |
|
* |
1055 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/">About Instrument Scripts in General</a> |
1056 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language">Introduction to the NKSP Script Language</a> |
1057 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a> |
1058 |
|
* - <a href="http://doc.linuxsampler.org/Gigedit/Managing_Scripts">Using Instrument Scripts with Gigedit</a> |
1059 |
*/ |
*/ |
1060 |
class Script { |
class Script { |
1061 |
public: |
public: |
1066 |
COMPRESSION_NONE = 0 ///< Is not compressed at all (default). |
COMPRESSION_NONE = 0 ///< Is not compressed at all (default). |
1067 |
}; |
}; |
1068 |
enum Language_t { |
enum Language_t { |
1069 |
LANGUAGE_NKSP = 0 ///< NKSP stands for "Is Not KSP" (default). |
LANGUAGE_NKSP = 0 ///< NKSP stands for "Is Not KSP" (default). Refer to the <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a> for details about this script language. |
1070 |
}; |
}; |
1071 |
|
|
1072 |
String Name; ///< Arbitrary name of the script, which may be displayed i.e. in an instrument editor. |
String Name; ///< Arbitrary name of the script, which may be displayed i.e. in an instrument editor. |
1079 |
void SetScriptAsText(const String& text); |
void SetScriptAsText(const String& text); |
1080 |
void SetGroup(ScriptGroup* pGroup); |
void SetGroup(ScriptGroup* pGroup); |
1081 |
ScriptGroup* GetGroup() const; |
ScriptGroup* GetGroup() const; |
1082 |
|
void CopyAssign(const Script* orig); |
1083 |
protected: |
protected: |
1084 |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
1085 |
virtual ~Script(); |
virtual ~Script(); |
1168 |
Region* GetNextRegion(); |
Region* GetNextRegion(); |
1169 |
Region* AddRegion(); |
Region* AddRegion(); |
1170 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
1171 |
|
void MoveTo(Instrument* dst); |
1172 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress); |
1173 |
virtual void CopyAssign(const Instrument* orig); |
virtual void CopyAssign(const Instrument* orig); |
1174 |
// own methods |
// own methods |
1336 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
1337 |
virtual void LoadScriptGroups(); |
virtual void LoadScriptGroups(); |
1338 |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
1339 |
|
uint32_t GetSampleChecksum(Sample* pSample); |
1340 |
|
uint32_t GetSampleChecksumByIndex(int index); |
1341 |
|
bool VerifySampleChecksumTable(); |
1342 |
|
bool RebuildSampleChecksumTable(); |
1343 |
|
int GetWaveTableIndexOf(gig::Sample* pSample); |
1344 |
friend class Region; |
friend class Region; |
1345 |
friend class Sample; |
friend class Sample; |
1346 |
|
friend class Instrument; |
1347 |
friend class Group; // so Group can access protected member pRIFF |
friend class Group; // so Group can access protected member pRIFF |
1348 |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
1349 |
private: |
private: |
1367 |
void PrintMessage(); |
void PrintMessage(); |
1368 |
}; |
}; |
1369 |
|
|
1370 |
|
#if HAVE_RTTI |
1371 |
|
size_t countEnum(const std::type_info& type); |
1372 |
|
size_t countEnum(String typeName); |
1373 |
|
const char* enumKey(const std::type_info& type, size_t value); |
1374 |
|
const char* enumKey(String typeName, size_t value); |
1375 |
|
bool enumKey(const std::type_info& type, String key); |
1376 |
|
bool enumKey(String typeName, String key); |
1377 |
|
const char** enumKeys(const std::type_info& type); |
1378 |
|
const char** enumKeys(String typeName); |
1379 |
|
size_t enumValue(String key); |
1380 |
|
#endif // HAVE_RTTI |
1381 |
|
|
1382 |
String libraryName(); |
String libraryName(); |
1383 |
String libraryVersion(); |
String libraryVersion(); |
1384 |
|
|