fprintks
Prev | Orchestra Opcodes and Operators | Next

## fprintks

fprintks — Similar to printks but prints to a file.

## Description

Similar to printks but prints to a file.

## Syntax

    fprintks "filename", "string", [, kval1] [, kval2] [...]

## Initialization

"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.

## Performance

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 does not have a itime parameter. For more information about output formatting, please look at printks's documentation.

## Examples

Here is an example of the fprintks opcode. It uses the file fprintks.csd.

Example 378. 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
    -n          ; no sound
    ; For Non-realtime ouput leave only the line below:
    ; -o fprintks.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    ; by Matt Ingalls, edited by Kevin Conder & Menno Knevel 2021

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

    instr 1     ; a score generator

    kstart init 0
    kdur linrand 10
    kpitch linrand 8
    kpitch  *=  100
    ; Printing to a file called "my.sco".
    fprintks "my.sco", "i1\\t%2.2f\\t%2.2f\\t%2.2f\\n", kstart, kdur, kpitch

    knext linrand 1
    kstart = kstart + knext

    endin

    </CsInstruments>
    <CsScore>
    i 1 0 0.003
    e
    </CsScore>
    </CsoundSynthesizer>

This example will generate a file called “my.sco”. It should contain lines like this:

    i1	0.00	1.35	668.01
    i1	0.13	2.21	246.53
    i1	0.22	1.88	437.51
    i1	1.18	9.65	126.09

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 379. 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 380. 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 = "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 parameters 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

## See also

File Input and Output

## Credits

Author: Matt Ingalls
January 2003

Prev | Up | Next
foutk | Home | fprints