Tangle beta: Manual

Tangle is currently in beta release. That means that it is fully functional, but there are some features in progress and possibly some bugs. This document is intended to help you get started with using it, but it also highlights areas which are incomplete. In addition, the document itself is a work in progress. Feel free to contact me about its shortcomings, and I'll try to keep improving it.

  1. Introduction
    1. Tooltips
  2. The canvas
    1. Adding components
    2. Selecting & moving components
    3. Navigating the canvas
    4. Inputs & output ports
  3. Understanding connections
  4. Connection editing
    1. Range
    2. Order and blend mode
    3. Shortcut arrows
  5. Components
    1. Oscillator
    2. Filter
    3. Noise
    4. Sequencer
    5. Envelope
    6. Macro
    7. XY Pad
    8. Quantise
    9. MixPan
    10. Delay
    11. Expression
    12. Scope

Introduction (top)

Tangle is a modular polyphonic software synthesiser. Like several other well-known software programs, it uses a 'boxes and wires' approach. This lets you add components to a canvas and connect them together to build custom structures.

This idea has been applied in 3D CAD software, video game engines, and many other fields, but most of all in audio software. Of course, that's not too surprising; musicians have tinkered with modular synthesisers since long before the average person owned a computer.

Compared to other well-known and mature audio programs of the 'box and wire' type, Tangle is almost embarassingly simple. It has very few components (12 at present) and tries to do a lot with them. The focus is on providing a fast and enjoyable way to try out new combinations, and to yield musical results quickly.

You won't be building your own oscillators in Tangle - components are 'high level' and designed for easy use. They enable numerous synthesis methods: FM, AM, wavetable, subtractive, and comb-filter (Karplus) synthesis. More components may be added in future to expand these options.

Tooltips (top)

Tangle has helpful tooltips attached to many of its controls. Hover your mouse to get more information on what these controls do, and keyboard shortcuts for them. In some cases the tooltips are dynamic - if you change an option, the tooltip will change to give more info on your choice.

The canvas (top)

When you open Tangle, the biggest area you can see is called the canvas. This is the area where you'll be adding components and linking them together. By default, you'll see two components on the canvas. The larger box with orange sliders is an oscillator. The smaller box with a white knob marked 'Gain' is the main output. Any signal plugged into this will emit from your speakers when you play a MIDI note.

If you play your MIDI keyboard or click the triangle play button (top left, next to the Tangle logo), you can hear what this patch does. It's just a sine wave.

Adding components (top)

To add a new component, right click (or ctrl-click) on an empty area of the canvas. A menu appears with all available components listed. When the new component is added, it is highlighted (selected) by default.

You will also see a new panel at the bottom of the screen with similar controls to the canvas component. This is called an edit panel. It contains all the detailed settings for a component, whereas the object on the canvas just shows shortcuts to a few important parameters.

Selecting & moving components (top)

Screenshot of selecting multiple components

You can click on a component to select it. Clicking on an empty part of the canvas deselects it, and its edit panel disappears. You can select multiple components by shift-clicking, or dragging a selection box on the canvas.

You can move a component by dragging it around the canvas. If multiple components are selected, they will all be moved.

Tip: When selecting or moving a canvas component, you may change a parameter by accident if you click a control like a slider. One way to avoid this is to click and drag just above or below the main rounded-rectangle of the component, between the circles that represent inputs and output ports. In this area of 'empty space' there's no danger of accidentally clicking a slider.

The canvas is a large area, and you can scroll around in the familiar way, using scroll bars at the right and bottom of the canvas, or using a mousewheel or OS specific gestures.

Image of the recentre and zoom buttons.

If you get 'lost' you can quickly return to the area showing your components by clicking the recentre button in the top toolbar. It looks like a rectangle with a dot in the centre - or you can hit C on your keyboard.

You can zoom in and out of the canvas using the magnify glass icon in the top toolbar. Alternatively, hold Ctrl and use your mouse scroll wheel to zoom. Tangle is entirely dynamically drawn - there are no images, so you can zoom in and out with no loss of quality.

Inputs & output ports (top)

Components have inputs and outputs which can be connected. They are shown as little circles above and below each component. Inputs are at the top of the component, outputs are at the bottom. This means that the natural way to create a patch in Tangle is from bottom to top.

A filter component with its cutoff input highlighted.

Inputs and outputs are very similar. I will use the word ports to talk about them both. Placing your mouse over a port shows the port's name overlaid on the canvas component. It also highlights any connections heading into or out of the port.

Dragging from an output to an input (or vice-versa) will create a new connection.

Understanding connections (top)

I call the normal formula for applying modulation from an input to a parameter the relative rule. It looks like this:

modulatedValue = basicValue + (basicValue × inputValue)

For example, imagine oscillator X has a frequency of 400Hz, and oscillator Y is connected to its frequency input. The connection has a range of -1.0 to 1.0. The modulated frequency of X at Y's minimum and maximum points will therefore be:

400Hz + (400Hz × -1.0) = 0Hz
400Hz + (400Hz × 1.0)  = 800Hz

What happens if X has a frequency of 1000Hz instead?

1000Hz + (1000Hz × -1.0) = 0Hz
1000Hz + (1000Hz × 1.0)  = 2000Hz

Although the total amount of modulation has increased, the amount relative to the original value stays the same. This is a useful property, because humans perceive frequency and amplitude relatively. For example, we perceive the interval between 100Hz and 200Hz to be the same as the interval between 1000Hz and 2000Hz - both are octaves.

Reducing the the modulation strength to -0.1 to 0.1 yields a weaker modulation, that still remains constant (to our ears) as we play different notes:

400Hz + (400Hz × -0.1) = 360Hz
400Hz + (400Hz × 0.1)  = 440Hz

1000Hz + (1000Hz × -0.1) = 900Hz
1000Hz + (1000Hz × 0.1)  = 1100Hz

Note: some inputs don't follow the relative rule. It will be noted where this is the case.

Connection editing (top)

Connection edit panel

Creating connections in Tangle is easy - just drag from an output to an input, or vice-versa. You are not allowed to connect inputs to inputs or outputs to outputs.

Tangle allows multiple connections to a single input. Therefore there must be a way to blend these signals together before they are used to affect the input parameter. For this reason, every input in Tangle is a simple mixer in its own right.

Click an input port, and a connection edit panel appears at the bottom of the screen (image above). It shows the connections you have added to the input in a list. When you mouse over an item in the list, the particular connection is highlighted on the canvas.

In the top right corner of the connection edit panel, there is a button to toggle a slide-out oscilliscope. This shows a realtime view of the signal flowing into the input after it has been mixed together. It can be very helpful in understanding what is happening with your input signal mixing. For more information, see the Scope section.

Range (top)

Four range editor controls.

In the middle of each item in the connections list is the range editor. Each output has a default range; for example, oscillators output a range of -1.0 to 1.0 by default, while envelopes and macro knobs have a default range of 0.0 to 1.0. However, you can 'translate' the default range to any range you like using the range editor.

You can edit each numberbox individually, or you can drag on the white circle with a cross to scale the range equally on both sides.

For connections plugged into the main output, reducing the range will effectively make them quieter. With connections used for modulation, a smaller range reduces the strength of the modulation. When doing modulation, you may want to experiment with ‘unbalanced’ ranges such as 0.25 to 1.0. This would be useful for a macro knob which doesn't completely kill the modulation when it's at a low value, but just reduces it to a quarter of its original strength.

Tip: For audio objects (e.g. oscillators, as opposed to control objects like macro knobs) plugged into the main output, you will nearly always have a ‘balanced’ range such as -1.0 to 1.0, or -0.3 to 0.3. An unbalanced range like -0.25 to 0.5 is essentially a DC offset, which is undesirable.

Tip: You can also have a negative range - for example, 0.0 to -1.0 or 1.0 to -1.0. This can be useful to give macro knobs negative effects as you push them higher, or to flip the phase of an LFO.

WARNING: Be careful when using large ranges. With 3 mixed signals each with a range of -1.0 to 1.0, the total range will sum to -3.0 to 3.0, which will probably clip the output. Sometimes however, you may need a large range; for example, if you want a macro knob to modulate a filter cutoff from a low level to a high level. If the cutoff is set at 100Hz and you want a macro knob to modulate it to 10,000Hz, you'll need a range of 0.0 to 100.0.

Order and blend mode (top)

The signals, now translated to their chosen range, are then mixed together. They are combined in order from top to bottom, with each connection adding to or multiplying with the result from previous combinations in succession. The easiest way to explain this system is to look at a simple example:

Connect three oscillators into a main output. To ‘mix’ them so we can hear all three, we set them all to add + mode. In this case, the order is unimportant; adding things in any order gives the same result.

To control the strength of all 3 oscillators connected to an input, we could connect a macro knob to the same input, with its default range of 0.0 to 1.0. Placed at the end of the list (i.e. 4th) and in mul ×, it would attenuate the combined signal of the 3 oscillators.

If you move the macro knob's connection to the 3rd position, so one of the oscillators takes the 4th position, what happens? First the two oscillators are summed together. The result is then multiplied (i.e. attenuated) by the macro value. Finally, the third oscillator is added to the resulting summed and scaled signal. In other words, the macro knob controls the volume of both the first two oscillators, but does not affect the third.

Changing the order of connections.

Blend mode is represented by a toggle that can be switched between add + and mul ×. If your modulation isn't doing what you expect, don't forget to check this!

You can reorder connections by dragging on the far left part of a connection item, which is marked with three small lines. Your cursor will change to a ‘grab hand’ when you mouse over this area.

Future work: This (relatively) simple system lets you acheive some interesting and useful effects. But there are times when I feel the limits of this system. I may address this in the future, but I’m keen to keep things as simple as possible.

Connection shortcut arrows (top)

A collection of connection shortcut arrows.

In the middle of each connection line, you can see an arrow indicating the direction that the connection is going (from input to output). You can interact with this arrow in a few ways that speed up making changes to your connections:

  • Double clicking the arrow deletes the connection
  • Dragging the arrow to another input moves the connection
  • When you mouseover an arrow, a white circle appears nearby. Mousing over the white circle lets you quickly edit the connection's range.

Components (top)

Oscillator (top)

Image of the oscillator canvas component and edit panel.

The oscillator is is used both to create audio tones and to modulate other signals as an LFO.

Setting the frequency is done with two values. The first, marked Freq. Ratio, is relative to the MIDI note base frequency. The second, marked Freq. Add is a static frequency that doesn't change if the MIDI note changes. You can use both in tandem.

Freq. Ratio can be set as a ratio of the base MIDI note frequency (common in FM synths) or as a musical interval relative to it (more common in analog synths). Switch between these with the musical note icon. In ratio mode, the base frequency is multiplied by the box's value e.g. MIDI note A3, with a base frequency of 440Hz, on an Oscillator with ratio 0.5 results in a frequency of 440 x 0.5 = 220Hz.

The same 'note' icon near the Freq. Add box toggles between regular Hz (cycles per second) and tempo-relative Hz (cycles per DAW beat), useful for tempo-synced LFOs.

The oscillator has an optional internal ADSR envelope. This reduces the number of freestanding envelopes needed on the canvas - in fact often none are needed at all. The V slider controls the envelope's sensitivity to velocity.

The waveshape of the oscillator can be selected from a browser. Click the name under the representation of the waveform in the edit panel. A popup will appear that lets you browse thousands of waveforms. You can also search these waveforms, or add your own as WAV files.

You can also assign and blend between up to four waveshapes. An input allows the waveform blending to be modulated.

Note: The wave blending parameter doesn't use the relative rule. The input value is simply added to the existing knob position, which has a range of 0.0 to 1.0. To modulate with an oscillator for example, set the knob to its centre position and modulate with a range of -0.5 to 0.5.

Future work: Currently blending is just a simple fade between waveshapes. I'm looking into other methods for blending, which may be added as selectable options.

The oscillator has has an optional stereo output. This second output can be detuned from the original, which helps create stereo width.

Optionally, a randomisation factor can be applied to the frequency, envelope attack and release of the oscillator in each polyphonic voice. This introduces imperfections, which can be reminiscent of analog synthesisers with unstable or imprecisely calibrated circuits.

Filter (top)

Image of the filter canvas component and edit panel.

Tangle has a stereo filter with a selection of filter types, which can be used to shape your sounds. Cutoff, resonance and stereo cutoff differential can be modulated.

The following filter types are available:

  • State variable 12dB/octave low pass, high pass, band pass and notch
  • Warm 24dB/octave low pass, high pass, band pass
  • Zero delay 24dB/octave low pass, high pass, band pass
  • Ladder 24dB lowpass

The filter has an optional internal ADSR envelope, which can move the cutoff frequency over time, a very common effect in subtractive synthesis. It is toggled with the envelope icon to the right of the filter type menu.

Noise (top)

Image of the noise canvas component and edit panel.

The noise component offers several noise algorithms, with a frequency control that gives a wide choice over how many random samples are created per second. It can be used both to generate noise for audio output, and as a control signal to randomly modulate other components.

The available noise types are:

  • Ramp smoothly interpolated white noise.
  • Step uninterpolated white noise.
  • Pink noise filtered for apparent equal power across the spectrum
  • Brown noise filtered for reduced high frequencies
  • Crackle random impulses
  • Hiss a more unusual noise flavour

The noise has an optional internal ADSR envelope, which can control its amplitude.

Sequencer (top)

Image of the sequencer canvas component and edit panel.

The sequencer is inspired by MakeNoise's Rene, a 'Cartesian' sequencer. This means the steps are arranged in grid, and you can use several different algorithms to step through this grid in different patterns.

Each step can output a frequency (which can be glided), an amplitude envelope, and a modulation envelope. This lets you create entire sequences, with each note having its own envelopes.

The pattern algorithms offer different, modulatable ways of stepping through the grid. Slew steps right and up at a steady rate, relative to the host's tempo, which can be modulated. Mod only means that the X and Y modulation inputs control the position: 0.0 gives the first step, 0.333 the second, 0.666 the third, and 1.0 the fourth. Trigger mode advances the sequence in X or Y each time the respective modulation input crosses from below 1.0 to 1.0 or above.

Future work: More pattern algorithms will likely be added. I may add a clock component which makes creating tempo-based sequences easier.

Frequencies are output in ratios for input into oscillators, and can be set quantised to a scale, or as an unquantised ratio. Each step has a glide time so notes can be bent into one another.

Amplitude and modulation envelopes on each step have attack, level and release controls.

There are controls to quickly randomise the values on each step by a given amount, or reset all steps to a certain value.

Envelope (top)

Image of the envelope canvas component and edit panel.

The envelope is much more powerful than the internal ADSR envelopes that are found in some other components. It can have unlimited stages. Each stage can be a curve, customisable from linear to exponential in both directions, or a step which jumps to a value instantly and remains at it for the duration of the stage time.

The envelope stage times can be modulated, and each stage has a 'Mod Scale' value that dictates how it responds to modulation. A stage with a mod scale of 0.0 won't be modulated at all, while one with 2.0 will have double the modulation of its time.

You can edit stage times, end levels and curves both by dragging on the graphical handles, and by editing number boxes for precision. There are numerous keyboard shortcuts for to speed up envelope editing:

  • ← → change stage time.
  • ↑ ↓ change stage end level.
  • Shift + ← → change selected stage.
  • Shift + ↑ ↓ change stage curve.
  • Enter add new stage in front of selected.
  • Backspace/Delete delete selected stage.
  • S toggle stage between curve and step.
  • T focus stage time, ready to type.
  • M focus stage mod scale, ready to type.
  • L focus stage level, ready to type.

Note: Some DAW hosts restrict plugins' access to keystrokes, so some shortcuts may not be available.

The envelope can sustain at a certain point, or loop through a sequence of stages while the note is sustained. Drag the yellow sustain bar to the right to split it into a start and end point for the loop.

The envelope stage times are relative to the host's tempo - therefore a stage time of 1 means one quarter note beat, not one second. This, in combination with the loop function, lets you make rhythmic and tempo-synced patterns.

Future work: It's currently a bit fiddly to make rhymthic patterns. It's easiest to type stage times to values like 0.5 to make sure they sound rhythmic. I have some ideas for tools to make this easier and more natural - for example, snapping of stage times to certain values.

Macro (top)

Image of the macro canvas component and edit panel.

The macro object serves three functions. First, it lets you control multiple modulations with a single knob. Secondly, it acts as an 'interface' with the DAW because it can be automated. Third, you can assign MIDI control signals to affect the macro value, so you can set up MIDI controllers to play your patches with.

It would be nice if all parameters in your Tangle patch could be automated, but most DAW hosts only support fixed lists of parameters. This is a problem when users can dynamically add new parameters. Instead, you can assign an automation lane to a macro object, which will then respond to automation on that particular lane.

It is possible to assign multiple macro objects to the same automation lane - in this case, they will all be moved simultaneously by automation on that lane. This can be useful for making patches clearer if you want to control many things from a single automation lane.

XY Pad (top)

Image of the XY Pad canvas component.

The XY pad works in a similar way to the macro knob, but lets you control two values simultaneously by moving a point on a two-dimensional space.

Future work: The XY Pad currently has no associated edit panel. In the future you will be able to assign automation lanes to the x and y axis.

Quantise (top)

Image of the quantise canvas component and edit panel.

The quantise component locks a signal to a custom set of values. Each value in the input signal is converted to the nearest value in the quantise list. So with a quantise list of 0.25 and 0.5, an inputted value of 0.3 will output as 0.25.

Quantisation is especially useful when modulating frequency ratios, sequence times or envelope times, to stick to 'musical' results. Two seperate signals can be quantised by the same component, since there are various situations where you want seperate signals to be quantised to the same list. The canvas component shows in realtime the quantised output of each signal stream.

The smooth knob lets you set a length of time over which changes in quantised value will be interpolated. This could be used to glide between frequency values, for example.

Future work: At the moment it's a bit fiddly to set up the quantiser for locking to frequency ratios. I think I will build a different layout to the quantiser to make this use case easier.

MixPan (top)

Image of the mixpan canvas component and edit panel.

The mixpan component is a multipurpose gadget that allows both stereo mixing and panning capabilities. Its 4 inputs are mixed into its 2 outputs differently depending on the selected algorithm. It has a simple display that visualises the strength of each signal (with opacity) and its placement in the stereo field (with position). This makes it easy to see what each algorithm does.

Mix Stereo fades between two stereo signals. Mix Mirror fades between all four signals, in order on the left channel and in reverse order on the right channel. Pan Splay spreads the four signals across the stereo image and then pans them together. Pan Thread weaves each signal's pan position around, which can create interesting effects.

Future work: There will very likely be more algorithm choices in future.

Delay (top)

Image of the delay canvas component and edit panel.

The delay component implements a stereo delay of the type commonly found in the electronic music world, with a few extra surprises. The delay time can be modulated smoothly, which can produce a woozy feeling if done subtly, or chaotic sounds when done to extremes. The delay can have feedback (i.e. it repeats) which goes through a lowpass filter for classic dub-style delays.

Remember, each individual voice has its own delay. Therefore you can give different delay times to your polyphonic notes, which can result in very unique effects. Try plugging an output from an expression component into the delay time.

The delay time for left and right channels can be set in seconds, beats of the host's tempo, or more unusually, relative to the voice's MIDI base frequency. This last option opens the possibility of using the delay for Karplus-strong synthesis, a simple form of physical modelling. Set the delay type to comb, and then try passing short bursts of noise or oscillator waves through the delay.

Expression (top)

Image of the expression canvas component and edit panel.

The expression component captures and outputs various values from the voice's MIDI data, such as velocity, key position on the keyboard, aftertouch, and also a constant random value for the duration of the note. This lets you add expressive modulations and per-note variations.

You can adjust each value's response by adding and moving points to its graph. This is useful for custom aftertouch pressure responses, for example.

Future work: The component's UI is basic at the moment, it only lets you set response curves. It will likely be expanded with more features in future.