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-2018 by Christian Schoenebeck * |
* Copyright (C) 2003-2021 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 * |
26 |
|
|
27 |
#include "DLS.h" |
#include "DLS.h" |
28 |
#include <vector> |
#include <vector> |
29 |
|
#include <array> // since C++11 |
30 |
|
|
31 |
#ifndef __has_feature |
#ifndef __has_feature |
32 |
# define __has_feature(x) 0 |
# define __has_feature(x) 0 |
51 |
# define LIST_TYPE_3GNL 0x33676E6C |
# define LIST_TYPE_3GNL 0x33676E6C |
52 |
# define LIST_TYPE_3LS 0x334c5320 // own gig format extension |
# define LIST_TYPE_3LS 0x334c5320 // own gig format extension |
53 |
# define LIST_TYPE_RTIS 0x52544953 // own gig format extension |
# define LIST_TYPE_RTIS 0x52544953 // own gig format extension |
54 |
|
# define LIST_TYPE_3DNM 0x33646e6d |
55 |
# define CHUNK_ID_3GIX 0x33676978 |
# define CHUNK_ID_3GIX 0x33676978 |
56 |
# define CHUNK_ID_3EWA 0x33657761 |
# define CHUNK_ID_3EWA 0x33657761 |
57 |
# define CHUNK_ID_3LNK 0x336C6E6B |
# define CHUNK_ID_3LNK 0x336C6E6B |
63 |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
64 |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
65 |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
66 |
|
# define CHUNK_ID_SCPV 0x53435056 // own gig format extension |
67 |
# define CHUNK_ID_LSDE 0x4c534445 // own gig format extension |
# define CHUNK_ID_LSDE 0x4c534445 // own gig format extension |
68 |
|
# define CHUNK_ID_3DDP 0x33646470 |
69 |
#else // little endian |
#else // little endian |
70 |
# define LIST_TYPE_3PRG 0x67727033 |
# define LIST_TYPE_3PRG 0x67727033 |
71 |
# define LIST_TYPE_3EWL 0x6C776533 |
# define LIST_TYPE_3EWL 0x6C776533 |
73 |
# define LIST_TYPE_3GNL 0x6C6E6733 |
# define LIST_TYPE_3GNL 0x6C6E6733 |
74 |
# define LIST_TYPE_3LS 0x20534c33 // own gig format extension |
# define LIST_TYPE_3LS 0x20534c33 // own gig format extension |
75 |
# define LIST_TYPE_RTIS 0x53495452 // own gig format extension |
# define LIST_TYPE_RTIS 0x53495452 // own gig format extension |
76 |
|
# define LIST_TYPE_3DNM 0x6d6e6433 |
77 |
# define CHUNK_ID_3GIX 0x78696733 |
# define CHUNK_ID_3GIX 0x78696733 |
78 |
# define CHUNK_ID_3EWA 0x61776533 |
# define CHUNK_ID_3EWA 0x61776533 |
79 |
# define CHUNK_ID_3LNK 0x6B6E6C33 |
# define CHUNK_ID_3LNK 0x6B6E6C33 |
85 |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
86 |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
87 |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
88 |
|
# define CHUNK_ID_SCPV 0x56504353 // own gig format extension |
89 |
# define CHUNK_ID_LSDE 0x4544534c // own gig format extension |
# define CHUNK_ID_LSDE 0x4544534c // own gig format extension |
90 |
|
# define CHUNK_ID_3DDP 0x70646433 |
91 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
92 |
|
|
93 |
#ifndef GIG_DECLARE_ENUM |
#ifndef GIG_DECLARE_ENUM |
155 |
curve_type_unknown = 0xffffffff /**< Unknown curve type. */ |
curve_type_unknown = 0xffffffff /**< Unknown curve type. */ |
156 |
); |
); |
157 |
|
|
158 |
|
/** Defines the wave form type used by an LFO (gig format extension). |
159 |
|
* |
160 |
|
* This is a gig format extension. The original Gigasampler/GigaStudio |
161 |
|
* software always used a sine (sinus) wave form for all its 3 LFOs, so this |
162 |
|
* was not configurable in the original gig format. Accordingly setting any |
163 |
|
* other wave form than sine (sinus) will be ignored by the original |
164 |
|
* Gigasampler/GigaStudio software. |
165 |
|
* |
166 |
|
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
167 |
|
*/ |
168 |
|
GIG_DECLARE_ENUM(lfo_wave_t, |
169 |
|
lfo_wave_sine = 0, /**< Sine (sinus) wave form (this is the default wave form). */ |
170 |
|
lfo_wave_triangle = 1, /**< Triangle wave form. */ |
171 |
|
lfo_wave_saw = 2, /**< Saw (up) wave form (saw down wave form can be achieved by flipping the phase). */ |
172 |
|
lfo_wave_square = 3, /**< Square wave form. */ |
173 |
|
); |
174 |
|
|
175 |
/** Dimensions allow to bypass one of the following controllers. |
/** Dimensions allow to bypass one of the following controllers. |
176 |
* |
* |
177 |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
362 |
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. |
363 |
}; |
}; |
364 |
|
|
365 |
/** Defines which frequencies are filtered by the VCF. |
/** Audio filter types. |
366 |
|
* |
367 |
|
* The first 5 filter types are the ones which exist in GigaStudio, and |
368 |
|
* which are very accurately modeled on LinuxSampler side such that they |
369 |
|
* would sound with LinuxSampler exactly as with GigaStudio. |
370 |
|
* |
371 |
|
* The other filter types listed here are extensions to the gig format and |
372 |
|
* are LinuxSampler specific filter type implementations. Note that none of |
373 |
|
* these are duplicates of the GigaStudio filter types. For instance |
374 |
|
* @c vcf_type_lowpass (GigaStudio) and @c vcf_type_lowpass_2p |
375 |
|
* (LinuxSampler) are both lowpass filters with 2 poles, however they do |
376 |
|
* sound differently. |
377 |
* |
* |
378 |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
* @see enumCount(), enumKey(), enumKeys(), enumValue() |
379 |
*/ |
*/ |
380 |
GIG_DECLARE_ENUM(vcf_type_t, |
GIG_DECLARE_ENUM(vcf_type_t, |
381 |
vcf_type_lowpass = 0x00, /**< Standard lowpass filter type. */ |
vcf_type_lowpass = 0x00, /**< Standard lowpass filter type (GigaStudio). */ |
382 |
vcf_type_lowpassturbo = 0xff, /**< More poles than normal lowpass. */ |
vcf_type_lowpassturbo = 0xff, /**< More poles than normal lowpass (GigaStudio). */ |
383 |
vcf_type_bandpass = 0x01, /**< Bandpass filter type. */ |
vcf_type_bandpass = 0x01, /**< Bandpass filter type (GigaStudio). */ |
384 |
vcf_type_highpass = 0x02, /**< Highpass filter type. */ |
vcf_type_highpass = 0x02, /**< Highpass filter type (GigaStudio). */ |
385 |
vcf_type_bandreject = 0x03 /**< Band reject filter type. */ |
vcf_type_bandreject = 0x03, /**< Band reject filter type (GigaStudio). */ |
386 |
|
vcf_type_lowpass_1p = 0x11, /**< [gig extension]: 1-pole lowpass filter type (LinuxSampler). */ |
387 |
|
vcf_type_lowpass_2p = 0x12, /**< [gig extension]: 2-pole lowpass filter type (LinuxSampler). */ |
388 |
|
vcf_type_lowpass_4p = 0x14, /**< [gig extension]: 4-pole lowpass filter type (LinuxSampler). */ |
389 |
|
vcf_type_lowpass_6p = 0x16, /**< [gig extension]: 6-pole lowpass filter type (LinuxSampler). */ |
390 |
|
vcf_type_highpass_1p = 0x21, /**< [gig extension]: 1-pole highpass filter type (LinuxSampler). */ |
391 |
|
vcf_type_highpass_2p = 0x22, /**< [gig extension]: 2-pole highpass filter type (LinuxSampler). */ |
392 |
|
vcf_type_highpass_4p = 0x24, /**< [gig extension]: 4-pole highpass filter type (LinuxSampler). */ |
393 |
|
vcf_type_highpass_6p = 0x26, /**< [gig extension]: 6-pole highpass filter type (LinuxSampler). */ |
394 |
|
vcf_type_bandpass_2p = 0x32, /**< [gig extension]: 2-pole bandpass filter type (LinuxSampler). */ |
395 |
|
vcf_type_bandreject_2p = 0x42 /**< [gig extension]: 2-pole bandreject filter type (LinuxSampler). */ |
396 |
); |
); |
397 |
|
|
398 |
/** |
/** |
478 |
GIG_DECLARE_ENUM(sust_rel_trg_t, |
GIG_DECLARE_ENUM(sust_rel_trg_t, |
479 |
sust_rel_trg_none = 0x00, /**< No release triggered sample(s) are played on sustain pedal up (default). */ |
sust_rel_trg_none = 0x00, /**< No release triggered sample(s) are played on sustain pedal up (default). */ |
480 |
sust_rel_trg_maxvelocity = 0x01, /**< Play release trigger sample(s) on sustain pedal up, and simply use 127 as MIDI velocity for playback. */ |
sust_rel_trg_maxvelocity = 0x01, /**< Play release trigger sample(s) on sustain pedal up, and simply use 127 as MIDI velocity for playback. */ |
481 |
sust_rel_trg_keyvelocity = 0x02, /**< Play release trigger sample(s) on sustain pedal up, and use the key's last MIDI note-on velocity for playback. */ |
sust_rel_trg_keyvelocity = 0x02 /**< Play release trigger sample(s) on sustain pedal up, and use the key`s last MIDI note-on velocity for playback. */ |
482 |
); |
); |
483 |
|
|
484 |
// just symbol prototyping |
// just symbol prototyping |
550 |
uint8_t EG1ControllerAttackInfluence; ///< Amount EG1 Controller has influence on the EG1 Attack time (0 - 3, where 0 means off). |
uint8_t EG1ControllerAttackInfluence; ///< Amount EG1 Controller has influence on the EG1 Attack time (0 - 3, where 0 means off). |
551 |
uint8_t EG1ControllerDecayInfluence; ///< Amount EG1 Controller has influence on the EG1 Decay time (0 - 3, where 0 means off). |
uint8_t EG1ControllerDecayInfluence; ///< Amount EG1 Controller has influence on the EG1 Decay time (0 - 3, where 0 means off). |
552 |
uint8_t EG1ControllerReleaseInfluence; ///< Amount EG1 Controller has influence on the EG1 Release time (0 - 3, where 0 means off). |
uint8_t EG1ControllerReleaseInfluence; ///< Amount EG1 Controller has influence on the EG1 Release time (0 - 3, where 0 means off). |
553 |
|
lfo_wave_t LFO1WaveForm; ///< [gig extension]: The fundamental wave form to be used by the amplitude LFO, e.g. sine, triangle, saw, square (default: sine). |
554 |
double LFO1Frequency; ///< Frequency of the sample amplitude LFO (0.10 - 10.00 Hz). |
double LFO1Frequency; ///< Frequency of the sample amplitude LFO (0.10 - 10.00 Hz). |
555 |
|
double LFO1Phase; ///< [gig extension]: Phase displacement of the amplitude LFO's wave form (0.0° - 360.0°). |
556 |
uint16_t LFO1InternalDepth; ///< Firm pitch of the sample amplitude LFO (0 - 1200 cents). |
uint16_t LFO1InternalDepth; ///< Firm pitch of the sample amplitude LFO (0 - 1200 cents). |
557 |
uint16_t LFO1ControlDepth; ///< Controller depth influencing sample amplitude LFO pitch (0 - 1200 cents). |
uint16_t LFO1ControlDepth; ///< Controller depth influencing sample amplitude LFO pitch (0 - 1200 cents). |
558 |
lfo1_ctrl_t LFO1Controller; ///< MIDI Controller which controls sample amplitude LFO. |
lfo1_ctrl_t LFO1Controller; ///< MIDI Controller which controls sample amplitude LFO. |
559 |
bool LFO1FlipPhase; ///< Inverts phase of the sample amplitude LFO wave. |
bool LFO1FlipPhase; ///< Inverts the polarity of the sample amplitude LFO wave, so it flips the wave form vertically. |
560 |
bool LFO1Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
bool LFO1Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
561 |
// Filter Cutoff Frequency EG/LFO |
// Filter Cutoff Frequency EG/LFO |
562 |
uint16_t EG2PreAttack; ///< Preattack value of the filter cutoff EG (0 - 1000 permille). |
uint16_t EG2PreAttack; ///< Preattack value of the filter cutoff EG (0 - 1000 permille). |
571 |
uint8_t EG2ControllerAttackInfluence; ///< Amount EG2 Controller has influence on the EG2 Attack time (0 - 3, where 0 means off). |
uint8_t EG2ControllerAttackInfluence; ///< Amount EG2 Controller has influence on the EG2 Attack time (0 - 3, where 0 means off). |
572 |
uint8_t EG2ControllerDecayInfluence; ///< Amount EG2 Controller has influence on the EG2 Decay time (0 - 3, where 0 means off). |
uint8_t EG2ControllerDecayInfluence; ///< Amount EG2 Controller has influence on the EG2 Decay time (0 - 3, where 0 means off). |
573 |
uint8_t EG2ControllerReleaseInfluence; ///< Amount EG2 Controller has influence on the EG2 Release time (0 - 3, where 0 means off). |
uint8_t EG2ControllerReleaseInfluence; ///< Amount EG2 Controller has influence on the EG2 Release time (0 - 3, where 0 means off). |
574 |
|
lfo_wave_t LFO2WaveForm; ///< [gig extension]: The fundamental wave form to be used by the filter cutoff LFO, e.g. sine, triangle, saw, square (default: sine). |
575 |
double LFO2Frequency; ///< Frequency of the filter cutoff LFO (0.10 - 10.00 Hz). |
double LFO2Frequency; ///< Frequency of the filter cutoff LFO (0.10 - 10.00 Hz). |
576 |
|
double LFO2Phase; ///< [gig extension]: Phase displacement of the filter cutoff LFO's wave form (0.0° - 360.0°). |
577 |
uint16_t LFO2InternalDepth; ///< Firm pitch of the filter cutoff LFO (0 - 1200 cents). |
uint16_t LFO2InternalDepth; ///< Firm pitch of the filter cutoff LFO (0 - 1200 cents). |
578 |
uint16_t LFO2ControlDepth; ///< Controller depth influencing filter cutoff LFO pitch (0 - 1200). |
uint16_t LFO2ControlDepth; ///< Controller depth influencing filter cutoff LFO pitch (0 - 1200). |
579 |
lfo2_ctrl_t LFO2Controller; ///< MIDI Controlle which controls the filter cutoff LFO. |
lfo2_ctrl_t LFO2Controller; ///< MIDI Controlle which controls the filter cutoff LFO. |
580 |
bool LFO2FlipPhase; ///< Inverts phase of the filter cutoff LFO wave. |
bool LFO2FlipPhase; ///< Inverts the polarity of the filter cutoff LFO wave, so it flips the wave form vertically. |
581 |
bool LFO2Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
bool LFO2Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
582 |
// Sample Pitch EG/LFO |
// Sample Pitch EG/LFO |
583 |
double EG3Attack; ///< Attack time of the sample pitch EG (0.000 - 10.000s). |
double EG3Attack; ///< Attack time of the sample pitch EG (0.000 - 10.000s). |
584 |
int16_t EG3Depth; ///< Depth of the sample pitch EG (-1200 - +1200). |
int16_t EG3Depth; ///< Depth of the sample pitch EG (-1200 - +1200). |
585 |
|
lfo_wave_t LFO3WaveForm; ///< [gig extension]: The fundamental wave form to be used by the pitch LFO, e.g. sine, triangle, saw, square (default: sine). |
586 |
double LFO3Frequency; ///< Frequency of the sample pitch LFO (0.10 - 10.00 Hz). |
double LFO3Frequency; ///< Frequency of the sample pitch LFO (0.10 - 10.00 Hz). |
587 |
|
double LFO3Phase; ///< [gig extension]: Phase displacement of the pitch LFO's wave form (0.0° - 360.0°). |
588 |
int16_t LFO3InternalDepth; ///< Firm depth of the sample pitch LFO (-1200 - +1200 cents). |
int16_t LFO3InternalDepth; ///< Firm depth of the sample pitch LFO (-1200 - +1200 cents). |
589 |
int16_t LFO3ControlDepth; ///< Controller depth of the sample pitch LFO (-1200 - +1200 cents). |
int16_t LFO3ControlDepth; ///< Controller depth of the sample pitch LFO (-1200 - +1200 cents). |
590 |
lfo3_ctrl_t LFO3Controller; ///< MIDI Controller which controls the sample pitch LFO. |
lfo3_ctrl_t LFO3Controller; ///< MIDI Controller which controls the sample pitch LFO. |
591 |
|
bool LFO3FlipPhase; ///< [gig extension]: Inverts the polarity of the pitch LFO wave, so it flips the wave form vertically (@b NOTE: this setting for LFO3 is a gig format extension; flipping the polarity was only available for LFO1 and LFO2 in the original Gigasampler/GigaStudio software). |
592 |
bool LFO3Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
bool LFO3Sync; ///< If set to <i>true</i> only one LFO should be used for all voices. |
593 |
// Filter |
// Filter |
594 |
bool VCFEnabled; ///< If filter should be used. |
bool VCFEnabled; ///< If filter should be used. |
629 |
eg_opt_t EG1Options; ///< [gig extension]: Behavior options which should be used for envelope generator 1 (volume amplitude EG). |
eg_opt_t EG1Options; ///< [gig extension]: Behavior options which should be used for envelope generator 1 (volume amplitude EG). |
630 |
eg_opt_t EG2Options; ///< [gig extension]: Behavior options which should be used for envelope generator 2 (filter cutoff EG). |
eg_opt_t EG2Options; ///< [gig extension]: Behavior options which should be used for envelope generator 2 (filter cutoff EG). |
631 |
sust_rel_trg_t SustainReleaseTrigger; ///< [gig extension]: Whether a sustain pedal up event shall play release trigger sample. |
sust_rel_trg_t SustainReleaseTrigger; ///< [gig extension]: Whether a sustain pedal up event shall play release trigger sample. |
632 |
|
bool NoNoteOffReleaseTrigger; ///< [gig extension]: If @c true then don't play a release trigger sample on MIDI note-off events. |
633 |
|
|
634 |
// derived attributes from DLS::Sampler |
// derived attributes from DLS::Sampler |
635 |
using DLS::Sampler::UnityNote; |
using DLS::Sampler::UnityNote; |
656 |
using DLS::Sampler::AddSampleLoop; |
using DLS::Sampler::AddSampleLoop; |
657 |
using DLS::Sampler::DeleteSampleLoop; |
using DLS::Sampler::DeleteSampleLoop; |
658 |
// overridden methods |
// overridden methods |
659 |
virtual void SetGain(int32_t gain); |
virtual void SetGain(int32_t gain) OVERRIDE; |
660 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
661 |
virtual void CopyAssign(const DimensionRegion* orig); |
virtual void CopyAssign(const DimensionRegion* orig); |
662 |
protected: |
protected: |
663 |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
783 |
double* GetCutoffVelocityTable(curve_type_t vcfVelocityCurve, uint8_t vcfVelocityDynamicRange, uint8_t vcfVelocityScale, vcf_cutoff_ctrl_t vcfCutoffController); |
double* GetCutoffVelocityTable(curve_type_t vcfVelocityCurve, uint8_t vcfVelocityDynamicRange, uint8_t vcfVelocityScale, vcf_cutoff_ctrl_t vcfCutoffController); |
784 |
double* GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling); |
double* GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling); |
785 |
double* CreateVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling); |
double* CreateVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling); |
786 |
|
bool UsesAnyGigFormatExtension() const; |
787 |
}; |
}; |
788 |
|
|
789 |
/** @brief Encapsulates sample waves of Gigasampler/GigaStudio files used for playback. |
/** @brief Encapsulates sample waves of Gigasampler/GigaStudio files used for playback. |
850 |
file_offset_t ReadAndLoop(void* pBuffer, file_offset_t 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); |
851 |
file_offset_t Write(void* pBuffer, file_offset_t SampleCount); |
file_offset_t Write(void* pBuffer, file_offset_t SampleCount); |
852 |
Group* GetGroup() const; |
Group* GetGroup() const; |
853 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
854 |
void CopyAssignMeta(const Sample* orig); |
void CopyAssignMeta(const Sample* orig); |
855 |
void CopyAssignWave(const Sample* orig); |
void CopyAssignWave(const Sample* orig); |
856 |
uint32_t GetWaveDataCRC32Checksum(); |
uint32_t GetWaveDataCRC32Checksum(); |
857 |
bool VerifyWaveData(uint32_t* pActually = NULL); |
bool VerifyWaveData(uint32_t* pActually = NULL); |
858 |
protected: |
protected: |
859 |
static size_t Instances; ///< Number of instances of class Sample. |
static size_t Instances; ///< Number of instances of class Sample. |
860 |
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 of samples, and only if no external decompression buffer was supplied. |
861 |
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) |
862 |
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). |
863 |
file_offset_t* 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. |
944 |
void SplitDimensionZone(dimension_t type, int zone); |
void SplitDimensionZone(dimension_t type, int zone); |
945 |
void SetDimensionType(dimension_t oldType, dimension_t newType); |
void SetDimensionType(dimension_t oldType, dimension_t newType); |
946 |
// overridden methods |
// overridden methods |
947 |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
virtual void SetKeyRange(uint16_t Low, uint16_t High) OVERRIDE; |
948 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
949 |
virtual void CopyAssign(const Region* orig); |
virtual void CopyAssign(const Region* orig); |
950 |
protected: |
protected: |
951 |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
956 |
DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase); |
DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase); |
957 |
~Region(); |
~Region(); |
958 |
friend class Instrument; |
friend class Instrument; |
959 |
|
private: |
960 |
|
bool UsesAnyGigFormatExtension() const; |
961 |
}; |
}; |
962 |
|
|
963 |
/** @brief Abstract base class for all MIDI rules. |
/** @brief Abstract base class for all MIDI rules. |
1040 |
protected: |
protected: |
1041 |
MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg); |
MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg); |
1042 |
MidiRuleCtrlTrigger(); |
MidiRuleCtrlTrigger(); |
1043 |
void UpdateChunks(uint8_t* pData) const; |
void UpdateChunks(uint8_t* pData) const OVERRIDE; |
1044 |
friend class Instrument; |
friend class Instrument; |
1045 |
}; |
}; |
1046 |
|
|
1080 |
protected: |
protected: |
1081 |
MidiRuleLegato(RIFF::Chunk* _3ewg); |
MidiRuleLegato(RIFF::Chunk* _3ewg); |
1082 |
MidiRuleLegato(); |
MidiRuleLegato(); |
1083 |
void UpdateChunks(uint8_t* pData) const; |
void UpdateChunks(uint8_t* pData) const OVERRIDE; |
1084 |
friend class Instrument; |
friend class Instrument; |
1085 |
}; |
}; |
1086 |
|
|
1132 |
protected: |
protected: |
1133 |
MidiRuleAlternator(RIFF::Chunk* _3ewg); |
MidiRuleAlternator(RIFF::Chunk* _3ewg); |
1134 |
MidiRuleAlternator(); |
MidiRuleAlternator(); |
1135 |
void UpdateChunks(uint8_t* pData) const; |
void UpdateChunks(uint8_t* pData) const OVERRIDE; |
1136 |
friend class Instrument; |
friend class Instrument; |
1137 |
}; |
}; |
1138 |
|
|
1152 |
class MidiRuleUnknown : public MidiRule { |
class MidiRuleUnknown : public MidiRule { |
1153 |
protected: |
protected: |
1154 |
MidiRuleUnknown() { } |
MidiRuleUnknown() { } |
1155 |
void UpdateChunks(uint8_t* pData) const { } |
void UpdateChunks(uint8_t* pData) const OVERRIDE { } |
1156 |
friend class Instrument; |
friend class Instrument; |
1157 |
}; |
}; |
1158 |
|
|
1176 |
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a> |
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a> |
1177 |
* - <a href="http://doc.linuxsampler.org/Gigedit/Managing_Scripts">Using Instrument Scripts with Gigedit</a> |
* - <a href="http://doc.linuxsampler.org/Gigedit/Managing_Scripts">Using Instrument Scripts with Gigedit</a> |
1178 |
*/ |
*/ |
1179 |
class Script { |
class Script : protected DLS::Storage { |
1180 |
public: |
public: |
1181 |
enum Encoding_t { |
enum Encoding_t { |
1182 |
ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default). |
ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default). |
1193 |
Encoding_t Encoding; ///< Format the script's source code text is encoded with. |
Encoding_t Encoding; ///< Format the script's source code text is encoded with. |
1194 |
Language_t Language; ///< Programming language and dialect the script is written in. |
Language_t Language; ///< Programming language and dialect the script is written in. |
1195 |
bool Bypass; ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument. |
bool Bypass; ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument. |
1196 |
|
uint8_t Uuid[16]; ///< Persistent Universally Unique Identifier of this script, which remains identical after any changes to this script. |
1197 |
|
|
1198 |
String GetScriptAsText(); |
String GetScriptAsText(); |
1199 |
void SetScriptAsText(const String& text); |
void SetScriptAsText(const String& text); |
1203 |
protected: |
protected: |
1204 |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
1205 |
virtual ~Script(); |
virtual ~Script(); |
1206 |
void UpdateChunks(progress_t* pProgress); |
void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1207 |
|
void DeleteChunks() OVERRIDE; |
1208 |
void RemoveAllScriptReferences(); |
void RemoveAllScriptReferences(); |
1209 |
|
void GenerateUuid(); |
1210 |
friend class ScriptGroup; |
friend class ScriptGroup; |
1211 |
friend class Instrument; |
friend class Instrument; |
1212 |
private: |
private: |
1227 |
* not available in the GigaStudio 4 software. It is currently only |
* not available in the GigaStudio 4 software. It is currently only |
1228 |
* supported by LinuxSampler and gigedit. |
* supported by LinuxSampler and gigedit. |
1229 |
*/ |
*/ |
1230 |
class ScriptGroup { |
class ScriptGroup : protected DLS::Storage { |
1231 |
public: |
public: |
1232 |
String Name; ///< Name of this script group. For example to be displayed in an instrument editor. |
String Name; ///< Name of this script group. For example to be displayed in an instrument editor. |
1233 |
|
|
1238 |
ScriptGroup(File* file, RIFF::List* lstRTIS); |
ScriptGroup(File* file, RIFF::List* lstRTIS); |
1239 |
virtual ~ScriptGroup(); |
virtual ~ScriptGroup(); |
1240 |
void LoadScripts(); |
void LoadScripts(); |
1241 |
void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1242 |
|
virtual void DeleteChunks() OVERRIDE; |
1243 |
friend class Script; |
friend class Script; |
1244 |
friend class File; |
friend class File; |
1245 |
private: |
private: |
1287 |
// derived methods from DLS::Resource |
// derived methods from DLS::Resource |
1288 |
using DLS::Resource::GetParent; |
using DLS::Resource::GetParent; |
1289 |
// overridden methods |
// overridden methods |
1290 |
Region* GetFirstRegion(); |
Region* GetRegionAt(size_t pos); |
1291 |
Region* GetNextRegion(); |
Region* GetFirstRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead."); |
1292 |
|
Region* GetNextRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead."); |
1293 |
Region* AddRegion(); |
Region* AddRegion(); |
1294 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
1295 |
void MoveTo(Instrument* dst); |
void MoveTo(Instrument* dst); |
1296 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1297 |
virtual void CopyAssign(const Instrument* orig); |
virtual void CopyAssign(const Instrument* orig); |
1298 |
// own methods |
// own methods |
1299 |
Region* GetRegion(unsigned int Key); |
Region* GetRegion(unsigned int Key); |
1311 |
uint ScriptSlotCount() const; |
uint ScriptSlotCount() const; |
1312 |
bool IsScriptSlotBypassed(uint index); |
bool IsScriptSlotBypassed(uint index); |
1313 |
void SetScriptSlotBypassed(uint index, bool bBypass); |
void SetScriptSlotBypassed(uint index, bool bBypass); |
1314 |
|
bool IsScriptPatchVariableSet(int slot, String variable); |
1315 |
|
std::map<String,String> GetScriptPatchVariables(int slot); |
1316 |
|
String GetScriptPatchVariable(int slot, String variable); |
1317 |
|
void SetScriptPatchVariable(int slot, String variable, String value); |
1318 |
|
void UnsetScriptPatchVariable(int slot = -1, String variable = ""); |
1319 |
protected: |
protected: |
1320 |
Region* RegionKeyTable[128]; ///< fast lookup for the corresponding Region of a MIDI key |
Region* RegionKeyTable[128]; ///< fast lookup for the corresponding Region of a MIDI key |
1321 |
|
|
1336 |
Script* script; |
Script* script; |
1337 |
bool bypass; |
bool bypass; |
1338 |
}; |
}; |
1339 |
|
typedef std::array<uint8_t,16> _UUID; |
1340 |
|
typedef std::map<String,String> _PatchVars; |
1341 |
|
typedef std::map<int,_PatchVars> _VarsBySlot; |
1342 |
|
typedef std::map<_UUID,_VarsBySlot> _VarsByScript; |
1343 |
MidiRule** pMidiRules; |
MidiRule** pMidiRules; |
1344 |
std::vector<_ScriptPooolEntry> scriptPoolFileOffsets; |
std::vector<_ScriptPooolEntry> scriptPoolFileOffsets; |
1345 |
std::vector<_ScriptPooolRef>* pScriptRefs; |
std::vector<_ScriptPooolRef>* pScriptRefs; |
1346 |
|
_VarsByScript scriptVars; |
1347 |
|
|
1348 |
|
_VarsByScript stripScriptVars(); |
1349 |
|
bool ReferencesScriptWithUuid(const _UUID& uuid); |
1350 |
|
bool UsesAnyGigFormatExtension() const; |
1351 |
}; |
}; |
1352 |
|
|
1353 |
/** @brief Group of Gigasampler samples |
/** @brief Group of Gigasampler samples |
1361 |
* there is always at least one Group in a .gig file, no matter if you |
* there is always at least one Group in a .gig file, no matter if you |
1362 |
* created one yet or not. |
* created one yet or not. |
1363 |
*/ |
*/ |
1364 |
class Group { |
class Group : public DLS::Storage { |
1365 |
public: |
public: |
1366 |
String Name; ///< Stores the name of this Group. |
String Name; ///< Stores the name of this Group. |
1367 |
|
|
1368 |
Sample* GetFirstSample(); |
Sample* GetSample(size_t index); |
1369 |
Sample* GetNextSample(); |
Sample* GetFirstSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1370 |
|
Sample* GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1371 |
void AddSample(Sample* pSample); |
void AddSample(Sample* pSample); |
1372 |
protected: |
protected: |
1373 |
Group(File* file, RIFF::Chunk* ck3gnm); |
Group(File* file, RIFF::Chunk* ck3gnm); |
1374 |
virtual ~Group(); |
virtual ~Group(); |
1375 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1376 |
|
virtual void DeleteChunks() OVERRIDE; |
1377 |
void MoveAll(); |
void MoveAll(); |
1378 |
friend class File; |
friend class File; |
1379 |
private: |
private: |
1380 |
File* pFile; |
File* pFile; |
1381 |
RIFF::Chunk* pNameChunk; ///< '3gnm' chunk |
RIFF::Chunk* pNameChunk; ///< '3gnm' chunk |
1382 |
|
size_t SamplesIterator; ///< Used by GetFirstSample(), GetNextSample() only. |
1383 |
}; |
}; |
1384 |
|
|
1385 |
/** @brief Provides convenient access to Gigasampler/GigaStudio .gig files. |
/** @brief Provides convenient access to Gigasampler/GigaStudio .gig files. |
1437 |
using DLS::File::Save; |
using DLS::File::Save; |
1438 |
using DLS::File::GetFileName; |
using DLS::File::GetFileName; |
1439 |
using DLS::File::SetFileName; |
using DLS::File::SetFileName; |
1440 |
|
using DLS::File::GetRiffFile; |
1441 |
// overridden methods |
// overridden methods |
1442 |
File(); |
File(); |
1443 |
File(RIFF::File* pRIFF); |
File(RIFF::File* pRIFF); |
1444 |
Sample* GetFirstSample(progress_t* pProgress = NULL); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetFirstSample(progress_t* pProgress = NULL) LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1445 |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1446 |
Sample* GetSample(uint index); |
Sample* GetSample(size_t index, progress_t* pProgress = NULL); |
1447 |
Sample* AddSample(); |
Sample* AddSample(); |
1448 |
size_t CountSamples(); |
size_t CountSamples(); |
1449 |
void DeleteSample(Sample* pSample); |
void DeleteSample(Sample* pSample); |
1456 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
1457 |
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. |
1458 |
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. |
1459 |
Group* GetGroup(uint index); |
Group* GetGroup(size_t index); |
1460 |
Group* GetGroup(String name); |
Group* GetGroup(String name); |
1461 |
Group* AddGroup(); |
Group* AddGroup(); |
1462 |
void DeleteGroup(Group* pGroup); |
void DeleteGroup(Group* pGroup); |
1469 |
ScriptGroup* AddScriptGroup(); |
ScriptGroup* AddScriptGroup(); |
1470 |
void DeleteScriptGroup(ScriptGroup* pGroup); |
void DeleteScriptGroup(ScriptGroup* pGroup); |
1471 |
virtual ~File(); |
virtual ~File(); |
1472 |
virtual void UpdateChunks(progress_t* pProgress); |
virtual void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1473 |
protected: |
protected: |
1474 |
// overridden protected methods from DLS::File |
// overridden protected methods from DLS::File |
1475 |
virtual void LoadSamples(); |
virtual void LoadSamples() OVERRIDE; |
1476 |
virtual void LoadInstruments(); |
virtual void LoadInstruments() OVERRIDE; |
1477 |
virtual void LoadGroups(); |
virtual void LoadGroups(); |
1478 |
virtual void UpdateFileOffsets(); |
virtual void UpdateFileOffsets() OVERRIDE; |
1479 |
// own protected methods |
// own protected methods |
1480 |
virtual void LoadSamples(progress_t* pProgress); |
virtual void LoadSamples(progress_t* pProgress); |
1481 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
1492 |
friend class Group; // so Group can access protected member pRIFF |
friend class Group; // so Group can access protected member pRIFF |
1493 |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
1494 |
private: |
private: |
1495 |
std::list<Group*>* pGroups; |
std::vector<Group*>* pGroups; |
1496 |
std::list<Group*>::iterator GroupsIterator; |
std::vector<Group*>::iterator GroupsIterator; |
1497 |
bool bAutoLoad; |
bool bAutoLoad; |
1498 |
std::list<ScriptGroup*>* pScriptGroups; |
std::list<ScriptGroup*>* pScriptGroups; |
1499 |
|
|
1500 |
|
bool UsesAnyGigFormatExtension() const; |
1501 |
}; |
}; |
1502 |
|
|
1503 |
/** |
/** |