16 |
#include "Event.h" |
#include "Event.h" |
17 |
#include "../../common/Pool.h" |
#include "../../common/Pool.h" |
18 |
#include "InstrumentScriptVMFunctions.h" |
#include "InstrumentScriptVMFunctions.h" |
19 |
|
#include "InstrumentScriptVMDynVars.h" |
20 |
|
|
21 |
|
/** |
22 |
|
* Amount of bits on the left hand side of all pool_element_id_t numbers (i.e. |
23 |
|
* event_id_t, note_id_t) being reserved for script VM implementation internal |
24 |
|
* purposes. |
25 |
|
* |
26 |
|
* Right now there is only one bit reserved, which allows the VM (and its |
27 |
|
* built-in functions) to distinguish user supplied @c Event IDs (event_id_t) |
28 |
|
* from @c Note IDs (note_id_t). |
29 |
|
*/ |
30 |
|
#define INSTR_SCRIPT_EVENT_ID_RESERVED_BITS 1 |
31 |
|
|
32 |
|
/** |
33 |
|
* Used to mark IDs (in script scope) to actually be a note ID. |
34 |
|
*/ |
35 |
|
#define INSTR_SCRIPT_NOTE_ID_FLAG (1 << (sizeof(pool_element_id_t) * 8 - 1)) |
36 |
|
|
37 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
38 |
|
|
39 |
|
#define EVENT_STATUS_INACTIVE 0 |
40 |
|
#define EVENT_STATUS_NOTE_QUEUE 1 |
41 |
|
|
42 |
namespace LinuxSampler { |
namespace LinuxSampler { |
43 |
|
|
44 |
class AbstractEngineChannel; |
class AbstractEngineChannel; |
45 |
class InstrumentScript; |
class InstrumentScript; |
46 |
|
|
47 |
|
/** @brief Convert IDs between script scope and engine internal scope. |
48 |
|
* |
49 |
|
* This class is used to translate unique IDs of events between script |
50 |
|
* scope and sampler engine internal scope, that is: |
51 |
|
* @code |
52 |
|
* int (script scope) -> event_id_t (engine internal scope) |
53 |
|
* int (script scope) -> note_id_t (engine internal scope) |
54 |
|
* @endcode |
55 |
|
* and vice versa: |
56 |
|
* @code |
57 |
|
* event_id_t (engine internal scope) -> int (script scope) |
58 |
|
* note_id_t (engine internal scope) -> int (script scope) |
59 |
|
* @endcode |
60 |
|
* This is required because engine internally notes and regular events are |
61 |
|
* using their own, separate ID generating pool, and their ID number set |
62 |
|
* may thus overlap. |
63 |
|
* |
64 |
|
* @see INSTR_SCRIPT_EVENT_ID_RESERVED_BITS |
65 |
|
*/ |
66 |
|
class ScriptID { |
67 |
|
public: |
68 |
|
enum type_t { |
69 |
|
EVENT, ///< ID is actually an event ID |
70 |
|
NOTE, ///< ID is actually a note ID |
71 |
|
}; |
72 |
|
|
73 |
|
/** |
74 |
|
* Construct a ScriptID object with an ID from script scope. |
75 |
|
*/ |
76 |
|
ScriptID(uint id) : m_id(id) {} |
77 |
|
|
78 |
|
/** |
79 |
|
* Returns a ScriptID object constructed with an event ID from engine |
80 |
|
* internal scope. |
81 |
|
*/ |
82 |
|
inline static ScriptID fromEventID(event_id_t id) { |
83 |
|
return ScriptID(id); |
84 |
|
} |
85 |
|
|
86 |
|
/** |
87 |
|
* Returns a ScriptID object constructed with a note ID from engine |
88 |
|
* internal scope. |
89 |
|
*/ |
90 |
|
inline static ScriptID fromNoteID(note_id_t id) { |
91 |
|
return ScriptID(INSTR_SCRIPT_NOTE_ID_FLAG | id); |
92 |
|
} |
93 |
|
|
94 |
|
/** |
95 |
|
* Whether the ID reflected by this ScriptID object is actually a note |
96 |
|
* ID or rather an event ID. |
97 |
|
*/ |
98 |
|
inline type_t type() const { |
99 |
|
return (m_id & INSTR_SCRIPT_NOTE_ID_FLAG) ? NOTE : EVENT; |
100 |
|
} |
101 |
|
|
102 |
|
inline bool isNoteID() const { |
103 |
|
return type() == NOTE; |
104 |
|
} |
105 |
|
|
106 |
|
inline bool isEventID() const { |
107 |
|
return type() == EVENT; |
108 |
|
} |
109 |
|
|
110 |
|
/** |
111 |
|
* Returns event ID (for engine internal scope) of the ID reflected by |
112 |
|
* this ScriptID object, it returns 0 (being an invalid ID) if the ID |
113 |
|
* reflected by this ScriptID object is not an event ID. |
114 |
|
*/ |
115 |
|
inline event_id_t eventID() const { |
116 |
|
switch (type()) { |
117 |
|
case EVENT: return m_id; |
118 |
|
default: return 0; // not an event id, return invalid ID |
119 |
|
} |
120 |
|
} |
121 |
|
|
122 |
|
/** |
123 |
|
* Returns note ID (for engine internal scope) of the ID reflected by |
124 |
|
* this ScriptID object, it returns 0 (being an invalid ID) if the ID |
125 |
|
* reflected by this ScriptID object is not a note ID. |
126 |
|
*/ |
127 |
|
inline note_id_t noteID() const { |
128 |
|
switch (type()) { |
129 |
|
case NOTE: return ~INSTR_SCRIPT_NOTE_ID_FLAG & m_id; |
130 |
|
default: return 0; // not a note id, return invalid ID |
131 |
|
} |
132 |
|
} |
133 |
|
|
134 |
|
/** |
135 |
|
* Integer cast operator, which returns an ID number of this ScripID |
136 |
|
* object intended for script scope. |
137 |
|
*/ |
138 |
|
inline operator uint() const { |
139 |
|
return m_id; |
140 |
|
} |
141 |
|
|
142 |
|
private: |
143 |
|
uint m_id; |
144 |
|
}; |
145 |
|
|
146 |
/** @brief List of Event IDs. |
/** @brief List of Event IDs. |
147 |
* |
* |
148 |
* Used for built-in script functions: |
* Used for built-in script functions: |
215 |
std::map<String,VMIntRelPtr*> builtInIntVariables() OVERRIDE; |
std::map<String,VMIntRelPtr*> builtInIntVariables() OVERRIDE; |
216 |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
217 |
std::map<String,int> builtInConstIntVariables() OVERRIDE; |
std::map<String,int> builtInConstIntVariables() OVERRIDE; |
218 |
|
std::map<String,VMDynVar*> builtInDynamicVariables() OVERRIDE; |
219 |
protected: |
protected: |
220 |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
221 |
|
|
238 |
InstrumentScriptVMFunction_set_event_mark m_fnSetEventMark; |
InstrumentScriptVMFunction_set_event_mark m_fnSetEventMark; |
239 |
InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark; |
InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark; |
240 |
InstrumentScriptVMFunction_by_marks m_fnByMarks; |
InstrumentScriptVMFunction_by_marks m_fnByMarks; |
241 |
|
InstrumentScriptVMFunction_change_vol m_fnChangeVol; |
242 |
|
InstrumentScriptVMFunction_change_tune m_fnChangeTune; |
243 |
|
InstrumentScriptVMFunction_change_pan m_fnChangePan; |
244 |
|
InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff; |
245 |
|
InstrumentScriptVMFunction_change_reso m_fnChangeReso; |
246 |
|
InstrumentScriptVMFunction_event_status m_fnEventStatus; |
247 |
|
InstrumentScriptVMDynVar_ENGINE_UPTIME m_varEngineUptime; |
248 |
|
|
249 |
friend class InstrumentScriptVMFunction_play_note; |
friend class InstrumentScriptVMFunction_play_note; |
250 |
friend class InstrumentScriptVMFunction_set_controller; |
friend class InstrumentScriptVMFunction_set_controller; |
254 |
friend class InstrumentScriptVMFunction_set_event_mark; |
friend class InstrumentScriptVMFunction_set_event_mark; |
255 |
friend class InstrumentScriptVMFunction_delete_event_mark; |
friend class InstrumentScriptVMFunction_delete_event_mark; |
256 |
friend class InstrumentScriptVMFunction_by_marks; |
friend class InstrumentScriptVMFunction_by_marks; |
257 |
|
friend class InstrumentScriptVMFunction_change_vol; |
258 |
|
friend class InstrumentScriptVMFunction_change_tune; |
259 |
|
friend class InstrumentScriptVMFunction_change_pan; |
260 |
|
friend class InstrumentScriptVMFunction_change_cutoff; |
261 |
|
friend class InstrumentScriptVMFunction_change_reso; |
262 |
|
friend class InstrumentScriptVMFunction_event_status; |
263 |
|
friend class InstrumentScriptVMDynVar_ENGINE_UPTIME; |
264 |
}; |
}; |
265 |
|
|
266 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |