nodes reference
introduction to nodes
Everything in Audulus is built with nodes
. There are 53 nodes in total.
Nodes are packets of code that do things. A node may have inputs, outputs, both, or none.
Inputs
are on the left side of nodes and are blue. Outputs
are on the right side of nodes and are red.
Nodes can be moved around the canvas, but they cannot be rotated.
You connect nodes together by dragging a wire from an output to an input. You cannot drag a wire from an input to an output. You can connect one output to as many inputs as you want.
You disconnect nodes by unhooking a wire from an input. Wires cannot be disconnected from an output. An input only accepts one wire. To connect multiple wires to one input, you must use an add
node to first add the signals together.
Wires can go from any output anywhere to any input anywhere: up, down, left, or right. However, overall signal flow in Audulus is from left to right.
Nodes send and receive signals through wires. Every signal is a number. [^1] Although all signals are numbers, there are several categories of signals. These categories are defined by their range, unit, and how they are used.
[^1]: Audulus signals are signed 32-bit floats.
The table below describes every type of signal that nodes use.
signal | range |
---|---|
any |
any signals can be any number and type of signal |
audio |
-1 to 1 [^2] |
gate |
0 or high where high is any non-zero positive 32-bit number. |
hz |
0 to sampleRate/2 [^3] |
integer |
an integer value |
midi value |
integers 0 to 127 |
mod |
0 to 1 |
seconds |
0 to 2^32-1 |
[^2]: Audio signals can exceed the -1 to 1
range, but they will be clipped to that range upon output.
[^3]: Hz values above sampleRate/2
can be generated but are limited in use. Negative hz
signals can be used to flip the phase of the phasor node, useful for through-zero FM.
Some nodes have attributes that are accessible in the inspector panel
. Every node has an (x, y)
position attribute in this panel.
Nodes can be packaged into modules
and submodules
. Modules
are containers for nodes that allow you to create a user interface for you to interact with. Submodules
are used inside of modules
. They are like user-created nodes.
Some nodes are exposable, meaning they have some element that can appear on UI of a module
. Some, like the knob
node, are automatically exposed while others, like the text
node, have an option to expose.
If a node is exposable, a node will have an (x, y)
coordinate for where it is inside the module and another (x, y)
coordinate for where it is on the UI of the module.
Other nodes have attributes you can change directly on the node.
There are 10 different categories of nodes. The table below lists each category and provides a short description.
category | description |
---|---|
util |
various utilities |
math |
use math and logic to manipulate and create signals |
meter |
displays for monitoring signals |
midi |
MIDI utilities |
level |
tools for adjusting and analyzing signal levels |
dsp |
digital signal processing tools |
synth |
essential primitive-level synthesis tools |
module |
used for creating modules and submodules |
poly |
utilities for creating and managing polyphonic signals |
switch |
tools for routing signals |
Some nodes count as outputs. Examples of outputs are value
, light
, and dac
nodes.
If a node is not connected to an output, it will not be evaluated.
util
description
util
nodes are various utilities that do some very essential things.
- The
adc
anddac
nodes are used to getaudio
andCV
in and out of Audulus. - The
text
node is used for labeling and commenting inside of patches. - The
timer
node has a variety of uses including creating envelopes and driving automation. - The
zero cross
node analyzes incoming audio and outputs its frequency inhz
.
adc
output | signal |
---|---|
adc |
audio |
control | description |
---|---|
channel number |
access to 1 of 16 channels indexed from 0 |
exposable | ❌ |
---|---|
description
The adc
node is how you get audio
and CV
into Audulus from an external source. An external source could be a microphone, a DAW, or a CV input from a hardware modular synth.
The adc
node outputs an audio
signal, but in this case, all that means is that incoming signals are clamped between -1 and 1
. The adc
node is often used as an audio
input, but it can also be used to pass a gate
signal from a modular synth.
The adc
node can access the first 16 inputs of any class-compliant audio interface.
The channels are indexed from 0
. Clicking or tapping on the channel number will increment it by 1 up to 15 when it will wrap around to 0 again.
In most cases, 0
is the left channel and 1
is the right channel.
dac
input | signal |
---|---|
dac |
audio |
control | description |
---|---|
channel number |
access to 1 of 16 channels indexed from 0 |
exposable | ❌ |
---|---|
description
The dac
node is how you get audio
and CV
out of Audulus and send it to an external output. An external output could be your headphones, speakers, a DAW, or a CV output to a hardware modular synth.
The dac
node takes an audio
signal input, but in this case, all that means is that outgoing signals are clamped between -1 and 1
. The dac
node is often used as an audio
output, but it can also be used to pass a gate
signal to a modular synth.
The dac
node can access the first 16 outputs of any class-compliant audio interface.
The channels are indexed from 0
. Clicking or tapping on the channel number will increment it by 1 up to 15 when it will wrap around to 0 again.
In most cases, 0
is the left channel and 1
is the right channel.
The dac
node does not include any DC-offset filtering. A constant DC offset can damage speakers. Most audio interfaces will filter a DC offset, but this offset can still cause distortion by decreasing the amount of headroom you have.
It is best practice to use a dc blocker
node before a dac
node unless you explicitly need to send a mod
or gate
signal to an external instrument.
text
exposable | ✅ |
---|---|
description
The text
node has no inputs or outputs. text
nodes are used for labeling and commenting inside your patches. Click or tap on the node and open the inspector panel
(pictured below). You can then type in the text field and text will appear inside the node.
option | description |
---|---|
Align |
Choose from Left , Center , and Right aligned text |
Exposed |
Check the box to expose this node to the UI of the module it is contained within |
The text
node can be resized by tapping or clicking on the blue ball that appears when selecting the node and dragging the ball left or right.
Below are all of the characters that will render correctly in the text
node.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
ÄÅÃÁÂÀÆæâäáàåãÇçÐðÊËÉÈêëéè
ÍÎÏÌïîíìÑñÖØÓÔÒÕõöóòôøÜÚÛÙ
üûúùÝýÿßþÞ
0123456789
!"#$%&'()*+,-./:;<=>?@[\]^
_`{|}~£×¿®¬½¼¡«»©¢¥¤ı¦µ¯´¬
±¾¶§÷¸°¨•
Text size cannot be changed. The canvas
node can do many manipulations with text that the text
node cannot.
timer
input | signal |
---|---|
trigger |
gate |
output | signal |
---|---|
time |
seconds since last reset |
exposable | ❌ |
---|---|
description
The timer
node outputs a signal in seconds
since its last reset. The node resets on the rising edge of an incoming gate
signal.
The timer
output increases smoothly from second to second. Its functional precision is 1/sampleRate seconds
. For example: at a sample rate of 44.1kHz the precision is 1/44,100
or approximately 0.00002 seconds
.
zero cross
input | signal |
---|---|
in |
any but it must cross through or at least touch 0 |
output | signal |
---|---|
out |
hz |
exposable | ❌ |
---|---|
description
The zero cross
node counts the time between two zero-crossings and outputs that value as a hz
signal. To be counted as a zero-crossing, the signal must either pass through 0
or be = 0
at some point during its cycle.
math
description
The math
nodes are some of the most powerful and versatile nodes.
- The
expr
node alone has 40 operators and functions which can be combined in many ways. sum
andproduct
are elegant ways to visually emphasize how signals are combining and can be expanded to have as many inputs as necessary.- The
random
node has aseed
input that ensures multiple copies of the same module can produce different random results with differentseed
values.
expr
arithmetic operator | description |
---|---|
x + y |
addition |
x - y |
subtraction |
x * y |
multiplication |
x / y |
division |
x^y |
exponentiation |
-x |
negation |
(x) |
parenthetical grouping |
exponential function | description |
---|---|
exp(x) |
e^x |
exp2(x) |
2^x |
pow(x, y) |
exponentiation x^y |
sqrt(x) |
square root[^4] |
ln(x) |
natural log |
log2(x) |
log base 2 |
log10(x) |
log base 10 |
[^4]: Cube roots and beyond are accessible like this: x^(1/y)
where x = radicand
and y = degree
.
boolean operator | description |
---|---|
x == y |
x is exactly equal to y |
x != y |
x is not y |
x < y |
x is less than y |
x <= y |
x is less than or equal to y |
x > y |
x is greater than y |
x >= y |
x is greater than or equal to y |
common function | description |
---|---|
abs(x) |
absolute value |
floor(x) |
round down to integer |
ceil(x) |
round up to integer |
fract(x) |
x - floor(x) |
mod(x, y) |
remainder of x / y |
min(x, y) |
returns lesser of x and y |
max(x, y) |
returns greater of x and y |
clamp(x, a, b) |
restricts x to the interval [a, b] |
step(x, edge) |
1 if x > edge otherwise 0 |
smoothstep(a, b, x) |
smooth step from 0 to 1 at the interval [a, b] |
mix(x, a, b) |
0 to 1 at x smoothly transitions between the interval [a, b] |
trigonometric function | description |
---|---|
sin(x) |
sine |
cos(x) |
cosine |
tan(x) |
tangent |
asin(x) |
inverse sine |
acos(x) |
inverse cosine |
atan(x) |
inverse tangent |
sinh(x) |
hyper sine |
cosh(x) |
hyper cosine |
tanh(x) |
hyper tangent |
asinh(x) |
inverse hyper sine |
acosh(x) |
inverse hyper cosine |
atanh(x) |
inverse hyper tangent |
constant | description |
---|---|
pi |
π |
e |
Euler's number |
exposable | ❌ |
---|---|
description
The expr
node is the most versatile node. It does math and basic programming operations.
Double clicking on any input will create an expr
node.
You enter equations into the inspector panel
, pictured below. You do not need to add an =
sign after your expression.
You can drag and drop various selected functions into the text field, or if you know their syntax, type them directly into the text box.
Entering letters or words will create variables as inputs, as pictured below.
Variables are case-sensitive, meaning x
is not the same as X
. Spaces and underscores are not allowed. For long variables, you can use camel case. For example: thisIsALongVariable
.
Variables can contain numbers, but they must start with a letter. input1
will generate an input but 1input
will not. Variables cannot contain symbols.
Certain variable names are reserved, like mod
, e
, and pi
. If you need to use them as variables you can capitalize the first letter, like this: Mod
, E
, Pi
.
You can call a variable multiple times within an expression, like x * x * x
.
Spaces between variables and operators and within functions are optional. x*y
is the same as x * y
and clamp(x,0,1)
is the same as clamp(x, 0, 1)
.
Functions can be nested within one another, like max(0, min(x, 1))
.
Divide-by-zero functions return a 0
. In other rare cases it is possible to create an expression that outputs a nan
value, or "Not a number." The node producing the nan
will immediately self-disconnect from your signal chain to prevent damage to speakers. A nan
will be displayed in the value
node, as pictured below.
Expressions like the 1/3
in x * (1/3)
are evaluated once during start-up and replaced by a float in the background of Audulus, saving some compute time.
sum
input | signal |
---|---|
in |
any |
in |
any |
... |
any |
output | signal |
---|---|
sum |
any |
exposable | ❌ |
---|---|
description
The sum
node adds two or more signals together.
In the inspector panel
you can specify how many channels you want to add together. The maximum is 256
.
When you increase the number of channels, the number of inputs increases accordingly.
product
input | signal |
---|---|
in |
any |
in |
any |
... |
any |
output | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The product
node multiplies two or more signals together.
In the inspector panel
you can specify how many channels you want to multiply together. The maximum is 256
.
When you increase the number of channels, the number of inputs increases accordingly.
random
output | signal |
---|---|
out |
mod |
exposable | ❌ |
---|---|
The random
node outputs a new random number between 0 and 1
for every sample. In other words, it produces white noise.
The Seed
value can be changed in the inspector panel
, pictured below. Changing the Seed
is necessary in cases where you have two or more random
nodes in a patch and want them to produce a different string of random numbers.
If the Seed
remains the same, every time the patch is reopened, the same string of random numbers will be produced.
meter
description
The meter
nodes are vital for displaying information about signals.
- The
meter
node is responsive and versatile. - The
waveform
node is a simple way to see how signals change over time. - The
value
node can help with debugging as well as displaying information on UIs. - The
light
andrgb light
nodes are great for adding visual feedback to modules. - The
scope
node is like thewaveform
node, but suited for examining audio rate signals. - With the
shader
andcanvas
nodes you can use your own code to create your own beautiful custom meters, visualizers, and UI elements using GLSL and Lua.
meter
input | signal |
---|---|
in |
audio |
exposable | ✅ |
---|---|
description
The meter
node displays the amplitude of a signal. The input works in a range of -1 to 1
. However, 0 to 1
will display the same as 0 to -1
, as you can see below:
In the inspector panel
the meter
node can be resized by altering the height and width parameters, as seen below. It is also exposable.
If both W
and H
values are 0
, then the node defaults to its standard size. The node can be resized however you want, but it cannot be rotated.
If you wire a poly
signal to a meter
node, it automatically creates one meter per channel.
waveform
input | signal |
---|---|
in |
audio |
exposable | ✅ |
---|---|
description
The waveform
node allows you to see signals change over time. It has a fixed 5-second window and moves from left to right.
Since it works with the audio
range, the top limit of the node is 1
, the center is 0
, and the bottom is -1
.
The waveform
node works best with low frequency signals. If you want to examine audio-rate signals, use a scope
node.
value
input | signal |
---|---|
in |
any |
exposable | ✅ |
---|---|
description
The value
node displays the current value of any signal.
In the inspector panel
, you can set precision from 0
to 0.0000
, and an option to alight Left
, Right
, or Center
. The value
node is also exposable.
Changing precision can be useful for UI displays. For example, a sequencer's current step
display should be a whole number, not a decimal.
If you wire a poly
signal to a value
node, it automatically creates one value display per channel.
light
input | signal |
---|---|
in |
gate |
exposable | ✅ automatic |
---|---|
description
The light
node turns on when the incoming signal is high
(any non-zero positive number). Otherwise it stays off.
rgb light
input | signal |
---|---|
r |
mod |
g |
mod |
b |
mod |
exposable | ✅ automatic |
---|---|
description
The rgb light
node has 3 inputs: one for red r
, one for green g
, and one for blue b
.
Each input works with a mod
signal. When the signal is 0
, the light is off. When the signal is 1
, the light is fully on.
Colors can be mixed by sending different values to each input.
scope
input | signal |
---|---|
x |
audio |
y |
audio |
r |
mod |
g |
mod |
b |
mod |
s |
mod |
exposable | ✅ |
---|---|
description
The scope
node can visualize high frequency waveforms, phase relationships, and Lissajous curves that you otherwise could not with the waveform
node.
A cursor draws a dot with a color of {r, g, b}
at the coordinates (x, y)
where both x
and y
have a range of -1 to 1
. The point (0, 0)
is the center of the display.
The s
variable is a measure of the persistence of the line drawn where 0
means only the current position of the cursor is shown and 1
means the cursor will draw a line that persists infinitely. s
values between 0
and 1
will cause the line to fade quickly or gradually over time.
There can be a large difference between what an s
value of 0.9
, 0.99
, and 0.999
look like, so experiment with what works best for your use.
In the scope
node's inspector panel
there are options to change both the Size
and resolution (Image Size
) of the scope.
The default size is W = 200
and H = 200
with an image size of W = 512
and H = 512
.
For a crisp, clean-looking line, the Image Size
should be at least double the Size
parameter. For a more digital-looking, stair-stepped size, the Image Size
should be the same or smaller than the Size.
shader
exposable | ✅ |
---|---|
description
The shader
node is an OpenGL shader that allows you to write your own shader using GLSL, a programming language similar to C.
Although the default example has r
g
b
inputs, you are not limited to just those inputs. You can have 0 inputs or as many as you need to run your code.
You write code in the inspector panel
.
At the bottom of the inspector panel
you can also find Size
and Image Size
parameters.
Error messages, if any, appear above these parameters.
canvas
exposable | ✅ |
---|---|
description
The canvas
node allows you to draw things using Lua, a simple interpreted programming language.
Although the default example has no inputs or outputs, you can create as many as you'd like by declaring them in the inspector panel
above the code block.
To create inputs and outputs, you must enter each variable with a space in between.
Below the field where you declare variables you can use Lua code to draw things on the canvas
node.
Below the code block are all of the available Lua functions which you can drag and drop into your code.
Below the functions are options to change the Size
of the canvas
node and Save Data
between patch loads.
Unlike other nodes, the canvas
node does not run at audio rate, making it unsuitable to be within any audio or time-critical control paths. As the name implies, it is intended to be space to draw things.
midi
description
The midi
nodes send and receive MIDI signals in and out of Audulus.
- The
keyboard
allows you to play Audulus synths with an external MIDI controller or feed in MIDI notes from a DAW. - The
note send
node sends MIDI notes out of Audulus to hardware or DAWs. - The
cc send
node sends MIDI CC messages from Audulus to hardware or or DAWs. - The
trigger
node can both act like a button within Audulus and can also receive on/off MIDI messages.
keyboard
output | signal |
---|---|
Hz |
Hz |
gate |
gate |
control | description |
---|---|
Legato/Poly(2,4,8,16) |
sets the number of voices |
Omni/(1-16) |
sets the MIDI channel |
exposable | ❌ |
---|---|
description
The keyboard
node receives input from MIDI keyboards, DAWs, and other input MIDI devices.
It outputs a Hz
value for the note and a gate
signal for note on/off. The height of the gate represents the velocity.
There are also two controls on the keyboard
node. The first cycles through Legato
and Poly(2,4,8,16)
.
Legato
means only one note (the last played) will be outputted. Poly 2
means 2 notes can be played at once, Poly 4
means 4, and so on.
Higher poly counts multiply CPU usage, so only set it to the count you need.
The Omni/(1-16)
control specifies which incoming MIDI channel is referenced. On Omni
, any messages from any of the channels will come through. You can also set the keyboard node to listen to a specific channel 1-16
.
note send
input | signal |
---|---|
note |
midi value |
gate |
gate |
velocity |
midi value |
exposable | ❌ |
---|---|
description
The note send
node sends MIDI note, gate, and velocity data from Audulus to external instruments.
The note
and velocity
inputs correspond to the 0-127
integer values expected by MIDI. Inputs are floored, so if the value is between 0
and 1
, 0
is the output.
The gate
input sends a note on/off signal where high
is on and 0
is off.
cc send
input | signal |
---|---|
value |
midi value |
number |
midi value |
trigger |
gate |
exposable | ❌ |
---|---|
description
The cc send
node sends MIDI CC value from Audulus to external instruments.
When the trigger
input goes high, the signal present at the value
input is sent to the number
CC.
trigger
control | description |
---|---|
button |
outputs gate when pressed |
exposable | ✅ automatic |
---|---|
description
The trigger
node outputs a gate when its button is pressed. The button can be clicked, tapped, or assigned to an external hardware MIDI signal in MIDI mapping mode.
level
description
The level
nodes are tools helpful for manipulating the level of a signal.
- You can create custom lines with the
spline
node and trace over them to output a continuous series of custom values. - The
mapper
node allows you to shape the response curve of a knob or signal moving through it. - The
env follow
node traces the loudness envelope of an incoming signal and outputs it as amod
signal.
spline
input | signal |
---|---|
in |
mod |
out | signal |
---|---|
out |
mod |
control | description |
---|---|
spline |
create breakpoints to draw spline |
exposable | ✅ |
---|---|
description
The spline
node allows you to draw a line using two or more breakpoints and then trace over that line using a mod
input.
Breakpoints are added by double clicking or tapping on the blank field inside the node. Once created, they can be dragged around anywhere inside of the field.
The coordinate system determining the output is (in, line)
. The bottom left of the field is (0, 0)
and the top right is (1, 1)
. The output of the node is the y
value of the line given x
input.
In the example below, identical spline nodes are driven by two different LFO shapes. The top is a saw wave and the bottom is a triangle wave.
mapper
input | signal |
---|---|
in |
mod |
out | signal |
---|---|
out |
mod [^5] |
[^5]: The output of the mapper
node can overshoot the maximum and minimum of the mod
signal by ~0.12
.
control | description |
---|---|
mapper |
move one of three breakpoints up or down to shape curve |
exposable | ✅ |
---|---|
description
The mapper
node allows you to change the response of an incoming modulation signal depending on the curve drawn in the node's field.
Below are some of the possible shapes you can draw using the mapper node.
The coordinate system determining the output is (in, line)
. The bottom left of the field is (0, 0)
and the top right is (1, 1)
. The output of the node is the y
value of the line given x
input.
The image below shows how the different shapes transform the incoming saw LFO.
As you can see in the above image, the mapper node can overshoot the modulation signal. This exception is a maximum of approximately +/- 0.12
.
env follow
input | signal |
---|---|
in |
audio |
out | signal |
---|---|
out |
mod [^6] |
[^6]: In most cases, the env follow
node is used to extract an amplitude envelope of an audio
signal, and abs(audio) = mod
. However, in reality the env follow
node outputs abs(any)
with some minor filtering to smooth transitions between samples.
exposable | ❌ |
---|---|
description
The env follow
node extracts an envelope from an incoming audio signal and transforms it into a modulation signal. It does this by taking the absolute value of the incoming signal and applying a small amount of filtering to smooth transitions between samples.
dsp
description
DSP is an acronym that means digital signal processing. The dsp
nodes are essentials for creating filters and manipulating signals at a conceptually low level.
- The
unit delay
node delays a signal by a single sample and marks precisely where a feedback delay happens within a feedback loop. - The
biquad
node is a building block for creating custom biquad filters. - The
low-pass
andhigh-pass
nodes are conveniently packaged, non-resonant filters. - The
delay line
node can delay a signal up to 20 seconds. - The
dc blocker
node prevents a signal with a DC-offset from harming speakers. - The
sample rate
node outputs the current sample rate, useful in many calculations where the precise sample rate is needed. - The
resample
node allows you to up- and then down-sample a signal to run certain parts of a module at a higher sample rate. - The
memory
node allows you to record, playback, and import audio or control signals. - The
dsp
node allows you to write code for low-level signal processing using the Lua programming langauge.
unit delay
input | signal |
---|---|
in |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The unit delay
node delays an incoming signal by 1
sample. It also explicitly tells Audulus where to insert a single sample feedback delay within a feedback loop.
If a unit delay
is not inserted somewhere within a feedback loop, Audulus will guess where to put it. Much of the time this is ok, but in some cases, like when creating analog-modeling filters, you need to be explicit about where the feedback delay goes.
biquad
input | signal |
---|---|
in |
any |
a1 |
a1 coefficient |
a2 |
a2 coefficient |
a3 |
a3 coefficient |
b1 |
b1 coefficient |
b2 |
b2 coefficient |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The biquad
node allows you to create all different types of biquadratic filters. Refer to this guide for more information.
You need to calculate the coefficient inputs separately from the node using expr
nodes.
low-pass
input | signal |
---|---|
in |
any |
alpha |
mod |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The low pass
node is a simple non-resonant 6dB/oct
low-pass filter. The alpha
input is the smoothing factor where 1 = no filtering
and 0 = maximum filtering
.
high-pass
input | signal |
---|---|
in |
any |
alpha |
mod |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The high pass
node is a simple non-resonant 6dB/oct
high-pass filter. The alpha
input is the smoothing factor where 1 = maximum filtering
and 0 = no filtering
.
delay line
input | signal |
---|---|
in |
any |
time |
seconds |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The delay line
node delays an incoming signal by a set number of seconds, determined by the value at the time
input.
dc blocker
input | signal |
---|---|
in |
audio |
out | signal |
---|---|
out |
audio |
exposable | ❌ |
---|---|
description
The dc blocker
node removes any DC offset from an audio
signal.
sample rate
out | signal |
---|---|
sample rate |
Hz |
exposable | ❌ |
---|---|
description
The sample rate
node outputs the current sample rate in Hz
.
resample
in | signal |
---|---|
in |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The resample
node lets you run a portion of a patch at a higher sample rate, also known as supersampling.
In the inspector panel
you can choose from different multiples of the base sample rate from 1x
to 16x
. Higher sample rates use more CPU time.
For example, given a base sample rate of 44.1kHz
, 4x
sample rate would be 176.4kHz
.
To properly use the resample
node, you have to have two resample
nodes in your patch, one to mark where you want to begin supersampling and one to mark where you want to downsample back to the original sample rate, as well as a pre-downsampling low-pass filter with a cutoff set to half the base sample rate.
Nodes that are super-sampled have a multiple in parentheses next to their titles, like Resample (4x)
.
memory
in | signal |
---|---|
read index |
any (positive) |
write index |
any (positive) |
write value |
any |
write enable |
gate |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The memory
node can read, write, and store audio
and control signals. Information is stored in the memory
node as a series of samples.
The read index
is the sample number currently outputted, indexed from 0
.
The write index
is the sample number currently selected to be (over)written, indexed from 0
.
The write value
is the value of the sample to be written.
The write enable
input will, if held high
, write the write value
to the write index
.
Reading and writing to the memory
node can happen at different index values at the same time.
You can also import audio to the memory node. On Mac, you do this by dragging an .AIFF
or .WAV
file from a Finder window into the space marked Drop audio file here
. There is also a check box labeled Save Data
that, when checked, will save the contents of the memory
node in between patch loads.
dsp
exposable | ❌ |
---|---|
description
The dsp
node is an allows you to write code for signal processing using Lua, a simple interpreted programming language.
You can create inputs and outputs using the fields in the inspector panel. Inputs and outputs are global arrays of samples. You must define a function called process
which takes a sample count to process and operates on the global arrays. Define constants and any storage you need between calls to process above the process function. A global variable, sampleRate, is set to the current sample rate and is available outside the process function. Another global variable, storage
is an array of samples that is saved in the patch, indended to save audio, sequencer data, etc.
synth
description
The synth
nodes are low-level building blocks specific to audio synthesis.
- The
osc
node outputs one of 4 classic anti-aliased waveforms. - The
phasor
node outputs an un-aliased phasor signal from0 to 2π
useful for creating custom oscillators - The
sample & hold
node can sample an input signal, store it, and hold that value at its output. - The
adsr
node generates an envelope according to an incominggate
signal.
osc
in | signal |
---|---|
Hz |
Hz |
amp |
mod |
sync |
gate or audio |
shp |
mod |
out | signal |
---|---|
out |
audio |
control | description |
---|---|
waveform selector |
selects one of 4 waveforms |
exposable | ✅ |
---|---|
description
The osc
node outputs as audio
one of four anti-aliased elemental waveforms, selectable on the panel of the node: sine, square, triangle, and saw.
The osc
node is intended as an audio-rate oscillator. This means it is anti-aliased. Using the osc
node as an LFO can lead to some unpredictable behavior with overshooting caused by the anti-aliasing.
The Hz
input controls the speed of the oscillator from 0
to sampleRate/2 Hz
.
The amp
input uses a mod
signal to control the amplitude of the wave. For example: An amplitude value of 1
will set the output of the osc
node to range between -1 and 1
, whereas a value of 0.5
will oscillate between -0.5 and 0.5
.
The sync
input will restart the waveform on the rising edge of an incoming gate
or audio
signal. It is a hard sync, meaning it will reset regardless of where it is in its cycle.
The shp
input changes the shape of the square and saw waves. For the square wave, shp
controls the pulse width from 50% to 100%
. For the saw wave, shp
will transform the saw wave into a supersaw which, when modulated, simulates the chorusing effect of two detuned saw waves.
The waveform selector is exposable.
phasor
in | signal |
---|---|
freq |
Hz or -Hz |
sync |
gate or audio |
out | signal |
---|---|
out |
0 to 2π |
exposable | ❌ |
---|---|
description
The phasor
node outputs a phasor from 0 to 2π
with 64-bit internal precision.
The phasor
node is not anti-aliased, making it suitable for creating custom LFOs. If you want to create a custom VCO with a phasor
node, refer to the resample
node section to see how to anti-alias its output. You can use an expr
node to shape and scale the output of the phasor
node.
The sync
input will reset the phasor on the rising edge of a gate
or audio
signal.
Positive Hz
values at the freq
input will run the phasor
from 0 to 2π
, while negative Hz
values will reverse the direction, running from 2π to 0
.
sample & hold
in | signal |
---|---|
in |
any |
trigger |
gate |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The sample & hold
node will sample a value at its input on the rising edge of a gate
signal at the trigger
input and hold that value at its output until the trigger
input is gated again.
You can think of it like a single-sample memory
node.
In the inspector panel
you can select the Save Data
checkbox to save the held value in between patch loads.
In the example below, on the top, a phasor
-based sine generator is being sampled at 10Hz
, and underneath, the sample & hold
node is sampling random values produced by a random
node.
adsr
in | signal |
---|---|
gate |
gate |
a |
seconds |
d |
seconds |
s |
mod |
r |
seconds |
out | signal |
---|---|
out |
mod |
exposable | ❌ |
---|---|
description
The adsr
node outputs an envelope when the gate
input is held high
.
The a
input is the attack time, d
is decay time, s
is sustain level, and r
is release time.
As long as the gate
input is held high
, the output of the envelope
node increases from 0
to gate height
over a
seconds, decreases to the s
level over d
seconds, then once the gate goes low
, decreases from the s
level back to 0
over r
seconds.
Below you can see the envelope
node going through its full cycle superimposed on the incoming gate
signal.
module
description
The module
nodes important elements for creating modules
and submodules
.
- The
module
node encases nodes into amodule
orsubmodule
. - The
input
andoutput
nodes allow signals to flow into and out ofmodules
andsubmodules
. - The
knob
,xy pad
,slider
,toggle
, andtouch pad
are all elements you can interact with that you can set up to control what's going inside amodule
.
module
exposable | ✅ |
---|---|
description
The module
node lets you encase nodes inside of a UI.
In the inspector panel
, you have options to name the module, define its size, whether or not it is exposed, when it is exposed if it should hide its inputs
and outputs
, and a field to enter a description of what it does.
Exposed elements within a module
node will appear automatically on the UI. You can move them around by clicking or tapping the lock icon
to enter Edit Modules
mode.
You can either define an explicit size for the module
node, or let the UI elements determine the size. In the example below, the first module
has a dimension of 0x0
and the size of the module is determined by where the input
and output
nodes are placed. In the second example, the module has a fixed size of 200x200
and the output can be placed wherever without shrinking the size of the module. In the third example, you can see how with a fixed size, you can even put UI elements outside of modules, which can be useful for both creative and practical purposes.
There are two classes of things you can create with the module
nodes: modules
and submodules
.
The difference between them is that modules
are meant to be interacted with while submodules
are like custom nodes used to create modules
. Below you can see some modules
on the left and submodules
on the right.
You can open any module
and see how it works inside. This is the interior of the 8-Step Sequencer
which has in itself a Begin-End Counter + Direction
submodule
in the top right. You can also see in the top right of the menu bar a directory showing root >
8-Step Sequencer
. This means we are inside of the sequencer.
Below is the inside of the Begin-End Counter + Direction submodule
that is inside of the 8-Step Sequencer
. Notice that the directory now reads root >
8-Step Sequencer >
Begin-End Counter + Direction
.
There is no limit to the number of module
nodes you can nest in one another, though it is rare to need more than 5 levels.
Modules
themselves can also be exposed to the UI of module
nodes. This means you can create synthesizers from individual module elements. Below is a screenshot of a synthesizer module
on the left made mostly of other modules
and a few extra nodes
that you see on the right.
input
out | signal |
---|---|
out |
any |
exposable | ✅ automatic |
---|---|
description
The input
node is used to get signals into a module
node. It must be placed inside the module
node.
It can be renamed in the inspector panel
.
output
in | signal |
---|---|
in |
any |
exposable | ✅ automatic |
---|---|
description
The output
node is used to get signals out of a module
node. It must be placed inside the module
node.
It can be renamed in the inspector panel
.
knob
out | signal |
---|---|
out |
mod |
control | description |
---|---|
knob |
move with up/down or left/right motion |
exposable | ✅ automatic |
---|---|
description
The knob
node is used to modify other nodes. It outputs a 0 to 1
mod
signal. This signal can be scaled and shaped by expr
, mapper
, and spline
nodes.
There are several options for the knob
node in the inspector panel
. You can directly set the Value
, change the Style
, Icon
, color, and MIDI CC
and Channel
.
There are six Style
options for the knob
node that change its shape: Standard
, Mini
, Large
, Drive
, Mix
, and Bipolar
. The three color options are blue, green, and red.
You can also select one of 16 animated Icon
options: Cutoff
, Res
, Drive
, Freq
, Level
, Offset
, PW
, Explog
, Length
, Random
, Density
, Attack
, Decay/Release
, Sustain
, Waves
.
Wires can be attached directly to knobs. When a wire is attached to a knob, a blue circle appears at the center. The input signal of the wire will be clamped to the 0 to 1
mod
signal range.
xy pad
out | signal |
---|---|
x |
mod |
y |
mod |
control | description |
---|---|
xy pad |
click or tap anywhere on field |
exposable | ✅ |
---|---|
description
The xy pad
node outputs two mod
signals that correspond to the (x, y)
coordinates of where you click or touch. This point is marked by a colored dot.
In the inspector panel
you can change the Size
of the node and its color.
You can make the node smaller, larger, or rectangular.
slider
out | signal |
---|---|
out |
mod |
control | description |
---|---|
slider |
click or tap to move up or down |
exposable | ✅ automatic |
---|---|
description
The slider
node is used to modify other nodes. It outputs a 0 to 1
mod
signal. This signal can be scaled and shaped by expr
, mapper
, and spline
nodes.
When the slider
node is zeroed (turned all the way down) a square appears in the center of the small circle.
In the inspector panel
you can change the color of the slider to blue, green, or red, and assign MIDI CC
and Channel
.
toggle
out | signal |
---|---|
out |
gate |
control | description |
---|---|
toggle switch |
click or tap to switch |
exposable | ✅ automatic |
---|---|
description
The toggle
node outputs a 0 or 1
gate signal. When the switch is set to the left, the output is 0
, and when it's set to the right, it is 1
.
In the inspector panel
you can set the color of the switch as blue, green, or red.
touch pad
out | signal |
---|---|
x |
mod |
y |
mod |
touch |
gate |
control | description |
---|---|
touch pad |
click or tap anywhere on field |
exposable | ✅ |
---|---|
description
The touch pad
node outputs two mod
signals that correspond to the (x, y)
coordinates of where you click or touch. This point is marked by a blue circle.
In the inspector panel
you can change the Size
of the node and the number of Channels
(for iOS multitouch).
You can make the node smaller, larger, or rectangular.
poly
description
The poly
nodes help create and manage polyphonic signals.
- The
combine
andsplit
nodes allow you to merge several mono signals together and then take them back apart. - The
poly mix
node takes a poly signal and mixes it down to a mono signal. - The
channel index
node outputs a poly signal of integers indexed from0
. - The
channel count
node outputs the current number of polyphony at its input.
combine
in | signal |
---|---|
0 |
any |
1 |
any |
... |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The combine
node takes from 2
up to 256
mono signals and combines them into one polyphonic signal.
In the inspector panel
you can set the number of channels.
split
in | signal |
---|---|
in |
any |
out | signal |
---|---|
0 |
any |
1 |
any |
... |
any |
exposable | ❌ |
---|---|
description
The split
node takes a poly signal and splits it into 1
to 256
mono signals.
In the inspector panel
you can set the number of channels.
poly mix
in | signal |
---|---|
0 |
any |
1 |
any |
... |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The split
node takes a poly signal and splits it into 1
to 256
mono signals.
In the inspector panel
you can set the number of Channels
.
channel index
out | signal |
---|---|
out |
integers 1 - 256 |
exposable | ❌ |
---|---|
description
The channel index
node creates a signal with 1
to 256
channels where each channel is an integer index number that is indexed from 0
.
In the inspector panel
you can set the number of Channels
.
channel count
out | signal |
---|---|
out |
integers 1 - 256 |
exposable | ❌ |
---|---|
description
The channel count
node outputs the number of channels in a signal as an integer.
switch
description
The switch
nodes route signals and turn them on or off.
- The
mux
node sends one of several inputs to one output while thedemux
node sends one input to several outputs. - The
spigot
node allows you to turn off a section of a patch to prevent it from wasting CPU time when not needed.
mux
in | signal |
---|---|
sel |
any |
0 |
any |
1 |
any |
... |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The mux
node routes one of 2
to 256
inputs to a single output according to the sel
value, which is indexed from 0
.
In the inspector panel
you can set the number of inputs.
When the sel
value is equal to or greater than 0
but less than 1
, then the 0
input is sent to the output. When the sel
value is equal to or greater than 1
but less than 2
, then the 1
input is sent to the output, and so on.
If the sel
value exceeds the number of inputs, then it will wrap around to the beginning. That means a mux
node with 2 inputs and a sel
value of 2
will send the 0
input to the output.
If the sel
value is negative, the selection wraps around backwards. So a mux
node with 2 inputs and a sel
value of -1
will send the 1
input to the output.
demux
in | signal |
---|---|
sel |
any |
in |
any |
out | signal |
---|---|
0 |
any |
1 |
any |
... |
any |
exposable | ❌ |
---|---|
description
The demux
node routes one signal to 2
or up to 256
outputs according to the sel
value, which is indexed from 0
.
In the inspector panel
you can set the number of outputs.
When the sel
value is equal to or greater than 0
but less than 1
, then the input is sent to the 0
output. When the sel
value is equal to or greater than 1
but less than 2
, then the input is sent to the 1
output, and so on.
If the sel
value exceeds the number of outputs, then it will wrap around to the beginning. That means a demux
node with 2 outputs and a sel
value of 2
will send the input to the 0
output.
If the sel
value is negative, the selection wraps around backwards. So a demux
node with 2 inputs and a sel
value of -1
will send the input to the 1
output.
spigot
in | signal |
---|---|
active |
gate |
in |
any |
out | signal |
---|---|
out |
any |
exposable | ❌ |
---|---|
description
The spigot
node turns off processing for all nodes to the left of it in the signal path that are not connected to some form of output like a meter
or dac
node.
When the active
input is 0
, nothing passes, and processing is halted. When the active
input is high
, the signal passes and everything is processed normally.
Nodes that are not processing show inactive
next to their name when in timing mode
. As you can see below, the first osc
node is shut off by the spigot
node whereas the second is not.
Beware that if you have any kind of meter
or other type of terminal output node connected to a node or series of nodes that you want to turn off using a spigot node, the node will not turn off.