2 SuperCollider real time audio synthesis system
3 Copyright (c) 2002 James McCartney. All rights reserved.
4 http://www.audiosynth.com
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "PyrKernel.h"
22 #include "PyrPrimitive.h"
23 #include "PyrMathPrim.h"
24 #include "MiscInlineMath.h"
25 #include "SC_InlineUnaryOp.h"
26 #include "SC_InlineBinaryOp.h"
27 #include "PyrSignal.h"
28 #include "PyrParseNode.h"
29 #include "PyrMessage.h"
34 #include "SC_Endian.h"
37 const int INT_MAX_BY_PyrSlot
= INT_MAX
/ sizeof(PyrSlot
);
39 inline bool IsSignal(PyrSlot
* slot
) { return (IsObj(slot
) && slotRawObject(slot
)->classptr
== class_signal
); }
40 inline bool NotSignal(PyrSlot
* slot
) { return (NotObj(slot
) || slotRawObject(slot
)->classptr
!= class_signal
); }
43 /* functors for dispatching template code */
47 static inline double run(double lhs
, double rhs
)
51 static inline int run(int lhs
, int rhs
)
55 static inline PyrObject
* signal_xf(VMGlobals
*g
, PyrObject
* ina
, float inb
)
57 return signal_add_xf(g
, ina
, inb
);
59 static inline PyrObject
* signal_fx(VMGlobals
*g
, float ina
, PyrObject
* inb
)
61 return signal_xf(g
, inb
, ina
);
63 static inline PyrObject
* signal_xx(VMGlobals
*g
, PyrObject
* ina
, PyrObject
* inb
)
65 return signal_add_xx(g
, ina
, inb
);
71 static inline double run(double lhs
, double rhs
)
75 static inline int run(int lhs
, int rhs
)
79 static inline PyrObject
* signal_xf(VMGlobals
*g
, PyrObject
* ina
, float inb
)
81 return signal_mul_xf(g
, ina
, inb
);
83 static inline PyrObject
* signal_fx(VMGlobals
*g
, float ina
, PyrObject
* inb
)
85 return signal_xf(g
, inb
, ina
);
87 static inline PyrObject
* signal_xx(VMGlobals
*g
, PyrObject
* ina
, PyrObject
* inb
)
89 return signal_mul_xx(g
, ina
, inb
);
95 static inline double run(double lhs
, double rhs
)
99 static inline int run(int lhs
, int rhs
)
103 static inline PyrObject
* signal_xf(VMGlobals
*g
, PyrObject
* ina
, float inb
)
105 return signal_sub_xf(g
, ina
, inb
);
107 static inline PyrObject
* signal_fx(VMGlobals
*g
, float ina
, PyrObject
* inb
)
109 return signal_sub_fx(g
, ina
, inb
);
111 static inline PyrObject
* signal_xx(VMGlobals
*g
, PyrObject
* ina
, PyrObject
* inb
)
113 return signal_sub_xx(g
, ina
, inb
);
117 template <typename Functor
>
118 inline int prOpNum(VMGlobals
*g
, int numArgsPushed
)
130 SetRaw(a
, Functor::run(slotRawInt(a
), slotRawInt(b
)));
139 SetSymbol(a
, slotRawSymbol(b
));
142 if (isKindOf(slotRawObject(b
), class_signal
))
143 SetObject(a
, Functor::signal_fx(g
, slotRawInt(a
), slotRawObject(b
)));
148 SetFloat(a
, slotRawInt(a
) + slotRawFloat(b
));
162 if (isKindOf(slotRawObject(a
), class_signal
)) {
165 SetRaw(a
, Functor::signal_xf(g
, slotRawObject(a
), slotRawInt(b
)));
174 SetSymbol(a
, slotRawSymbol(b
));
177 if (isKindOf(slotRawObject(b
), class_signal
)) {
178 SetRaw(a
, Functor::signal_xx(g
, slotRawObject(a
), slotRawObject(b
)));
183 SetRaw(a
, Functor::signal_xf(g
, slotRawObject(a
), slotRawFloat(b
)));
192 SetRaw(a
, Functor::run(slotRawFloat(a
), (double)slotRawInt(b
)));
201 SetSymbol(a
, slotRawSymbol(b
));
204 if (isKindOf(slotRawObject(b
), class_signal
))
205 SetObject(a
, Functor::signal_fx(g
, slotRawFloat(a
), slotRawObject(b
)));
210 SetRaw(a
, Functor::run(slotRawFloat(a
), slotRawFloat(b
)));
223 if (numArgsPushed
!= -1) // special case flag meaning it is a primitive
224 return errFailed
; // arguments remain on the stack
226 msg
= gSpecialBinarySelectors
[g
->primitiveIndex
];
227 sendMessage(g
, msg
, 2);
231 template <typename Functor
>
232 inline int prOpInt(VMGlobals
*g
, int numArgsPushed
)
242 SetRaw(a
, Functor::run(slotRawInt(a
), slotRawInt(b
)));
251 SetSymbol(a
, slotRawSymbol(b
));
254 if (isKindOf(slotRawObject(b
), class_signal
))
255 SetObject(a
, Functor::signal_fx(g
, slotRawInt(a
), slotRawObject(b
)));
260 SetFloat(a
, Functor::run((double)slotRawInt(a
), slotRawFloat(b
)));
271 if (numArgsPushed
!= -1) // special case flag meaning it is a primitive
272 return errFailed
; // arguments remain on the stack
274 msg
= gSpecialBinarySelectors
[g
->primitiveIndex
];
275 sendMessage(g
, msg
, 2);
279 template <typename Functor
>
280 inline int prOpFloat(VMGlobals
*g
, int numArgsPushed
)
290 SetRaw(a
, Functor::run(slotRawFloat(a
), (double)slotRawInt(b
)));
299 SetSymbol(a
, slotRawSymbol(b
));
302 if (isKindOf(slotRawObject(b
), class_signal
))
303 SetObject(a
, Functor::signal_fx(g
, slotRawFloat(a
), slotRawObject(b
)));
308 SetRaw(a
, Functor::run(slotRawFloat(a
), slotRawFloat(b
)));
319 if (numArgsPushed
!= -1) // special case flag meaning it is a primitive
320 return errFailed
; // arguments remain on the stack
322 msg
= gSpecialBinarySelectors
[g
->primitiveIndex
];
323 sendMessage(g
, msg
, 2);
327 int prAddNum(VMGlobals
*g
, int numArgsPushed
)
329 return prOpNum
<addNum
>(g
, numArgsPushed
);
332 int prSubNum(VMGlobals
*g
, int numArgsPushed
)
334 return prOpNum
<subNum
>(g
, numArgsPushed
);
337 int prMulNum(VMGlobals
*g
, int numArgsPushed
)
339 return prOpNum
<mulNum
>(g
, numArgsPushed
);
343 int prAddFloat(VMGlobals
*g
, int numArgsPushed
)
345 return prOpFloat
<addNum
>(g
, numArgsPushed
);
348 int prSubFloat(VMGlobals
*g
, int numArgsPushed
)
350 return prOpFloat
<subNum
>(g
, numArgsPushed
);
353 int prMulFloat(VMGlobals
*g
, int numArgsPushed
)
355 return prOpFloat
<mulNum
>(g
, numArgsPushed
);
358 int prAddInt(VMGlobals
*g
, int numArgsPushed
)
360 return prOpInt
<addNum
>(g
, numArgsPushed
);
363 int prSubInt(VMGlobals
*g
, int numArgsPushed
)
365 return prOpInt
<subNum
>(g
, numArgsPushed
);
368 int prMulInt(VMGlobals
*g
, int numArgsPushed
)
370 return prOpInt
<mulNum
>(g
, numArgsPushed
);
376 int prNthPrime(VMGlobals
*g
, int numArgsPushed
);
377 int prNthPrime(VMGlobals
*g
, int numArgsPushed
)
393 int prPrevPrime(VMGlobals
*g
, int numArgsPushed
);
394 int prPrevPrime(VMGlobals
*g
, int numArgsPushed
)
411 int prNextPrime(VMGlobals
*g
, int numArgsPushed
);
412 int prNextPrime(VMGlobals
*g
, int numArgsPushed
)
430 int prIsPrime(VMGlobals
*g
, int numArgsPushed
);
431 int prIsPrime(VMGlobals
*g
, int numArgsPushed
)
440 if (n
== 2) { SetTrue(a
); }
441 else { SetFalse(a
); }
442 } else if (n
<= nthPrime(NUMPRIMES
-1)) {
443 // do a search of the primes table
445 if (i
>= 0) { SetTrue(a
); }
446 else { SetFalse(a
); }
449 sqrtn
= (int)sqrt(static_cast<double>(n
));
451 sqrtn
= (int)sqrt(n
);
453 for (i
=0; i
<NUMPRIMES
; ++i
) {
455 if (n
% p
== 0) { SetFalse(a
); break; }
456 if (p
>= sqrtn
) { SetTrue(a
); break; }
462 int prIndexOfPrime(VMGlobals
*g
, int numArgsPushed
);
463 int prIndexOfPrime(VMGlobals
*g
, int numArgsPushed
)
471 if (n
== 2) { SetInt(a
, 0); }
473 } else if (n
<= nthPrime(NUMPRIMES
-1)) {
487 int prAs32Bits(VMGlobals
*g
, int numArgsPushed
);
488 int prAs32Bits(VMGlobals
*g
, int numArgsPushed
)
491 // return an integer that is a bit pattern for the 32 bit float representation
492 union { float f
; int32 i
; } u
;
493 u
.f
= slotRawFloat(a
);
498 int prHigh32Bits(VMGlobals
*g
, int numArgsPushed
);
499 int prHigh32Bits(VMGlobals
*g
, int numArgsPushed
)
503 #if BYTE_ORDER == BIG_ENDIAN
504 union { struct { uint32 hi
, lo
; } i
; double f
; } du
;
506 union { struct { uint32 lo
, hi
; } i
; double f
; } du
;
509 du
.f
= slotRawFloat(a
);
514 int prLow32Bits(VMGlobals
*g
, int numArgsPushed
);
515 int prLow32Bits(VMGlobals
*g
, int numArgsPushed
)
519 #if BYTE_ORDER == BIG_ENDIAN
520 union { struct { uint32 hi
, lo
; } i
; double f
; } du
;
522 union { struct { uint32 lo
, hi
; } i
; double f
; } du
;
525 du
.f
= slotRawFloat(a
);
530 int prFrom32Bits(VMGlobals
*g
, int numArgsPushed
);
531 int prFrom32Bits(VMGlobals
*g
, int numArgsPushed
)
533 PyrSlot
*a
= g
->sp
- 1;
537 err
= slotIntVal(b
, &word
);
540 union { float f
; int32 i
; } u
;
547 int prFrom64Bits(VMGlobals
*g
, int numArgsPushed
);
548 int prFrom64Bits(VMGlobals
*g
, int numArgsPushed
)
550 PyrSlot
*a
= g
->sp
- 2;
551 PyrSlot
*b
= g
->sp
- 1;
555 err
= slotIntVal(b
, &hi
);
558 err
= slotIntVal(c
, &lo
);
561 #if BYTE_ORDER == BIG_ENDIAN
562 union { struct { uint32 hi
, lo
; } i
; double f
; } du
;
564 union { struct { uint32 lo
, hi
; } i
; double f
; } du
;
573 int mathClipInt(struct VMGlobals
*g
, int numArgsPushed
)
585 } else if (IsSym(c
)) {
587 } else if (IsInt(b
) && IsInt(c
)) {
588 SetRaw(a
, sc_clip(slotRawInt(a
), slotRawInt(b
), slotRawInt(c
)));
590 err
= slotDoubleVal(b
, &lo
);
592 err
= slotDoubleVal(c
, &hi
);
594 SetFloat(a
, sc_clip((double)slotRawInt(a
), lo
, hi
));
599 int mathClipFloat(struct VMGlobals
*g
, int numArgsPushed
)
611 } else if (IsSym(c
)) {
614 err
= slotDoubleVal(b
, &lo
);
616 err
= slotDoubleVal(c
, &hi
);
618 SetRaw(a
, sc_clip(slotRawFloat(a
), lo
, hi
));
623 int mathClipSignal(struct VMGlobals
*g
, int numArgsPushed
)
636 } else if (IsSym(c
)) {
638 } else if (IsSignal(b
) && IsSignal(c
)) {
639 sig
= signal_clip_x(g
, slotRawObject(a
), slotRawObject(b
), slotRawObject(c
));
642 err
= slotFloatVal(b
, &lo
);
644 err
= slotFloatVal(c
, &hi
);
646 sig
= signal_clip_f(g
, slotRawObject(a
), lo
, hi
);
652 int mathWrapInt(struct VMGlobals
*g
, int numArgsPushed
)
663 } else if (IsSym(c
)) {
665 } else if (IsInt(b
) && IsInt(c
)) {
666 SetRaw(a
, sc_mod((int)(slotRawInt(a
) - slotRawInt(b
)), (int)(slotRawInt(c
) - slotRawInt(b
) + 1)) + slotRawInt(b
));
670 err
= slotDoubleVal(b
, &lo
);
672 err
= slotDoubleVal(c
, &hi
);
674 SetFloat(a
, sc_mod(x
- lo
, hi
- lo
) + lo
);
679 int mathWrapFloat(struct VMGlobals
*g
, int numArgsPushed
)
691 } else if (IsSym(c
)) {
694 err
= slotDoubleVal(b
, &lo
);
696 err
= slotDoubleVal(c
, &hi
);
698 SetRaw(a
, sc_mod(slotRawFloat(a
) - lo
, hi
- lo
) + lo
);
703 int mathWrapSignal(struct VMGlobals
*g
, int numArgsPushed
)
716 } else if (IsSym(c
)) {
718 } else if (IsSignal(b
) && IsSignal(c
)) {
719 sig
= signal_wrap_x(g
, slotRawObject(a
), slotRawObject(b
), slotRawObject(c
));
722 err
= slotFloatVal(b
, &lo
);
724 err
= slotFloatVal(c
, &hi
);
726 sig
= signal_wrap_f(g
, slotRawObject(a
), lo
, hi
);
732 int mathFoldInt(struct VMGlobals
*g
, int numArgsPushed
)
743 } else if (IsSym(c
)) {
745 } else if (IsInt(b
) && IsInt(c
)) {
746 SetRaw(a
, sc_fold(slotRawInt(a
), slotRawInt(b
), slotRawInt(c
)));
750 err
= slotDoubleVal(b
, &lo
);
752 err
= slotDoubleVal(c
, &hi
);
754 SetFloat(a
, sc_fold(x
, lo
, hi
));
759 int mathFoldFloat(struct VMGlobals
*g
, int numArgsPushed
)
771 } else if (IsSym(c
)) {
774 err
= slotDoubleVal(b
, &lo
);
776 err
= slotDoubleVal(c
, &hi
);
778 SetRaw(a
, sc_fold(slotRawFloat(a
), lo
, hi
));
783 int mathFoldSignal(struct VMGlobals
*g
, int numArgsPushed
)
796 } else if (IsSym(c
)) {
798 } else if (IsSignal(b
) && IsSignal(c
)) {
799 sig
= signal_fold_x(g
, slotRawObject(a
), slotRawObject(b
), slotRawObject(c
));
802 err
= slotFloatVal(b
, &lo
);
804 err
= slotFloatVal(c
, &hi
);
806 sig
= signal_fold_f(g
, slotRawObject(a
), lo
, hi
);
812 int prSimpleNumberSeries(struct VMGlobals
*g
, int numArgsPushed
)
814 PyrSlot
*a
= g
->sp
- 2;
815 PyrSlot
*b
= g
->sp
- 1;
820 if (IsInt(a
) && (IsInt(b
) || IsNil(b
)) && IsInt(c
)) {
821 int first
, second
, last
, step
;
822 first
= slotRawInt(a
);
823 last
= slotRawInt(c
);
824 second
= IsInt(b
) ? slotRawInt(b
) : (first
< last
? first
+ 1 : first
- 1);
825 step
= second
- first
;
830 size
= ((last
- first
) / step
) + 1;
831 if(size
<1 || size
> INT_MAX_BY_PyrSlot
){
832 post("prSimpleNumberSeries: array size %i exceeds limit (%i)\n", size
, INT_MAX_BY_PyrSlot
);
836 PyrObject
*obj
= newPyrArray(g
->gc
, size
, 0, true);
838 PyrSlot
*slots
= obj
->slots
;
840 // Faster iteration for common case
842 for (int i
=0; i
<size
; ++i
) {
846 for (int i
=0; i
<size
; ++i
) {
847 SetInt(slots
+i
, first
++);
852 for (int i
=0; i
<size
; ++i
) {
853 SetInt(slots
+i
, val
);
859 double first
, second
, last
, step
;
860 err
= slotDoubleVal(a
, &first
);
862 err
= slotDoubleVal(c
, &last
);
864 err
= slotDoubleVal(b
, &second
);
866 if (first
< last
) second
= first
+ 1.;
867 else second
= first
- 1.;
870 step
= second
- first
;
871 size
= (int)floor((last
- first
) / step
+ 0.001) + 1;
872 if(size
<1 || size
> INT_MAX_BY_PyrSlot
){
873 post("prSimpleNumberSeries: array size %i exceeds limit (%i)\n", size
, INT_MAX_BY_PyrSlot
);
876 PyrObject
*obj
= newPyrArray(g
->gc
, size
, 0, true);
878 PyrSlot
*slots
= obj
->slots
;
879 if(first
==0. && step
==1.){
880 // Faster iteration for common case
881 for (long i
=0; i
<size
; ++i
) {
882 SetFloat(slots
+i
, i
);
886 for (long i
=0; i
<size
; ++i
) {
887 val
= first
+ step
* i
;
888 SetFloat(slots
+i
, val
);
899 asFraction {|maxDenominator=100|
900 var mediant, lower, upper, temp;
903 #n, d = this.neg.asFraction(maxDenominator);
907 upper = [1.0, this.reciprocal.floor];
908 lower = [1.0, upper[1]+1.0];
910 lower = [this.floor, 1.0];
911 upper = [lower[0]+1.0, 1.0];
913 mediant = [lower[0] + upper[0], lower[1] + upper[1]];
915 mediant = [lower[0] + upper[0], lower[1] + upper[1]];
917 { (this * mediant[1]) > mediant[0] }
919 if (maxDenominator < mediant[1]) {^upper};
920 d = upper[0] - (this * upper[1]);
921 if (d == 0) {^upper};
923 k = floor(((this * lower[1]) - lower[0]) / d);
925 temp = [lower[0] + (k1 * upper[0]), lower[1] + (k1 * upper[1])];
926 lower = [lower[0] + (k * upper[0]), lower[1] + (k * upper[1])];
929 { (this * mediant[1]) == mediant[0] }
931 if (maxDenominator >= mediant[1]) {^mediant};
932 if (lower[1] < upper[1]) {^lower};
936 if (maxDenominator < mediant[1]) {^lower};
937 d = lower[0] - (this * lower[1]);
938 if (d == 0) {^lower};
940 k = floor(((this * upper[1]) - upper[0]) / d);
942 temp = [(k1 * lower[0]) + upper[0], (k1 * lower[1]) + upper[1]];
943 upper = [(k * lower[0]) + upper[0], (k * lower[1]) + upper[1]];
951 int prAsFraction(struct VMGlobals
*g
, int numArgsPushed
)
953 PyrSlot
*a
= g
->sp
- 2;
954 PyrSlot
*b
= g
->sp
- 1;
957 double mediant_num
, lower_num
, upper_num
, temp_num
;
958 double mediant_den
, lower_den
, upper_den
, temp_den
;
965 err
= slotDoubleVal(a
, &x
);
968 err
= slotIntVal(b
, &maxDenominator
);
971 bool faster
= IsTrue(c
);
973 PyrObject
*obj
= newPyrArray(g
->gc
, 2, 0, true);
975 PyrSlot
*slots
= obj
->slots
;
991 upper_den
= floor(1./x
);
993 lower_den
= upper_den
+ 1.;
995 lower_num
= floor(x
);
997 upper_num
= lower_num
+ 1.;
1002 mediant_num
= lower_num
+ upper_num
;
1003 mediant_den
= lower_den
+ upper_den
;
1004 //post(" md %g %g %g %g %g %g\n", mediant_num, mediant_den, lower_num, lower_den, upper_num, upper_den);
1006 if (x
* mediant_den
> mediant_num
) {
1007 d
= upper_num
- (x
* upper_den
);
1008 if (maxDenominator
< mediant_den
|| fabs(d
) < 1e-5) {
1009 if (neg
) upper_num
= -upper_num
;
1010 SetInt(slots
+0, (int)upper_num
);
1011 SetInt(slots
+1, (int)upper_den
);
1014 lower_num
= mediant_num
;
1015 lower_den
= mediant_den
;
1017 k
= (int)floor(((x
* lower_den
) - lower_num
) / d
);
1020 temp_num
= lower_num
+ (k1
* upper_num
);
1021 temp_den
= lower_den
+ (k1
* upper_den
);
1022 lower_num
= lower_num
+ (k
* upper_num
);
1023 lower_den
= lower_den
+ (k
* upper_den
);
1024 upper_num
= temp_num
;
1025 upper_den
= temp_den
;
1028 } else if (x
* mediant_den
== mediant_num
) {
1029 if (maxDenominator
>= mediant_den
) {
1030 if (neg
) mediant_num
= -mediant_num
;
1031 SetInt(slots
+0, (int)mediant_num
);
1032 SetInt(slots
+1, (int)mediant_den
);
1034 } else if (lower_den
< upper_den
) {
1035 if (neg
) lower_num
= -lower_num
;
1036 SetInt(slots
+0, (int)lower_num
);
1037 SetInt(slots
+1, (int)lower_den
);
1040 if (neg
) upper_num
= -upper_num
;
1041 SetInt(slots
+0, (int)upper_num
);
1042 SetInt(slots
+1, (int)upper_den
);
1046 d
= lower_num
- (x
* lower_den
);
1047 if (maxDenominator
< mediant_den
|| fabs(d
) < 1e-5) {
1048 if (neg
) lower_num
= -lower_num
;
1049 SetInt(slots
+0, (int)lower_num
);
1050 SetInt(slots
+1, (int)lower_den
);
1053 upper_num
= mediant_num
;
1054 upper_den
= mediant_den
;
1056 k
= (int)floor(((x
* upper_den
) - upper_num
) / d
);
1059 temp_num
= (k1
* lower_num
) + upper_num
;
1060 temp_den
= (k1
* lower_den
) + upper_den
;
1061 upper_num
= (k
* lower_num
) + upper_num
;
1062 upper_den
= (k
* lower_den
) + upper_den
;
1063 lower_num
= temp_num
;
1064 lower_den
= temp_den
;
1071 void initMathPrimitives()
1075 base
= nextPrimitiveIndex();
1077 definePrimitive(base
, index
++, "_AddInt", prAddInt
, 2, 0);
1078 definePrimitive(base
, index
++, "_SubInt", prSubInt
, 2, 0);
1079 definePrimitive(base
, index
++, "_MulInt", prMulInt
, 2, 0);
1080 definePrimitive(base
, index
++, "_AddFloat", prAddFloat
, 2, 0);
1081 definePrimitive(base
, index
++, "_SubFloat", prSubFloat
, 2, 0);
1082 definePrimitive(base
, index
++, "_MulFloat", prMulFloat
, 2, 0);
1083 definePrimitive(base
, index
++, "_NthPrime", prNthPrime
, 1, 0);
1084 definePrimitive(base
, index
++, "_PrevPrime", prPrevPrime
, 1, 0);
1085 definePrimitive(base
, index
++, "_NextPrime", prNextPrime
, 1, 0);
1086 definePrimitive(base
, index
++, "_IsPrime", prIsPrime
, 1, 0);
1087 definePrimitive(base
, index
++, "_IndexOfPrime", prIndexOfPrime
, 1, 0);
1088 definePrimitive(base
, index
++, "_As32Bits", prAs32Bits
, 1, 0);
1089 definePrimitive(base
, index
++, "_High32Bits", prHigh32Bits
, 1, 0);
1090 definePrimitive(base
, index
++, "_Low32Bits", prLow32Bits
, 1, 0);
1091 definePrimitive(base
, index
++, "_From32Bits", prFrom32Bits
, 2, 0);
1092 definePrimitive(base
, index
++, "_From64Bits", prFrom64Bits
, 3, 0);
1094 definePrimitive(base
, index
++, "_ClipInt", mathClipInt
, 3, 0);
1095 definePrimitive(base
, index
++, "_ClipFloat", mathClipFloat
, 3, 0);
1096 definePrimitive(base
, index
++, "_ClipSignal", mathClipSignal
, 3, 0);
1097 definePrimitive(base
, index
++, "_WrapInt", mathWrapInt
, 3, 0);
1098 definePrimitive(base
, index
++, "_WrapFloat", mathWrapFloat
, 3, 0);
1099 definePrimitive(base
, index
++, "_WrapSignal", mathWrapSignal
, 3, 0);
1100 definePrimitive(base
, index
++, "_FoldInt", mathFoldInt
, 3, 0);
1101 definePrimitive(base
, index
++, "_FoldFloat", mathFoldFloat
, 3, 0);
1102 definePrimitive(base
, index
++, "_FoldSignal", mathFoldSignal
, 3, 0);
1104 definePrimitive(base
, index
++, "_SimpleNumberSeries", prSimpleNumberSeries
, 3, 0);
1105 definePrimitive(base
, index
++, "_AsFraction", prAsFraction
, 3, 0);