1 |
/* |
/* |
2 |
* Copyright (c) 2014-2016 Christian Schoenebeck |
* Copyright (c) 2014-2017 Christian Schoenebeck |
3 |
* |
* |
4 |
* http://www.linuxsampler.org |
* http://www.linuxsampler.org |
5 |
* |
* |
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 by InstrScriptIDType_T to initialize its constants at compile time. |
34 |
|
* |
35 |
|
* This macro is already ready to initialize additional members for |
36 |
|
* InstrScriptIDType_T (that is more than the currently two enum constants). |
37 |
|
* Just keep in mind that you also have to increase |
38 |
|
* INSTR_SCRIPT_EVENT_ID_RESERVED_BITS when you add more! |
39 |
|
* |
40 |
|
* @param x - sequential consecutive number (starting with zero) |
41 |
|
*/ |
42 |
|
#define INSTR_SCRIPT_ID_TYPE_FLAG(x) \ |
43 |
|
(x << (sizeof(pool_element_id_t) * 8 - INSTR_SCRIPT_EVENT_ID_RESERVED_BITS)) |
44 |
|
|
45 |
|
/** |
46 |
|
* These flags are used to distinguish the individual ID Types in script scope |
47 |
|
* from each other. They are added as most left bit(s) to each ID in script |
48 |
|
* scope. |
49 |
|
*/ |
50 |
|
enum InstrScriptIDType_T { |
51 |
|
/** |
52 |
|
* Used to mark IDs (in script scope) to actually be a MIDI event ID. |
53 |
|
*/ |
54 |
|
INSTR_SCRIPT_EVENT_ID_FLAG = INSTR_SCRIPT_ID_TYPE_FLAG(0), |
55 |
|
|
56 |
|
/** |
57 |
|
* Used to mark IDs (in script scope) to actually be a note ID. |
58 |
|
*/ |
59 |
|
INSTR_SCRIPT_NOTE_ID_FLAG = INSTR_SCRIPT_ID_TYPE_FLAG(1), |
60 |
|
}; |
61 |
|
|
62 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
63 |
|
|
64 |
|
#define EVENT_STATUS_INACTIVE 0 |
65 |
|
#define EVENT_STATUS_NOTE_QUEUE 1 |
66 |
|
|
67 |
|
enum { |
68 |
|
EVENT_PAR_NOTE = 1, |
69 |
|
EVENT_PAR_VELOCITY, |
70 |
|
EVENT_PAR_VOLUME, |
71 |
|
EVENT_PAR_TUNE, |
72 |
|
EVENT_PAR_0 = 1024, |
73 |
|
EVENT_PAR_1, |
74 |
|
EVENT_PAR_2, |
75 |
|
EVENT_PAR_3, |
76 |
|
}; |
77 |
|
|
78 |
|
enum { |
79 |
|
CALLBACK_STATUS_TERMINATED = 0, |
80 |
|
CALLBACK_STATUS_QUEUE = 1, |
81 |
|
CALLBACK_STATUS_RUNNING = (1 << 1) |
82 |
|
}; |
83 |
|
|
84 |
namespace LinuxSampler { |
namespace LinuxSampler { |
85 |
|
|
86 |
class AbstractEngineChannel; |
class AbstractEngineChannel; |
87 |
class InstrumentScript; |
struct InstrumentScript; |
88 |
|
|
89 |
|
/** @brief Convert IDs between script scope and engine internal scope. |
90 |
|
* |
91 |
|
* This class is used to translate unique IDs of events between script |
92 |
|
* scope and sampler engine internal scope, that is: |
93 |
|
* @code |
94 |
|
* int (script scope) -> event_id_t (engine internal scope) |
95 |
|
* int (script scope) -> note_id_t (engine internal scope) |
96 |
|
* @endcode |
97 |
|
* and vice versa: |
98 |
|
* @code |
99 |
|
* event_id_t (engine internal scope) -> int (script scope) |
100 |
|
* note_id_t (engine internal scope) -> int (script scope) |
101 |
|
* @endcode |
102 |
|
* This is required because engine internally i.e. notes and regular events |
103 |
|
* are using their own, separate ID generating pool, and their ID number |
104 |
|
* set may thus overlap and historically there were built-in script |
105 |
|
* functions in KSP which allow to pass both regular MIDI event IDs, as well |
106 |
|
* as Note IDs. So we must be able to distinguish between them in our |
107 |
|
* built-in script function implementations. |
108 |
|
* |
109 |
|
* @see INSTR_SCRIPT_EVENT_ID_RESERVED_BITS |
110 |
|
*/ |
111 |
|
class ScriptID { |
112 |
|
public: |
113 |
|
enum type_t { |
114 |
|
EVENT, ///< ID is actually an event ID |
115 |
|
NOTE, ///< ID is actually a note ID |
116 |
|
}; |
117 |
|
|
118 |
|
/** |
119 |
|
* Construct a ScriptID object with an ID from script scope. |
120 |
|
*/ |
121 |
|
ScriptID(uint id) : m_id(id) {} |
122 |
|
|
123 |
|
/** |
124 |
|
* Returns a ScriptID object constructed with an event ID from engine |
125 |
|
* internal scope. |
126 |
|
*/ |
127 |
|
inline static ScriptID fromEventID(event_id_t id) { |
128 |
|
return ScriptID(INSTR_SCRIPT_EVENT_ID_FLAG | id); |
129 |
|
} |
130 |
|
|
131 |
|
/** |
132 |
|
* Returns a ScriptID object constructed with a note ID from engine |
133 |
|
* internal scope. |
134 |
|
*/ |
135 |
|
inline static ScriptID fromNoteID(note_id_t id) { |
136 |
|
return ScriptID(INSTR_SCRIPT_NOTE_ID_FLAG | id); |
137 |
|
} |
138 |
|
|
139 |
|
/** |
140 |
|
* Whether the ID reflected by this ScriptID object is actually a note |
141 |
|
* ID or rather an event ID. |
142 |
|
*/ |
143 |
|
inline type_t type() const { |
144 |
|
return (m_id & INSTR_SCRIPT_NOTE_ID_FLAG) ? NOTE : EVENT; |
145 |
|
} |
146 |
|
|
147 |
|
inline bool isNoteID() const { |
148 |
|
return type() == NOTE; |
149 |
|
} |
150 |
|
|
151 |
|
inline bool isEventID() const { |
152 |
|
return type() == EVENT; |
153 |
|
} |
154 |
|
|
155 |
|
/** |
156 |
|
* Returns event ID (for engine internal scope) of the ID reflected by |
157 |
|
* this ScriptID object, it returns 0 (being an invalid ID) if the ID |
158 |
|
* reflected by this ScriptID object is not an event ID. |
159 |
|
*/ |
160 |
|
inline event_id_t eventID() const { |
161 |
|
switch (type()) { |
162 |
|
case EVENT: return m_id; |
163 |
|
default: return 0; // not an event id, return invalid ID |
164 |
|
} |
165 |
|
} |
166 |
|
|
167 |
|
/** |
168 |
|
* Returns note ID (for engine internal scope) of the ID reflected by |
169 |
|
* this ScriptID object, it returns 0 (being an invalid ID) if the ID |
170 |
|
* reflected by this ScriptID object is not a note ID. |
171 |
|
*/ |
172 |
|
inline note_id_t noteID() const { |
173 |
|
switch (type()) { |
174 |
|
case NOTE: return ~INSTR_SCRIPT_NOTE_ID_FLAG & m_id; |
175 |
|
default: return 0; // not a note id, return invalid ID |
176 |
|
} |
177 |
|
} |
178 |
|
|
179 |
|
/** |
180 |
|
* Integer cast operator, which returns an ID number of this ScripID |
181 |
|
* object intended for script scope. |
182 |
|
*/ |
183 |
|
inline operator uint() const { |
184 |
|
return m_id; |
185 |
|
} |
186 |
|
|
187 |
|
private: |
188 |
|
uint m_id; |
189 |
|
}; |
190 |
|
|
191 |
/** @brief List of Event IDs. |
/** @brief List of Event IDs. |
192 |
* |
* |
260 |
std::map<String,VMIntRelPtr*> builtInIntVariables() OVERRIDE; |
std::map<String,VMIntRelPtr*> builtInIntVariables() OVERRIDE; |
261 |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
262 |
std::map<String,int> builtInConstIntVariables() OVERRIDE; |
std::map<String,int> builtInConstIntVariables() OVERRIDE; |
263 |
|
std::map<String,VMDynVar*> builtInDynamicVariables() OVERRIDE; |
264 |
protected: |
protected: |
265 |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
266 |
|
|
267 |
// buil-in script variables |
// built-in script variables |
268 |
VMInt8Array m_CC; |
VMInt8Array m_CC; |
269 |
VMInt8RelPtr m_CC_NUM; |
VMInt8RelPtr m_CC_NUM; |
270 |
VMIntRelPtr m_EVENT_ID; |
VMIntRelPtr m_EVENT_ID; |
273 |
VMInt8Array m_KEY_DOWN; |
VMInt8Array m_KEY_DOWN; |
274 |
//VMIntArray m_POLY_AT; //TODO: ... |
//VMIntArray m_POLY_AT; //TODO: ... |
275 |
//int m_POLY_AT_NUM; //TODO: ... |
//int m_POLY_AT_NUM; //TODO: ... |
276 |
|
VMIntRelPtr m_NI_CALLBACK_TYPE; |
277 |
|
VMIntRelPtr m_NKSP_IGNORE_WAIT; |
278 |
|
VMIntRelPtr m_NKSP_CALLBACK_PARENT_ID; |
279 |
|
|
280 |
// buil-in script functions |
// built-in script functions |
281 |
InstrumentScriptVMFunction_play_note m_fnPlayNote; |
InstrumentScriptVMFunction_play_note m_fnPlayNote; |
282 |
InstrumentScriptVMFunction_set_controller m_fnSetController; |
InstrumentScriptVMFunction_set_controller m_fnSetController; |
283 |
InstrumentScriptVMFunction_ignore_event m_fnIgnoreEvent; |
InstrumentScriptVMFunction_ignore_event m_fnIgnoreEvent; |
286 |
InstrumentScriptVMFunction_set_event_mark m_fnSetEventMark; |
InstrumentScriptVMFunction_set_event_mark m_fnSetEventMark; |
287 |
InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark; |
InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark; |
288 |
InstrumentScriptVMFunction_by_marks m_fnByMarks; |
InstrumentScriptVMFunction_by_marks m_fnByMarks; |
289 |
|
InstrumentScriptVMFunction_change_vol m_fnChangeVol; |
290 |
|
InstrumentScriptVMFunction_change_vol_time m_fnChangeVolTime; |
291 |
|
InstrumentScriptVMFunction_change_tune m_fnChangeTune; |
292 |
|
InstrumentScriptVMFunction_change_tune_time m_fnChangeTuneTime; |
293 |
|
InstrumentScriptVMFunction_change_pan m_fnChangePan; |
294 |
|
InstrumentScriptVMFunction_change_pan_time m_fnChangePanTime; |
295 |
|
InstrumentScriptVMFunction_change_pan_curve m_fnChangePanCurve; |
296 |
|
InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff; |
297 |
|
InstrumentScriptVMFunction_change_reso m_fnChangeReso; |
298 |
|
InstrumentScriptVMFunction_change_attack m_fnChangeAttack; |
299 |
|
InstrumentScriptVMFunction_change_decay m_fnChangeDecay; |
300 |
|
InstrumentScriptVMFunction_change_sustain m_fnChangeSustain; |
301 |
|
InstrumentScriptVMFunction_change_release m_fnChangeRelease; |
302 |
|
InstrumentScriptVMFunction_change_amp_lfo_depth m_fnChangeAmpLFODepth; |
303 |
|
InstrumentScriptVMFunction_change_amp_lfo_freq m_fnChangeAmpLFOFreq; |
304 |
|
InstrumentScriptVMFunction_change_pitch_lfo_depth m_fnChangePitchLFODepth; |
305 |
|
InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq; |
306 |
|
InstrumentScriptVMFunction_change_note m_fnChangeNote; |
307 |
|
InstrumentScriptVMFunction_change_velo m_fnChangeVelo; |
308 |
|
InstrumentScriptVMFunction_fork m_fnFork; |
309 |
|
InstrumentScriptVMFunction_event_status m_fnEventStatus; |
310 |
|
InstrumentScriptVMFunction_wait m_fnWait2; |
311 |
|
InstrumentScriptVMFunction_stop_wait m_fnStopWait; |
312 |
|
InstrumentScriptVMFunction_abort m_fnAbort; |
313 |
|
InstrumentScriptVMFunction_fade_in m_fnFadeIn; |
314 |
|
InstrumentScriptVMFunction_fade_out m_fnFadeOut; |
315 |
|
InstrumentScriptVMFunction_change_vol_curve m_fnChangeVolCurve; |
316 |
|
InstrumentScriptVMFunction_change_tune_curve m_fnChangeTuneCurve; |
317 |
|
InstrumentScriptVMFunction_get_event_par m_fnGetEventPar; |
318 |
|
InstrumentScriptVMFunction_set_event_par m_fnSetEventPar; |
319 |
|
InstrumentScriptVMFunction_change_play_pos m_fnChangePlayPos; |
320 |
|
InstrumentScriptVMFunction_callback_status m_fnCallbackStatus; |
321 |
|
InstrumentScriptVMDynVar_ENGINE_UPTIME m_varEngineUptime; |
322 |
|
InstrumentScriptVMDynVar_NI_CALLBACK_ID m_varCallbackID; |
323 |
|
InstrumentScriptVMDynVar_ALL_EVENTS m_varAllEvents; |
324 |
|
InstrumentScriptVMDynVar_NKSP_CALLBACK_CHILD_ID m_varCallbackChildID; |
325 |
|
|
326 |
friend class InstrumentScriptVMFunction_play_note; |
friend class InstrumentScriptVMFunction_play_note; |
327 |
friend class InstrumentScriptVMFunction_set_controller; |
friend class InstrumentScriptVMFunction_set_controller; |
331 |
friend class InstrumentScriptVMFunction_set_event_mark; |
friend class InstrumentScriptVMFunction_set_event_mark; |
332 |
friend class InstrumentScriptVMFunction_delete_event_mark; |
friend class InstrumentScriptVMFunction_delete_event_mark; |
333 |
friend class InstrumentScriptVMFunction_by_marks; |
friend class InstrumentScriptVMFunction_by_marks; |
334 |
|
friend class InstrumentScriptVMFunction_change_vol; |
335 |
|
friend class InstrumentScriptVMFunction_change_vol_time; |
336 |
|
friend class InstrumentScriptVMFunction_change_tune; |
337 |
|
friend class InstrumentScriptVMFunction_change_tune_time; |
338 |
|
friend class InstrumentScriptVMFunction_change_pan; |
339 |
|
friend class InstrumentScriptVMFunction_change_pan_time; |
340 |
|
friend class InstrumentScriptVMFunction_change_pan_curve; |
341 |
|
friend class InstrumentScriptVMFunction_change_cutoff; |
342 |
|
friend class InstrumentScriptVMFunction_change_reso; |
343 |
|
friend class InstrumentScriptVMFunction_change_attack; |
344 |
|
friend class InstrumentScriptVMFunction_change_decay; |
345 |
|
friend class InstrumentScriptVMFunction_change_release; |
346 |
|
friend class InstrumentScriptVMFunction_change_sustain; |
347 |
|
friend class VMChangeSynthParamFunction; |
348 |
|
friend class InstrumentScriptVMFunction_change_amp_lfo_depth; |
349 |
|
friend class InstrumentScriptVMFunction_change_amp_lfo_freq; |
350 |
|
friend class InstrumentScriptVMFunction_change_pitch_lfo_depth; |
351 |
|
friend class InstrumentScriptVMFunction_change_pitch_lfo_freq; |
352 |
|
friend class VMChangeFadeCurveFunction; |
353 |
|
friend class InstrumentScriptVMFunction_fade_in; |
354 |
|
friend class InstrumentScriptVMFunction_fade_out; |
355 |
|
friend class InstrumentScriptVMFunction_get_event_par; |
356 |
|
friend class InstrumentScriptVMFunction_set_event_par; |
357 |
|
friend class InstrumentScriptVMFunction_change_note; |
358 |
|
friend class InstrumentScriptVMFunction_change_velo; |
359 |
|
friend class InstrumentScriptVMFunction_change_play_pos; |
360 |
|
friend class InstrumentScriptVMFunction_event_status; |
361 |
|
friend class InstrumentScriptVMFunction_wait; |
362 |
|
friend class InstrumentScriptVMFunction_stop_wait; |
363 |
|
friend class InstrumentScriptVMFunction_abort; |
364 |
|
friend class InstrumentScriptVMFunction_fork; |
365 |
|
friend class InstrumentScriptVMFunction_callback_status; |
366 |
|
friend class InstrumentScriptVMDynVar_ENGINE_UPTIME; |
367 |
|
friend class InstrumentScriptVMDynVar_NI_CALLBACK_ID; |
368 |
|
friend class InstrumentScriptVMDynVar_ALL_EVENTS; |
369 |
|
friend class InstrumentScriptVMDynVar_NKSP_CALLBACK_CHILD_ID; |
370 |
}; |
}; |
371 |
|
|
372 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |