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-2007 by Christian Schoenebeck * |
* Copyright (C) 2003-2012 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 * |
31 |
# define LIST_TYPE_3EWL 0x3365776C |
# define LIST_TYPE_3EWL 0x3365776C |
32 |
# define LIST_TYPE_3GRI 0x33677269 |
# define LIST_TYPE_3GRI 0x33677269 |
33 |
# define LIST_TYPE_3GNL 0x33676E6C |
# define LIST_TYPE_3GNL 0x33676E6C |
|
# define CHUNK_ID_SMPL 0x736D706C |
|
34 |
# define CHUNK_ID_3GIX 0x33676978 |
# define CHUNK_ID_3GIX 0x33676978 |
35 |
# define CHUNK_ID_3EWA 0x33657761 |
# define CHUNK_ID_3EWA 0x33657761 |
36 |
# define CHUNK_ID_3LNK 0x336C6E6B |
# define CHUNK_ID_3LNK 0x336C6E6B |
44 |
# define LIST_TYPE_3EWL 0x6C776533 |
# define LIST_TYPE_3EWL 0x6C776533 |
45 |
# define LIST_TYPE_3GRI 0x69726733 |
# define LIST_TYPE_3GRI 0x69726733 |
46 |
# define LIST_TYPE_3GNL 0x6C6E6733 |
# define LIST_TYPE_3GNL 0x6C6E6733 |
|
# define CHUNK_ID_SMPL 0x6C706D73 |
|
47 |
# define CHUNK_ID_3GIX 0x78696733 |
# define CHUNK_ID_3GIX 0x78696733 |
48 |
# define CHUNK_ID_3EWA 0x61776533 |
# define CHUNK_ID_3EWA 0x61776533 |
49 |
# define CHUNK_ID_3LNK 0x6B6E6C33 |
# define CHUNK_ID_3LNK 0x6B6E6C33 |
429 |
uint8_t DimensionUpperLimits[8]; ///< gig3: defines the upper limit of the dimension values for this dimension region |
uint8_t DimensionUpperLimits[8]; ///< gig3: defines the upper limit of the dimension values for this dimension region |
430 |
|
|
431 |
// derived attributes from DLS::Sampler |
// derived attributes from DLS::Sampler |
432 |
DLS::Sampler::UnityNote; |
using DLS::Sampler::UnityNote; |
433 |
DLS::Sampler::FineTune; |
using DLS::Sampler::FineTune; |
434 |
DLS::Sampler::Gain; |
using DLS::Sampler::Gain; |
435 |
DLS::Sampler::SampleLoops; |
using DLS::Sampler::SampleLoops; |
436 |
DLS::Sampler::pSampleLoops; |
using DLS::Sampler::pSampleLoops; |
437 |
|
|
438 |
// own methods |
// own methods |
439 |
double GetVelocityAttenuation(uint8_t MIDIKeyVelocity); |
double GetVelocityAttenuation(uint8_t MIDIKeyVelocity); |
450 |
void SetVCFVelocityScale(uint8_t scaling); |
void SetVCFVelocityScale(uint8_t scaling); |
451 |
Region* GetParent() const; |
Region* GetParent() const; |
452 |
// derived methods |
// derived methods |
453 |
DLS::Sampler::AddSampleLoop; |
using DLS::Sampler::AddSampleLoop; |
454 |
DLS::Sampler::DeleteSampleLoop; |
using DLS::Sampler::DeleteSampleLoop; |
455 |
// overridden methods |
// overridden methods |
456 |
virtual void SetGain(int32_t gain); |
virtual void SetGain(int32_t gain); |
457 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
637 |
friend class Instrument; |
friend class Instrument; |
638 |
}; |
}; |
639 |
|
|
640 |
|
/** Abstract base class for all MIDI rules. */ |
641 |
|
class MidiRule { |
642 |
|
public: |
643 |
|
virtual ~MidiRule() { } |
644 |
|
}; |
645 |
|
|
646 |
|
/** MIDI rule for triggering notes by control change events. */ |
647 |
|
class MidiRuleCtrlTrigger : public MidiRule { |
648 |
|
public: |
649 |
|
uint8_t ControllerNumber; ///< MIDI controller number. |
650 |
|
uint8_t Triggers; ///< Number of triggers. |
651 |
|
struct trigger_t { |
652 |
|
uint8_t TriggerPoint; ///< The CC value to pass for the note to be triggered. |
653 |
|
bool Descending; ///< If the change in CC value should be downwards. |
654 |
|
uint8_t VelSensitivity; ///< How sensitive the velocity should be to the speed of the controller change. |
655 |
|
uint8_t Key; ///< Key to trigger. |
656 |
|
bool NoteOff; ///< If a note off should be triggered instead of a note on. |
657 |
|
uint8_t Velocity; ///< Velocity of the note to trigger. 255 means that velocity should depend on the speed of the controller change. |
658 |
|
bool OverridePedal; ///< If a note off should be triggered even if the sustain pedal is down. |
659 |
|
} pTriggers[32]; |
660 |
|
|
661 |
|
protected: |
662 |
|
MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg); |
663 |
|
friend class Instrument; |
664 |
|
}; |
665 |
|
|
666 |
/** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */ |
/** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */ |
667 |
class Instrument : protected DLS::Instrument { |
class Instrument : protected DLS::Instrument { |
668 |
public: |
public: |
669 |
// derived attributes from DLS::Resource |
// derived attributes from DLS::Resource |
670 |
DLS::Resource::pInfo; |
using DLS::Resource::pInfo; |
671 |
DLS::Resource::pDLSID; |
using DLS::Resource::pDLSID; |
672 |
// derived attributes from DLS::Instrument |
// derived attributes from DLS::Instrument |
673 |
DLS::Instrument::IsDrum; |
using DLS::Instrument::IsDrum; |
674 |
DLS::Instrument::MIDIBank; |
using DLS::Instrument::MIDIBank; |
675 |
DLS::Instrument::MIDIBankCoarse; |
using DLS::Instrument::MIDIBankCoarse; |
676 |
DLS::Instrument::MIDIBankFine; |
using DLS::Instrument::MIDIBankFine; |
677 |
DLS::Instrument::MIDIProgram; |
using DLS::Instrument::MIDIProgram; |
678 |
DLS::Instrument::Regions; |
using DLS::Instrument::Regions; |
679 |
// own attributes |
// own attributes |
680 |
int32_t Attenuation; ///< in dB |
int32_t Attenuation; ///< in dB |
681 |
uint16_t EffectSend; |
uint16_t EffectSend; |
686 |
|
|
687 |
|
|
688 |
// derived methods from DLS::Resource |
// derived methods from DLS::Resource |
689 |
DLS::Resource::GetParent; |
using DLS::Resource::GetParent; |
690 |
// overridden methods |
// overridden methods |
691 |
Region* GetFirstRegion(); |
Region* GetFirstRegion(); |
692 |
Region* GetNextRegion(); |
Region* GetNextRegion(); |
695 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
696 |
// own methods |
// own methods |
697 |
Region* GetRegion(unsigned int Key); |
Region* GetRegion(unsigned int Key); |
698 |
|
MidiRule* GetMidiRule(int i); |
699 |
protected: |
protected: |
700 |
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 |
701 |
|
|
704 |
void UpdateRegionKeyTable(); |
void UpdateRegionKeyTable(); |
705 |
friend class File; |
friend class File; |
706 |
friend class Region; // so Region can call UpdateRegionKeyTable() |
friend class Region; // so Region can call UpdateRegionKeyTable() |
707 |
|
private: |
708 |
|
MidiRule** pMidiRules; |
709 |
}; |
}; |
710 |
|
|
711 |
/** @brief Group of Gigasampler objects |
/** @brief Group of Gigasampler objects |
748 |
static const DLS::version_t VERSION_3; |
static const DLS::version_t VERSION_3; |
749 |
|
|
750 |
// derived attributes from DLS::Resource |
// derived attributes from DLS::Resource |
751 |
DLS::Resource::pInfo; |
using DLS::Resource::pInfo; |
752 |
DLS::Resource::pDLSID; |
using DLS::Resource::pDLSID; |
753 |
// derived attributes from DLS::File |
// derived attributes from DLS::File |
754 |
DLS::File::pVersion; |
using DLS::File::pVersion; |
755 |
DLS::File::Instruments; |
using DLS::File::Instruments; |
756 |
|
|
757 |
// derived methods from DLS::Resource |
// derived methods from DLS::Resource |
758 |
DLS::Resource::GetParent; |
using DLS::Resource::GetParent; |
759 |
// derived methods from DLS::File |
// derived methods from DLS::File |
760 |
DLS::File::Save; |
using DLS::File::Save; |
761 |
|
using DLS::File::GetFileName; |
762 |
// overridden methods |
// overridden methods |
763 |
File(); |
File(); |
764 |
File(RIFF::File* pRIFF); |
File(RIFF::File* pRIFF); |