1 |
/* |
/* |
2 |
* Copyright (c) 2014-2017 Christian Schoenebeck |
* Copyright (c) 2014-2020 Christian Schoenebeck |
3 |
* |
* |
4 |
* http://www.linuxsampler.org |
* http://www.linuxsampler.org |
5 |
* |
* |
51 |
/** |
/** |
52 |
* Used to mark IDs (in script scope) to actually be a MIDI event ID. |
* 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), |
INSTR_SCRIPT_EVENT_ID_FLAG = INSTR_SCRIPT_ID_TYPE_FLAG(0LL), |
55 |
|
|
56 |
/** |
/** |
57 |
* Used to mark IDs (in script scope) to actually be a note ID. |
* 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), |
INSTR_SCRIPT_NOTE_ID_FLAG = INSTR_SCRIPT_ID_TYPE_FLAG(1LL), |
60 |
}; |
}; |
61 |
|
|
62 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
#define INSTR_SCRIPT_EVENT_GROUPS 28 |
118 |
/** |
/** |
119 |
* Construct a ScriptID object with an ID from script scope. |
* Construct a ScriptID object with an ID from script scope. |
120 |
*/ |
*/ |
121 |
ScriptID(uint id) : m_id(id) {} |
ScriptID(vmint id) : m_id(id) {} |
122 |
|
|
123 |
/** |
/** |
124 |
* Returns a ScriptID object constructed with an event ID from engine |
* Returns a ScriptID object constructed with an event ID from engine |
180 |
* Integer cast operator, which returns an ID number of this ScripID |
* Integer cast operator, which returns an ID number of this ScripID |
181 |
* object intended for script scope. |
* object intended for script scope. |
182 |
*/ |
*/ |
183 |
inline operator uint() const { |
inline operator vmint() const { |
184 |
return m_id; |
return m_id; |
185 |
} |
} |
186 |
|
|
187 |
private: |
private: |
188 |
uint m_id; |
vmint m_id; |
189 |
}; |
}; |
190 |
|
|
191 |
/** @brief List of Event IDs. |
/** @brief List of Event IDs. |
193 |
* Used for built-in script functions: |
* Used for built-in script functions: |
194 |
* by_marks(), set_event_mark(), delete_event_mark() |
* by_marks(), set_event_mark(), delete_event_mark() |
195 |
*/ |
*/ |
196 |
class EventGroup : protected ConstCapacityArray<int> { |
class EventGroup : protected ConstCapacityArray<vmint> { |
197 |
public: |
public: |
198 |
EventGroup() : ConstCapacityArray<int>(CONFIG_MAX_EVENTS_PER_FRAGMENT), m_script(NULL) {} |
EventGroup() : ConstCapacityArray<vmint>(CONFIG_MAX_EVENTS_PER_FRAGMENT), m_script(NULL) {} |
199 |
void insert(int eventID); |
void insert(vmint eventID); |
200 |
void erase(int eventID); |
void erase(vmint eventID); |
201 |
void setScript(InstrumentScript* pScript) { m_script = pScript; } |
void setScript(InstrumentScript* pScript) { m_script = pScript; } |
202 |
inline int size() const { return ConstCapacityArray<int>::size(); } |
inline size_t size() const { return ConstCapacityArray<vmint>::size(); } |
203 |
inline void clear() { ConstCapacityArray<int>::clear(); } |
inline void clear() { ConstCapacityArray<vmint>::clear(); } |
204 |
inline int& operator[](uint index) { return ConstCapacityArray<int>::operator[](index); } |
inline vmint& operator[](ssize_t index) { return ConstCapacityArray<vmint>::operator[](index); } |
205 |
inline const int& operator[](uint index) const { return ConstCapacityArray<int>::operator[](index); } |
inline const vmint& operator[](ssize_t index) const { return ConstCapacityArray<vmint>::operator[](index); } |
206 |
protected: |
protected: |
207 |
InstrumentScript* m_script; |
InstrumentScript* m_script; |
208 |
}; |
}; |
226 |
VMEventHandler* handlerNote; ///< VM representation of script's MIDI note on callback or NULL if current script did not define such an event handler. |
VMEventHandler* handlerNote; ///< VM representation of script's MIDI note on callback or NULL if current script did not define such an event handler. |
227 |
VMEventHandler* handlerRelease; ///< VM representation of script's MIDI note off callback or NULL if current script did not define such an event handler. |
VMEventHandler* handlerRelease; ///< VM representation of script's MIDI note off callback or NULL if current script did not define such an event handler. |
228 |
VMEventHandler* handlerController; ///< VM representation of script's MIDI controller callback or NULL if current script did not define such an event handler. |
VMEventHandler* handlerController; ///< VM representation of script's MIDI controller callback or NULL if current script did not define such an event handler. |
229 |
|
VMEventHandler* handlerRpn; ///< VM representation of script's MIDI RPN event callback or NULL if current script did not define such an event handler. |
230 |
|
VMEventHandler* handlerNrpn; ///< VM representation of script's MIDI NRPN event callback or NULL if current script did not define such an event handler. |
231 |
Pool<ScriptEvent>* pEvents; ///< Pool of all available script execution instances. ScriptEvents available to be allocated from the Pool are currently unused / not executiong, whereas the ScriptEvents allocated on the list are currently suspended / have not finished execution yet (@see pKeyEvents). |
Pool<ScriptEvent>* pEvents; ///< Pool of all available script execution instances. ScriptEvents available to be allocated from the Pool are currently unused / not executiong, whereas the ScriptEvents allocated on the list are currently suspended / have not finished execution yet (@see pKeyEvents). |
232 |
RTList<ScriptEvent>* pKeyEvents[128]; ///< Stores previously finished executed "note on" script events for the respective active note/key as long as the key/note is active. This is however only done if there is a "note" script event handler and a "release" script event handler defined in the script and both handlers use (reference) polyphonic variables. If that is not the case, then this list is not used at all. So the purpose of pKeyEvents is only to implement preserving/passing polyphonic variable data from "on note .. end on" script block to the respective "on release .. end on" script block. |
RTList<ScriptEvent>* pKeyEvents[128]; ///< Stores previously finished executed "note on" script events for the respective active note/key as long as the key/note is active. This is however only done if there is a "note" script event handler and a "release" script event handler defined in the script and both handlers use (reference) polyphonic variables. If that is not the case, then this list is not used at all. So the purpose of pKeyEvents is only to implement preserving/passing polyphonic variable data from "on note .. end on" script block to the respective "on release .. end on" script block. |
233 |
RTAVLTree<ScriptEvent> suspendedEvents; ///< Contains pointers to all suspended events, sorted by time when those script events are to be resumed next. |
RTAVLTree<ScriptEvent> suspendedEvents; ///< Contains pointers to all suspended events, sorted by time when those script events are to be resumed next. |
259 |
InstrumentScriptVM(); |
InstrumentScriptVM(); |
260 |
VMExecStatus_t exec(VMParserContext* parserCtx, ScriptEvent* event); |
VMExecStatus_t exec(VMParserContext* parserCtx, ScriptEvent* event); |
261 |
VMFunction* functionByName(const String& name) OVERRIDE; |
VMFunction* functionByName(const String& name) OVERRIDE; |
262 |
std::map<String,VMIntRelPtr*> builtInIntVariables() OVERRIDE; |
std::map<String,VMIntPtr*> builtInIntVariables() OVERRIDE; |
263 |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
std::map<String,VMInt8Array*> builtInIntArrayVariables() OVERRIDE; |
264 |
std::map<String,int> builtInConstIntVariables() OVERRIDE; |
std::map<String,vmint> builtInConstIntVariables() OVERRIDE; |
265 |
std::map<String,VMDynVar*> builtInDynamicVariables() OVERRIDE; |
std::map<String,VMDynVar*> builtInDynamicVariables() OVERRIDE; |
266 |
protected: |
protected: |
267 |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
ScriptEvent* m_event; ///< The event currently executed by exec(). |
273 |
VMInt8RelPtr m_EVENT_NOTE; |
VMInt8RelPtr m_EVENT_NOTE; |
274 |
VMInt8RelPtr m_EVENT_VELOCITY; |
VMInt8RelPtr m_EVENT_VELOCITY; |
275 |
VMInt8Array m_KEY_DOWN; |
VMInt8Array m_KEY_DOWN; |
276 |
|
VMInt16RelPtr m_RPN_ADDRESS; // used for both RPN and NRPN events |
277 |
|
VMInt16RelPtr m_RPN_VALUE; // used for both RPN and NRPN events |
278 |
//VMIntArray m_POLY_AT; //TODO: ... |
//VMIntArray m_POLY_AT; //TODO: ... |
279 |
//int m_POLY_AT_NUM; //TODO: ... |
//int m_POLY_AT_NUM; //TODO: ... |
280 |
VMIntRelPtr m_NI_CALLBACK_TYPE; |
VMInt32RelPtr m_NI_CALLBACK_TYPE; |
281 |
VMIntRelPtr m_NKSP_IGNORE_WAIT; |
VMInt8RelPtr m_NKSP_IGNORE_WAIT; |
282 |
VMIntRelPtr m_NKSP_CALLBACK_PARENT_ID; |
VMIntRelPtr m_NKSP_CALLBACK_PARENT_ID; |
283 |
|
|
284 |
// built-in script functions |
// built-in script functions |
295 |
InstrumentScriptVMFunction_change_tune m_fnChangeTune; |
InstrumentScriptVMFunction_change_tune m_fnChangeTune; |
296 |
InstrumentScriptVMFunction_change_tune_time m_fnChangeTuneTime; |
InstrumentScriptVMFunction_change_tune_time m_fnChangeTuneTime; |
297 |
InstrumentScriptVMFunction_change_pan m_fnChangePan; |
InstrumentScriptVMFunction_change_pan m_fnChangePan; |
298 |
|
InstrumentScriptVMFunction_change_pan_time m_fnChangePanTime; |
299 |
|
InstrumentScriptVMFunction_change_pan_curve m_fnChangePanCurve; |
300 |
InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff; |
InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff; |
301 |
InstrumentScriptVMFunction_change_reso m_fnChangeReso; |
InstrumentScriptVMFunction_change_reso m_fnChangeReso; |
302 |
InstrumentScriptVMFunction_change_attack m_fnChangeAttack; |
InstrumentScriptVMFunction_change_attack m_fnChangeAttack; |
303 |
InstrumentScriptVMFunction_change_decay m_fnChangeDecay; |
InstrumentScriptVMFunction_change_decay m_fnChangeDecay; |
304 |
|
InstrumentScriptVMFunction_change_sustain m_fnChangeSustain; |
305 |
InstrumentScriptVMFunction_change_release m_fnChangeRelease; |
InstrumentScriptVMFunction_change_release m_fnChangeRelease; |
306 |
|
InstrumentScriptVMFunction_change_cutoff_attack m_fnChangeCutoffAttack; |
307 |
|
InstrumentScriptVMFunction_change_cutoff_decay m_fnChangeCutoffDecay; |
308 |
|
InstrumentScriptVMFunction_change_cutoff_sustain m_fnChangeCutoffSustain; |
309 |
|
InstrumentScriptVMFunction_change_cutoff_release m_fnChangeCutoffRelease; |
310 |
InstrumentScriptVMFunction_change_amp_lfo_depth m_fnChangeAmpLFODepth; |
InstrumentScriptVMFunction_change_amp_lfo_depth m_fnChangeAmpLFODepth; |
311 |
InstrumentScriptVMFunction_change_amp_lfo_freq m_fnChangeAmpLFOFreq; |
InstrumentScriptVMFunction_change_amp_lfo_freq m_fnChangeAmpLFOFreq; |
312 |
|
InstrumentScriptVMFunction_change_cutoff_lfo_depth m_fnChangeCutoffLFODepth; |
313 |
|
InstrumentScriptVMFunction_change_cutoff_lfo_freq m_fnChangeCutoffLFOFreq; |
314 |
InstrumentScriptVMFunction_change_pitch_lfo_depth m_fnChangePitchLFODepth; |
InstrumentScriptVMFunction_change_pitch_lfo_depth m_fnChangePitchLFODepth; |
315 |
InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq; |
InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq; |
316 |
InstrumentScriptVMFunction_change_note m_fnChangeNote; |
InstrumentScriptVMFunction_change_note m_fnChangeNote; |
346 |
friend class InstrumentScriptVMFunction_change_tune; |
friend class InstrumentScriptVMFunction_change_tune; |
347 |
friend class InstrumentScriptVMFunction_change_tune_time; |
friend class InstrumentScriptVMFunction_change_tune_time; |
348 |
friend class InstrumentScriptVMFunction_change_pan; |
friend class InstrumentScriptVMFunction_change_pan; |
349 |
|
friend class InstrumentScriptVMFunction_change_pan_time; |
350 |
|
friend class InstrumentScriptVMFunction_change_pan_curve; |
351 |
friend class InstrumentScriptVMFunction_change_cutoff; |
friend class InstrumentScriptVMFunction_change_cutoff; |
352 |
friend class InstrumentScriptVMFunction_change_reso; |
friend class InstrumentScriptVMFunction_change_reso; |
353 |
friend class InstrumentScriptVMFunction_change_attack; |
friend class InstrumentScriptVMFunction_change_attack; |
354 |
friend class InstrumentScriptVMFunction_change_decay; |
friend class InstrumentScriptVMFunction_change_decay; |
355 |
friend class InstrumentScriptVMFunction_change_release; |
friend class InstrumentScriptVMFunction_change_release; |
356 |
|
friend class InstrumentScriptVMFunction_change_sustain; |
357 |
|
friend class InstrumentScriptVMFunction_change_cutoff_attack; |
358 |
|
friend class InstrumentScriptVMFunction_change_cutoff_decay; |
359 |
|
friend class InstrumentScriptVMFunction_change_cutoff_release; |
360 |
|
friend class InstrumentScriptVMFunction_change_cutoff_sustain; |
361 |
friend class VMChangeSynthParamFunction; |
friend class VMChangeSynthParamFunction; |
362 |
friend class InstrumentScriptVMFunction_change_amp_lfo_depth; |
friend class InstrumentScriptVMFunction_change_amp_lfo_depth; |
363 |
friend class InstrumentScriptVMFunction_change_amp_lfo_freq; |
friend class InstrumentScriptVMFunction_change_amp_lfo_freq; |
364 |
|
friend class InstrumentScriptVMFunction_change_cutoff_lfo_depth; |
365 |
|
friend class InstrumentScriptVMFunction_change_cutoff_lfo_freq; |
366 |
friend class InstrumentScriptVMFunction_change_pitch_lfo_depth; |
friend class InstrumentScriptVMFunction_change_pitch_lfo_depth; |
367 |
friend class InstrumentScriptVMFunction_change_pitch_lfo_freq; |
friend class InstrumentScriptVMFunction_change_pitch_lfo_freq; |
368 |
friend class VMChangeFadeCurveFunction; |
friend class VMChangeFadeCurveFunction; |