/[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 3034 by schoenebeck, Mon Oct 31 00:05:00 2016 UTC revision 3691 by schoenebeck, Fri Jan 3 12:35:20 2020 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (c) 2014-2016 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 64  enum InstrScriptIDType_T { Line 64  enum InstrScriptIDType_T {
64  #define EVENT_STATUS_INACTIVE 0  #define EVENT_STATUS_INACTIVE 0
65  #define EVENT_STATUS_NOTE_QUEUE 1  #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;
# Line 101  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 163  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 176  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 209  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 240  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().
268    
269          // buil-in script variables          // built-in script variables
270          VMInt8Array m_CC;          VMInt8Array m_CC;
271          VMInt8RelPtr m_CC_NUM;          VMInt8RelPtr m_CC_NUM;
272          VMIntRelPtr  m_EVENT_ID;          VMIntRelPtr  m_EVENT_ID;
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          // buil-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 269  namespace LinuxSampler { Line 293  namespace LinuxSampler {
293          InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark;          InstrumentScriptVMFunction_delete_event_mark m_fnDeleteEventMark;
294          InstrumentScriptVMFunction_by_marks m_fnByMarks;          InstrumentScriptVMFunction_by_marks m_fnByMarks;
295          InstrumentScriptVMFunction_change_vol m_fnChangeVol;          InstrumentScriptVMFunction_change_vol m_fnChangeVol;
296            InstrumentScriptVMFunction_change_vol_time m_fnChangeVolTime;
297          InstrumentScriptVMFunction_change_tune m_fnChangeTune;          InstrumentScriptVMFunction_change_tune m_fnChangeTune;
298            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;
313            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;
317            InstrumentScriptVMFunction_change_pitch_lfo_freq m_fnChangePitchLFOFreq;
318            InstrumentScriptVMFunction_change_note m_fnChangeNote;
319            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;
326            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;
330            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;
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 291  namespace LinuxSampler { Line 346  namespace LinuxSampler {
346          friend class InstrumentScriptVMFunction_delete_event_mark;          friend class InstrumentScriptVMFunction_delete_event_mark;
347          friend class InstrumentScriptVMFunction_by_marks;          friend class InstrumentScriptVMFunction_by_marks;
348          friend class InstrumentScriptVMFunction_change_vol;          friend class InstrumentScriptVMFunction_change_vol;
349            friend class InstrumentScriptVMFunction_change_vol_time;
350          friend class InstrumentScriptVMFunction_change_tune;          friend class InstrumentScriptVMFunction_change_tune;
351            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;
366            friend class InstrumentScriptVMFunction_change_amp_lfo_depth;
367            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;
371            friend class InstrumentScriptVMFunction_change_pitch_lfo_freq;
372            friend class VMChangeFadeCurveFunction;
373            friend class InstrumentScriptVMFunction_fade_in;
374            friend class InstrumentScriptVMFunction_fade_out;
375            friend class InstrumentScriptVMFunction_get_event_par;
376            friend class InstrumentScriptVMFunction_set_event_par;
377            friend class InstrumentScriptVMFunction_change_note;
378            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;
389            friend class InstrumentScriptVMDynVar_NKSP_CALLBACK_CHILD_ID;
390      };      };
391    
392  } // namespace LinuxSampler  } // namespace LinuxSampler

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

  ViewVC Help
Powered by ViewVC