Welcome to Audulus! With Audulus you can build synthesizers from first principles, design new sounds, or process audio. All with real-time low-latency processing suitable for live performance.
The iPad Audulus UI at a glance:
- Pinch with two fingers to zoom in and out of your patch.
- Drag on the background or with two fingers to pan.
- Double-tap on a node to zoom in for editing.
- Double-tap on the background to zoom out and see your entire patch.
- Many operations use context menus - hold down the context menu button with one hand and tap with the other.
- To create a new node, hold the context menu button, and tap on the background.
- To make a connection, hold the connection button and drag from an output to an input.
- To disconnect, hold the connection button and drag from an input.
- Tap the button in the lower right corner to bring up the on-screen keyboard.
- Audulus will automatically detect your MIDI keyboard or control surface.
The Mac Audulus UI at a glance:
- many operations use right-click context menus (control click if you have one button)
- to create a new node, right-click on the background, choose a node category and node type
- to zoom use the mouse wheel or two fingers on your trackpad
- to pan, drag the background
- to select a node just click on it
- to select multiple nodes, hold shift while clicking
- to select all the nodes required to compute a node's output, command-click on the node
- to make a connection between nodes, drag from an output to an input
- to disconnect, drag from an input
- to get help on a node, hover the mouse over it for about a second
Note: presets are currently available on the Mac version. presets will soon be coming to the iPad version!
Presets enable rapid switching between different networks. You might use presets for switching between sounds during a performance or experimenting with different ideas within a single patch.
To store a preset, hold the option key and press one of the number keys. To load a preset press one of the number keys.
Because connections in Audulus fade in/out when connected/disconnected, you can set up your patch so there are no clicks or pops when changing presets.
Also, sharing nodes between presets enables things like delay spillover.
A MIDI program change message will call up a preset, so presets can be used with your MIDI foot controller. This is particularly useful for guitar rigs.
Polyphonic processing in Audulus works seamlessly. A connection between nodes is polyphonic if it is rendered thicker. Nodes are automatically capable of polyphonic processing. So for example, feed a Distortion node with a polyphonic connection and the distortion will be applied separately to each voice in the connection.
A good example of polyphonic processing is the Subtractive example. Set the Keyboard node to "poly" and note the thicker polyphonic connections. That is, up until the voices are mixed down by the PolyToMono node.
To install Audulus as an Audio Unit plugin, download the installer package above.
The installer package will install the Audio Anit to either a user-specific (~/Library/Audio/Plug-Ins/Components) or a system-wide (/Library/Audio/Plug-Ins/Components) location.
The Audulus Audio Unit will appear under the manufacturer name "Subatomic".
Note that the plugin is currently 32-bit only, so if you're running your host in 64-bit mode, it may not appear in the menu.
The Audulus Audio Unit needs to know the location of the purchased Audulus.app. By default it will look in the Applications folder. If Audulus.app is not in the Applications folder, you will see a button to locate it in the plugin window.
Audulus sends usage information back to us when the app exits. This is of great help in improving the app. The following information will be sent:
- when the app is launched
- when a new document is created
- names of examples opened
- names of the nodes created
- errors encountered while running the app
- the OS version
Note: not available for iPad.
The AudioUnit node hosts an AudioUnit plug-in. Double-click to open the AudioUnit's view. Many AudioUnit plugins are available for purchase online.
Some AudioUnits are not compatible with Mac App Store apps. If the AudioUnit node shows "Error: see documentation" then download the "unsandboxed" version of Audulus, here. This version requres the Mac App Store version of Audulus to be installed, but doesn't run with the same restrictions. If the unsandboxed version does not fix the error, please contact support.
We plan to implement AudioUnit parameter control via additional node inputs in a future version.
The input node recieves an input signal, which comes from either:
- The audio hardware's inputs, if running stand-alone and not within a sub-patch
- the patch node's input of the same name, if the input node is within a sub-patch
- the AudioUnit's inputs if running in an AudioUnit and not within a sub-patch.
The Output node sends signal output leaving the patch. The signal goes to either:
- the audio hardware's outputs, if running stand-alone and not within a sub-patch
- the patch node's output of the same name, the output node is within a sub-patch
- or the AudioUnit's outputs if running in an AudioUnit and not within a sub-patch
The Patch node is a patch within a patch (or a sub-patch). The patch node's inputs and outputs correspond to the input and output nodes within the sub-patch.
To enter the sub-patch, double-click on the patch node. To exit, select "Exit Sub-Patch" from the View menu.
A sub-patch can be shared between multiple patch nodes by instancing the patch node (accessible via the context menu).
A patch file may be imported as a sub-patch by selecting "Import Sub-Patch" from the File menu. This imports the file's data, rather than linking to the file.
The PolyToMono node mixes a polyphonic input (denoted by a thick wire) to a monophonic output (thin wire). Each voice is mixed equally.
Typically, you'll want to place linear effects (reverb, delay, EQ) after the PolyToMono, since it will sound the same as placing them before but only a single voice needs to be processed. On the other hand, nonlinear effects, such as Distortion will have quite a different effect if placed before the PolyToMono versus after.
Text is editable text that can be used to label things and write comments. To edit the text, invoke the context menu on the text.
The Time node outputs the transport time (in seconds).
If running as an audio unit, the time node will output the host's current time.
The Timer node outputs the time (in seconds) after its input is triggered.
The ZeroCross node can be used to detect the pitch of a simple waveform. It outputs the frequency of zero-crossings of its input signal in Hertz.
The ADSR (Attack Decay Sustain Release) node controls the envelope of a note. The control signal can be used for the note's volume, or to vary some other parameter such as a filter cutoff.
The envelope starts when the velocity input becomes greater than zero and decays when the velocity returns to zero. The envelope goes through four stages of attack, decay, sustain, and release each controlled by a knob.
The Attack knob specifies how long in seconds until the note reaches full volume.
The Decay knob specifies how long until (in seconds) the note fades to the sustain level which is, in turn, specified by the Sustain knob.
The Release knob specifies how long (in seconds) until the note fades after the velocity returns to zero.
The Oscillator node is the foundation of most synthesizers. It produces one of the following waveforms, according to its waveforms menu:
- sine. A neutral waveform with no harmonic character.
- triangle. Also mellow but with more harmonics.
To see what these waveforms look like, set the oscillator's pitch input to 1 and attach the out output to a waveform node.
The pitch input is in units of Hertz.
The sync input will reset the oscillator whenever it crosses 0. To see this in action, hook another low-frequency oscillator to the sync input and watch the waveform node.
The semitones and cents knobs shift the input pitch.
Coming soon to iPad.
The Sample node plays a sample. Currently only AIFF files (files with extension .aiff) are supported. Only the first channel is read from the file.
The node's trigger input causes the sample to play. Hook up a Trigger node to the sample node to trigger the sample.
The add node adds its two inputs, a and b. Addition of signals is the same as mixing, so the add node can also be used to mix signals (equally).
The Div node divides its two inputs, a by b.
The Math Expression Node (Expr) allows the entry of a textual mathematical expression, like 2*x + y + z. The node creates an input for each variable and a single output for the result of the expression.
It has a variety of uses, including: unit conversion, control-signal mapping, wave-shaping or building custom oscillators. It can also be used when doing math with individual nodes is too cumbersome.
The Math Expression Node includes the following operators and functions:
|x * y, x / y||multiplication, division|
|x + y, x - y||addition, subtraction|
|x < y, x > y||less, greater. 1 if true, 0 if false|
|x == y||equality. 1 if true, 0 if false|
|x ? a : b||conditional. b if x is 0, otherwise a|
FunctionsTrigonometric functions (angles are in radians)
|pow(x,y)||xy. Can also use x^y as shorthand.|
|exp(x)||ex. Can also use e^x as shorthand.|
|exp2(x)||2x. Can also use 2^x as shorthand.|
|floor(x)||rounds down to the nearest integer|
|ceil(x)||rounds up to the nearest integer|
|fract(x)||x - floor(x)|
|mod(x,y)||remainder of x / y|
|min(x,y)||returns the lesser of x and y|
|max(x,y)||returns the 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. Hard step.|
|smoothstep(x, a, b)||smooth step from 0 to 1 on the interval [a, b]|
The LessThan node outputs 1 if a < b, otherwise 0.
The mod node computes the remainder of division of a by b.
The mult node multiplies its two inputs, a and b.
The Random node outputs random numbers in the range [0, 1].
The Sin node outputs sin(x), where x is its input.
The sub node subtracts its two inputs, a and b.
The keyboard node converts MIDI note messages as well as interaction with its on-screen keyboard into pitch and velocity signals.
Pitch is expressed as the fundamental frequency of the note in Hertz. MIDI note velocities are scaled to a zero-to-one range.
The keybaord has two modes:
- Legato. Only one note at a time, and notes will not be re-triggered.
- Poly. Polyphonic - multiple notes can be played simultaneously.
When in poly mode, the keybaord's pitch and velocity outputs become polyphonic, shown as thicker connections. This can consume considerably more CPU time than monophoic processing. To support polyphony efficiently in your patch, use the PolyToMono node, which will mix the polyphonic signals to monophonic.
The Trigger node outputs one when its button is pressed, and zero otherwise.
To assign the button to a MIDI key, right-click on the button, select Learn Midi Note and then press a key on your controller. To unassign the MIDI key, select Unassign Note from the button's right-click menu.
The Delay node time-delays the input signal by a duration specified by the Time knob, in seconds.
The Distortion node adds harmonics to a signal by applying a sigmoid function to the signal. As the input signal becomes larger, the sigmoid behaves more like a step function.
To create a great rock distortion sound for electric guitar, run a HighPass node before the distortion, to give the guitar some tightness and a LowPass node after as a tone control. Adjust the HighPass for more of a fuzzy sound. Connect this to a good old tube amp and commence rocking.
The Filter node is a 12db/octave low-pass filter with resonance. To change the filter cutoff frequency and resonance, drag on the filter graph.
The frequency input controls the cutoff frequency of the filter in units of Hertz. The filter's cutoff frequency ranges between 20 Hz and half the current sample rate (e.g. 22 kHz for standard 44 kHz audio).
Resonance amplifies the frequencies close to the cutoff frequency. Resonance may be modulated using the resonance input. Range: 0 to 1.
In the future, this node will be improved with more filter types.
The HighPass node implements a 12db/octave high-pass filter. Its implementation is very simple and efficient.
The LowPass node implements a 12db/octave low-pass filter. Its implementation is very simple and efficient.
The PitchShift node changes the pitch of its in input according to the value of its shift input. If shift is one, the input signal is unchanged. If shift is two, the output will be the input shifted one octave up. If shift is 1/2, the output will be the input shifted one octave down. Best results are achieved when shift is between 1/2 and 2.
The PitchShift node uses the FFT-based phase vocoder algorithm, which is polyphonic.
The Constant node outputs a constant value specified by its knob.
The Level node adjusts the level of its input. For example:
The Mapper node transforms input according to a curve. Three control points manipulate the curve. For the more technically inclined among you, the curve is a quadratic Bezier.
The Range clamps its input within a range specified by the min and max inputs.
The Spline node provides an arbitrary piecewise-linear envelope. That is, it connects some points with lines to make a function. The node's input takes the x-coordinate and output provides the y-coordinate.
Among the Spline node's uses are pitch envelopes, amplitude envelopes, oscillator waveforms, velocity curves, and automation control.
- To create a control point, double tap on the function area.
- To move a control point, drag it.
- To delete a control point, double tap on it
The value boxes on the left control the min and max value of the function. Control for the scale of the x-axis will be added in a future version.
The red dot shows the current input and output values.
The Crossfade node blends between its two inputs according to the value of the mix knob.
The Mixer4x1 node mixes its four inputs equally. Level nodes may be used to vary the level of each channel prior to mixing.
In the future we plan to build a more full-featured mixer node.
The Meter node implements a simple level meter.
This node will be improved with better metering and options in the future.
The Value node displays the current value of its input. For example:
The Waveform node shows a signal as a horizontally scrolling waveform. Hook an output of a node to its input to see what the signal looks like over time. Its a great debugging tool.