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-2012 by Christian Schoenebeck * |
* Copyright (C) 2003-2013 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 * |
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(); |
458 |
|
virtual void CopyAssign(const DimensionRegion* orig); |
459 |
protected: |
protected: |
460 |
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. |
461 |
DimensionRegion(Region* pParent, RIFF::List* _3ewl); |
DimensionRegion(Region* pParent, RIFF::List* _3ewl); |
629 |
// overridden methods |
// overridden methods |
630 |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
631 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
632 |
|
virtual void CopyAssign(const Region* orig); |
633 |
protected: |
protected: |
634 |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
635 |
void LoadDimensionRegions(RIFF::List* rgn); |
void LoadDimensionRegions(RIFF::List* rgn); |
643 |
class MidiRule { |
class MidiRule { |
644 |
public: |
public: |
645 |
virtual ~MidiRule() { } |
virtual ~MidiRule() { } |
646 |
|
protected: |
647 |
|
virtual void UpdateChunks(uint8_t* pData) const = 0; |
648 |
|
friend class Instrument; |
649 |
}; |
}; |
650 |
|
|
651 |
/** MIDI rule for triggering notes by control change events. */ |
/** MIDI rule for triggering notes by control change events. */ |
665 |
|
|
666 |
protected: |
protected: |
667 |
MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg); |
MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg); |
668 |
|
MidiRuleCtrlTrigger(); |
669 |
|
void UpdateChunks(uint8_t* pData) const; |
670 |
|
friend class Instrument; |
671 |
|
}; |
672 |
|
|
673 |
|
/** MIDI rule for instruments with legato samples. */ |
674 |
|
class MidiRuleLegato : public MidiRule { |
675 |
|
public: |
676 |
|
uint8_t LegatoSamples; ///< Number of legato samples per key in each direction (always 12) |
677 |
|
bool BypassUseController; ///< If a controller should be used to bypass the sustain note |
678 |
|
uint8_t BypassKey; ///< Key to be used to bypass the sustain note |
679 |
|
uint8_t BypassController; ///< Controller to be used to bypass the sustain note |
680 |
|
uint16_t ThresholdTime; ///< Maximum time (ms) between two notes that should be played legato |
681 |
|
uint16_t ReleaseTime; ///< Release time |
682 |
|
range_t KeyRange; ///< Key range for legato notes |
683 |
|
uint8_t ReleaseTriggerKey; ///< Key triggering release samples |
684 |
|
uint8_t AltSustain1Key; ///< Key triggering alternate sustain samples |
685 |
|
uint8_t AltSustain2Key; ///< Key triggering a second set of alternate sustain samples |
686 |
|
|
687 |
|
protected: |
688 |
|
MidiRuleLegato(RIFF::Chunk* _3ewg); |
689 |
|
MidiRuleLegato(); |
690 |
|
void UpdateChunks(uint8_t* pData) const; |
691 |
|
friend class Instrument; |
692 |
|
}; |
693 |
|
|
694 |
|
/** MIDI rule to automatically cycle through specified sequences of different articulations. The instrument must be using the smartmidi dimension. */ |
695 |
|
class MidiRuleAlternator : public MidiRule { |
696 |
|
public: |
697 |
|
uint8_t Articulations; ///< Number of articulations in the instrument |
698 |
|
String pArticulations[32]; ///< Names of the articulations |
699 |
|
|
700 |
|
range_t PlayRange; ///< Key range of the playable keys in the instrument |
701 |
|
|
702 |
|
uint8_t Patterns; ///< Number of alternator patterns |
703 |
|
struct pattern_t { |
704 |
|
String Name; ///< Name of the pattern |
705 |
|
int Size; ///< Number of steps in the pattern |
706 |
|
const uint8_t& operator[](int i) const { /// Articulation to play |
707 |
|
return data[i]; |
708 |
|
} |
709 |
|
uint8_t& operator[](int i) { |
710 |
|
return data[i]; |
711 |
|
} |
712 |
|
private: |
713 |
|
uint8_t data[32]; |
714 |
|
} pPatterns[32]; ///< A pattern is a sequence of articulation numbers |
715 |
|
|
716 |
|
typedef enum { |
717 |
|
selector_none, |
718 |
|
selector_key_switch, |
719 |
|
selector_controller |
720 |
|
} selector_t; |
721 |
|
selector_t Selector; ///< Method by which pattern is chosen |
722 |
|
range_t KeySwitchRange; ///< Key range for key switch selector |
723 |
|
uint8_t Controller; ///< CC number for controller selector |
724 |
|
|
725 |
|
bool Polyphonic; ///< If alternator should step forward only when all notes are off |
726 |
|
bool Chained; ///< If all patterns should be chained together |
727 |
|
|
728 |
|
protected: |
729 |
|
MidiRuleAlternator(RIFF::Chunk* _3ewg); |
730 |
|
MidiRuleAlternator(); |
731 |
|
void UpdateChunks(uint8_t* pData) const; |
732 |
|
friend class Instrument; |
733 |
|
}; |
734 |
|
|
735 |
|
/** A MIDI rule not yet implemented by libgig. */ |
736 |
|
class MidiRuleUnknown : public MidiRule { |
737 |
|
protected: |
738 |
|
MidiRuleUnknown() { } |
739 |
|
void UpdateChunks(uint8_t* pData) const { } |
740 |
friend class Instrument; |
friend class Instrument; |
741 |
}; |
}; |
742 |
|
|
770 |
Region* AddRegion(); |
Region* AddRegion(); |
771 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
772 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
773 |
|
virtual void CopyAssign(const Instrument* orig); |
774 |
// own methods |
// own methods |
775 |
Region* GetRegion(unsigned int Key); |
Region* GetRegion(unsigned int Key); |
776 |
MidiRule* GetMidiRule(int i); |
MidiRule* GetMidiRule(int i); |
777 |
|
MidiRuleCtrlTrigger* AddMidiRuleCtrlTrigger(); |
778 |
|
MidiRuleLegato* AddMidiRuleLegato(); |
779 |
|
MidiRuleAlternator* AddMidiRuleAlternator(); |
780 |
|
void DeleteMidiRule(int i); |
781 |
protected: |
protected: |
782 |
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 |
783 |
|
|
820 |
friend class File; |
friend class File; |
821 |
private: |
private: |
822 |
File* pFile; |
File* pFile; |
823 |
RIFF::Chunk* pNameChunk; |
RIFF::Chunk* pNameChunk; ///< '3gnm' chunk |
824 |
}; |
}; |
825 |
|
|
826 |
/** Parses Gigasampler files and provides abstract access to the data. */ |
/** Parses Gigasampler files and provides abstract access to the data. */ |
852 |
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. |
853 |
Instrument* GetInstrument(uint index, progress_t* pProgress = NULL); |
Instrument* GetInstrument(uint index, progress_t* pProgress = NULL); |
854 |
Instrument* AddInstrument(); |
Instrument* AddInstrument(); |
855 |
|
Instrument* AddDuplicateInstrument(const Instrument* orig); |
856 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
857 |
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. |
858 |
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. |