/[svn]/linuxsampler/trunk/src/engines/common/InstrumentScriptVM.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/InstrumentScriptVM.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3214 by schoenebeck, Thu May 25 14:46:47 2017 UTC revision 3691 by schoenebeck, Fri Jan 3 12:35:20 2020 UTC
# Line 1  Line 1 
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   *   *
# Line 51  enum InstrScriptIDType_T { Line 51  enum InstrScriptIDType_T {
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
# Line 75  enum { Line 75  enum {
75      EVENT_PAR_3,      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;
# Line 112  namespace LinuxSampler { Line 118  namespace LinuxSampler {
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
# Line 174  namespace LinuxSampler { Line 180  namespace LinuxSampler {
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.
# Line 187  namespace LinuxSampler { Line 193  namespace LinuxSampler {
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      };      };
# Line 220  namespace LinuxSampler { Line 226  namespace LinuxSampler {
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.
# Line 251  namespace LinuxSampler { Line 259  namespace LinuxSampler {
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().
# Line 265  namespace LinuxSampler { Line 273  namespace LinuxSampler {
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;
283    
284          // built-in script functions          // built-in script functions
285          InstrumentScriptVMFunction_play_note m_fnPlayNote;          InstrumentScriptVMFunction_play_note m_fnPlayNote;
286          InstrumentScriptVMFunction_set_controller m_fnSetController;          InstrumentScriptVMFunction_set_controller m_fnSetController;
287            InstrumentScriptVMFunction_set_rpn m_fnSetRpn;
288            InstrumentScriptVMFunction_set_nrpn m_fnSetNrpn;
289          InstrumentScriptVMFunction_ignore_event m_fnIgnoreEvent;          InstrumentScriptVMFunction_ignore_event m_fnIgnoreEvent;
290          InstrumentScriptVMFunction_ignore_controller m_fnIgnoreController;          InstrumentScriptVMFunction_ignore_controller m_fnIgnoreController;
291          InstrumentScriptVMFunction_note_off m_fnNoteOff;          InstrumentScriptVMFunction_note_off m_fnNoteOff;
# Line 284  namespace LinuxSampler { Line 297  namespace LinuxSampler {
297          InstrumentScriptVMFunction_change_tune m_fnChangeTune;          InstrumentScriptVMFunction_change_tune m_fnChangeTune;
298          InstrumentScriptVMFunction_change_tune_time m_fnChangeTuneTime;          InstrumentScriptVMFunction_change_tune_time m_fnChangeTuneTime;
299          InstrumentScriptVMFunction_change_pan m_fnChangePan;          InstrumentScriptVMFunction_change_pan m_fnChangePan;
300            InstrumentScriptVMFunction_change_pan_time m_fnChangePanTime;
301            InstrumentScriptVMFunction_change_pan_curve m_fnChangePanCurve;
302          InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff;          InstrumentScriptVMFunction_change_cutoff m_fnChangeCutoff;
303          InstrumentScriptVMFunction_change_reso m_fnChangeReso;          InstrumentScriptVMFunction_change_reso m_fnChangeReso;
304          InstrumentScriptVMFunction_change_attack m_fnChangeAttack;          InstrumentScriptVMFunction_change_attack m_fnChangeAttack;
305          InstrumentScriptVMFunction_change_decay m_fnChangeDecay;          InstrumentScriptVMFunction_change_decay m_fnChangeDecay;
306            InstrumentScriptVMFunction_change_sustain m_fnChangeSustain;
307          InstrumentScriptVMFunction_change_release m_fnChangeRelease;          InstrumentScriptVMFunction_change_release m_fnChangeRelease;
308            InstrumentScriptVMFunction_change_cutoff_attack m_fnChangeCutoffAttack;
309            InstrumentScriptVMFunction_change_cutoff_decay m_fnChangeCutoffDecay;
310            InstrumentScriptVMFunction_change_cutoff_sustain m_fnChangeCutoffSustain;
311            InstrumentScriptVMFunction_change_cutoff_release m_fnChangeCutoffRelease;
312          InstrumentScriptVMFunction_change_amp_lfo_depth m_fnChangeAmpLFODepth;          InstrumentScriptVMFunction_change_amp_lfo_depth m_fnChangeAmpLFODepth;
313          InstrumentScriptVMFunction_change_amp_lfo_freq m_fnChangeAmpLFOFreq;          InstrumentScriptVMFunction_change_amp_lfo_freq m_fnChangeAmpLFOFreq;
314            InstrumentScriptVMFunction_change_cutoff_lfo_depth m_fnChangeCutoffLFODepth;
315            InstrumentScriptVMFunction_change_cutoff_lfo_freq m_fnChangeCutoffLFOFreq;
316          InstrumentScriptVMFunction_change_pitch_lfo_depth m_fnChangePitchLFODepth;          InstrumentScriptVMFunction_change_pitch_lfo_depth m_fnChangePitchLFODepth;
317          InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq;          InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq;
318          InstrumentScriptVMFunction_change_note m_fnChangeNote;          InstrumentScriptVMFunction_change_note m_fnChangeNote;
319          InstrumentScriptVMFunction_change_velo m_fnChangeVelo;          InstrumentScriptVMFunction_change_velo m_fnChangeVelo;
320            InstrumentScriptVMFunction_fork m_fnFork;
321          InstrumentScriptVMFunction_event_status m_fnEventStatus;          InstrumentScriptVMFunction_event_status m_fnEventStatus;
322          InstrumentScriptVMFunction_wait m_fnWait2;          InstrumentScriptVMFunction_wait m_fnWait2;
323          InstrumentScriptVMFunction_stop_wait m_fnStopWait;          InstrumentScriptVMFunction_stop_wait m_fnStopWait;
324            InstrumentScriptVMFunction_abort m_fnAbort;
325          InstrumentScriptVMFunction_fade_in m_fnFadeIn;          InstrumentScriptVMFunction_fade_in m_fnFadeIn;
326          InstrumentScriptVMFunction_fade_out m_fnFadeOut;          InstrumentScriptVMFunction_fade_out m_fnFadeOut;
327            InstrumentScriptVMFunction_change_vol_curve m_fnChangeVolCurve;
328            InstrumentScriptVMFunction_change_tune_curve m_fnChangeTuneCurve;
329          InstrumentScriptVMFunction_get_event_par m_fnGetEventPar;          InstrumentScriptVMFunction_get_event_par m_fnGetEventPar;
330          InstrumentScriptVMFunction_set_event_par m_fnSetEventPar;          InstrumentScriptVMFunction_set_event_par m_fnSetEventPar;
331            InstrumentScriptVMFunction_change_play_pos m_fnChangePlayPos;
332            InstrumentScriptVMFunction_callback_status m_fnCallbackStatus;
333          InstrumentScriptVMDynVar_ENGINE_UPTIME m_varEngineUptime;          InstrumentScriptVMDynVar_ENGINE_UPTIME m_varEngineUptime;
334          InstrumentScriptVMDynVar_NI_CALLBACK_ID m_varCallbackID;          InstrumentScriptVMDynVar_NI_CALLBACK_ID m_varCallbackID;
335          InstrumentScriptVMDynVar_ALL_EVENTS m_varAllEvents;          InstrumentScriptVMDynVar_ALL_EVENTS m_varAllEvents;
336            InstrumentScriptVMDynVar_NKSP_CALLBACK_CHILD_ID m_varCallbackChildID;
337    
338          friend class InstrumentScriptVMFunction_play_note;          friend class InstrumentScriptVMFunction_play_note;
339          friend class InstrumentScriptVMFunction_set_controller;          friend class InstrumentScriptVMFunction_set_controller;
340            friend class InstrumentScriptVMFunction_set_rpn;
341            friend class InstrumentScriptVMFunction_set_nrpn;
342          friend class InstrumentScriptVMFunction_ignore_event;          friend class InstrumentScriptVMFunction_ignore_event;
343          friend class InstrumentScriptVMFunction_ignore_controller;          friend class InstrumentScriptVMFunction_ignore_controller;
344          friend class InstrumentScriptVMFunction_note_off;          friend class InstrumentScriptVMFunction_note_off;
# Line 319  namespace LinuxSampler { Line 350  namespace LinuxSampler {
350          friend class InstrumentScriptVMFunction_change_tune;          friend class InstrumentScriptVMFunction_change_tune;
351          friend class InstrumentScriptVMFunction_change_tune_time;          friend class InstrumentScriptVMFunction_change_tune_time;
352          friend class InstrumentScriptVMFunction_change_pan;          friend class InstrumentScriptVMFunction_change_pan;
353            friend class InstrumentScriptVMFunction_change_pan_time;
354            friend class InstrumentScriptVMFunction_change_pan_curve;
355          friend class InstrumentScriptVMFunction_change_cutoff;          friend class InstrumentScriptVMFunction_change_cutoff;
356          friend class InstrumentScriptVMFunction_change_reso;          friend class InstrumentScriptVMFunction_change_reso;
357          friend class InstrumentScriptVMFunction_change_attack;          friend class InstrumentScriptVMFunction_change_attack;
358          friend class InstrumentScriptVMFunction_change_decay;          friend class InstrumentScriptVMFunction_change_decay;
359          friend class InstrumentScriptVMFunction_change_release;          friend class InstrumentScriptVMFunction_change_release;
360            friend class InstrumentScriptVMFunction_change_sustain;
361            friend class InstrumentScriptVMFunction_change_cutoff_attack;
362            friend class InstrumentScriptVMFunction_change_cutoff_decay;
363            friend class InstrumentScriptVMFunction_change_cutoff_release;
364            friend class InstrumentScriptVMFunction_change_cutoff_sustain;
365          friend class VMChangeSynthParamFunction;          friend class VMChangeSynthParamFunction;
366          friend class InstrumentScriptVMFunction_change_amp_lfo_depth;          friend class InstrumentScriptVMFunction_change_amp_lfo_depth;
367          friend class InstrumentScriptVMFunction_change_amp_lfo_freq;          friend class InstrumentScriptVMFunction_change_amp_lfo_freq;
368            friend class InstrumentScriptVMFunction_change_cutoff_lfo_depth;
369            friend class InstrumentScriptVMFunction_change_cutoff_lfo_freq;
370          friend class InstrumentScriptVMFunction_change_pitch_lfo_depth;          friend class InstrumentScriptVMFunction_change_pitch_lfo_depth;
371          friend class InstrumentScriptVMFunction_change_pitch_lfo_freq;          friend class InstrumentScriptVMFunction_change_pitch_lfo_freq;
372            friend class VMChangeFadeCurveFunction;
373          friend class InstrumentScriptVMFunction_fade_in;          friend class InstrumentScriptVMFunction_fade_in;
374          friend class InstrumentScriptVMFunction_fade_out;          friend class InstrumentScriptVMFunction_fade_out;
375          friend class InstrumentScriptVMFunction_get_event_par;          friend class InstrumentScriptVMFunction_get_event_par;
376          friend class InstrumentScriptVMFunction_set_event_par;          friend class InstrumentScriptVMFunction_set_event_par;
377          friend class InstrumentScriptVMFunction_change_note;          friend class InstrumentScriptVMFunction_change_note;
378          friend class InstrumentScriptVMFunction_change_velo;          friend class InstrumentScriptVMFunction_change_velo;
379            friend class InstrumentScriptVMFunction_change_play_pos;
380          friend class InstrumentScriptVMFunction_event_status;          friend class InstrumentScriptVMFunction_event_status;
381          friend class InstrumentScriptVMFunction_wait;          friend class InstrumentScriptVMFunction_wait;
382          friend class InstrumentScriptVMFunction_stop_wait;          friend class InstrumentScriptVMFunction_stop_wait;
383            friend class InstrumentScriptVMFunction_abort;
384            friend class InstrumentScriptVMFunction_fork;
385            friend class InstrumentScriptVMFunction_callback_status;
386          friend class InstrumentScriptVMDynVar_ENGINE_UPTIME;          friend class InstrumentScriptVMDynVar_ENGINE_UPTIME;
387          friend class InstrumentScriptVMDynVar_NI_CALLBACK_ID;          friend class InstrumentScriptVMDynVar_NI_CALLBACK_ID;
388          friend class InstrumentScriptVMDynVar_ALL_EVENTS;          friend class InstrumentScriptVMDynVar_ALL_EVENTS;
389            friend class InstrumentScriptVMDynVar_NKSP_CALLBACK_CHILD_ID;
390      };      };
391    
392  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.3214  
changed lines
  Added in v.3691

  ViewVC Help
Powered by ViewVC