fprintks — Similar to printks but prints to a file.
"filename" -- name of the output file.
"string" -- the text string to be printed. Can be up to 8192 characters and must be in double quotes.
kval1, kval2, ... (optional) -- The k-rate values to be printed. These are specified in “string” with the standard C value specifier (%f, %d, etc.) in the order given.
fprintks is similar to the printks opcode except it outputs to a file and doesn't have a itime parameter. For more information about output formatting, please look at printks's documentation.
Here is an example of the fprintks opcode. It uses the file fprintks.csd.
Example 163. Example of the fprintks 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 ; Audio out Audio in -odac -iadc ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o fprintks.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> /* Written by Matt Ingalls, edited by Kevin Conder. */ ; Initialize the global variables. sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 ; Instrument #1 - a score generator example. instr 1 ; K-rate stuff. kstart init 0 kdur linrand 10 kpitch linrand 8 ; Printing to to a file called "my.sco". fprintks "my.sco", "i1\\t%2.2f\\t%2.2f\\t%2.2f\\n", kstart, kdur, 4+kpitch knext linrand 1 kstart = kstart + knext endin </CsInstruments> <CsScore> /* Written by Matt Ingalls, edited by Kevin Conder. */ ; Play Instrument #1. i 1 0 0.001 </CsScore> </CsoundSynthesizer>
This example will generate a file called “my.sco”. It should contain lines like this:
i1 0.00 3.94 10.26 i1 0.20 3.35 6.22 i1 0.67 3.65 11.33 i1 1.31 1.42 4.13
Here is an example of the fprintks opcode, which converts a standard MIDI file to a csound score. It uses the file fprintks-2.csd.
Example 164. Example of the fprintks opcode to convert a MIDI file to a csound score.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in No messages ; -odac -iadc -d ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: -n -Fmidichn_advanced.mid ;Don't write audio ouput to disk and use the file midichn_advanced.mid as MIDI input </CsOptions> <CsInstruments> sr = 48000 ksmps = 16 nchnls = 2 ;Example by Jonathan Murphy 2007 ; assign all midi events to instr 1000 massign 0, 1000 pgmassign 0, 1000 instr 1000 ktim timeinsts kst, kch, kd1, kd2 midiin if (kst != 0) then ; p4 = MIDI event type p5 = channel p6= data1 p7= data2 fprintks "MIDI2cs.sco", "i1\\t%f\\t%f\\t%d\\t%d\\t%d\\t%d\\n", ktim, 1/kr, kst, kch, kd1, kd2 endif endin </CsInstruments> <CsScore> i1000 0 10000 e </CsScore> </CsoundSynthesizer>
This example will generate a file called “MIDI2cs.sco” containing i-events according to the MIDI file
Here is an advanced example of the fprintks opcode, which generates scores for Csound. It uses the file scogen-2.csd.
Example 165. Example of the fprintks opcode to create a Csound score file generator using Csound.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in No messages ; -odac -iadc -d ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: -n ;Don't write audio ouput to disk </CsOptions> <CsInstruments> ;=========================================================== ; scogen.csd by: Matt Ingalls ; ; a "port" of sorts ; of the old "mills" score generator (scogen) ; ; this instrument creates a schottstaedt.sco file ; to be used with the schottstaedt.orc file ; ; as long as you dont save schottstaedt.orc as a .csd ; file, you should be able to keep it open in MacCsound ; and render each newly generated .sco file. ; ;=========================================================== gScoName = "/Users/matt/Desktop/schottstaedt.sco" ; the name of the file to be generated sr = 100 ; this defines our temporal resolution, ; an sr of 100 means we will generate p2 and p3 values ; to the nearest 1/100th of a second ksmps = 1 ; set kr=sr so we can do everything at k-rate ; some print opcodes opcode PrintInteger, 0, k kval xin fprintks gScoName, "%d", kval endop opcode PrintFloat, 0, k kval xin fprintks gScoName, "%f", kval endop opcode PrintTab, 0, 0 fprintks gScoName, "%n" endop opcode PrintReturn, 0, 0 fprintks gScoName, "%r" endop ; recursively calling opcode to handle all the optional parameters opcode ProcessAdditionalPfields, 0, ikio iPtable, kndx, iNumPfields, iPfield xin ; additional pfields start at 5, we use a default 0 to identify the first call iPfield = (iPfield == 0 ? 5 : iPfield) if (iPfield > iNumPfields) goto endloop ; find our tables iMinTable table 2*iPfield-1, iPtable iMaxTable table 2*iPfield, iPtable ; get values from our tables kMin tablei kndx, iMinTable kMax tablei kndx, iMaxTable ; find a random value in the range and write it to the score fprintks gScoName, "%t%f", kMin + rnd(kMax-kMin) ; recursively call for any additional pfields. ProcessAdditionalPfields iPtable, kndx, iNumPfields, iPfield + 1 endloop: endop /* =========================================================== Generate a gesture of i-statements p2 = start of the gesture p3 = duration of the gesture p4 = number of a function that contains a list of all function table numbers used to define the pfield random distribution p5 = scale generated p4 values according to density (0=off, 1=on) [todo] p6 = let durations overlap gesture duration (0=off, 1=on) [todo] p7 = seed for random number generator seed [todo] =========================================================== */ instr Gesture ; initialize iResolution = 1/sr kNextStart init p2 kCurrentTime init p2 iNumPfields table 0, p4 iInstrMinTable table 1, p4 iInstrMaxTable table 2, p4 iDensityMinTable table 3, p4 iDensityMaxTable table 4, p4 iDurMinTable table 5, p4 iDurMaxTable table 6, p4 iAmpMinTable table 7, p4 iAmpMaxTable table 8, p4 ; check to make sure there is enough data print iNumPfields if iNumPfields < 4 then prints "%dError: At least 4 p-fields (8 functions) need to be specified.%n", iNumPfields turnoff endif ; initial comment fprints gScoName, "%!Generated Gesture from %f to %f seconds%n %!%t%twith a p-max of %d%n%n", p2, p3, iNumPfields ; k-rate stuff if (kCurrentTime >= kNextStart) then ; write a new note! kndx = (kCurrentTime-p2)/p3 ; get the required pfield ranges kInstMin tablei kndx, iInstrMinTable kInstMax tablei kndx, iInstrMaxTable kDensMin tablei kndx, iDensityMinTable kDensMax tablei kndx, iDensityMaxTable kDurMin tablei kndx, iDurMinTable kDurMax tablei kndx, iDurMaxTable kAmpMin tablei kndx, iAmpMinTable kAmpMax tablei kndx, iAmpMaxTable ; find random values for all our required parametrs and print the i-statement fprintks gScoName, "i%d%t%f%t%f%t%f", kInstMin + rnd(kInstMax-kInstMin), kNextStart, kDurMin + rnd(kDurMax-kDurMin), kAmpMin + rnd(kAmpMax-kAmpMin) ; now any additional pfields ProcessAdditionalPfields p4, kndx, iNumPfields PrintReturn ; calculate next starttime kDensity = kDensMin + rnd(kDensMax-kDensMin) if (kDensity < iResolution) then kDensity = iResolution endif kNextStart = kNextStart + kDensity endif kCurrentTime = kCurrentTime + iResolution endin </CsInstruments> <CsScore> /* =========================================================== scogen.sco this csound module generates a score file you specify a gesture of notes by giving the "gesture" instrument a number to a (negative) gen2 table. this table stores numbers to pairs of functions. each function-pair represents a range (min-max) of randomness for every pfield for the notes to be generated. =========================================================== */ ; common tables for pfield ranges f100 0 2 -7 0 2 0 ; static 0 f101 0 2 -7 1 2 1 ; static 1 f102 0 2 -7 0 2 1 ; ramp 0->1 f103 0 2 -7 1 2 0 ; ramp 1->0 f105 0 2 -7 10 2 10 ; static 10 f106 0 2 -7 .1 2 .1 ; static .1 ; specific pfield ranges f10 0 2 -7 .8 2 .01 ; density f11 0 2 -7 8 2 4 ; pitchmin f12 0 2 -7 8 2 12 ; pitchmax ;=== table containing the function numbers used for all the p-field distributions ; ; p1 - table number ; p2 - time table is instantiated ; p3 - size of table (must be >= p5!) ; p4 - gen# (should be = -2) ; p5 - number of pfields of each note to be generated ; p6 - table number of the function representing the minimum possible note number (p1) of a generated note ; p7 - table number of the function representing the maximum possible note number (p1) of a generated note ; p8 - table number of the function representing the minimum possible noteon-to-noteon time (p2 density) of a generated note ; p9 - table number of the function representing the maximum possible noteon-to-noteon time (p2 density) of a generated note ; p10 - table number of the function representing the minimum possible duration (p3) of a generated note ; p11 - table number of the function representing the maximum possible duration (p3) of a generated note ; p12 - table number of the function representing the maximum possible amplitude (p4) of a generated note ; p13 - table number of the function representing the maximum possible amplitude (p5) of a generated note ; p14,p16.. - table number of the function representing the minimum possible value for additional pfields (p5,p6..) of a generated note ; p15,p17.. - table number of the function representing the maximum possible value for additional pfields (p5,p6..) of a generated note ; siz 2 #pds p1min p1max p2min p2max p3min p3max p4min p4max p5min p5max p6min p6max f1 0 32 -2 6 101 101 10 10 101 105 100 106 11 12 100 101 ;gesture definitions ; start dur pTble scale overlap seed i"Gesture" 0 60 1 ;todo-->0 0 123 </CsScore> </CsoundSynthesizer>
This example will generate a file called “schottstaedt.sco” which can be used as a score together with schottstaedt.orc