34 |
#include "../common/SampleFile.h" |
#include "../common/SampleFile.h" |
35 |
#include "../common/SampleManager.h" |
#include "../common/SampleManager.h" |
36 |
#include "../../common/ArrayList.h" |
#include "../../common/ArrayList.h" |
37 |
|
#include "../../common/optional.h" |
38 |
|
#include "../../common/Exception.h" |
39 |
|
#include "../../common/Path.h" |
40 |
|
|
41 |
#define TRIGGER_ATTACK ((unsigned char) (1 << 0)) // 0x01 |
#define TRIGGER_ATTACK ((unsigned char) (1 << 0)) // 0x01 |
42 |
#define TRIGGER_RELEASE ((unsigned char) (1 << 1)) // 0x02 |
#define TRIGGER_RELEASE ((unsigned char) (1 << 1)) // 0x02 |
43 |
#define TRIGGER_FIRST ((unsigned char) (1 << 2)) // 0x04 |
#define TRIGGER_FIRST ((unsigned char) (1 << 2)) // 0x04 |
44 |
#define TRIGGER_LEGATO ((unsigned char) (1 << 3)) // 0x08 |
#define TRIGGER_LEGATO ((unsigned char) (1 << 3)) // 0x08 |
45 |
|
|
46 |
|
#define optional LinuxSampler::optional |
47 |
|
|
48 |
namespace sfz |
namespace sfz |
49 |
{ |
{ |
50 |
// Forward declarations |
// Forward declarations |
56 |
class LookupTable; |
class LookupTable; |
57 |
class SampleManager; |
class SampleManager; |
58 |
|
|
59 |
|
class Exception : public LinuxSampler::Exception { |
60 |
|
public: |
61 |
|
}; |
62 |
|
|
63 |
class Sample : public LinuxSampler::SampleFileBase<Region> { |
class Sample : public LinuxSampler::SampleFileBase<Region> { |
64 |
private: |
private: |
65 |
int End; |
int End; |
89 |
friend class SampleManager; |
friend class SampleManager; |
90 |
}; |
}; |
91 |
|
|
92 |
|
/** @brief Real-time instrument script (sfz format extension). |
93 |
|
* |
94 |
|
* Real-time instrument scripts are user supplied small programs which can |
95 |
|
* be used by instrument designers to create custom behaviors and features |
96 |
|
* not available in the stock sampler engine. Features which might be very |
97 |
|
* exotic or specific for the respective instrument. |
98 |
|
* |
99 |
|
* This is an extension of the sfz format, thus a feature which is currently |
100 |
|
* only supported by LinuxSampler. Scripts will not load with other sfz |
101 |
|
* players right now. The dedicated sfz opcode for this purpose is: |
102 |
|
* @code |
103 |
|
* script=path/to/scriptfile |
104 |
|
* @endcode |
105 |
|
* This opcode is recommended to appear in the sfz file's global section, |
106 |
|
* however ATM the precise location of the opcode is simply ignored. |
107 |
|
* Currently there may only be one @c script opcode per instrument. Further |
108 |
|
* @c script opcodes will currently simply be ignored. In future using |
109 |
|
* multiple @c script opcodes will be supported as well, the scripts will |
110 |
|
* then be executed by the sampler in the order in which their opcodes |
111 |
|
* appeared in their sfz file. |
112 |
|
* |
113 |
|
* You find more informations about Instrument Scripts on the LinuxSampler |
114 |
|
* documentation site: |
115 |
|
* |
116 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/">About Instrument Scripts in General</a> |
117 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language">Introduction to the NKSP Script Language</a> |
118 |
|
* - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a> |
119 |
|
*/ |
120 |
|
class Script { |
121 |
|
public: |
122 |
|
enum Language_t { |
123 |
|
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. |
124 |
|
}; |
125 |
|
|
126 |
|
Script(LinuxSampler::Path path); |
127 |
|
Script(String path); |
128 |
|
virtual ~Script(); |
129 |
|
|
130 |
|
String Name() const; ///< Name of the script (currently returns the file's file name without its path). |
131 |
|
Language_t Language(); ///< Programming language and dialect the script was written in (currently always returns LANGUAGE_NKSP). |
132 |
|
String GetSourceCode(); ///< Reads the script's source code from its script file and returns the entire source code as String. |
133 |
|
private: |
134 |
|
LinuxSampler::Path m_path; |
135 |
|
}; |
136 |
|
|
137 |
// Enumerations |
// Enumerations |
138 |
enum sw_vel_t { VEL_CURRENT, VEL_PREVIOUS }; |
enum sw_vel_t { VEL_CURRENT, VEL_PREVIOUS }; |
139 |
enum off_mode_t { OFF_FAST, OFF_NORMAL }; |
enum off_mode_t { OFF_FAST, OFF_NORMAL }; |
196 |
}; |
}; |
197 |
|
|
198 |
///////////////////////////////////////////////////////////// |
///////////////////////////////////////////////////////////// |
|
// class Exception |
|
|
|
|
|
class Exception : |
|
|
public std::runtime_error |
|
|
{ |
|
|
public: |
|
|
Exception(const std::string& msg) : |
|
|
runtime_error(msg) |
|
|
{ |
|
|
} |
|
|
|
|
|
std::string Message() |
|
|
{ |
|
|
return what(); |
|
|
} |
|
|
|
|
|
void PrintMessage() |
|
|
{ |
|
|
std::cerr << what() << std::endl << std::flush; |
|
|
} |
|
|
}; |
|
|
|
|
|
///////////////////////////////////////////////////////////// |
|
|
// class optional |
|
|
|
|
|
// Handy class nicked from LinuxSampler... |
|
|
// Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck |
|
|
// Copyright (C) 2005, 2006 Christian Schoenebeck |
|
|
|
|
|
class optional_base |
|
|
{ |
|
|
public: |
|
|
class nothing_t { public: nothing_t() {} }; |
|
|
static const nothing_t nothing; |
|
|
}; |
|
|
|
|
|
template<class T> |
|
|
class optional : |
|
|
public optional_base |
|
|
{ |
|
|
public: |
|
|
optional() |
|
|
{ |
|
|
initialized = false; |
|
|
} |
|
|
|
|
|
optional(T data) |
|
|
{ |
|
|
this->data = data; |
|
|
initialized = true; |
|
|
} |
|
|
|
|
|
optional(nothing_t) |
|
|
{ |
|
|
initialized = false; |
|
|
} |
|
|
|
|
|
template <class T_inner> |
|
|
optional(T_inner data) |
|
|
{ |
|
|
this->data = T(data); |
|
|
initialized = true; |
|
|
} |
|
|
|
|
|
const T& get() const throw (Exception) |
|
|
{ |
|
|
if (!initialized) throw Exception("optional variable not initialized"); |
|
|
return data; |
|
|
} |
|
|
|
|
|
T& get() throw (Exception) |
|
|
{ |
|
|
if (!initialized) throw Exception("optional variable not initialized"); |
|
|
return data; |
|
|
} |
|
|
|
|
|
void unset() |
|
|
{ |
|
|
initialized = false; |
|
|
} |
|
|
|
|
|
optional& operator =(const optional& arg) throw (Exception) |
|
|
{ |
|
|
if (!arg.initialized) { |
|
|
initialized = false; |
|
|
} else { |
|
|
this->data = arg.data; |
|
|
initialized = true; |
|
|
} |
|
|
return *this; |
|
|
} |
|
|
|
|
|
optional& operator =(const T& arg) |
|
|
{ |
|
|
this->data = arg; |
|
|
initialized = true; |
|
|
return *this; |
|
|
} |
|
|
|
|
|
const T& operator *() const throw (Exception) { return get(); } |
|
|
T& operator *() throw (Exception) { return get(); } |
|
|
|
|
|
const T* operator ->() const throw (Exception) |
|
|
{ |
|
|
if (!initialized) throw Exception("optional variable not initialized"); |
|
|
return &data; |
|
|
} |
|
|
|
|
|
T* operator ->() throw (Exception) |
|
|
{ |
|
|
if (!initialized) throw Exception("optional variable not initialized"); |
|
|
return &data; |
|
|
} |
|
|
|
|
|
operator bool() const { return initialized; } |
|
|
bool operator !() const { return !initialized; } |
|
|
|
|
|
protected: |
|
|
T data; |
|
|
bool initialized; |
|
|
}; |
|
|
|
|
|
///////////////////////////////////////////////////////////// |
|
199 |
// class Articulation |
// class Articulation |
200 |
|
|
201 |
// Articulation containing all performance parameters for synthesis |
// Articulation containing all performance parameters for synthesis |
645 |
/// List of Regions belonging to this Instrument |
/// List of Regions belonging to this Instrument |
646 |
std::vector<Region*> regions; |
std::vector<Region*> regions; |
647 |
::LinuxSampler::ArrayList<Curve> curves; |
::LinuxSampler::ArrayList<Curve> curves; |
648 |
|
std::vector<Script> scripts; |
649 |
|
|
650 |
friend class File; |
friend class File; |
651 |
friend class Query; |
friend class Query; |