AUM Users Guide

TABLE OF CONTENTS

Also see Frequently Asked Questions at the AUM website.

Basics

AUM is a flexible audio mixer, plugin host, and recorder.

Channel strips

The basic building block is the channel strip. They come in two flavors, Audio strips for processing audio, and MIDI strips for hosting non-audio nodes such as MIDI sequencer plugins.

A channel strip has nodes (see below) that represents inputs, outputs and effects in audio strips, or MIDI plugins in midi strips. Audio strips also have a level fader, mute and solo buttons, and a record-enable button.

Creating channels

Create a channel by tapping the big square plus-button and selecting Audio or MIDI. Tap again to create yet another channel, etc.

Rename or delete a channel

At the bottom of the channel is the channel title. Tap it to rename or delete the channel. If the channel has no specified name, it will automatically be named "CHAN N", or "ChN: SOURCE" where N is the number of the channel and SOURCE is the title of the input node of the channel.

Reorder channels

You can reorder a channel by dragging its title label upwards and keep holding while moving your finger left or right. The order of the channels has only visual meaning, and does not affect the signal path in any way. (Except for the special case of feedback routings, where the order will affect at which node the feedback happens).

MIDI strips are always processed before any audio strips, regardless of the visual order.

Bookmark channels

You can bookmark channels to quickly jump to one later. This is useful if you have a large project where you need to scroll to see all channels.

Tap a channel's title, then toggle the bookmark button in the top right of the view that shows up. The channel will now be listed in the bookmarks menu, available by tapping the bookmark symbol at the lower right corner of the main screen.

Duplicating channels

You can duplicate channel strips by tapping the channel title label and then the DUPLICATE button.

All the nodes in the channel strip, including their state and MIDI control mappings, will be duplicated and appended as a new channel strip in the session.

Importing channels

You can import one or several channels from other sessions and append them to your current session. This is useful as a way to create reusable channel templates that you can use in multiple projects.

Tap the big square plus-button and select "IMPORT", then choose from which session you want to import channels. Alternatively, long-press a session file in the FILES menu and choose "Import channels". After that, you'll be able to select which specific channels to import.

Restoring removed channels

In case you accidentally removed a channel, you can restore it by tapping "Restore Removed Channel" in the Import menu mentioned above.

Nodes

Each audio strip have slots to hold an input source, one or more optional effect inserts, and an output destination. MIDI strips have one or more MIDI slots to hold MIDI plugins that don't process or generate any audio. The things you can put in a slot are called nodes.

Loading nodes

Tap the plus-sign in an empty slot to load a node into the slot. This will open the node-picker, listing the available nodes for this kind of slot.

Drag down to reveal a search bar where you can easily find specific nodes or plugins.

Eject or bypass a node

To remove a node, swipe it to the left to reveal the eject button. In this state, the node is bypassed. Tap the eject button to remove the node.

Adding node slots

The area for the effect insert slots is scrollable, the same goes for the slots in a MIDI strip.

To add more slots, scroll to the bottom and tap the circled "+1" button.

You can also double-tap on the empty area below the current slots to quickly add another one.

Reorder nodes

You can reorder effects and MIDI nodes within the same channel strip by dragging it right and then up or down. The order of the effect nodes determine their position in the signal chain, and can thus affect the sound. The order of the MIDI nodes have only visual meaning.

Deleting slots

To delete an empty effect or MIDI slot, long-press the slot and then tap REMOVE SLOT in the menu. There must be at least 2 slots in a strip for this button to show up.

Move, Swap or Duplicate

Long-press a node to show the node slot menu.

Tap SELECT to mark this node for duplication or moving. The currently selected node will light up with a glow while the menu is open.

You can now long-press an empty slot, and tap COPY HERE to duplicate the previously selected node to this slot, or MOVE HERE to move it there.

If you long-press an existing node, you can instead tap SWAP to swap this node with the selected node.

Replacing nodes

Apart from simply ejecting the node and loading another one, you can replace the node and have AUM try to re-create any MIDI routings from the old node.

Long-press a node to bring up the menu and tap REPLACE. This will show the standard Node Picker that let you choose a node to load in this slot. If both the old and the new node has MIDI inputs/outputs, it will try connecting the new node in the same way as the old node.

Pre/post fader

In audio strips, the wire line going between the level fader and the effect insert chain shows which inserts are pre and post fader.

Pre-fader inserts are the ones above the fader connection line, and will get the full level of the previous node. Post-fader inserts are below the fader connection line, and will have their input level controlled by the level fader.

Long-press an effect insert slot to bring up the node slot menu, where you can tap POST FADER to connect the level fader at the input of this node, or PRE FADER to connect it at its output.

Sessions

An AUM session is a project containing all channel strips and their nodes, as well as many settings.

When first launching AUM, you are greeted with a clean session. The initial session will be named with the current date and time until you save it with a given name.

Saving/Loading/Clearing

Tap the top right menu button where you can save the current session (SAVE), open a previous one (FILES>Sessions), or clear and start on a fresh session (CLEAR).

Restore last state

If you had a non-empty session when you closed AUM last time, you have the option to tap the LAST STATE button to restore the last state.

The last state is saved automatically when the app is backgrounded, as well as before clearing the session or loading another session.

You can also restore the last state by tapping "Restore Previous State" in the FILE menu. This is useful if you accidentally forgot to save your session before clearing or opening a new session.

Default Session

If you save a session or folder named "Default", you get quick access to this by tapping the DEFAULT button shown at launch. This can be useful for example to keep a folder of templates to start your new from.

Session file operations

Long-press a session in the FILES menu to show a menu of actions you can perform on the file.

The usual iOS sharing options are available, as well as some built in actions:

  • Copy URL - Copy a universal link to the pasteboard, that can then be pasted into Notes or other apps. Opening the URL will then open AUM and load this session. Useful for referencing session files in notes.
  • Import Channels - Import selected channels from the session file, appending them to the current session.
  • Rename - Rename the session file.

Session Notes

In the main menu you will also find NOTES. Use this to keep notes about the current session.

You can also enter URLs in the text, which can be long-pressed while not editing the text.

Running in background

AUM keeps running in the background if any of these conditions are true:

  • There are audio or MIDI channel strips in the session.
  • Transport is running.
  • AUM is connected via Inter-App Audio to any other app.

If all of the above are false, AUM will suspend and stop running while in background.

To stop AUM from running in the background, simply CLEAR the session as described in the previous section, or swipe AUM away from the iOS multi-task thumbnail view to fully terminate it. To go back to the last session state, tap LAST STATE next time you open AUM.

It's a good idea to not leave AUM running when you're not using it, or it will drain your device battery.

Signal routing

AUM offers very flexible routing, and supports multi-channel audio interfaces, internal busses for grouping, submixing and effect sends, as well as multiple Inter-App Audio output ports.

Hardware inputs / outputs

Tap an empty input slot and choose "Hardware Input" to show a list of available hardware inputs.

Tap an empty output slot and choose "Hardware Output" to show a list of available hardware outputs.

External audio interfaces will also show up here, including all their channels.

Hardware channels are available as both stereo pairs and individual mono channels.

Tap an item in the list to load it into the slot.

Avoiding feedback

AUM detects the case where an external audio interface or headset is disconnected, so that a hardware input node changes to the built-in microphone. This situation can lead to feedback, so AUM disables the input node. Reconnect the external input, or tap the node and then the ENABLE button to activate it.

Hardware sends

You can also use hardware sends, available in the effect slots, to send a variable amount of the signal at that point in the signal chain to a hardware output. This is useful to integrate external effects, for example.

Internal busses

In AUM, internal busses has multiple functionality and covers subgroups, mixing, and effect sends.

To use a bus, you send audio into a bus by choosing it as output destination for a channel, or a corresponding bus send in an effect insert slot. Then receive the audio from the bus in one or more other channels, by choosing it as input source.

Custom name and color

You can tap a bus node to set a custom name and color for that bus. Any other nodes for the same bus will also be updated accordingly.

Main Mix

AUM doesn't have a built-in master or main mix. Instead, you're encouraged to use a bus for this.

For example, let all your channels output to Bus A, then add a channel which takes input from Bus A and outputs to hardware. This last channel now functions as a main mix channel, and gives you control of the master volume. It can also be used to apply insert effects like compression or EQ on the main mix.

Subgroups

In the same way, use several different busses for output, with corresponding bus channels, to have more than one mixes with individual master level controls and effects. The subgroup channels can in their turn output to a common main mix bus, etc.

Effect sends

In addition to using busses as output destinations, you can add one or more Bus Send in the effect slots. This will split the signal and send a variable amount of it to a bus. You can have several channels sending to the same bus, of course.

Add a channel that receives on the bus and then add effects such as reverb and delay on this channel. This effect-channel can output directly to hardware, or to yet another bus, etc. And it can contain other bus sends, that sends to other effect channels, and so on.

Drag the small knob next to the Bus Send node to control the amount of send.

Signal splitting

You can send to a bus, and then have several channels receiving on the same bus, thus splitting the signal so you can apply different effects in parallell, or route the same signal to several hardware outputs, etc.

Multi-bus Audio Unit plugins

AUM supports AU plugins with multiple inputs and/or outputs. This is useful for feeding side-chain signals into compressors, or getting separate outputs for drum parts, etc.

To access the extra busses of a plugin, tap an empty slot where you want the access point to be in your signal flow, and select "Multi-bus Audio Unit instances". This will list all currently loaded Audio Unit plugins that have extra busses.

After instantiating the plugin bus access node, tap the I/O graphics to the left of the node to select between the available inputs and outputs:

Input to Plugin Bus

Select which input bus of the plugin that should receive the signal entering this node. 'None' means the the signal is not sent to the plugin.

Plugin Bus to Output

Select which output bus of the plugin that should be sent out of this node. The first item is 'None' for source nodes (no output), and 'Pass-through' for effect nodes, which just passes the input signal through the node.

Inter-App Audio outputs

AUM has eight IAA output ports that can be loaded in other Inter-App Audio hosts.

Tap an empty output slot and choose "IAA / Audiobus Output", then select one of the ports. Load the corresponding port as an audio source in another host. It's not important in which order you do this. The port in AUM will show as disconnected until it's connected in another host.

A host transport panel will show up next to connected IAA output nodes, allowing you to control the transport of the connected host.

Audiobus

The IAA output ports mentioned above can also be used as Audiobus inputs.

AUM can also function as Audiobus output, receiving individual streams from connected inputs.

Simply connect AUM in the output slot in the Audiobus app, and AUM will automatically create channels for each connected input app. You can use the same input connection as source in several channels, for example to apply different effects in parallell.

Level metering

Main meter

At the top center is the Level Meter. Tap it to choose the meter source. The meter can show the current levels of hardware inputs and outputs, internal busses, IAA / AB output ports, as well as the input or output levels of channels.

Channel meters

In addition, every channel has simple 3-dot peak meters on the input and output slots, for easy detection of optimal signal levels. Tap the dots to choose it as the Level Meter source. If the channel input/output is already the active meter source, then it will instead use the corresponding meter source for the node in that slot.

Bad Signal detection

Sometimes plugins have bugs that make them produce bad floating point values in their signal, such as NaN (not-a-number) and Inf (infinities). When such a value enters the signal stream, it will contaminate the signal and make it invalid, since such values can't be used in mathematical operations and can't be output by the audio interface.

AUM detects such bad signals per audio channel strip, and shuts down the signal for any channel where this happens until the bad signals go away. When a bad signal is detected, it's indicated by a "BAD SIGNAL" label below the channel strip.

If you encounter this, bypass each plugin in the channel until the BAD SIGNAL indicator goes away, and then report the problem to the developer of the plugin so they can fix their bug.

FilePlayer nodes

The built-in file player can play back previously recorded files, or any soundfile stored in AudioShare or any other location on your iOS device.

You create a file player by tapping the empty source node of an Audio channel strip and selecting "File Player".

Controlling playback

The file player starts with the main transport clock, tap play in the upper left corner of the screen.

It only plays if the player is enabled, controlled by the circular toggle at the left side of the node. This toggle can be used also while the main transport is rolling, it will then start playing at the next sync quantum boundary (default 1 bar, can be set in the Clock Options) if SYNC is enabled for the player, or else it will start directly.

The play-enable toggle is also MIDI controllable. However, it's not suitable for rapid triggering, since the file player is disk based, not memory based.

Tap the node to show the File Player user interface. Here you can select the file, and setup looping and synchronization.

Options

Load file

Tap the top row in the SELECTED FILE section to load a new file. This will allow you to browse any file stored in AudioShare. You can also tap the top right button in the navigation bar (looking like a folder with an arrow), to browse and select any file stored on your iOS device, including cloud services and external USB drives (iPadOS 13 required).

Loop

When enabled, the file will loop.

Sync

When enabled, the playback rate will be adjusted to keep it synchronized to current tempo, according to the original tempo of the file.

The playback rate may fluctuate due to small corrections made by Ableton Link. It's also adjusted when the amount of latency compensation changes, by speeding up or down for a short moment.

When disabled, playback rate is constant with no fluctuations, and the play-enable toggle will not wait for the next sync quantum before it starts.

Original BPM

The original tempo of the file, used for synchronization. If there is "nnn bpm" in the filename, it will be used as a default value.

Number of Beats

When both Loop and Sync are enabled, the tempo is instead derived from the number of beats in the file. The precise tempo will then be calculated according to this, to avoid drifting out of sync over time.

However, if you want to make it drift in a controlled way, you can double-tap the value and enter any decimal number. For example, a value of 4.5 would make it loop every 4 quarter-notes and 1 eight-note.

Rate

When Sync is OFF, you can control the playback rate of the FilePlayer freely using this parameter, which is also MIDI controllable.

Beat Offset

Introduces a negative or positive time shift for when the file starts playing. Can be used to offset loops for rhythmically interesting results, etc.

Normalize

Normalizes the gain to -0.1 dB. Good for recordings with low levels, or to bring 32-bit files with clipping levels into range.

Built-in effect nodes

AUM has several built-in node types for signal processing, apart from the nodes for signal routing mentioned above.

Stereo Processing

Stereo Balance

Adjust the balance between the left and right channel.

Drag the small knob next to the node to control the balance.

Stereo to Mono

Convert stereo to mono by using only left, right or a variable blend between the two channels.

Drag the small knob next to the node to adjust the blend between left and right.

Stereo Panning

Similar to Balance, but instead pan left or right channels into the other channel.

Mid/Side Balance

Adjust the balance between mid and side. More side makes the stereo image wider.

By using this on two bus channels receiving on the same bus, with one on 100% mid and the other 100% side, you can apply different processing on mid and side, for example adding reverb to the side signal only.

Mid/Side-Stereo Convert

Convert the signal from M/S to L/R or the other way around.

Use this if recording with a real M/S microphone setup.

It can also be used for individual processing of Mid and Side signals with plugins that has individual controls for left and right, by putting this node before and after the effect(s).

This node also applies a gain of -3 dB, so that the net gain of two of these nodes equal 0 dB.

Invert Phase

Invert left, right or both channels.

Tap the toggles next to the node to select which channels to invert.

Filters and EQs

Parametric EQ

A single-band parametric equalizer.

Tap the node to adjust center frequency, Q, and gain.

The gain can also be controlled directly using the knob next to the node.

Low-shelf Filter

A low-shelf filter to boost or cut low frequencies.

Tap the node to adjust cutoff frequency and gain.

The gain can also be controlled directly using the knob next to the node.

High-shelf Filter

A high-shelf filter to boost or cut high frequencies.

Tap the node to adjust cutoff frequency and gain.

The gain can also be controlled directly using the knob next to the node.

Low-pass Filter

A resonant low-pass filter to cut everything above a given frequency.

Tap the node to adjust cutoff frequency and resonance.

The frequency can also be controlled directly using the knob next to the node.

High-pass Filter

A resonant high-pass filter to cut everything below a given frequency.

Tap the node to adjust cutoff frequency and resonance.

The frequency can also be controlled directly using the knob next to the node.

LP/HP Filter

A combined "DJ style" low-pass/high-pass filter. In the center position (0 %) the filter is fully open. Increasing the value (+ %) does high-pass, and decreasing it (- %) does low-pass filtering.

All-pass (1st order)

A first order all-pass filter, mainly useful for acoustic engineers and such.

All-pass (2nd order)

A second order all-pass filter, mainly useful for acoustic engineers and such.

Dynamics

Gain

A simple gain control.

Hard clip

Applies a gain control and then clips hard at +0dB.

Saturation

Applies a gain control and then clips softly up to +0dB using a tanh curve.

Peak Limiter

Look-ahead peak limiter.

Tap the node to adjust attack time, decay time, and pre-gain.

The pre-gain can also be controlled directly using the knob next to the node.

This node introduces a latency equal to the attack time. Changing the attack time thus changes the latency compensation for the whole mix, which will produce some noises while being adjusted.

Utilities

Time Offset

Adjust time offset at this point in the signal chain.

The time offset value can be set both negative (this signal will appear earlier than others) or positive (this signal will appear later than others).

This node manipulates the internal latency compensation, affecting any sends or outputs later down the chain. Do not try to use this as a delay effect, there are a bunch of good AUv3 delays for that purpose!

The way it works is that a positive offset reports a negative latency, and a negative offset is reported as a positive latency.

What happens then is that if the latency is negative, any output/send nodes later down the chain compensates this by adding an equal amount of delay (or rather, the amount needed to reach the full compensation for the maximum latency of the output). The result is thus that a positive time offset results in added delay of the same amount.

In the other direction, a positive latency means that the node "tricks" the latency compensation by saying there is a latency that needs compensation, while in reality there is not. This has the effect of increasing the maximum latency of the output, so that all other output/send nodes compensates this imaginary latency by adding a delay. The result is that a negative time offset delays everything else, so that this node shifts the signal "backwards" in time.

Plugin support

AUM can host Audio Unit Extensions (AUv3) as well as Inter-App Audio instruments, generators and effects.

Both kind of plugins receives host transport state and beat clock signal from AUM, for sample accurate synchronization (if implemented by the plugin).

A menu button will be shown to the left of the plugin node. Tap this to access MIDI routing for this node if it can receive MIDI. You can also double-tap the menu button as a shortcut for showing and assigning the built-in MIDI keyboard to this node only.

Instruments vs Generators vs MIDI processors

The difference between the types of plugins shown below the plugin names, is that Instruments and Music Effects can receive direct MIDI from the host (AUM in this case) without going through a separate Virtual MIDI port, while Generators and Effects does not have this ability.

MIDI processors are available only in the MIDI strips, and does not process audio signals but can receive and transmit MIDI.

Audio Unit Extensions (AUv3 plugins)

Audio Unit Extensions shows their user interface directly inside AUM in a floating window. Tap the node to show the plugins user interface.

Multiple instances can be created of the same Audio Unit Extension.

Double-tap the AUM background to close all open plugin windows.

Plugin window

The plugin window shows the user interface of the plugin. Its title bar contains the following items:

  • Keys button (If the plugin can receive MIDI). Show the built-in keyboard and connect it to this plugin only.
  • Route button (If the plugin can receive MIDI). Show the MIDI routing for the plugins MIDI inputs and outputs.
  • MIDI Control button Access the plugins parameters, allowing you to assign MIDI controls to them. Long-press this button to enter Control Finder mode.
  • Presets button Access the plugins presets.
  • Plugin title The title of the plugin. Double-tap to cycle between default window size and maximized. Long-press to customize the short-name and node color for this plugin instance.
  • Bypass toggle Tap to (un)bypass the plugin.
  • Close button Tap to close this window.

Move a plugin window by dragging its title bar. Resize it by dragging the handle in its lower right corner.

Main parameter knob

AUM can expose a selected parameter of the Audio Unit plugin as a single knob or toggle next to the node. The selection is made in the MIDI Control view, which lists all the available parameters. See here for more details.

Instance name & color

When having multiple instances of the same plugin in the same channel strip, it's useful to set a name to identify them. You can also change the node background color. Do this by long-pressing the titlebar of the plugin window.

The name will be shown beneath the plugin icon in the node instead of the plugins "shortName" (if any), truncated to 6 characters. It will also be appended to the full plugin title as displayed in the title bar, MIDI connection lists and MIDI matrix.

You can also override the default node background color.

Multi-bus support

AUM supports Audio Unit plugins with multiple busses. See this section for more information.

Bypass behaviour

Since AUM 1.4.0, bypassing an AUv3 will stop processing it, saving CPU usage.

Inter-App Audio

An Inter-App Audio (IAA) node run as a separate app. Tap the node to switch to the app.

To avoid "ghost IAA processes", make sure to always switch at least once to a hosted IAA app so that it becomes visible in the iOS multitask manager.

On iOS 15 and later, turn off anything related with Siri and "app suggestions" for all your IAA apps, or iOS might pre-launch the apps in the background at various times making them fail to load in a host.

Latency compensation

AUM does latency compensation if an effect introduces a delay of the signal. The compensation is propagated through mix busses and sends, so that everything lines up at the end.

Note that AUv3 effects that introduces latency must report this to the host, or AUM won't know that they need compensation and how much.

It also compensates for the total round-trip latency when recording hardware inputs. This can be disabled in the Settings.

Tap the DSP meter / battery indicator to show the current latency values and some other statistics, including the current time and date.

If the compensation reaches the limit of the internal latency compensation buffers, an error message will be shown and the sound will be distorted.

Inter-App Audio latency

Since IAA does not provide an interface to report latency, it can be adjusted manually in the node settings menu. Tap the menu symbol next to an IAA node and then the gear symbol.

However, some IAA nodes, like the AUFX audio effect series, does report latency to the host through a creative use of existing programming interfaces.

Latency and synchronization

When Ableton Link is enabled, AUM includes the current latency compensation when aligning with the Link session beat time.

The latency compensated beat time is used to sync IAA and AU plugins.

Clock and transport

The transport controls are located at the top left of the screen.

The play button controls the transport clock, for starting and syncing file player nodes, hosted IAA apps and AU plugins.

The rec button controls recording in the app.

Drag left or right on the transport controls area to locate to another beat in the timeline.

Tap the tempo label to show the tempo menu, where you can adjust the tempo and access the Clock Options.

Tempo Menu

Tap tempo

You can tap out the tempo on the TAP button.

Tempo value

Drag left/right to change tempo. Tap the arrows for 0.1 step changes. Double-tap to enter a numeric value by keyboard.

Metronome

Tap the metronome symbol to enable or disable the metronome. The downbeat will be accentuated with a higher pitch, according to the current time signature.

Clock Options

Tap the three dots next to the metronome button to show the Clock Options. (see below)

Clock Options

Time Signature

The number of beats per whole note. This value affects the metronome and the phase synchronization in Ableton Link.

Pre-roll

The number of bars before time zero that the clock should start at. When recording, it will start recording at time zero, and this will function as a "count-in".

Transport MIDI Control

Access the MIDI control setup for Transport. This is also available in the main MIDI Control menu.

Sync Quantum

The number of bars for the synchronization interval used by the built-in FilePlayer, Recorder, and Ableton Link.

For example, a setting of 1 bar means that the beat time will be aligned on bar boundaries. The duration of a bar is decided by the current Time Signature.

While connected to an Ableton Link session, the transport will wait until the next sync quantum boundary before starting after pressing play.

While transport is rolling, tapping Record will wait until the next sync quantum to begin recording. Tapping Record again (instead of Stop) will again wait until next sync quantum to end the recording. This gives recording durations in whole number of bars, useful for recording loops.

Ableton Link

Tap to setup Ableton Link.

Ableton Link is a technology that synchronizes beat, phase and tempo of Ableton Live and Link-enabled apps over a wireless network. It lets you play devices together with the freedom of a live band. Anyone can start and stop their part while others keep playing, and anyone can adjust the tempo and the rest will follow. You can use Link to play with several instances of Ableton Live, with Live and iOS apps, or even without Live in your setup: using Link-enabled apps on multiple devices, or multiple apps on the same device.

When Sync Start/Stop is enabled, other connected Link peers with this option enabled will follow the start/stop state of each other. So press play in one app and the other will start playing as well.

Even when Sync Start/Stop is enabled, you can opt out of this by long-pressing the transport play/pause button. This will start/stop AUMs transport without affecting connected Link peers.

When Link is enabled, the transport clock will not be sample-precise since it will follow the Link beat time instead of the sample time. It will also have more or less jitter depending on device and other connected Link peers.

Ableton Link Offset

Adjust Ableton Link time offset in milliseconds, useful for manual adjustment if there are unknown latency between synced devices.

MIDI Clock Send

Tap to enable and configure sending of MIDI beat clock.

This functionality allows you to synchronize external hardware such as sequencers. It's not recommended for syncing hosted apps or plugins, they should use standard host sync instead. For non-hosted apps (possibly running on other devices), Ableton Link is often a better choice instead of MIDI clock.

When starting the transport from the beginning, or after locating to a specific beat, a START message is sent.

When pausing and starting again without rewinding or locating, a CONTINUE message is sent. The exception to this is when synchronized with Ableton Link, then it will wait for the next Link sync quantum (default is one bar) and then send a START message.

If Song Position Pointer is enabled, any START mentioned above, that is not for starting from the beginning, will be replaced with a SPP + CONTINUE message.

The Latency Compensation modes are as follows:

  • None - The MIDI clock will align with the audio output, but disregarding device output latency.
  • Output - The MIDI clock will align with the audio output, including device output latency. Use this when the audio generated by the clocked device is mixed externally with the audio coming from AUM.
  • Input - The MIDI clock will align with the audio input. Use this when the audio generated by the clocked device is fed back and mixed in AUM.

Any negative clock offsets will need a suitable pre-roll to not miss the first clock ticks. This is done automatically if the transport is stopped, and when tapping rewind.

Metronome Level

Adjust the volume of the metronome.

Metronome Output

Tap to select the hardware output channel for the metronome.

During Pre-Roll Only

When enabled, the metronome only sounds during the pre-roll phase.

Recording

Tap the circled R button on a channel to enable or disable recording for that channel. Then tap the red dot (record) button in the transport controls at the top left of the screen to start recording.

Each recording-enabled channel will be recorded as a separate file. If you want to record a mix of several channels, use a mix bus!

Recording tails

Recording continues even if you stop the transport clock by tapping pause. This allows recording effect tails after playing has stopped.

Tap the record button again while transport is stopped to finish the recording.

Synchronized recording

If you tap record while the transport is rolling, it will wait for the next sync quantum to start or end the recording at that point in time. This can be used to record loops on the fly. Each such recording will generate a new file.

If you stop the transport while it's waiting for the next sync quantum, it will finish recording immediately.

Recorded files

Note that tapping the transport play button does not play back your recordings. The play button is just for controlling the transport clock. You can load the recording in a FilePlayer node if you wish to play it back as part of your mix.

Tap the menu button at the top right and choose "Files" to view your recordings. From there, tap a recording to play it back or export it in various ways.

The recordings are written directly into the file space of AudioShare, the audio file manager for iOS. You can use AudioShare to manage the recordings further, for example sharing them, doing some basic editing, normalizing and converting.

MIDI routing

AUM features a MIDI matrix that can connect MIDI from anywhere to anywhere, including externally connected MIDI devices, hosted nodes and plugins, and virtual MIDI endpoints.

CoreMIDI destinations (Virtual MIDI ports and external MIDI devices) are limited to 256 bytes per MIDI package. Typical MIDI messages are only 3 bytes long, so this is generally not a problem. However, it could be if you need to send large SysEx data. In that case, try to split it up in several smaller SysEx packages instead.

MIDI Matrix

Tap the Z-shaped curved symbol next to the main menu button to show the MIDI routing matrix.

The MIDI sources are listed at the top, and the destinations to the right. In the area between them is a grid of connection points. Tap a connection point to add or remove a connection.

You can drag the small resize handle in the top right corner of the matrix to resize it. This is useful to decide how much of the endpoint names should be visible. Tap the handle to flip between maximized and minimized (where only the icons are visible).

Retaining unavailable endpoints

If a MIDI source/destination is not available (For example MIDI controller unplugged, IAA app terminated, or AUv3 plugin crashed), they will still be shown in the matrix if they are connected to anything else. If the missing MIDI endpoint becomes available again, it will automatically re-connect. If you remove all connections for the endpoint, it will be hidden until the endpoint becomes available again.

MIDI Connection lists

Another way to connect MIDI endpoints is by viewing the MIDI Sources list for a specific MIDI Destination, or the other way around.

To reach this, either tap the routing button in an AU plugin window title bar, or the menu-button next to any node that has a MIDI destination, or tap the endpoint name in the MIDI Matrix. This shows the list of connectable MIDI endpoints for this endpoint and allows you to connect or disconnect them.

If the node has multiple MIDI inputs, or both MIDI input(s) and output(s), you will first be presented with a list of available inputs and outputs. Choose an input to show the MIDI Sources connection list for this input, or an output to show the MIDI Destinations connection list.

MIDI filtering

All MIDI destinations also include a MIDI filter to select specific channels, note ranges or MIDI messages to pass or block. In addition, you can choose to transpose the MIDI notes.

To show the filter settings, open the MIDI Connection list for the destination, as mentioned above. Then scroll to the bottom to find the MIDI filters. You can also tap the filter button in the top right corner of that view to quickly scroll down to the filter section.

The available MIDI filters are:

  • Channel filter. Use this to select which MIDI channel that should be passed to the destination.
  • Note Range. This allows a certain range of the keyboard to reach the destination.
  • Transpose. Transpose MIDI Note and Aftertouch messages by any given amount of semitones.
  • CC Filter. Tap to select which MIDI CCs are allowed to reach the destination.
  • Message Type. Here you can block or pass MIDI events depending on the message type.
    • Note On/Off
    • Pitch Bend
    • Program Change
    • Polyphonic Aftertouch
    • Channel Aftertouch
    • System Real-time (MIDI Clock)
    • System Common
    • System Exclusive

Swapping connections

You can swap the MIDI connections between two endpoints. This could be useful if you want to switch to another hardware controller, or if two or more controllers of the same model was connected in a different order than intended, for example.

Tap a MIDI endpoint name in the MIDI Matrix, then tap the swap symbol in the top left. This will show a list of all other endpoints. Select one to swap connections with it.

For MIDI destinations, also the Filter settings are swapped.

Renaming endpoints

CoreMIDI hardware endpoints can be renamed. Tap the endpoint name in the MIDI Matrix, then tap the Name settings row and enter a new name.

The custom name is associated with the original endpoint name. If a device has both a MIDI source and destination with the same name, both endpoints will be renamed.

If the original name changes you will have to rename it again. The original name might change via settings in the connected device, or due to name collisions (as explained below).

Custom names are saved with the session, and cleared when you clear the session. Custom names are kept even if the device is unplugged.

Multiple devices of same model

When there are multiple hardware MIDI devices of the same brand and model connected, and it's not possible to change their names by firmware, it would lead to a name collision since all such devices have the same name.

To handle this, AUM will detect a name collision and append the USB Location ID to their names, in the form of an 8 digit number #nnnnnnnn.

This ID is tied to the physical port of your USB hub. If you move the cable to another port, the ID will change. It might also change if you change the hub, and will change if you connect the hub via another hub, etc. Thus endpoints in a saved session might not be recognized after such a change of the physical setup. You can use the Swap Connections (see above) function to restore the connections to the correct endpoint in the matrix if this happens.

When using custom renaming of endpoints (see above), the custom name will be associated with the current name of the device (including any #nnnnnnnn number). This means it will be separate for when there is only one and when there is more than one of the same device plugged in.

AUM Virtual endpoints

AUM exposes a virtual CoreMIDI source and destination for connection with other apps running in the background but not hosted inside AUM.

IAA apps and AUv3 plugins should always use standard host MIDI instead of virtual CoreMIDI endpoints.

'AUM' Destination

This is a MIDI source in AUM, and a destination in other apps. Use it to pass MIDI from other apps into AUM.

'AUM' Source

This is a MIDI destination in AUM, and a source in other apps. Use it to pass MIDI from AUM into other apps.

Avoid double-connections

Note that each individual app decides where it receives MIDI from, and where it sends MIDI to. If an app has Virtual MIDI ports, AUM can act as a MIDI router between that apps virtual ports and other MIDI endpoints.

Make sure you don't accidentally create double-connections, which would happen if you for example:

  • configure app A to receive from app B, and configure app B to send to app A at the same time
  • configure app A to receive from app B, and configure AUM to route app B to app A
  • configure app A to receive from a hardware MIDI controller, and configure AUM to route that same hardware MIDI controller to app A

Also note that even though you have routed MIDI into an apps virtual port via AUM, it's no guarantee that the app will actually listen on its virtual port. Some apps need you to explicitly enable or select its virtual port as its MIDI source.

MIDI Bus nodes

You can create any number of MIDI Buses. Tap an empty slot in a MIDI channel strip, and choose MIDI Bus.

A MIDI Bus acts like a proxy, allowing you to group several MIDI sources and/or destinations. For example merging multiple MIDI keyboards and controllers, and then only having to connect your plugin instruments to this MIDI Bus instead of redoing the connections to each MIDI source. Or the other way around, connecting a controller to a MIDI Bus and from there to multiple synths.

Each MIDI Bus has its own MIDI Filtering, just like any other MIDI destination.

Enabled toggle

There is an 'Enabled' toggle for each MIDI Bus node. It's available as a circled button next to the node, and is also MIDI controllable.

When enabled all MIDI data is passed through (if allowed by its filter). When disabled, only note off and sustain/sostenuto off for active notes are passed through, so you can de-activate the toggle while playing a chord and it will keep playing until you release the keys.

Custom name & color

Tap a MIDI Bus node to set a custom name and color if needed.

Wireless MIDI

AUM supports standard Network MIDI as well as Bluetooth LE MIDI. You can configure wireless MIDI in Settings.

MIDI Control

You can control the volume, mute, solo and rec toggles of all audio channel strips through MIDI. Both MIDI and audio strips also have a "Scroll to this channel" trigger parameter. Additionally, each channel allow control of any parameters of its nodes, including parameters of Audio Unit extensions. You can also control node bypass, the global Transport, as well as loading saved sessions via MIDI commands, and more.

Tap the menu button and choose "MIDI CTRL" to configure MIDI control. You can also reach the MIDI Controls for a specific channel by tapping the channel label and then the button that look like four sliders. In the same way, you can tap the similar button in an Audio Unit plugin titlebar to show all controls of that specific plugin instance.

It listens on the "MIDI Control" MIDI destination. Connect sources to this destination to use them for MIDI control, either by tapping the "MIDI Sources" shortcut at the top of the MIDI Control page, or by using the main MIDI routing matrix.

MIDI Control Collections

MIDI controls are organized in collections. Each channel has a collection for each of its nodes, and audio channels also have a "Channel Controls" collection for the level fader, etc.

Additionally, AUv3 plugins can present their parameters in subgroups, which will be displayed as sub-collections inside the main MIDI Control collection of the plugin.

Some MIDI Control collections are dynamic: they consist of items added by the user. For example Session Load actions, Preset Load actions, and Tempo Presets.

Each MIDI Control Collection has a menu with various actions. Open it by tapping the three vertical dots to the right of the collection section.

Save/Load mappings

Tap Save to save the current MIDI Control mappings for this collection. Tap Load to load a previously saved mapping. Mappings are stored individually for each kind of collection. You can access the mappings in the iOS Files app, in the "On my iPad/AUM/MIDI Mappings" folder, where you can share or rename them, etc.

When loading a mapping for a whole channel, AUM will try to be smart when determining the kind of collection to match with the existing nodes in the channel. It will skip any nodes not existent in both the channel and the mapping file, but will ignore the exact location of the nodes in the channel. However it will preserve the order of nodes of the same kind, so it will for example distinguish between "first Bus Send" and "second Bus Send", etc.

Copy/Paste mappings

Copy and paste mappings between MIDI Control collections. A mapping copied from one collection can only be pasted to a same kind of collection.

Set MIDI Channels

This allows you to batch-set the MIDI channel for all controls in the collection, recursively. Enter channel 1-16 or 0 for OMNI (any channel).

Clear All

Tap this to clear all MIDI Control mappings in the collection, recursively.

Delete All

Only shown for dynamic collections. Deletes all user-added items in the collection.

Mapping MIDI messages to controls

Tap a MIDI control parameter, and a panel will show up where you can configure the MIDI channel and message type that this parameter should respond to.

There are four kind of parameters: Values, Toggles, Triggers and Indexed. They all have a bit different settings.

MIDI channel

The first setting is the MIDI channel that this mapping should respond on, 1-16 or OMNI (respond on any channel).

Set to OFF to disable this mapping. You can also swipe left on the parameter in the list to reveal a "CLEAR" button.

Message type

The next setting decides the kind of MIDI message that should be matched:

  • CC - Continuous Controller. Value is 0-127 (7 bits).
  • NOTE - Note on messages. Velocity 0-127 is used as value. Note off is interpreted as a value of 0.
  • PC - Program Change 0-127.
  • PBEND - Pitch Bend. Value is 0-16383 (14 bits).
  • CHPRS - Channel Pressure 0-127.

Number

The third setting decides which number (data byte 1) that should be matched for CC, NOTE and PC messages.

Learn

Tap the LEARN button to initiate MIDI learn for this parameter, which will automatically configure the parameter to respond to the next incoming MIDI message.

Range

For Value and Indexed parameters, you can set the mapping range by tapping the "0 -> 100%" button and adjust the min and max points.

Cycle & Invert

For Toggle and Indexed parameters, you can enable or disable auto CYCLE mode.

When enabled, the parameter cycles through its values when receiving a non-zero value, useful for NOTE or momentary CC buttons.

When disabled, a Toggle parameter is ON only while the NOTE is held or when the CC value is above 64 (useful for latching buttons) while Indexed parameters are set to the value as normal.

For Toggle parameters with Cycle off, you can also enable INVERT to reverse the on/off state, which is the same as swapping the min and max points in the Range.

Multiple mappings for same message

Multiple parameters can be mapped to the same kind of MIDI message. This is fine and no problem, and can be useful in some cases. When this is the case, a small warning triangle will appear just to make sure you are aware of it. Tap it to see a list of all parameters mapped to this message, where you can also edit the mappings.

MIDI Control Finder

Instead of scrolling through all the parameters of a node, you can quickly show the MIDI control settings for a specific parameter.

This works for all AUv3 plugins as well as many of the built-in nodes such as EQs, filters and stereo processing nodes.

To do this, tap the node to show its user interface or plugin window, then tap the MIDI Controls button (looks like four faders). Then, activate the Control Finder by tapping the button that looks like a radiating knob in the top right. You can also simply long-press the just mentioned MIDI Controls button.

Once the Control Finder is activated for this plugin, tweak any parameter in the plugin and AUM will lookup and show the MIDI Control settings for it. If you tweak multiple parameters within a very short time window, all of them will be shown. (This is useful for XY-pad style controls, for example)

When the "Found Controls" popup is shown, configure the parameter as usual, and tap NEXT or outside the popup to find another one, or DONE to stop the Control Finder. You can also stop the Control Finder by tapping on the animated find-controls button in the plugin titlebar. Closing the plugin window will also stop it.

NOTE: MIDI Control is disabled while Control Finder is active, to avoid detecting parameters that are currently being externally modulated, etc.

Audio Unit MIDI Control

All parameters exposed by the Audio Unit plugin can be MIDI controlled by AUM.

Additionally, you can load specific presets or show the plugin window via MIDI.

Preset Load actions

All Audio Unit plugins adds a built-in "Preset Load" sub-page for loading presets via MIDI actions. Tap the "ADD" button and select a preset to add an action for it. Then tap the action to configure which MIDI message it should trigger on. Swipe an action to DELETE or EDIT it.

Show Plugin action

All Audio Unit plugins adds a built-in "Show plugin" action. Triggering this action will open the plugin window. Triggering again for the front-most plugin will close the window.

Main Parameter selection

Audio Unit plugins can expose a single parameter as an easy-accessible knob next to the node.

To select which parameter should be exposed, tap on a parameter in the list and then toggle the knob-like symbol in the lower right corner so that it lights up in green color. Toggle it off if you don't wish to have a Main Parameter knob.

Music Effect nodes show their MIDI routing button next to the node only if no Main Parameter is selected.

Transport Control

MIDI Machine Control

The "Receive MMC" toggle allows remote control of the transport state with MIDI Machine Control. When enabled, AUM reacts to the following MMC SysEx commands:

  • Play (0x02 or 0x03)
  • Stop (0x01)
  • Pause (0x09)
  • Rewind (0x05)
  • Record (0x06)
  • Goto/Locate (0x44)

The Stop command also rewinds if the transport is already stopped.

Simple MIDI control

There are also simple MIDI control items that can be controlled by MIDI note or CC messages, for example a connected MIDI pedal:

  • Rewind
  • Start play
  • Stop/rewind
  • Toggle play
  • Toggle record
  • Previous bar
  • Next bar
  • Tap tempo
  • Tempo
  • Tempo Presets
  • Metronome on/off

Rewind when stopped

When this toggle is enabled, the transport will always rewind when stopped via MIDI (including MMC).

Tempo Presets

This allows setting a specific tempo triggered by a MIDI message. Tap "ADD" to add a tempo preset. Then tap it to configure which MIDI message should trigger it. Swipe it to DELETE or EDIT it.

System actions

Switch to AUM

This MIDI action switches AUM into foreground. Note that AUM must be actively running in the background for it to respond to MIDI messages, for example transport running or having any channel with a loaded source node or MIDI node.

Hide all plugins

When this action is triggered, AUM hides all plugin windows. Same as double-tapping the background.

Un-solo all channels

When triggered, all audio channel strips are un-soloed.

Session Load actions

The "Session Load" MIDI control sub-page allows you to add MIDI actions for loading specified sessions. Tap the "ADD" button and select a session to add an action for it. Then tap the action to configure which MIDI message it should trigger on. Swipe an action to DELETE or EDIT it.

Session load actions are saved globally, not in the session.

Settings

Tap the menu button and choose "Settings" to show the settings.

Audio Engine

Sample Rate

AUM always run in the current hardware sample rate, with no sample rate conversion.

The current sample rate is shown, tap it to select another preferred sample rate. On iOS, there's no guarantee that the preferred sample rate will be used, depending on device model, other running apps, and connected audio devices.

Buffer Size

Tap to select the preferred buffer size. As with sample rate, the current buffer size is not always under our control.

Larger buffer sizes means longer latency delay, but better stability with less risk for drop-outs.

Min. Latency

Set a minimum latency, taking into account any latency compensation already happening because of latency-introducing effect nodes.

This will reduce jitter for CoreMIDI destinations, since events can be timestamped in the future.

The latency will be compensated at the hardware audio outputs so everything aligns correctly.

Mic & Speaker

Output Route

Tap to select the current output route for the device. This is the same as can be seen in the iOS Control Center, etc.

Input Source

Select the preferred input source. For built-in microphone, you can select which mic and what polar pattern to use, including support for stereo microphones as available on some device models.

Input Gain

Adjust the hardware microphone gain.

High Quality

Enables measurement mode, which disables various iOS audio processing (filters and automatic gain control) for built-in input and output. This gives much lower latency, and can give higher fidelity and better bass response. You might need to increase the Mic Input gain and output level when enabled.

Recording

Bit Depth

This setting controls the bit depth of recorded audio. Choose between standard 16 and 24 bit signed integers, or 32 bit floating point.

32 bit floating point allows recordings with levels above +0dB without clipping, and the file can then be normalized or processed in other ways to bring it back to good levels.

Latency Comp.

When enabled, compensate for latency when recording hardware inputs, by shifting the recording in time according to the total round-trip delay of the audio system.

The compensation is only done on channels that has a hardware input as source, or a bus source that has hardware inputs feeding it (recursively).

Note that if you record hardware input mixed with other sources (FilePlayers, IAA/AU instruments, etc), also the non-hardware source will be shifted back and thus get out of sync on the recording. In those cases you might want to turn off latency compensation, or record the hardware inputs separately and mix it together with other sources as a later step.

Channel Defaults

Fader Level

The default level in dB for newly created channels. The default value is also set when double-tapping a channels volume fader.

First Effect Slot

Determines the pre/post fader position for the initial effect slot in newly created channels.

Send Amount

The initial send amount for newly created Bus Sends.

Audiobus

Auto-add Sources

When enabled, new Audiobus sources are automatically added as new channels.

Wireless MIDI

Bluetooth Central

This brings up the standard Bluetooth LE MIDI Central view, where you can search for nearby devices and connect with them.

Once connected with a device, it will show up in the lists of available MIDI sources and/or destinations.

Bluetooth Peripheral

This brings up the standard Bluetooth LE MIDI Local Peripheral view, where you can advertise this device.

While this device is being advertised, another device can connect to it. Once connected, the other device will show up in the lists of available MIDI sources and/or destinations.

Network MIDI

This will show the Network MIDI settings, where you can enable or disable the Network MIDI session, as well as browse available MIDI hosts on the network and connect or disconnect them to the MIDI network session.

To make your Mac show up in the list of available hosts, make sure to give its MIDI Network Session a Bonjour name in Audio MIDI Setup.

Appearance

Show Status Bar

Show or hide the system status bar. Showing the status bar can be useful to see the additional info, but also when using Stage Manager to avoid having the three dots at the top collide with the AUM user interface.

DSP% and Statistics

Global DSP% meter

The DSP% meter measures the current CPU load of the audio processing. In other words, how much of the total available audio render time that is used by the audio processing thread in AUM.

It can be useful for checking if you're nearing the maximum load, which would give rise to audio drop-outs and glitches due to buffer underruns.

Beneath the DSP% meter there is a Battery status indicator that shows how much energy is left in the battery and if it's charging or not.

Due of CPU Frequency Scaling managed by the operating system, the CPU changes clock speed on demand, slowing down to save energy whenever it can. In addition, it can move execution between slower energy-saving CPU Cores and faster high-performance CPU Cores.

Because of this, using the global DSP% meter is not useful for comparing the efficiency between different AUM sessions or how much a specific plugin adds to the CPU load.

The CPU might be running at a slow clock speed, and then you add additional load in the form of a plugin. To keep up with the demand, the system speeds up the CPU clock speed. Now the CPU runs faster than before, so this can actually make the DSP% meter drop to a lower value when it got more work to do!

Per-node DSP% and Latency

You can drag a node to the right to reveal its full title as well as its individual DSP% meter and Latency information in milliseconds.

The DSP% shows how much of the available audio render time was used by this node. Beware of the CPU Frequency Scaling mentioned above!

See the Latency section below for how to interpret the latency information.

Engine Info

Tap the DSP% meter to open the Engine Info view.

This view displays various useful information:

  • Sample Rate - The current audio sample rate.
  • Buffer Size - The current audio buffer size.
  • Buffer Duration - The time interval between render cycles.
  • Node Statistics - Detailed statistics of DSP load and latency per node. (See below!)
  • Device Input Latency - The reported latency of the audio input.
  • Round Trip Latency - The calculated round-trip latency, from input to output.
  • Device Output Latency - The reported latency of the audio output.
  • Latency Compensation - The current applied latency compensation.
  • Total - Total output latency = Device Output Latency + Latency Compensation.
  • IAA Host Ports - Some information about connected Inter-App Audio ports.

You can ask for another sample rate or buffer size in the Engine Settings.

Node Statistics

In the Node Statistics view you can see detailed information about the DSP load of each node, as well as the init/load time, last state save time, and the reported latency of each node.

DSP Load

The DSP Load has four different views:

  • Buffer % - Shows the DSP load as a percentage of the buffer duration (render cycle interval). The absolute numbers are not meaningful due to CPU Frequency Scaling, but you can compare the numbers between nodes.
  • Total % - Shows the DSP load as a percentage of the total DSP load, so that the sum adds up to 100%. This is even more useful to compare DSP load between nodes, since it's not affected as much by CPU Frequency Scaling.
  • Time - Shows the DSP render time per buffer in microseconds.
  • Max - Shows the maximum DSP render time per buffer in microseconds since node creation. This value is reset when buffer size changes.

If you have any Audiobus sources connected, a separate Audiobus Sources item will tell the DSP load & time of all of them, since the processing does not happen in their actual respective Nodes.

The Audio Engine item displays the DSP load & time of everything else that happens in AUM during the render cycle, like bus processing, level metering, transport clock, thread messaging, etc.

DSP Core distribution

This table shows how often the DSP thread has executed on each separate CPU core since the last 2 seconds or so.

On devices with more than 2 cores, we can assume that the last 2 cores are fast Performance cores and the others are slow (energy-saving) Efficiency cores.

Latency

This table shows the reported latency of each node. Nodes with no latency are not listed.

For Hardware/Bus Output/Send nodes, the latency information is displayed as A + B = SUM where A is the accumulated latency at this point in the signal chain and B is the compensation delay done by this node to reach the SUM total max latency of that bus or hardware output, so that all signals are aligned at the end.

For Bus Receive nodes, the displayed latency is the max total latency of the bus.

Init/Load times

The time it took for each node to be initialized, including state loading.

Save times

The last time it took for each node to save its state.

MIDI keyboard

AUM has a built-in keyboard to play notes. The keyboard is a MIDI Source that can be routed to anything, including hosted nodes and plugins, other apps virtual MIDI ports, or connected external MIDI devices.

It is also a MIDI Destination, which will simply pass through any incoming MIDI. This is useful for connecting an external MIDI keyboard but still be able to use the shortcuts for quick keyboard routing to plugins etc.

To quickly connect the keyboard to a single plugin (such as a synth), double-tap the menu button next to the node, or tap the keys button in a plugin titlebar.

Tap the keyboard symbol in the lower left corner to show the keyboard.

Then tap the connect button to connect MIDI endpoints to or from the keyboard.

The gear button opens the keyboard settings where you can adjust velocity and its MIDI channel.

Tap the arrows to enter scroll mode, where dragging on the keyboard selects which octave(s) are visible.

Keyboard shortcuts

If you have an external typing keyboard connected to your iOS device, you can use some keyboard shortcuts to control AUM, for example transport, metronome, scrolling and open/save.

To see available shortcuts, press and hold the command (⌘) key.

NOTE: There's currently an iOS bug (as of iOS/iPadOS 15.1) that breaks keyboard shortcuts after having focussed a text field in an AUv3 plugin. For example after saving a preset inside the plugin user interface. To get it working again when this happens, close and re-open the plugin window.

Developer Notes

Below are some AUM specific notes for developers.

See devnotes.kymatica.com for some more information regarding AUv3 parameters, MIDI timestamps, and more.

AUv3 window size

AUv3 plugins can ask AUM for a preferred window size, by including one or more special _size:{WIDTH,HEIGHT} tags in the tags array of the AudioComponents dictionary in Info.plist, where WIDTH and HEIGHT are actual numbers.

AUM will choose the first size tag that fits the current screen size. That way, a plugin can have separate preferred window sizes for iPad and iPhone in portrait and landscape.

AUv3 shortName & color

You can return a default value in audioUnitShortName to set the plugin instance short name and color. AUM parses some extra information in shortName. The format is shortName;$rrggbb$ or shortName;extraString;$rrggbb$ where rrggbb is in hexadecimal and sets the background color. ExtraString is displayed in the plugin title bar but not beneath the plugin icon.

You can emit a didChangeValueForKey for audioUnitShortName to have AUM update this. Note that this would overwrite any custom instance name and color set by the user, so use carefully!

AUv3 default Main Parameter

The default Main Parameter is choosen by calling parametersForOverviewWithCount:1 on the audio unit instance.

AUv3 latency compensation

For AUM to be able to compensate for latency introduced by plugins, they must report their input-to-output latency by overriding their latency method.

If the plugin changes latency dynamically (depending on some user setting for example), emit a didChangeValueForKey for latency to notify the host that it changed. This will make AUM recalculate the whole latency compensation network of the session, which might result in glitches as compensation delays are changed etc. Therefore, only do this as a side-effect of some user action.

AUM also sets the contextPresentationLatency on the plugins input busses, so if any upstream node introduces latency it will be known to effect nodes later down the chain. This is useful for effect plugins that also has a sequencer, for example.

Grouping of Virtual MIDI endpoints

Virtual MIDI endpoints are grouped by kMIDIPropertyModel. If you're a developer using virtual MIDI outputs, please set this property to the app name.

Report IAA latency

I invented a hack to allow IAA effects report their latency.

If you would like to implement this in your own IAA app, take a look at this document. In short, the node sends the latency encoded as a Host Remote Event (latencyFrames<<8)|0xFF after connection to host, and when/if the latency changes.

Synchronization

AUv3 plugins and IAA apps should use the currentTempo and currentBeatPosition from the musicalContextBlock to synchronize with the musical beat position and tempo.

Note that currentBeatPosition might start at negative values in case of Pre-Roll or Ableton Link. So when transportStateBlock isPlaying changes to true, you'll need to calculate at which sample within the current buffer that beat 0.0 actually happens.

Since AUM 1.4.0, currentSampleTime from transportStateBlock is simply a direct conversion of beat time to sample time: currentBeat * 60.0 / tempo * sampleRate, but in earlier versions it represents the actual number of samples rendered since beat 0, and will not be perfectly aligned with the current beat position when AUM is synchronized via Ableton Link.

If a plugin wants to know the actual number of rendered samples, they can instead use the mSampleTime field of the AudioTimeStamp passed to their render block.

Plugins should cache the musicalContextBlock and transportStateBlock in their allocateRenderResources method.

Note that since Link is based on host time and not sample time, there can never be a 1:1 correspondence to the actual number of rendered samples, or number of recorded samples in a file.

For IAA apps that syncs to Ableton Link instead of using standard host sync, AUM compensates the timestamp used when processing these nodes, by adding any additional delay caused by latency compensation. It does not add the device hardware output latency, since Link apps are supposed to already do this.

AUv3 init order

When an AUv3 plugin is loaded from a session in AUM, this is the order of things that happens:

  • If there already was a session loaded, it's saved to a hidden file (for Restore Last State).
  • Wait for above state save to finish.
  • The new AUM session is read from file, loading session title, notes, etc.
  • Reads and sets session properties like sample rate, minimumLatency, metronome, and state for all HW and Mix busses.
  • Empty channel objects are created for all channels in the session.
  • Wait for this to finish.
  • Loads the nodes for all channels:
    • Create the node object.
    • For AUv3 plugins, instantiate the AUAudioUnit object.
    • Enable all inputBusses of the AU, also set shouldAllocateBuffer to NO.
    • Enable all outputBusses of the AU, also set shouldAllocateBuffer to NO.
    • Set sample rate for all busses.
    • Set the AU transportStateBlock, musicalContextBlock and MIDIOutputEventBlock.
    • Call AU allocateRenderResources, failing if it returns false or if renderResourcesAllocated is not set after the call.
    • Grab the AU renderBlock and scheduleParameterBlock.
    • Add observer for kAudioComponentInstanceInvalidationNotification,
    • Get the current values of all AUParameters to store their default values.
    • Set AU fullStateForDocument with the state data stored in the session.
    • Get the list of AUParameters with kAudioUnitParameterFlag_IsWritable from AU, creating MIDI Controls for them.
    • Add observers for latency, audioUnitShortName, parameterTree and currentPreset.
    • Get currentPreset (for displaying checkmark in preset list).
    • Implement an iOS bug hackaround: get and show the view for the plugin, hidden from the user, and then close it again.
    • Setup MIDI outputs for each name in the AU MIDIOutputNames array.
    • Grab the AU scheduleMIDIEventBlock.
    • Setup MIDI inputs for each MIDI input. virtualMIDICableCount is checked to know the number of inputs, but if it says 0 we assume the AU has 1 MIDI input if isMusicDeviceOrEffect is true.
    • Repeat for the next node.
  • Wait for the above to finish for all nodes and channels.
  • For each channel, refresh the list of nodes on the audio thread.
  • Load the MIDI matrix state (setting up MIDI routings)
  • Load the MIDI Controls state (setting up all MIDI parameter bindings)
  • Refresh the list of channels on the audio thread, this brings them into the actual audio render process, and will start calling their renderBlocks.
  • Wait for the channel list refresh to finish, then reset the Transport Clock.

Contact

Main website: www.kymatica.com

Feel free to send me an email with any questions or problems!

Follow me on Twitter for news and other information.

If you like the app, please consider giving a review in the App Store, it really helps!

Privacy Policy

Find our privacy policy here: kymatica.com/aum/privacy