% — Modulus operator.


Arithmetic operators perform operations of change-sign (negate), don't-change-sign, logical AND logical OR, add, subtract, multiply and divide. Note that a value or an expression may fall between two of these operators, either of which could take it as its left or right argument, as in

a + b * c.

In such cases three rules apply:

1. * and / bind to their neighbors more strongly than + and −. Thus the above expression is taken as

a + (b * c)

with * taking b and c and then + taking a and b * c.

2. + and bind more strongly than &&, which in turn is stronger than ||:

a && b - c || d

is taken as

(a && (b - c)) || d

3. When both operators bind equally strongly, the operations are done left to right:

a - b - c

is taken as

(a - b) - c

Parentheses may be used as above to force particular groupings.

The operator % returns the value of a reduced by b, so that the result, in absolute value, is less than the absolute value of b, by repeated subtraction. This is the same as modulus function in integers. New in Csound version 3.50.


a % b  (no rate restriction)

where the arguments a and b may be further expressions.


The arguments of % can be scalar values or k-rate one dimensional arrays (vectors), or any combination. If one of the arguments is an array, so is the value.


Here is an example of the % operator. It uses the file modulus.csd.

Example 20. Example of the % operator.

See the sections Real-time Audio and Command Line Flags for more information on using command line flags.

; Select audio/midi flags here according to platform
-odac -Ma --midi-key=4 --midi-velocity-amp=5 -m0  ;;;realtime audio out and midi in
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o %.wav -W ;;; for file output any platform

sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1

giScale ftgen 1, 0, -12, -2, 0, -34, -7, 10, -14, 3, -21, -3, -27, -10, 7, -17	;12 note scale with detuned keys

instr 1

ikey	= p4
ivel	= p5
indx	= ikey % 12								;work on the twelftone scale
icent	tab_i indx, giScale							;load the scale
ifreqeq	= cpsmidinn(ikey)
ifreq	= ifreqeq * cent(icent)							;change frequency by cents from table
prints	"Key %d modulus 12 =  %d. ", ikey, indx
prints	"Equal-tempered frequency of this key  = %f,", ifreqeq
prints  " but here with cent deviation %d = %f%n", icent, ifreq
asig	vco2 ivel*.5, ifreq
	outs asig, asig

f 0 60		;run for 60 seconds


See Also

-, +, &&, ||, *, /, ^


Arithmetic on vectors is new in version 6.00