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.0directly 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/atomrnodes!
- 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.