< back


Ops

Introduction

Ops is a modular synthesiser designed to make it easy to create and explore sound interactively with a touch screen. Ops does away with patch cords, instead using a system of connected blocks with a clear signal flow.

The blocks, called ops, are joined together into structures by dragging and dropping them on screen. Structures can easily be copied and varied to build-up rich, interesting results.

There are ops to perform a wide range of functions, including interaction, signal generation, effects processing, control, audio input, MIDI input, and pitch and rhythm manipulation.


Getting Started

The following video shows a basic tutorial on how to get started with ops.


Using Ops

Basics

The app has two screens: a Projects screen and an Ops screen. One is for managing project files, the other for building structures out of ops and then playing them. The app starts in the Projects screen. Use the buttons top right to toggle between screens.

The Ops screen has two modes, Edit and Play, selected with the toggle button top left. In Edit mode the ops menu is visible along the bottom of the screen, and can be scrolled by dragging the lower edge. The ops on the menu are grouped and colour-coded by function. To get help on an op long touch it on the menu.

The Ops view can be panned by dragging on the background, and can be zoomed in or out by pinching with two fingers. This will work in either Edit or Play modes. The Lock button will disable this, which can be useful in Play mode when performing with interface ops. The Fit button will automatically pan and zoom to fit all structures into view.

To create a new op drag it from the menu onto the screen. The new op will have default input ops already attached, and so is guaranteed to generate some kind of output.

To hear the audio output and to interact with any interface ops, toggle to the Play mode. The menu will disappear, and editing functions will suspend.

The outputs of all structures on screen are mixed together to make the total audio output of the app.

To control a dial touch it and drag up/down, to control a slider touch directly or drag left-right. trigger and gate ops are activated by touch, as are note and notes keyboards, and rhythm pads.

Structures can be moved around the screen in Edit mode by dragging their root op - the one furthest to the right.

ops are connected together into structures by a process of replacement. Because ops always have inputs attached (they are created by default) one input must be replaced by another. This is done by dragging a source op or structure onto a target op and then dropping to replace it. Both the target op and any structure to its left are replaced by the source, thus preserving the tree-like structure. The source can be a new op from the menu, or any existing op or structure.

Structures can be broken apart by dragging an op away from the op it is connected to. When this happens, a new default input op is added to replace the op that is dragged away so that both parts remain functioning.

To delete an op or structure, drag it from the view and drop it onto the menu.

Dragging any op with two fingers will duplicate that op and all the structure to its left, creating a new structure. Tip: the first finger can be touched anywhere on the screen, the second finger then used to drag and copy the structure of choice.

Projects

The Projects screen shows a number of example projects that come with the app, as well as your own creations. Touch a project to select it and bring up a menu of options. From here you can Load, Rename, Delete or Export a project. You can also double tap a project to load.

Use the top menu items to create a New blank project, to Import and to Save. The current project name is shown in the top menu in orange.

Projects can be Imported and Exported as zipped folders to and from iCloud Drive and external apps such as Google Drive, Dropbox etc.

send and recv ops

Although signals flow through structures from left to right, there are times when it is useful to send signals between ops in other ways. For example one signal could be sent to two different places, or to create feedback loops around structures from output to input. Such sending of signals can be achieved using send and recv ops.

A recv op receives a signal coming from the output of any op on screen. Add it from the menu, then double tap it while in Edit mode. The recv op will flash to show it is waiting for a source to be chosen. Tap on any other op to choose it as the source, or tap the recv op again to cancel. The name of the chosen source op will appear in the recv op and its output will now be duplicated at the output of the recv op. You can think of an invisible connection now existing between the output of the source op and the output of the recv op.

A send op can be used as the source of a signal to pair to a recv op. Connect it as the output of a structure, and choose it as the source after double-tapping a recv op. Its main feature is that its output does not contribute to the audio output of the app. This allows structures to be used as modules feeding other structures without generating any audio output themselves.

recv ops can be used to create feedback loops between the output of a structure and one of its inputs. Use in conjunction with delay ops as a rich source of generative sound.

note ops have a second output in the form of an embedded gate op to the left of the keyboard. This generates a value of 1 when a key is held (and turns yellow) or a value between 0 and 1, corresponding to the note velocity, when the note ops is mapped to a MIDI input. To use the gate output, connect it to a recv op and then use that, for example, to gate an ADSR envelope.

MIDI mapping

All interface ops (dials, sliders, triggers, gates, note, notes and pads) can be mapped to respond to incoming MIDI messages. dials, sliders and pads can be mapped to MIDI continuous controller (CC) messages, whereas triggers, gates, note and notes can be mapped to MIDI note messages.

To map an interface op, double tap it so that it begins flashing. Then simply send a MIDI message to the app on the desired MIDI channel. dials, sliders and pads will map to the specific CC controller number being sent. triggers and gates will map to the specific MIDI note being sent. note and notes receive all note ON/OFFs on the chosen MIDI channel.

If received successfully, the op will stop flashing. To cancel a MIDI mapping or to clear the current mapping, touch the op when it is flashing.

Multiple ops can be given the same MIDI mapping, in which case the MIDI message will effect all ops simultaneously. The exception being note ops, where things work differently in order to support polyphony. When several notes are held simultaneously, their messages will be sent in turn to different note ops. The first note ON message that is received will be sent to the first note op that was mapped. The second note ON message will then be sent to the second note op and so on.


Essential Technical Details

The following summarises key technical details about how ops works, and is essential in getting the most from the app:

Inputs on the left, outputs on the right

ops compute a value at their output, on the right-hand side, based on the values at their inputs, on the left-hand side.

Interface ops do not have inputs

Interface ops, such as dials and sliders, do not have inputs, but output a value depending on user interaction.

ops update every sample

All ops compute a new output value every sample tick, at 44.1kHz.

Signals flows left to right

ops are joined together from output to input so that values flow through the structure from left to right. Structures are tree-like having a single root on the right - the output - and leaves on the left - the sources.

All structures add to the audio output

The output of a structure - which comes from the op furthest to the right (the root) - is mixed into the audio output of the app. The outputs of all structures on the Ops screen are scaled and mixed together equally. The exception is the output of send ops which are mute. See later.

Values range from -1 to +1

Signal values typically lie in the range -1 to +1. There are cases where values can go outside this range, where it makes sense (see below). However the resulting audio signal of all structures on the screen is limited to this range to avoid clipping.

Any op can be connected to any other op

Because all signal values use the same range of -1 to +1, anything can be connected to anything else.

Values mean different things to different ops

Values can represent many things, including audio signals, control signals, pitches, note sets and rhythms. The meaning of a value to an op depends on the input to which it is connected.

For example, pitch inputs map the range -1...1 to the entire MIDI note range, with a value of 0 corresponding to middle C. freq inputs of LFOs, however, map -1...1 onto a logarithmic frequency scale ranging from 1/64Hz to 64Hz, with 0 corresponding to 1Hz.

In the case of notes and rhythms, a musical pattern is encoded as a single value.

Pitch arithmetic

When pitch values are added or subtracted, the corresponding pitches are shifted. When adding values from a snap slider, the pitch is shifted by an octave for each upper tick mark. The total shift range is ± 6 octaves, a bit more than the full MIDI note range.

To shift a pitch by semitones, add a value from the semitone shift op found in the maths section of the menu. This scales input values in the range ± 1 to an output that corresponds to ± 1 octave. When used with a snap slider as its input, the lower tick marks correspond to a pitch shift in the range ± 12 semitones.

Log frequency scales

Pitch is a logarithmic frequency scale. Every time you step up, or down, a semitone, the corresponding frequency is multiplied, or divided, by 2 1/12. So a step of 12 semitones - an octave - either doubles or halves the frequency.

Similarly, LFO frequencies and tick rates work on logarithmic scales. Likewise, each equal step change in value is interpreted as a multiplication in frequency. As with pitch, when adding, or subtracting, frequencies with a snap slider, each upper tick mark corresponds to a doubling, or halving in frequency.

You can use values outside the ±1 range to extend the ranges of frequencies, rates and delay times. Use arithmetic ops to do so. For example adding 1 to 1 to make 2 will give a delay time of 64 secs when used with a delay op. Or, subtracting 1 from -1 to give -2 will give a delay of 1/64 sec.

12 is the magic number

12 has been used as a number system wherever possible. Pitch and octave shifts, rhythm lengths, and ratio values are all based on 12 divisions. This fits with the snapped slider which divides the value range -1...1 into either 12 or 24 discrete values, as shown with its upper and lower sets of tick marks.


Snapped Slider

The following table summarises the meaning of snapped slider values when used as inputs to various ops.

Snap Slider Upper Tick Mark

-6

-5

-4

-3

-2

-1

0

1

2

3

4

5

6

Output Value

-1

-5/6

-2/3

-1/2

-1/3

-1/6

0

1/6

1/3

1/2

2/3

5/6

1

When used as a pitch value

MIDI pitch

...

0

12

24

36

48

60

72

84

96

108

120

...

When added to a pitch value

Octave shift

-6

-5

-4

-3

-2

-1

0

1

2

3

4

5

6

When used as an LFO frequency or tick rate

Freq in Hz

1/64

1/32

1/16

1/8

1/4

1/2

1

2

4

8

16

32

64

Equivalent BPM

...

15

30

60

120

240

...

When used as a duration in a delay, line or reverb op

Time in secs

1/8

...

1/4

...

1/2

...

1

...

2

...

4

...

8

When used as a duration in an envelope, adsr or slew op

Time in secs

1/64

...

1/32

...

1/16

...

1/8

...

1/4

...

1/2

...

1

When used in a ratio op

Multiplier

1/7

1/6

1/5

1/4

1/3

1/2

1

2

3

4

5

6

7

When used in a rhythm op

Rhythm length

0

1

2

3

4

5

6

7

8

9

10

11

12

When used in a divide op

Divide By

1

2

3

4

5

6

7

8

9

10

11

12

13


ops Reference

The following reference for each op can also be seen by long-touching it on the menu.

controls

dial

A rotary dial. Touch and slide up/down to change value. Outputs a value in the range -1...1

uni dial

A unipolar rotary dial. Touch and slide up/down to change value. Outputs a value in the range 0...1

slider

Touch or slide left/right to change value. Outputs a value in the range -1...1

snap slider

Touch or slide left/right to change value. Outputs a value in the range -1...1, in increments of 1/12

trigger

Touch to generate a trigger - a value of 1 for one sample.

gate

Outputs a value of 1 while touched.

note

Outputs a pitch value for use by oscillators and filters. Touch a note to select the pitch. The embedded gate op outputs a value of 1 while a key is held, or a velocity value between 0...1 if driven by an external MIDI note.

notes

Outputs a value which represents the set of selected notes. Touch a note to toggle whether it is selected. For use with noteset and arpeggiator ops.

pads

Outputs a value which represents a rhythm pattern up to 12 steps long. Touch a pad to toggle whether it is selected. For use with the rhythm op.


patterns

note set

Selects one note from a set of notes and outputs its pitch. Use the notes op to provide a note set. The index input selects which of the notes is output. It maps the value range 0...1 onto note number 1...N where N is the number of notes in the note set.

arpeggiator

Generates a sequence of note pitches from a note set. The sequence advances each time the trigger input is fired, and loops from end to beginning. Use the notes op to provide a note set. The step input sets how many notes are advanced each trigger in the range 1...N-1 where N is the number of notes in the note set. This means a step input value of 0 will advance by 1 note, and a value of 1 will go backwards 1 note. Values in-between cycle through the notes in different patterns.

rhythm

A trigger rhythm generator. Each time the trigger input is fired, an output trigger is generated according to the pattern provided to the rhy input by a pads op. The pattern advances by one step each trigger and loops at the point set by the length input. If the length input is set with a snap slider its cursor position corresponds to the point in the pattern where the loop takes place.


links

send

Sends a value to a recv op. Makes the input available to a recv op without having any output itself. Useful for connecting structures together. See ⓘ for more info.

receive

Receives a value from any other op in use. Double tap to select the source op. See ⓘ for more info.


timing

tick

Generates a regular series of triggers at a given rate. The rate input maps the value range ±1 onto a logarithmic frequency range of 1/64 to 64 Hz with a value of 0 corresponding to 1Hz.

divide

A trigger divider which thins-out incoming triggers. Only passes through every divide by trigger from the trigger input to output. When the divide by input is set with a snap slider the upper tick marks correspond to a division value in the range 1...13

timer

A triggerable timer. When the trigger input is fired, the output goes from 0 to 1 for a duration set by the time input, a logarithmic scale in the range 1/8 to 8 secs


sources

sine

A sine wave oscillator with 12 octaves frequency range. A pitch value of 0 corresponds to middle C. When pitch is set with a snap slider the upper tick marks corresponds to a shift of ±6 octaves. Use a note op to set the pitch with a keyboard. Add and subtract values to shift the pitch. See ⓘ for more info.

saw

A sawtooth wave oscillator with 12 octaves frequency range. A pitch value of 0 corresponds to middle C. When pitch is set with a snap slider the upper tick marks corresponds to a shift of ±6 octaves. Use a note op to set the pitch with a keyboard. Add and subtract values to shift the pitch. See ⓘ for more info.

triangle

A triangle wave oscillator with 12 octaves frequency range. A pitch value of 0 corresponds to middle C. When pitch is set with a snap slider the upper tick marks corresponds to a shift of ±6 octaves. Use a note op to set the pitch with a keyboard. Add and subtract values to shift the pitch. See ⓘ for more info.

square

A square wave oscillator with 12 octaves frequency range. A pitch value of 0 corresponds to middle C. When pitch is set with a snap slider the upper tick marks corresponds to a shift of ±6 octaves. Use a note op to set the pitch with a keyboard. Add and subtract values to shift the pitch. See ⓘ for more info.

sine lfo

A sine wave low frequency oscillator (LFO) with logarithmic frequency range 1/64 - 64 Hz. A freq value of 0 corresponds to 1Hz. When freq is set with a snap slider the upper tick marks corresponds to a halving/doubling of frequency.

saw lfo

A sawtooth wave low frequency oscillator (LFO) with logarithmic frequency range 1/64 - 64 Hz. A freq value of 0 corresponds to 1Hz. When freq is set with a snap slider the upper tick marks corresponds to a halving/doubling of frequency.

triangle lfo

A triangle wave low frequency oscillator (LFO) with logarithmic frequency range 1/64 - 64 Hz. A freq value of 0 corresponds to 1Hz. When freq is set with a snap slider the upper tick marks corresponds to a halving/doubling of frequency.

square lfo

A square wave low frequency oscillator (LFO) with logarithmic frequency range 1/64 - 64 Hz. A freq value of 0 corresponds to 1Hz. When freq is set with a snap slider the upper tick marks corresponds to a halving/doubling of frequency.

noise

A white noise source. Each sample is randomly chosen in the range ±amp

input

The audio input to the app. Will be either the microphone input of the device, an external audio interface, or an Inter App Audio or Audiobus source.


envelopes

envelope

A triggerable envelope generator. When the trigger input is fired, the output follows a 3-stage envelope, the attack and release stages being exponential functions. The durations of each stage are set by the attack, hold and release inputs. Each of these map a value in the range ±1 to durations in the range 1/64 to 1 sec, with a value of 0 corresponding to 1/8 sec.

adsr

A classic ADSR envelope generator. When the gate input becomes nonzero, the output follows the attack and decay stages, an exponential rise function followed by an exponential decay function whose durations are set by the attack and decay inputs. The output is then held at a value equal to the gate input multiplied by the sustain input value. When the gate input returns to zero, the output follows another exponential decay function whose duration is determined by the release input value. All timing inputs map a value in the range ±1 to durations in the range 1/64 to 1 sec, with a value of 0 corresponding to 1/8 sec.

slew

A slew limiter which limits the rate of change of the input. Can be used to generate a simple attack/release envelope in conjunction with a gate or square wave LFO, or to generate glissando/portamento when modifying pitch values. The slew time input maps a value in the range ±1 to a duration in the range 1/64 to 1 sec, with an input value of 0 corresponding to 1/8 sec.

latched envelope

A two-step triggerable envelope. Each consecutive trigger input will start the attack then release stages of the envelope in turn. The envelope functions are linear with output values between 0 and 1. Both attack and release inputs map a value in the range ±1 to durations in the range 1/64 to 1 sec, with a value of 0 corresponding to 1/8 sec.

line

A linear envelope function. When triggered, the output goes from the from input value to the to input value over the duration of the time input. The time input is a logarithmic scale in the range 1/8 to 8 secs, with an input value of 0 corresponding to 1 sec.


filters

modal filter

A resonant filter which simulates a mechanical mass-spring-damper system. Good for generating pitched resonant modes of instruments, especially percussion, when fed a trigger signal. The pitch input covers a 12 octave range, with a value of 0 corresponding to middle C. The Q input is the 'quality factor' of the filter and corresponds to the degree of resonance or decay time. Increasing Q increases resonance and lengthens decay.

resonant filter

A 2nd-order resonant filter. The resonant frequency is set with the pitch value which covers a 12 octave range, with a value of 0 corresponding to middle C. The bandwidth of the filter is set with b/w as a fraction of the resonant frequency. A smaller bandwidth will make the filter resonate more and take longer to decay.

notch filter

A Butterworth band-reject, or notch, filter. The centre frequency of the notch is set by the pitch input which covers a 12 octave range, with a value of 0 corresponding to middle C. The bandwidth of the notch is set by the b/w input as a fraction of the centre frequency.

lowpass filter

A Moog-style low-pass resonant ladder filter. The cut-off frequency is set by the pitch input which covers a 12 octave range, with a value of 0 corresponding to middle C. The resonance of the filter at the cut-off frequeny is set by the res input.

highpass filter

A Butterworth high-pass filter. The cut-off frequency is set by the pitch input which covers a 12 octave range, with a value of 0 corresponding to middle C.


effects

delay

A feedback delay line. delay input values of -1 to 1 map to a logarithmic scale of delays between 1/8 and 8 secs. If set with a snap slider, every other upper tick mark corresponds to a doubling/halving of the delay time. For delay times outside this range, add or subtract values using arithmetic ops. For example, adding two values of 1 to make 2 will give a delay time of 64 secs. Or, subtracting a value of 1 from -1 to give -2 will give a delay time of 1/64 sec.

clip

A soft amplitude limiter. The input is sinusoidally soft-clipped to the value of the level input.

reverb

A reverb simulation effect with separate low- and high-frequency decay times in the range 1/8 to 8 secs

pitch shift

A simple audio pitch shifter that can shift pitch in real-time by ±12 semitones.


maths

add

Adds two values. Output = x+y

sub

Subtracts one value from another. Output = x-y

mul

Multiplies two values. Output = x * y

ratio

Multiplies or divides the in value by a whole number when used as an LFO frequency or tick rate. Useful to create rhythmically synced timings. The range of ratio from -1...1 maps to multipliers of 1/7 1/6 1/5 1/4 1/3 1/2 [1] 2 3 4 5 6 7. When ratio is set with a snap slider, these correspond to the upper row of tick marks.

semitone shift

When added to a pitch value, shifts the pitch by ±12 semitones. When the input is set with a snap slider, each of the lower row of tick marks corresponds to a semitone.


misc

gain

A ±20dB level gain.

scale

Scales the input to be within the range from...to.

sample & hold

Samples the input when the trigger input is fired and holds the output at this value.

random

Generates a random rumber in the range ±1 when the trigger input is fired.

toggle

Toggles the output between 0 and 1 when the trigger input is fired.

switch

Toggles the output between one of the two inputs when the trigger input is fired.

dc block

Filters out the DC component of a signal. Useful within feedback loops to prevent an ever-increasing signal.


Credits

Ops uses code from the following excellent libraries:

AudioKit by Aurelius Prochazka and others
Sporth and SoundPipe by Paul Batchelor
both under the MIT licence

and Audiobus



© Jonathan Mackenzie 2017