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

Diff of /linuxsampler/trunk/src/scriptvm/common.h

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

revision 3561 by schoenebeck, Fri Aug 23 11:44:00 2019 UTC revision 3582 by schoenebeck, Fri Aug 30 12:23:40 2019 UTC
# Line 19  Line 19 
19  #include <vector>  #include <vector>
20  #include <map>  #include <map>
21  #include <stddef.h> // offsetof()  #include <stddef.h> // offsetof()
22    #include <functional> // std::function<>
23    
24  namespace LinuxSampler {  namespace LinuxSampler {
25    
# Line 37  namespace LinuxSampler { Line 38  namespace LinuxSampler {
38      typedef uint64_t vmuint;      typedef uint64_t vmuint;
39    
40      /**      /**
41       * Native data type used internally by the script engine for floating point       * Native data type used by the script engine both internally for floating
42       * data types. This type is currently not exposed to scripts.       * point data, as well as for all @c real data types used by scripts (i.e.
43         * for all ~foo variables in NKSP scripts).
44       */       */
45      typedef float vmfloat;      typedef float vmfloat;
46    
# Line 64  namespace LinuxSampler { Line 66  namespace LinuxSampler {
66          INT_ARR_EXPR, ///< integer array expression          INT_ARR_EXPR, ///< integer array expression
67          STRING_EXPR, ///< string expression          STRING_EXPR, ///< string expression
68          STRING_ARR_EXPR, ///< string array expression          STRING_ARR_EXPR, ///< string array expression
69            REAL_EXPR, ///< floating point (scalar) expression
70            REAL_ARR_EXPR, ///< floating point array expression
71      };      };
72    
73      /** @brief Result flags of a script statement or script function call.      /** @brief Result flags of a script statement or script function call.
# Line 134  namespace LinuxSampler { Line 138  namespace LinuxSampler {
138      };      };
139    
140      /**      /**
141         * This constant is used for comparison with Unit::unitFactor() to check
142         * whether a number does have any metric unit prefix at all.
143         *
144         * @see Unit::unitFactor()
145         */
146        static const vmfloat VM_NO_FACTOR = vmfloat(1);
147    
148        /**
149       * All measurement unit types supported by this script engine.       * All measurement unit types supported by this script engine.
150       *       *
151       * @e Note: there is no standard unit "cents" here (for pitch/tuning), use       * @e Note: there is no standard unit "cents" here (for pitch/tuning), use
# Line 150  namespace LinuxSampler { Line 162  namespace LinuxSampler {
162          VM_BEL,         ///< Measuring relation between two energy levels (in logarithmic scale). Since we are using it for accoustics, we are always referring to A-weighted Bels (i.e. dBA).          VM_BEL,         ///< Measuring relation between two energy levels (in logarithmic scale). Since we are using it for accoustics, we are always referring to A-weighted Bels (i.e. dBA).
163      };      };
164    
165        //TODO: see Unit::hasUnitFactorEver()
166        enum EverTriState_t {
167            VM_NEVER = 0,
168            VM_MAYBE,
169            VM_ALWAYS,
170        };
171    
172      // just symbol prototyping      // just symbol prototyping
173      class VMIntExpr;      class VMIntExpr;
174        class VMRealExpr;
175      class VMStringExpr;      class VMStringExpr;
176        class VMNumberExpr;
177        class VMArrayExpr;
178      class VMIntArrayExpr;      class VMIntArrayExpr;
179        class VMRealArrayExpr;
180      class VMStringArrayExpr;      class VMStringArrayExpr;
181      class VMParserContext;      class VMParserContext;
182    
183      /** @brief Virtual machine measuring unit.      /** @brief Virtual machine standard measuring unit.
184       *       *
185       * Abstract base class representing standard measurement units throughout       * Abstract base class representing standard measurement units throughout
186       * the script engine. These might be i.e. "dB" (deci Bel) for loudness,       * the script engine. These might be e.g. "dB" (deci Bel) for loudness,
187       * "Hz" (Hertz) for frequencies or "s" for "seconds".       * "Hz" (Hertz) for frequencies or "s" for "seconds". These unit types can
188         * combined with metric prefixes, for instance "kHz" (kilo Hertz),
189         * "us" (micro second), etc.
190       *       *
191       * Originally the script engine only supported abstract integer values for       * Originally the script engine only supported abstract integer values for
192       * controlling any synthesis parameter or built-in function argument or       * controlling any synthesis parameter or built-in function argument or
193       * variable. Under certain situations it makes sense though for an       * variable. Under certain situations it makes sense though for an
194       * instrument script author to provide values in real, standard measurement       * instrument script author to provide values in real, standard measurement
195       * units, for example setting the frequency of some LFO directly to "20Hz".       * units to provide a more natural and intuitive approach for writing
196       * Hence support for standard units in scripts was added as an extension to       * instrument scripts, for example by setting the frequency of some LFO
197       * the NKSP script engine.       * directly to "20Hz" or reducing loudness by "-4.2dB". Hence support for
198         * standard units in scripts was added as an extension to the NKSP script
199         * engine.
200         *
201         * So a unit consists of 1) a sequence of metric prefixes as scale factor
202         * (e.g. "k" for kilo) and 2) the actual unit type (e.g. "Hz" for Hertz).
203         * The unit type is a constant feature of number literals and variables, so
204         * once a variable was declared with a unit type (or no unit type at all)
205         * then that unit type of that variable cannot be changed for the entire
206         * life time of the script. This is different from the unit's metric
207         * prefix(es) of variables which may freely be changed at runtime.
208       */       */
209      class VMUnit {      class VMUnit {
210      public:      public:
211          /**          /**
212           * Returns the metric prefix of this unit. A metric prefix essentially           * Returns the metric prefix(es) of this unit as unit factor. A metric
213           * is just a mathematical scale factor that should be applied to the           * prefix essentially is just a mathematical scale factor that should be
214           * number associated with the measurement unit. Usually a unit either           * applied to the number associated with the measurement unit. Consider
215           * has exactly none or one prefix, but note that there might also be           * a string literal in an NKSP script like '3kHz' where 'k' (kilo) is
216           * units with more than one prefix, for example mdB (mili deci bel)           * the metric prefix, which essentically is a scale factor of 1000.
          * is used sometimes which has two prefixes. This is an exception though  
          * and more than two prefixes is currently not supported by the script  
          * engine.  
217           *           *
218           * Start iterating over the prefixes of this unit by passing @c 0 as           * Usually a unit either has exactly none or one metric prefix, but note
219           * argument to this method. The prefixes are terminated with return           * that there might also be units with more than one prefix, for example
220           * value VM_NO_PREFIX being always the last element.           * @c mdB (milli deci Bel) is used sometimes which has two prefixes. The
221             * latter is an exception though and more than two prefixes is currently
222             * not supported by the script engine.
223           *           *
224           * @param i - index of prefix           * The factor returned by this method is the final mathematical factor
225           * @returns prefix of requested index or VM_NO_PREFIX otherwise           * that should be multiplied against the number associated with this
226           * @see unitFactor()           * unit. This factor results from the sequence of metric prefixes of
227             * this unit.
228             *
229             * @see MetricPrefix_t, hasUnitFactorNow(), hasUnitFactorEver(),
230             *      VM_NO_FACTOR
231             * @returns current metric unit factor
232           */           */
233          virtual MetricPrefix_t unitPrefix(vmuint i) const = 0;          virtual vmfloat unitFactor() const = 0;
234    
235            //TODO: this still needs to be implemented in tree.h/.pp, built-in functions and as 2nd pass of parser appropriately
236            /*virtual*/ EverTriState_t hasUnitFactorEver() const { return VM_NEVER; }
237    
238          /**          /**
239           * Conveniently returns the final mathematical factor that should be           * Whether this unit currently does have any metric unit prefix.
240           * multiplied against the number associated with this unit. This factor           *
241           * results from the sequence of metric prefixes of this unit.           * This is actually just a convenience method which returns @c true if
242             * unitFactor() is not @c 1.0.
243           *           *
244           * @see unitPrefix()           * @see MetricPrefix_t, unitFactor(), hasUnitFactorEver(), VM_NO_FACTOR
245             * @returns @c true if this unit currently has any metric prefix
246           */           */
247          vmfloat unitFactor() const;          bool hasUnitFactorNow() const;
248    
249          /**          /**
250           * This is the actual fundamental measuring unit base type of this unit,           * This is the actual fundamental measuring unit base type of this unit,
251           * which might be either Hertz, second or Bel.           * which might be either Hertz, second or Bel.
252           *           *
253           * @returns standard unit type identifier or VM_NO_UNIT if no unit used           * Note that a number without a unit type may still have metric
254             * prefixes.
255             *
256             * @returns standard unit type identifier or VM_NO_UNIT if no unit type
257             *          is used for this object
258           */           */
259          virtual StdUnit_t unitType() const = 0;          virtual StdUnit_t unitType() const = 0;
260    
# Line 219  namespace LinuxSampler { Line 267  namespace LinuxSampler {
267          /**          /**
268           * Returns the actual mathematical factor represented by the passed           * Returns the actual mathematical factor represented by the passed
269           * two @a prefix1 and @a prefix2 arguments.           * two @a prefix1 and @a prefix2 arguments.
270             *
271             * @returns scale factor of given metric unit prefixes
272           */           */
273          static vmfloat unitFactor(MetricPrefix_t prefix1, MetricPrefix_t prefix2);          static vmfloat unitFactor(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
274    
275            /**
276             * Returns the actual mathematical factor represented by the passed
277             * @a prefixes array. The passed array should always be terminated by a
278             * VM_NO_PREFIX value as last element.
279             *
280             * @param prefixes - sequence of metric prefixes
281             * @param size - max. amount of elements of array @a prefixes
282             * @returns scale factor of given metric unit prefixes
283             */
284            static vmfloat unitFactor(const MetricPrefix_t* prefixes, vmuint size = 2);
285      };      };
286    
287      /** @brief Virtual machine expression      /** @brief Virtual machine expression
# Line 254  namespace LinuxSampler { Line 315  namespace LinuxSampler {
315           * if this expression is i.e. actually a string expression like "12",           * if this expression is i.e. actually a string expression like "12",
316           * calling asInt() will @b not cast that numerical string expression to           * calling asInt() will @b not cast that numerical string expression to
317           * an integer expression 12 for you, instead this method will simply           * an integer expression 12 for you, instead this method will simply
318           * return NULL!           * return NULL! Same applies if this expression is actually a real
319             * number expression: asInt() would return NULL in that case as well.
320           *           *
321           * @see exprType()           * @see exprType(), asReal(), asNumber()
322           */           */
323          VMIntExpr* asInt() const;          VMIntExpr* asInt() const;
324    
325          /**          /**
326             * In case this expression is a real number (floating point) expression,
327             * then this method returns a casted pointer to that VMRealExpr object.
328             * It returns NULL if this expression is not a real number expression.
329             *
330             * @b Note: type casting performed by this method is strict! That means
331             * if this expression is i.e. actually a string expression like "12",
332             * calling asReal() will @b not cast that numerical string expression to
333             * a real number expression 12.0 for you, instead this method will
334             * simply return NULL! Same applies if this expression is actually an
335             * integer expression: asReal() would return NULL in that case as well.
336             *
337             * @see exprType(), asInt(), asNumber()
338             */
339            VMRealExpr* asReal() const;
340    
341            /**
342             * In case this expression is a scalar number expression, that is either
343             * an integer (scalar) expression or a real number (floating point
344             * scalar) expression, then this method returns a casted pointer to that
345             * VMNumberExpr base class object. It returns NULL if this
346             * expression is neither an integer (scalar), nor a real number (scalar)
347             * expression.
348             *
349             * Since the methods asInt() and asReal() are very strict, this method
350             * is provided as convenience access in case only very general
351             * information (e.g. which standard measurement unit is being used or
352             * whether final operator being effective to this expression) is
353             * intended to be retrieved of this scalar number expression independent
354             * from whether this expression is actually an integer or a real number
355             * expression.
356             *
357             * @see exprType(), asInt(), asReal()
358             */
359            VMNumberExpr* asNumber() const;
360    
361            /**
362           * In case this expression is a string expression, then this method           * In case this expression is a string expression, then this method
363           * returns a casted pointer to that VMStringExpr object. It returns NULL           * returns a casted pointer to that VMStringExpr object. It returns NULL
364           * if this expression is not a string expression.           * if this expression is not a string expression.
# Line 281  namespace LinuxSampler { Line 379  namespace LinuxSampler {
379           * returns NULL if this expression is not an integer array expression.           * returns NULL if this expression is not an integer array expression.
380           *           *
381           * @b Note: type casting performed by this method is strict! That means           * @b Note: type casting performed by this method is strict! That means
382           * if this expression is i.e. an integer expression or a string           * if this expression is i.e. an integer scalar expression, a real
383           * expression, calling asIntArray() will @b not cast those scalar           * number expression or a string expression, calling asIntArray() will
384           * expressions to an array expression for you, instead this method will           * @b not cast those expressions to an integer array expression for you,
385           * simply return NULL!           * instead this method will simply return NULL!
386           *           *
387           * @b Note: this method is currently, and in contrast to its other           * @b Note: this method is currently, and in contrast to its other
388           * counter parts, declared as virtual method. Some deriving classes are           * counter parts, declared as virtual method. Some deriving classes are
# Line 299  namespace LinuxSampler { Line 397  namespace LinuxSampler {
397          virtual VMIntArrayExpr* asIntArray() const;          virtual VMIntArrayExpr* asIntArray() const;
398    
399          /**          /**
400             * In case this expression is a real number (floating point) array
401             * expression, then this method returns a casted pointer to that
402             * VMRealArrayExpr object. It returns NULL if this expression is not a
403             * real number array expression.
404             *
405             * @b Note: type casting performed by this method is strict! That means
406             * if this expression is i.e. a real number scalar expression, an
407             * integer expression or a string expression, calling asRealArray() will
408             * @b not cast those scalar expressions to a real number array
409             * expression for you, instead this method will simply return NULL!
410             *
411             * @b Note: this method is currently, and in contrast to its other
412             * counter parts, declared as virtual method. Some deriving classes are
413             * currently using this to override this default implementation in order
414             * to implement an "evaluate now as real number array" behavior. This
415             * has efficiency reasons, however this also currently makes this part
416             * of the API less clean and should thus be addressed in future with
417             * appropriate changes to the API.
418             *
419             * @see exprType()
420             */
421            virtual VMRealArrayExpr* asRealArray() const;
422    
423            /**
424             * This is an alternative to calling either asIntArray() or
425             * asRealArray(). This method here might be used if the fundamental
426             * scalar data type (real or integer) of the array is not relevant,
427             * i.e. for just getting the size of the array. Since all as*() methods
428             * here are very strict regarding type casting, this asArray() method
429             * sometimes can reduce code complexity.
430             *
431             * Likewise calling this method only returns a valid pointer if the
432             * expression is some array type (currently either integer array or real
433             * number array). For any other expression type this method will return
434             * NULL instead.
435             *
436             * @see exprType()
437             */
438            VMArrayExpr* asArray() const;
439    
440            /**
441           * Returns true in case this expression can be considered to be a           * Returns true in case this expression can be considered to be a
442           * constant expression. A constant expression will retain the same           * constant expression. A constant expression will retain the same
443           * value throughout the entire life time of a script and the           * value throughout the entire life time of a script and the
# Line 329  namespace LinuxSampler { Line 468  namespace LinuxSampler {
468          bool isModifyable() const;          bool isModifyable() const;
469      };      };
470    
471        /** @brief Virtual machine scalar number expression
472         *
473         * This is the abstract base class for integer (scalar) expressions and
474         * real number (floating point scalar) expressions of scripts.
475         */
476        class VMNumberExpr : virtual public VMExpr, virtual public VMUnit {
477        public:
478            /**
479             * Returns @c true if the value of this expression should be applied
480             * as final value to the respective destination synthesis chain
481             * parameter.
482             *
483             * This property is somewhat special and dedicated for the purpose of
484             * this expression's (integer or real number) value to be applied as
485             * parameter to the synthesis chain of the sampler (i.e. for altering a
486             * filter cutoff frequency). Now historically and by default all values
487             * of scripts are applied relatively to the sampler's synthesis chain,
488             * that is the synthesis parameter value of a script is multiplied
489             * against other sources for the same synthesis parameter (i.e. an LFO
490             * or a dedicated MIDI controller either hard wired in the engine or
491             * defined by the instrument patch). So by default the resulting actual
492             * final synthesis parameter is a combination of all these sources. This
493             * has the advantage that it creates a very living and dynamic overall
494             * sound.
495             *
496             * However sometimes there are requirements by script authors where this
497             * is not what you want. Therefore the NKSP script engine added a
498             * language extension by prefixing a value in scripts with a @c !
499             * character the value will be defined as being the "final" value of the
500             * destination synthesis parameter, so that causes this value to be
501             * applied exclusively, and the values of all other sources are thus
502             * entirely ignored by the sampler's synthesis core as long as this
503             * value is assigned by the script engine as "final" value for the
504             * requested synthesis parameter.
505             */
506            virtual bool isFinal() const = 0;
507    
508            /**
509             * Calling this method evaluates the expression and returns the value
510             * of the expression as integer. If this scalar number expression is a
511             * real number expression then this method automatically casts the value
512             * from real number to integer.
513             */
514            vmint evalCastInt();
515    
516            /**
517             * Calling this method evaluates the expression and returns the value
518             * of the expression as real number. If this scalar number expression is
519             * an integer expression then this method automatically casts the value
520             * from integer to real number.
521             */
522            vmfloat evalCastReal();
523        };
524    
525      /** @brief Virtual machine integer expression      /** @brief Virtual machine integer expression
526       *       *
527       * This is the abstract base class for all expressions inside scripts which       * This is the abstract base class for all expressions inside scripts which
# Line 336  namespace LinuxSampler { Line 529  namespace LinuxSampler {
529       * abstract method evalInt() to return the actual integer result value of       * abstract method evalInt() to return the actual integer result value of
530       * the expression.       * the expression.
531       */       */
532      class VMIntExpr : virtual public VMExpr, virtual public VMUnit {      class VMIntExpr : virtual public VMNumberExpr {
533      public:      public:
534          /**          /**
535           * Returns the result of this expression as integer (scalar) value.           * Returns the result of this expression as integer (scalar) value.
# Line 365  namespace LinuxSampler { Line 558  namespace LinuxSampler {
558           * Returns always INT_EXPR for instances of this class.           * Returns always INT_EXPR for instances of this class.
559           */           */
560          ExprType_t exprType() const OVERRIDE { return INT_EXPR; }          ExprType_t exprType() const OVERRIDE { return INT_EXPR; }
561        };
562    
563        /** @brief Virtual machine real number (floating point scalar) expression
564         *
565         * This is the abstract base class for all expressions inside scripts which
566         * evaluate to a real number (floating point scalar) value. Deriving classes
567         * implement the abstract method evalReal() to return the actual floating
568         * point result value of the expression.
569         */
570        class VMRealExpr : virtual public VMNumberExpr {
571        public:
572          /**          /**
573           * Returns @c true if the value of this expression should be applied           * Returns the result of this expression as real number (floating point
574           * as final value to the respective destination synthesis chain           * scalar) value. This abstract method must be implemented by deriving
575           * parameter.           * classes.
576           *           */
577           * This property is somewhat special and dedicated for the purpose of          virtual vmfloat evalReal() = 0;
578           * this expression's integer value to be applied as parameter to the  
579           * synthesis chain of the sampler (i.e. for altering a filter cutoff          /**
580           * frequency). Now historically and by default all values of scripts are           * Returns the result of this expression as real number (floating point
581           * applied relatively to the sampler's synthesis chain, that is the           * scalar) value and thus behaves similar to the previous method,
582           * synthesis parameter value of a script is multiplied against other           * however this overridden method automatically takes unit prefixes into
583           * sources for the same synthesis parameter (i.e. an LFO or a dedicated           * account and returns a value corresponding to the expected given unit
584           * MIDI controller either hard wired in the engine or defined by the           * @a prefix.
          * instrument patch). So by default the resulting actual final synthesis  
          * parameter is a combination of all these sources. This has the  
          * advantage that it creates a very living and dynamic overall sound.  
585           *           *
586           * However sometimes there are requirements by script authors where this           * @param prefix - default measurement unit prefix expected by caller
          * is not what you want. Therefore the NKSP script engine added a  
          * language extension by prefixing a value in scripts with a @c !  
          * character the value will be defined as being the "final" value of the  
          * destination synthesis parameter, so that causes this value to be  
          * applied exclusively, and the values of all other sources are thus  
          * entirely ignored by the sampler's synthesis core as long as this  
          * value is assigned by the script engine as "final" value for the  
          * requested synthesis parameter.  
587           */           */
588          virtual bool isFinal() const = 0;          vmfloat evalReal(MetricPrefix_t prefix);
589    
590            /**
591             * This method behaves like the previous method, just that it takes
592             * a default measurement prefix with two elements (i.e. "milli cents"
593             * for tuning).
594             */
595            vmfloat evalReal(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
596    
597            /**
598             * Returns always REAL_EXPR for instances of this class.
599             */
600            ExprType_t exprType() const OVERRIDE { return REAL_EXPR; }
601      };      };
602    
603      /** @brief Virtual machine string expression      /** @brief Virtual machine string expression
# Line 433  namespace LinuxSampler { Line 637  namespace LinuxSampler {
637          virtual vmint arraySize() const = 0;          virtual vmint arraySize() const = 0;
638      };      };
639    
640        /** @brief Virtual Machine Number Array Expression
641         *
642         * This is the abstract base class for all expressions which either evaluate
643         * to an integer array or real number array.
644         */
645        class VMNumberArrayExpr : virtual public VMArrayExpr {
646        public:
647            /**
648             * Returns the metric unit factor of the requested array element.
649             *
650             * @param i - array element index (must be between 0 .. arraySize() - 1)
651             * @see VMUnit::unitFactor() for details about metric unit factors
652             */
653            virtual vmfloat unitFactorOfElement(vmuint i) const = 0;
654    
655            /**
656             * Changes the current unit factor of the array element given by element
657             * index @a i.
658             *
659             * @param i - array element index (must be between 0 .. arraySize() - 1)
660             * @param factor - new unit factor to be assigned
661             * @see VMUnit::unitFactor() for details about metric unit factors
662             */
663            virtual void assignElementUnitFactor(vmuint i, vmfloat factor) = 0;
664        };
665    
666      /** @brief Virtual Machine Integer Array Expression      /** @brief Virtual Machine Integer Array Expression
667       *       *
668       * This is the abstract base class for all expressions inside scripts which       * This is the abstract base class for all expressions inside scripts which
# Line 440  namespace LinuxSampler { Line 670  namespace LinuxSampler {
670       * abstract methods arraySize(), evalIntElement() and assignIntElement() to       * abstract methods arraySize(), evalIntElement() and assignIntElement() to
671       * access the individual integer array values.       * access the individual integer array values.
672       */       */
673      class VMIntArrayExpr : virtual public VMArrayExpr {      class VMIntArrayExpr : virtual public VMNumberArrayExpr {
674      public:      public:
675          /**          /**
676           * Returns the (scalar) integer value of the array element given by           * Returns the (scalar) integer value of the array element given by
# Line 465  namespace LinuxSampler { Line 695  namespace LinuxSampler {
695          ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }          ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }
696      };      };
697    
698        /** @brief Virtual Machine Real Number Array Expression
699         *
700         * This is the abstract base class for all expressions inside scripts which
701         * evaluate to an array of real numbers (floating point values). Deriving
702         * classes implement the abstract methods arraySize(), evalRealElement() and
703         * assignRealElement() to access the array's individual real numbers.
704         */
705        class VMRealArrayExpr : virtual public VMNumberArrayExpr {
706        public:
707            /**
708             * Returns the (scalar) real mumber (floating point value) of the array
709             * element given by element index @a i.
710             *
711             * @param i - array element index (must be between 0 .. arraySize() - 1)
712             */
713            virtual vmfloat evalRealElement(vmuint i) = 0;
714    
715            /**
716             * Changes the current value of an element (given by array element
717             * index @a i) of this real number array.
718             *
719             * @param i - array element index (must be between 0 .. arraySize() - 1)
720             * @param value - new real number value to be assigned to that array element
721             */
722            virtual void assignRealElement(vmuint i, vmfloat value) = 0;
723    
724            /**
725             * Returns always REAL_ARR_EXPR for instances of this class.
726             */
727            ExprType_t exprType() const OVERRIDE { return REAL_ARR_EXPR; }
728        };
729    
730      /** @brief Arguments (parameters) for being passed to a built-in script function.      /** @brief Arguments (parameters) for being passed to a built-in script function.
731       *       *
732       * An argument or a set of arguments passed to a script function are       * An argument or a set of arguments passed to a script function are
# Line 545  namespace LinuxSampler { Line 807  namespace LinuxSampler {
807          /**          /**
808           * Script data type of the function's return value. If the function does           * Script data type of the function's return value. If the function does
809           * not return any value (void), then it returns EMPTY_EXPR here.           * not return any value (void), then it returns EMPTY_EXPR here.
810             *
811             * Some functions may have a different return type depending on the
812             * arguments to be passed to this function. That's what the @a args
813             * parameter is for, so that the method implementation can look ahead
814             * of what kind of parameters are going to be passed to the built-in
815             * function later on in order to decide which return value type would
816             * be used and returned by the function accordingly in that case.
817             *
818             * @param args - function arguments going to be passed for executing
819             *               this built-in function later on
820             */
821            virtual ExprType_t returnType(VMFnArgs* args) = 0;
822    
823            /**
824             * Standard measuring unit type of the function's result value
825             * (e.g. second, Hertz).
826             *
827             * Some functions may have a different standard measuring unit type for
828             * their return value depending on the arguments to be passed to this
829             * function. That's what the @a args parameter is for, so that the
830             * method implementation can look ahead of what kind of parameters are
831             * going to be passed to the built-in function later on in order to
832             * decide which return value type would be used and returned by the
833             * function accordingly in that case.
834             *
835             * @param args - function arguments going to be passed for executing
836             *               this built-in function later on
837             * @see Unit for details about standard measuring units
838             */
839            virtual StdUnit_t returnUnitType(VMFnArgs* args) = 0;
840    
841            /**
842             * Whether the result value returned by this built-in function is
843             * considered to be a 'final' value.
844             *
845             * Some functions may have a different 'final' feature for their return
846             * value depending on the arguments to be passed to this function.
847             * That's what the @a args parameter is for, so that the method
848             * implementation can look ahead of what kind of parameters are going to
849             * be passed to the built-in function later on in order to decide which
850             * return value type would be used and returned by the function
851             * accordingly in that case.
852             *
853             * @param args - function arguments going to be passed for executing
854             *               this built-in function later on
855             * @see VMNumberExpr::isFinal() for details about 'final' values
856           */           */
857          virtual ExprType_t returnType() = 0;          virtual bool returnsFinal(VMFnArgs* args) = 0;
858    
859          /**          /**
860           * Minimum amount of function arguments this function accepts. If a           * Minimum amount of function arguments this function accepts. If a
# Line 630  namespace LinuxSampler { Line 938  namespace LinuxSampler {
938           *           *
939           * @param iArg - index of the function argument in question           * @param iArg - index of the function argument in question
940           *               (must be between 0 .. maxAllowedArgs() - 1)           *               (must be between 0 .. maxAllowedArgs() - 1)
941             * @param type - standard measurement unit data type used for that
942             *               function argument by currently parsed script
943           *           *
944           * @return true if a metric prefix would be accepted for the respective           * @return true if a metric prefix would be accepted for the respective
945           *         function argument by this function           *         function argument by this function
946           *           *
947           * @see MetricPrefix_t           * @see MetricPrefix_t
948           */           */
949          virtual bool acceptsArgUnitPrefix(vmint iArg) const;          virtual bool acceptsArgUnitPrefix(vmint iArg, StdUnit_t type) const;
950    
951          /**          /**
952           * This method is called by the parser to check whether arguments           * This method is called by the parser to check whether arguments
# Line 654  namespace LinuxSampler { Line 964  namespace LinuxSampler {
964           * @return true if a "final" value would be accepted for the respective           * @return true if a "final" value would be accepted for the respective
965           *         function argument by the function           *         function argument by the function
966           *           *
967           * @see VMIntExpr::isFinal()           * @see VMNumberExpr::isFinal(), returnsFinal()
968           */           */
969          virtual bool acceptsArgFinal(vmint iArg) const;          virtual bool acceptsArgFinal(vmint iArg) const;
970    
# Line 674  namespace LinuxSampler { Line 984  namespace LinuxSampler {
984          virtual bool modifiesArg(vmint iArg) const = 0;          virtual bool modifiesArg(vmint iArg) const = 0;
985    
986          /**          /**
987             * This method is called by the parser to let the built-in function
988             * perform its own, individual parse time checks on the arguments to be
989             * passed to the built-in function. So this method is the place for
990             * implementing custom checks which are very specific to the individual
991             * built-in function's purpose and its individual requirements.
992             *
993             * For instance the built-in 'in_range()' function uses this method to
994             * check whether the last 2 of their 3 arguments are of same data type
995             * and if not it triggers a parser error. 'in_range()' also checks
996             * whether all of its 3 arguments do have the same standard measuring
997             * unit type and likewise raises a parser error if not.
998             *
999             * For less critical issues built-in functions may also raise parser
1000             * warnings instead.
1001             *
1002             * It is recommended that classes implementing (that is overriding) this
1003             * method should always call their super class's implementation of this
1004             * method to ensure their potential parse time checks are always
1005             * performed as well.
1006             *
1007             * @param args - function arguments going to be passed for executing
1008             *               this built-in function later on
1009             * @param err - the parser's error handler to be called by this method
1010             *              implementation to trigger a parser error with the
1011             *              respective error message text
1012             * @param wrn - the parser's warning handler to be called by this method
1013             *              implementation to trigger a parser warning with the
1014             *              respective warning message text
1015             */
1016            virtual void checkArgs(VMFnArgs* args,
1017                                   std::function<void(String)> err,
1018                                   std::function<void(String)> wrn);
1019    
1020            /**
1021           * Implements the actual function execution. This exec() method is           * Implements the actual function execution. This exec() method is
1022           * called by the VM whenever this function implementation shall be           * called by the VM whenever this function implementation shall be
1023           * executed at script runtime. This method blocks until the function           * executed at script runtime. This method blocks until the function
# Line 959  namespace LinuxSampler { Line 1303  namespace LinuxSampler {
1303      /** @brief Built-in VM 8 bit integer array variable.      /** @brief Built-in VM 8 bit integer array variable.
1304       *       *
1305       * Used for defining built-in integer array script variables (8 bit per       * Used for defining built-in integer array script variables (8 bit per
1306       * array element). Currently there is no support for any other kind of array       * array element). Currently there is no support for any other kind of
1307       * type. So all integer arrays of scripts use 8 bit data types.       * built-in array type. So all built-in integer arrays accessed by scripts
1308         * use 8 bit data types.
1309       */       */
1310      struct VMInt8Array {      struct VMInt8Array {
1311          int8_t* data;          int8_t* data;
# Line 972  namespace LinuxSampler { Line 1317  namespace LinuxSampler {
1317    
1318      /** @brief Virtual machine script variable.      /** @brief Virtual machine script variable.
1319       *       *
1320       * Common interface for all variables accessed in scripts.       * Common interface for all variables accessed in scripts, independent of
1321         * their precise data type.
1322       */       */
1323      class VMVariable : virtual public VMExpr {      class VMVariable : virtual public VMExpr {
1324      public:      public:
# Line 993  namespace LinuxSampler { Line 1339  namespace LinuxSampler {
1339           */           */
1340          virtual void assignExpr(VMExpr* expr) = 0;          virtual void assignExpr(VMExpr* expr) = 0;
1341      };      };
1342        
1343      /** @brief Dynamically executed variable (abstract base class).      /** @brief Dynamically executed variable (abstract base class).
1344       *       *
1345       * Interface for the implementation of a dynamically generated content of       * Interface for the implementation of a dynamically generated content of
# Line 1067  namespace LinuxSampler { Line 1413  namespace LinuxSampler {
1413       */       */
1414      class VMDynIntVar : virtual public VMDynVar, virtual public VMIntExpr {      class VMDynIntVar : virtual public VMDynVar, virtual public VMIntExpr {
1415      public:      public:
1416          MetricPrefix_t unitPrefix(vmuint i) const OVERRIDE { return VM_NO_PREFIX; }          vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
1417          StdUnit_t unitType() const OVERRIDE { return VM_NO_UNIT; }          StdUnit_t unitType() const OVERRIDE { return VM_NO_UNIT; }
1418          bool isFinal() const OVERRIDE { return false; }          bool isFinal() const OVERRIDE { return false; }
1419      };      };
# Line 1349  namespace LinuxSampler { Line 1695  namespace LinuxSampler {
1695              case EMPTY_EXPR: return "empty";              case EMPTY_EXPR: return "empty";
1696              case INT_EXPR: return "integer";              case INT_EXPR: return "integer";
1697              case INT_ARR_EXPR: return "integer array";              case INT_ARR_EXPR: return "integer array";
1698                case REAL_EXPR: return "real number";
1699                case REAL_ARR_EXPR: return "real number array";
1700              case STRING_EXPR: return "string";              case STRING_EXPR: return "string";
1701              case STRING_ARR_EXPR: return "string array";              case STRING_ARR_EXPR: return "string array";
1702          }          }
# Line 1356  namespace LinuxSampler { Line 1704  namespace LinuxSampler {
1704      }      }
1705    
1706      /**      /**
1707         * Convenience function used for retrieving the data type of a script
1708         * variable name being passed to this function.
1709         *
1710         * @param name - some script variable name (e.g. "$foo")
1711         * @return variable's data type (e.g. INT_EXPR for example above)
1712         */
1713        inline ExprType_t exprTypeOfVarName(const String& name) {
1714            if (name.empty()) return (ExprType_t) -1;
1715            const char prefix = name[0];
1716            switch (prefix) {
1717                case '$': return INT_EXPR;
1718                case '%': return INT_ARR_EXPR;
1719                case '~': return REAL_EXPR;
1720                case '?': return REAL_ARR_EXPR;
1721                case '@': return STRING_EXPR;
1722                case '!': return STRING_ARR_EXPR;
1723            }
1724            return (ExprType_t) -1;
1725        }
1726    
1727        /**
1728         * Returns @c true in case the passed data type is some array data type.
1729         */
1730        inline bool isArray(const ExprType_t& type) {
1731            return type == INT_ARR_EXPR || type == REAL_ARR_EXPR ||
1732                   type == STRING_ARR_EXPR;
1733        }
1734    
1735        /**
1736         * Returns @c true in case the passed data type is some scalar number type
1737         * (i.e. not an array and not a string).
1738         */
1739        inline bool isNumber(const ExprType_t& type) {
1740            return type == INT_EXPR || type == REAL_EXPR;
1741        }
1742    
1743        /**
1744       * Convenience function used for converting an StdUnit_t constant to a       * Convenience function used for converting an StdUnit_t constant to a
1745       * string, i.e. for generating error message by the parser.       * string, i.e. for generating error message by the parser.
1746       */       */
# Line 1468  namespace LinuxSampler { Line 1853  namespace LinuxSampler {
1853          bool isStringLiteral() const; ///< Returns true in case this source token represents a string literal (i.e. "Some text").          bool isStringLiteral() const; ///< Returns true in case this source token represents a string literal (i.e. "Some text").
1854          bool isComment() const; ///< Returns true in case this source token represents a source code comment.          bool isComment() const; ///< Returns true in case this source token represents a source code comment.
1855          bool isPreprocessor() const; ///< Returns true in case this source token represents a preprocessor statement.          bool isPreprocessor() const; ///< Returns true in case this source token represents a preprocessor statement.
1856            bool isMetricPrefix() const;
1857            bool isStdUnit() const;
1858          bool isOther() const; ///< Returns true in case this source token represents anything else not covered by the token types mentioned above.          bool isOther() const; ///< Returns true in case this source token represents anything else not covered by the token types mentioned above.
1859    
1860          // extended types          // extended types
1861          bool isIntegerVariable() const; ///< Returns true in case this source token represents an integer variable name (i.e. "$someIntVariable").          bool isIntegerVariable() const; ///< Returns true in case this source token represents an integer variable name (i.e. "$someIntVariable").
1862            bool isRealVariable() const; ///< Returns true in case this source token represents a floating point variable name (i.e. "~someRealVariable").
1863          bool isStringVariable() const; ///< Returns true in case this source token represents an string variable name (i.e. "\@someStringVariable").          bool isStringVariable() const; ///< Returns true in case this source token represents an string variable name (i.e. "\@someStringVariable").
1864          bool isArrayVariable() const; ///< Returns true in case this source token represents an array variable name (i.e. "%someArryVariable").          bool isIntArrayVariable() const; ///< Returns true in case this source token represents an integer array variable name (i.e. "%someArrayVariable").
1865            bool isRealArrayVariable() const; ///< Returns true in case this source token represents a real number array variable name (i.e. "?someArrayVariable").
1866            bool isArrayVariable() const DEPRECATED_API; ///< Returns true in case this source token represents an @b integer array variable name (i.e. "%someArrayVariable"). @deprecated This method will be removed, use isIntArrayVariable() instead.
1867          bool isEventHandlerName() const; ///< Returns true in case this source token represents an event handler name (i.e. "note", "release", "controller").          bool isEventHandlerName() const; ///< Returns true in case this source token represents an event handler name (i.e. "note", "release", "controller").
1868    
1869          VMSourceToken& operator=(const VMSourceToken& other);          VMSourceToken& operator=(const VMSourceToken& other);

Legend:
Removed from v.3561  
changed lines
  Added in v.3582

  ViewVC Help
Powered by ViewVC