fprintks — Semblable à printks mais imprime dans un fichier.
"filename" -- nom du fichier de sortie.
"string" -- la chaîne de texte à imprimer. Peut contenir jusqu'à 8192 caractères et doit être entre guillements.
kval1, kval2, ... (facultatif) -- Les valeurs de taux-k à imprimer. Elle sont spécifiées dans « string » avec les spécificateurs de format du C standard (%f, %d, etc.) dans l'ordre donné.
fprintks est semblable à l'opcode printks sauf qu'il imprime dans un fichier et qu'il n'a pas de paramètre de taux-i. Pour plus d'information sur le formatage de la sortie, prière de consulter la documentation de printks.
Voici un exemple de l'opcode fprintks. Il utilise le fichier fprintks.csd.
Exemple 375. Exemple de l'opcode fprintks.
Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.
<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>
Cet exemple générera un fichier nommé « my.sco ». Il contiendra
des lignes comme celles-ci :
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
Voici un exemple de l'opcode fprintks, qui convertit un fichier MIDI standard en partition Csound. Il utilise le fichier fprintks-2.csd.
Exemple 376. Exemple de l'opcode fprintks pour convertir un fichier MIDI en partition 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 -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>
Cet exemple générera un fichier nommé « MIDI2cs.sco » contenant des
évènements i correspondant au fichier MIDI.
Voici un exemple avancé de l'opcocde fprintks, qui génère une partition pour Csound. Il utilise le fichier scogen-2.csd.
Exemple 377. Exemple de l'opcode fprintks pour créer un générateur de fichier de partition Csound au moyen de 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>
Cet exemple générera un fichier nommé « schottstaedt.sco » que l'on
peut utiliser comme partition avec
schottstaedt.orc