floor — Returns the largest integer not greater than x
floor(x) (init-, control-, or audio-rate arg allowed)
floor(k/i[]) (k- or i-arrays )
where the argument within the parentheses may be an expression. Value converters perform arithmetic translation from units of one kind to units of another. The result can then be a term in a further expression.
Here is an example of the floor opcode. It uses the file floor.csd.
Example 326. Example of the floor opcode.
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 ;;;realtime audio out ;-iadc ;;;uncomment -iadc if realtime audio input is needed too ; For Non-realtime ouput leave only the line below: ;-o floor.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 instr 1 idiv init 1 loop: inumber = 9 i1 = inumber / idiv ifl = floor(i1) print inumber, idiv, ifl ;print number / idiv = result using floor idiv = idiv + 1 if (idiv <= 10) igoto loop endin </CsInstruments> <CsScore> i 1 0 0 e </CsScore> </CsoundSynthesizer>
The output should include lines like these:
instr 1: inumber = 9.000 idiv = 1.000 ifl = 9.000 instr 1: inumber = 9.000 idiv = 2.000 ifl = 4.000 instr 1: inumber = 9.000 idiv = 3.000 ifl = 3.000 instr 1: inumber = 9.000 idiv = 4.000 ifl = 2.000 instr 1: inumber = 9.000 idiv = 5.000 ifl = 1.000 instr 1: inumber = 9.000 idiv = 6.000 ifl = 1.000 instr 1: inumber = 9.000 idiv = 7.000 ifl = 1.000 instr 1: inumber = 9.000 idiv = 8.000 ifl = 1.000 instr 1: inumber = 9.000 idiv = 9.000 ifl = 1.000 instr 1: inumber = 9.000 idiv = 10.000 ifl = 0.000
Here is another example of the floor opcode. It uses the file floor2.csd.
Example 327.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;RT audio out ;-iadc ;;;uncomment -iadc if RT audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o floor.wav -W ;;; for file output any platform ; By Stefano Cucchi 2024 </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 0dbfs = 1 nchnls = 2 instr 1 gkrandom randomh 1, 45, 300, 2, 3 ; generate some random numbers gkrandomFLOOR = floor (gkrandom) ; take the integer part gkrandomFRAC = frac (gkrandom) ; take the fractional part endin instr 10 ktrigger metro 4 kmintim = 0 kmaxnum = 10 kinsnum = 20 kwhen = 0 kdur = ktrigger*0.25 schedkwhen ktrigger, kmintim, kmaxnum, kinsnum, kwhen, kdur endin instr 20 irandomFLOOR = i(gkrandomFLOOR) irandomFRAC = i(gkrandomFRAC) ; Use the integer part to control the number of harmonics of every note ; after converting (k) value to (i) prints "generated value = %f\n", i(gkrandom) prints "--> floor value = %d\n", irandomFLOOR a1 buzz 0.5, 120, irandomFLOOR, 1 kenvelope linseg 0, p3*0.1, 1, p3*0.8, 1, p3*0.1, 0 a1 = a1*kenvelope aL, aR pan2 a1, irandomFRAC, 1 ; use the fractional part to control the pan position outs aL, aR endin </CsInstruments> <CsScore> f 1 0 16384 10 1 i 1 0 10 i 10 0 10 e </CsScore> </CsoundSynthesizer>
Here is an example for the rounding-group, comparing the different rounding opcodes. It uses the file rounding-group.csd.
Example 328. Example of the rounding group.
<CsoundSynthesizer> <CsOptions> -odac ; </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 ; by tgrey 2020 instr 1 iLoopStart = p4 iLoopEnd = p5 iOffset = p6 iCount init iLoopStart if(iLoopStart<iLoopEnd) then ; loop going up while iCount <= iLoopEnd do iVal = iCount+iOffset iRound = round(iVal) iInt = int(iVal) iFloor = floor(iVal) iCeil = ceil(iVal) print iVal, iRound, iInt, iFloor, iCeil iCount = iCount + 1 od elseif(iLoopEnd<iLoopStart) then ; loop going down while iCount >= iLoopEnd do iVal = iCount+iOffset iRound = round(iVal) iInt = int(iVal) iFloor = floor(iVal) iCeil = ceil(iVal) print iVal, iRound, iInt, iFloor, iCeil iCount = iCount - 1 od endif endin </CsInstruments> <CsScore> i1 0 .1 0 10 .5 i1 .2 .1 0 -10 .5 e </CsScore> </CsoundSynthesizer>