Module synfx_dsp_jit::stdlib
source · [−]Expand description
Definition of the Intermediate Representation for the JIT compiler.
This is a quick guide of the intermediate language you can pass into the JIT compiler in form of an crate::ASTNode tree.
For a reference of the AST itself I recommend looking at crate::ASTNode and crate::ASTBinOp. They are pretty self explanatory.
Make sure to visit crate::ast::build too, it is an easy way to build an AST data structure.
Global Variables
There are multiple different kinds of variables you can access:
- Predefined crate::DSPFunction Parameters (available in every function):
in1
- First channel inputin2
- Second channel inputalpha
- Alpha parameter inputbeta
- Beta parameter inputdelta
- Delta parameter inputgamma
- Gamma parameter input&sig1
- Writeable signal channel 1 output&sig2
- Writeable signal channel 2 output
- Global Constants
PI
- 3.14159…TAU
- 2*PIE
- Eulers number1PI
- 1/PI2PI
- 2/PIPI2
- PI/2PI3
- PI/3PI4
- PI/4PI6
- PI/6PI8
- PI/81SQRT2
- 1/sqrt(2)1SQRT_PI
- 1/sqrt(PI)LN2
- Ln(2)LN10
- Ln(10)
- Global Variables / Auxilary Variables:
$srate
- The current sample rate in Hz$israte
- The current sample rate in 1.0 / Hz$reset
- Is1.0
directly after the very first initialization and after an explicit call to crate::DSPFunction::reset. Otherwise it’s0.0
.
- Persistent Variables (persistent across multiple calls, until a reset):
*...
- Any variable that starts with a*
is stored across multiple calls.- Note: If you need more (longer) persistent variables, across resets too, use the
atomw
/atomr
nodes!
- Multiple Return Value Accessors
- First return value does not exist as variable, it just is the result of the AST node itself, or the result of the node function.
%1
- Second return value%2
- Third return value%3
- Fourth return value%4
- Fifth return value%5
- Sixth return value
DSP Nodes
I heavily recommend checking out HexoSynth
if you plan to use synfx-dsp-jit
, it offers a graphical environment for trying out
all the following nodes in real time in a visual programming language (called WBlockDSP):
DSPNodeType name | Inputs | Outputs | Description |
---|---|---|---|
accum | input, reset | sum | Accumulator, sums up the input |
phase | frequency, reset | phase | Phase oscillator |
sin | radians | sine | Sine function |
/% | a, b | div, rem | Computes the float division and remainder of a and b |
atomr | index | value | Reads an atomic float from a shared buffer at the given index |
atomr~ | index | value | Reads a linear interpolated atomic float from a shared buffer at the given index |
atomw | index, value | value | Writes an atomic float into a shared buffer at the given index |
s&h | input, set | value | A sample & hold node that samples it’s input on a rising edge at ‘set’. |
s&h~ | input, set | value | A sample & hold node that continously samples it’s input if ‘set’ is set. |
Buffers and Tables
You can pass a configuration to crate::DSPNodeContext::new which lets you define the number of possible buffers and a set of tables. Double precision buffers have to be declared by the JIT AST itself using crate::ASTNode::BufDeclare.
Tables are vectors of single precision floats, which are provided by the caller/user of crate::DSPNodeContext at creation time. You can however swap out the tables at runtime later with others. Either directly by accessing crate::DSPFunction::with_dsp_state or via the crate::engine::CodeEngine::send_table method.