jsfx_play
Abstract
Processes audio through a jsfx script
Description
jsfx_play
calls the actual sample processing code defined in a jsfx script.
The script must have been initialized via jsfx_new
, which instantiates and
compiles the script and returns a handle.
jsfx
jsfx
is an audio programming language implemented primarily as part of the DAW REAPER
.
It is a scriptiong language with a built-in compiler which translates it to
machine code on the fly. It allows the user to operate at the sample level (like
defining an udo with setksmps 1
but more efficient). It is around 2x to 2.5x slower
than hand-coded C.
jsfx input / output
A jsfx script has a certain number of audio input / output channels. The number of audio inputs / outputs passed to the script does not need to match the number of channels defined in the script but it is advised to do so. More precisely, if a plugin is stereo, passing only one channel will not reduce the work performed by the plugin. A plugin also defines a series of "sliders", which are parameters operating at control rate. A script can also use these sliders to send control values back, which can be read in csound via jsfx_getslider See https://www.reaper.fm/sdk/js/js.php for more information about the syntax, etc.
Syntax
a1 [, a2, a3, ...] jsfx_play ihandle, ain1 [, ain2, ain3, ...]
Arguments
- ain1, ain2, ...: the audio signals passed as input. The amount of channels processed is min(expected number of streams, given number of streams)
Output
- a1, a2, ...: the output audio generated by the plugin
Execution Time
- Performance (audio)
Examples
<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
sr = 44100
ksmps = 64
nchnls = 2
0dbfs = 1
;; This is the example file for the opcodes jsfx_new, jsfx_play and jsfx_setslider
gisnd ftgen 0, 0, 0, -1, "bourre-fragment-1.flac", 0, 0, 1
FLpanel "jsfx - tubeharmonics", 400, 500, 50, 50
FLcolor 150, 100, 150, 200, 100, 250
iw, ih = 300, 30
iline = ih * 2
iy, ix = ih, ih * 0.5
; min max exp
gkwhich, i0 FLslider "source", 0, 2, 0, 3, -1, iw, ih, ix, iy
iy += iline
iv1 FLvalue "", 50, 30, 322, iy
gkeven, i1 FLslider "even harmonics",0, 1, 0, 3, iv1, iw, ih, ix, iy
iy += iline
iv2 FLvalue "", 50, 30, 322, iy
gkodd, i2 FLslider "odd harmonics", 0, 1, 0, 3, iv2, iw, ih, ix, iy
iy += iline
iv3 FLvalue "", 50, 30, 322, iy
gkflct, i3 FLslider "fluctuation", 0, 1, 0, 3, iv3, iw, ih, ix, iy
iy += iline
iv4 FLvalue "", 50, 30, 322, iy
gkinpt, i4 FLslider "Input (dB)", -12, 12, 0, 3, iv4, iw, ih, ix, iy
iy += iline
iv5 FLvalue "", 50, 30, 322, iy
gkout, i5 FLslider "Output (dB)", -12, 12, 0, 3, iv5, iw, ih, ix, iy
iy += iline
FLcolor 150, 100, 150, 200, 200, 100
gkdump, i6 FLbutton "Dump variables", 1, 0, 2, iw/2, ih, ix, iy, -1
FLpanelEnd
FLrun
FLsetVal_i 0, i0
FLsetVal_i 0.3, i1
FLsetVal_i 0.3, i2
FLsetVal_i 0.1, i3
FLsetVal_i 0, i4
FLsetVal_i 0, i5
FLsetVal_i 0, i6
opcode loopsamp, a, i
ift xin
iloopend = nsamp(ift) / sr
asig flooper2 1, 1, 0, iloopend, 0.1, ift
xout asig
endop
opcode select3, a, kaaa
kwhich, a1, a2, a3 xin
if(kwhich < 1) then
asig = a1*(1-kwhich) + a2*kwhich
else
asig = a2*(2-kwhich) + a3*(kwhich-1)
endif
xout asig
endop
instr 1
a1 loopsamp gisnd
a3 vco2 0.5, ntof:i("3C")
a2 oscili 0.5, 1000
asig select3 gkwhich, a1, a2, a3
ihandle jsfx_new "tubeharmonics.jsfx"
print ihandle
jsfx_setslider ihandle, 1, gkeven, 2, gkodd, 3, gkflct, 4, gkinpt, 5, gkout
aout jsfx_play ihandle, asig
if gkdump == 1 then
jsfx_dump ihandle, metro(4)
endif
k7 jsfx_getslider ihandle, 7
printf "k7: %f \r", changed2(k7), k7
outs aout, aout
endin
</CsInstruments>
<CsScore>
i1 0.1 3600
</CsScore>
</CsoundSynthesizer>
See also
Credits
Eduardo Moguillansky, 2019
Uses the open-source implementation of the jsfx language by Pascal Gauthier et al. Based heavily on
the pd external jsfx~
.
https://github.com/asb2m10/jsusfx