% — 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.
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. Play modulus.csd
Example 17. Example of the % operator.
See the sections Real-time Audio and Command Line Flags for more information on using command line flags.
<CsoundSynthesizer> <CsOptions> ; 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 </CsOptions> <CsInstruments> 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 endin </CsInstruments> <CsScore> f 0 60 ;run for 60 seconds e </CsScore> </CsoundSynthesizer>