uapmd-app UI Guide (AI slop)

NOTE: it is an AI-slop documentation where the screenshots are all taken at v0.5.6+. uapmd-app is a quickly moving target and the sshots will quickly get outdated. Please bear with that.


This is a screen-by-screen reference for uapmd-app, the ImGui-based reference host that ships with UAPMD. It describes what each control does and where to find it.

For the wider picture -- what UAPMD is, how to obtain audio plugins on each platform, and what source separation needs from you -- read USERS_GUIDE.md first. This document assumes you already have the app running.

Screenshots were taken on macOS with the dark theme. Layout is identical on the other desktop platforms; on Android, iOS and Web the same widgets are laid out for the available screen space.

Starting the app

On desktop the executable takes a few optional arguments:

Argument Effect
--scan-only Scan plugins and exit, without opening a window.
--force-rescan (or --rescan) Discard the cached scan results and scan again.
--full Perform full verification during the scan. Requires --scan-only.
--mcp-server [port] Start the MCP server on launch. Defaults to port 37373.
--no-confirm-on-quit Skip the "you have unsaved changes" dialog when closing.

A positional argument is treated as a project file to load.

The main window

uapmd-app immediately after launch

Everything lives in a single window with four bands, top to bottom:

  1. The toolbar -- engine power, transport, global commands, display scale, theme.
  2. The navigator row -- the time-unit switcher, the zoom slider, and the whole-song position controller.
  3. The track list -- the master track followed by your tracks, each with a legend on the left and its clips on the right.
  4. The footer -- add a track, and open the Mixer Monitor window.

Auxiliary windows (Settings, Plugin Selector, editors, and so on) open as floating panels inside the main window. They can be moved and resized like ordinary windows, and their positions are remembered between runs.

At launch you get three empty tracks and an empty master track. Nothing is loaded and nothing is playing, but the audio engine is already running.

The toolbar

Audio Engine

The leftmost button reports and toggles the audio engine. It is green when on and red when off. Turning it off releases the audio device and disables the transport buttons; turning it back on re-activates the device and the plugins on it.

If parallel processing fails -- audio workers miss their deadline, or a plugin fails on a worker -- the button reads Audio Engine: Restart. Its tooltip says what to change in Settings (fewer workers, a larger buffer, or Serial); click it to restart.

System

The System menu

System is the catch-all menu:

Project

The Project menu

Project offers:

Scale and theme

UI: picks the UI scale factor -- x0.5, x0.8, x1.0, x1.2, x1.5, x2.0, x4.0. Changing it rescales every widget and font, and resizes the window to match. The button next to it (a half-filled circle) switches between the dark and light themes.

Plugins

Plugins toggles the Plugin Selector.

Transport

Three buttons, all disabled while the audio engine is off:

Button Behaviour
Record Records into the currently selected MIDI clip. Select a clip on the timeline first, otherwise the button does nothing. It turns red while recording; press it again to stop.
Play / Stop One button that shows a triangle when idle and a square while the transport is engaged. Stopping also cancels a paused state.
Pause / Resume Enabled only while the transport is engaged. Shows a pause glyph while playing and a play glyph while paused.

Playback in progress

During playback the playhead marker moves along the ruler, a vertical line tracks it in the position controller, and the two spectrum analyzers right after the transport buttons show input and output activity.

Spectrum analyzers

In and Out at the right end are live spectrum displays of the audio input and the final output bus.

The timeline

Tracks with MIDI clips

Time units

The View: Seconds / View: Beats button switches the ruler and the clip positions between absolute time and musical time. The two views are independent -- each keeps its own zoom.

The beats/ticks view

Snap

The combo beside the view switcher is the timeline snap. When you move or resize a clip with its grips, the edge you drag -- the start, for a move -- lands on the nearest multiple of that note length, counted from the start of the timeline through the tempo map, in either view. It offers the piano roll's divisions -- Free, 1/8, 1/16, 1/24, 1/32, 1/48, and 1/64 -- and defaults to 1/16. Free turns snapping off, and holding Alt while dragging places freely.

Zoom and position

The slider after the snap combo is the timeline zoom, showing pixels per unit. It is logarithmic and spans four orders of magnitude, so small drags near the left end still move a useful amount.

The wide bar filling the rest of the row is the position controller. It shows the entire song: one lane per track, each clip a small bar, with a translucent rectangle marking the region currently visible below. Drag it to scroll the track list.

The master track

The first row is the master track. It carries the tempo and time-signature meta events that the beats view is built from, and it can host its own plugin chain via Add Master Plugin. It has a gain slider but no mute or solo.

+ adds an empty track. Mixer Monitor opens the mixer window described below.

Tracks

A track owns an audio plugin graph and a set of clips. It is not "a plugin" -- a track typically holds one instrument plugin followed by zero or more effects, or, for audio material, just effects.

Each track legend has two rows of controls.

Row 1 -- clipboard icon, graph icon, gain slider, M, S:

Control Behaviour
Clipboard icon Opens the clip menu.
Graph icon Shows or hides the track graph editor.
Gain slider Track volume. Hovering shows the value in dB and as a linear factor; at the bottom of its travel it reads Mute.
M Mute. Turns red while the track is muted.
S Solo. Turns amber while soloed. Ctrl/Cmd-click to add a track to the current solo set instead of replacing it.

Row 2 -- snowflake icon, the plugin button, ⋮:

Control Behaviour
Snowflake icon Track freezing. Off by default; clicking renders the track and freezes it. While rendering the icon becomes a spinner and clicking cancels; a queued freeze shows amber and a completed one blue. If a freeze fails, the tooltip carries the error and clicking turns the policy off.
Plugin button Shows the name of the track's first plugin and opens the plugin menu. When the track is empty it reads Add Plugin and opens the Plugin Selector directly.
⋮ More track actions.

More track actions

The ⋮ menu holds the two actions that are destructive or easy to hit by accident: Bypass Track Processing (which stops the track's plugins from processing while leaving them loaded) and Delete Track.

Most of these controls are disabled while a track is busy -- for example while a freeze render is running.

Clips

A track can hold both audio and MIDI 2.0 clips at the same time. On playback both are fed into the track's graph, sliced per sample block. The usual reason to mix them is automation: an audio clip carrying the material, plus a MIDI 2.0 clip carrying Assignable Controllers that drive the effect plugins.

The clip menu

The track clip menu

The clipboard icon in the track legend opens the clip menu, which applies to the track as a whole:

The master track offers the same menu minus the audio-clip and Clear All entries.

Selecting and editing clips

The clip context menu

Drag across the lanes in either timeline view -- from empty space or from a clip -- to select the clips the rectangle crosses. A drag that starts on empty space and crosses no clips is a range instead, and offers Add New MIDI Clip and Add Empty Audio Clip sized to the dragged span on release; in the beats view the range snaps to the nearest quarter-note beat. Alt-drag always takes the range reading and leaves the selection alone. Shift-click or Shift-drag adds to the selection; Ctrl-click (Cmd-click on macOS) toggles a clip. Click an unselected clip to select it alone. Click empty space, or press Escape while hovering the timeline, to clear selection. The track's Clips and More menus include Select All Clips.

Clips move and resize through the grips at their two ends, never by dragging the clip itself. The upper half of a grip resizes that end; the lower half moves the whole clip. A grip sits just outside its clip, or just inside it where the clip meets a neighbour or the start of the timeline. Resizing the start keeps the content where it is on the timeline: shortening it hides the beginning, and lengthening it brings that back. A MIDI clip can be lengthened past the start of its content, down to the start of the timeline, and the content shifts along so the new space can hold notes; an audio clip stops at the start of its file. While you drag, an outline shows where the clip will go, and every edge follows the snap.

Right-click or double-click a clip to open its context menu; on Android and iOS, press and hold it too. Opening the menu on a selected clip keeps the other clips selected, so the commands below that act on the selection act on all of it. Press and hold is how touch devices reach these menus: hold for half a second without moving, and the press opens the menu instead of selecting. The desktop has no press-and-hold menu, since a held press is how a drag starts there:

Right-clicking, double-clicking, or pressing and holding empty space also offers selection and clipboard commands. Paste from a track header's Clips or More menu uses the playhead position. The internal clip clipboard is cleared when the project is cleared.

Clip editors

The piano roll

The piano roll editor

The piano roll edits the notes of a MIDI 2.0 clip. Its toolbar carries H Zoom in pixels per second, V Zoom as the height of one semitone row, and a Snap division. Snap defaults to 1/16, with Free, 1/8, 1/16, 1/24, 1/32, 1/48, and 1/64 available. The header also reports the clip length, the note count, and how many clip-level events it holds. Snap labels denote musical note durations relative to a whole note; for example, 1/16 is a sixteenth-note grid.

Drag across empty grid space to select notes. Shift-click or Shift-drag adds notes; Ctrl-click (Cmd-click on macOS) toggles a note. Clicking an unselected note selects it alone. Click empty space or press Escape over the grid to clear selection. Selection highlights use the note rectangles, and selected notes remain selected when an edit changes their event order. Reloading changed clip content, including undo/redo, clears note selection; refreshing unchanged content preserves it.

Right-click a note or empty grid space (long-press on Android and iOS) for Cut, Copy, Paste here, Delete, and Select All Notes. Opening a menu on a selected note preserves the selection. The clipboard belongs to that open clip: it does not transfer notes between clips, and closing the piano-roll window discards it. Paste preserves pitches, durations, relative timing, MIDI group/channel, velocity, release velocity, note attributes, and attached per-note automation. It starts at the clicked time, snapped to the grid, and selects the pasted notes. Clip-level controllers are not included in a note copy. Each cut, paste, or group deletion is one undo step.

While the pointer is over the note grid, Ctrl/Cmd+A selects all notes, Ctrl/Cmd+C/X copies/cuts, Ctrl/Cmd+V pastes at the pointer's snapped time, and Delete/Backspace deletes selected notes. Double-click still creates a note in empty space or requests deletion of the clicked note. Dragging a selected note moves all selected notes in time and pitch, preserving their spacing, durations, and pitch intervals. Attached per-note automation follows each note. The clicked note anchors grid snapping; the whole group stops at time zero or MIDI pitch limits. Release commits one undo step and keeps the moved notes selected; Escape cancels the drag. Edges also move the group when multiple notes are selected. Group resizing and property editing are not included: the property popup and lower panel edit the primary note. Single-note edge dragging still resizes that note.

Selecting a note fills the lower pane with that note's per-note events, where you can insert an event before the selected one, edit its type and value, or delete it. With no note selected the pane lists the clip-level automation events instead.

The step sequencer

The step sequencer

Open Step Sequencer edits a MIDI clip as a grid of steps: one row per note, one button per step. The toolbar sets the Note set (GM Drums or All Notes), the pattern Steps (1-128), its loop Repetitions (1-64), the step Division (1/1 to 1/32), and the Default Velocity and Default Gate given to newly activated steps. The header reports the pattern length and the expanded length in ticks.

Clicking a step toggles it. An active step opens an inline editor for its velocity and a MIDI 2.0 note attribute type and value; double-click a slider to type a value. Edits apply to the clip immediately, and Reload re-reads the clip. The Velocity / automation pane below the grid shows the velocity of each active note as a bar.

The step sequencer records its pattern in the clip as Flex Data metadata. Opening a clip that was not made by the step sequencer first asks for confirmation, since editing it may discard notes or other data the step grid cannot represent; opening alone changes nothing.

The MIDI event list

The MIDI event list editor

The dump list is the raw view of the same clip: one row per UMP, with its tick position, its absolute time, its delta from the previous event, and its message bytes. The example above shows MIDI 2.0 note-ons and note-offs (40 90 3C 00 60 00 00 00 is a note-on for note 60).

Edits here are staged, not applied immediately -- change what you need, then Apply Changes, or Discard Changes to reload the clip as it stands. The ⋮ button on each row inserts an event before it or deletes it.

Audio events

For audio clips, Edit Audio Events opens an editor for the clip's markers and warps. Markers name a position in the clip; warps map a position in the clip to a position on the timeline. Both are edited as lists, with Add Marker / Add Warp, and applied with Apply.

Plugins

Finding and loading plugins

The Plugin Selector

The Plugins button opens the Plugin Selector. UAPMD always performs a fast scan at startup, which discovers plugins without instantiating them -- this covers CLAP, LV2, AUv2, AUv3, and those VST3 bundles that ship a moduleinfo.json.

Everything else needs a real scan, which is what Scan Plugins does. Two checkboxes control it: Force Rescan discards the cached results, and Remote scanner process runs the scan in a separate process on desktop, so that a plugin which crashes on load cannot take the app down with it. Timeout (s) bounds how long a single bundle may take.

Bundles that failed are collected under Blocked bundles, which expands to list them and offers Clear blocklist, Show scan report, Copy as Markdown, and a table preview.

Filtering the plugin list

Search: filters the table, which sorts by format, name, vendor, or ID. Select a row and press Instantiate Plugin.

Destination below the button says where the plugin will go. It reads New Track (new UMP device) by default; opening the selector from a track's Add Plugin entry instead targets that track, and from the master track's entry it targets the master track. When a new track is created you can give its virtual UMP device a name and pick the MIDI API to expose it on.

JSFX effects

Where the build includes JSFX support, REAPER JSFX effects appear in the plugin list as the JSFX format, and open their own graphics in a JSFX editor panel. System -> JSFX Settings manages where they come from:

JSFX Settings

Every change rescans, and the window reports how many JSFX effects are available.

The plugin menu on a track

The track plugin menu

The plugin button in a track legend lists every plugin instance on that track, each with:

Add Plugin at the bottom opens the Plugin Selector targeting this track, appending to the chain.

Instance details

The plugin instance details window

The details window is a playground for one plugin instance:

The plugin GUI

A plugin's own GUI

Plugin editors open as dedicated native windows, sized to whatever the plugin asks for and resized along with it when the plugin requests a new size.

The track graph editor

The track graph editor

The graph icon in a track legend opens that track's audio graph. Nodes are the graph input, the built-in track volume node, each plugin instance, and the graph output; edges are audio and event connections. Ports are listed per node, so a plugin's channel layout is visible directly.

A track starts as a simple chain, and editing the connections turns it into a general DAG. Revert to Simple Graph puts it back to a plain chain. A minimap in the corner helps when the graph outgrows the window.

Virtual MIDI devices

The Virtual MIDI Devices window

Virtual MIDI Devices in the System menu opens a flat list of every plugin instance in the project, grouped by track, showing the format and the virtual UMP device each is exposed as. Disable unregisters its virtual MIDI device and Show opens its details window.

Create virtual MIDI 2.0 devices automatically is off by default. Turn it on to create devices for subsequently instantiated plugins, including plugins loaded from projects. Changing the checkbox leaves existing devices unchanged; use each row's Enable or Disable button to control them manually. Enable All and Disable All apply to all current instances without changing the automatic creation setting. Enable All uses the names entered in the device list. Default device names include a track suffix, such as sforzando [VST3] T1; master-track devices use Master. Custom device names are kept as entered.

Disabling the Virtual MIDI Devices addin unregisters its devices and removes the command. Re-enabling the addin creates devices for existing instances only when automatic creation is on.

Note that this window lists plugin instances, not tracks -- one track with two plugins appears as two rows.

The mixer monitor

The Mixer Monitor window

The Mixer Monitor reports latency compensation. The header shows the audible and render positions and the current playback phase; below it, Playback Compensation and Input Monitoring select the compensation strategy, and the table breaks down each track's reported latency, render lead, holdback, tail, and routing.

Projects and rendering

A project saves the tracks, their audio and MIDI 2.0 clips, and the plugin graphs with their state. Save Project and Load Project live in the Project menu, along with New Project, which resets to the launch state after prompting about unsaved changes.

Rendering to a file

The Render To File window

Render To File renders the timeline to a WAV file using offline processing -- faster than real time, and independent of the audio device.

A progress bar sits above Start Render, which becomes a stop button while a render runs.

Settings

The Settings window

System -> Device Settings opens audio and MIDI configuration:

Changing the audio device restarts the engine, which reactivates every loaded plugin.

On desktop, two more controls govern parallel processing:

Addins

The Addin Manager

Several features are addins rather than built-in code, and the Addin Manager lists them all with their package ID, the extension point they implement, their state, and the library they come from. The checkbox in the first column enables or disables each one.

Addins ship built-in (the piano roll, the MIDI event list, ARA support, the Demucs and BS-Roformer stem separators, Basic Pitch), or come from a shared library placed in one of the directories named at the top of the window.

ARA support covers ARA-capable plugins on desktop, and AAP plugins that advertise the ARA extension on Android.

Disabling an addin removes what it contributes -- turn off both stem separators, for example, and Import Split Audio Tracks disappears from the Project menu.

MML import (Augene2)

Where the build includes Augene2, System -> Augene2 Integration compiles MML (Music Macro Language) sources into clips of the current project.

Augene2 Integration Import MMLs... adds compiled inputs and Import included MML... adds files they include; Resource folder optionally names where to resolve their resources. Each source is either linked to an external file or kept as a bundled copy in the project, with Relink... and Remove. Compile regenerates the clips; on failure the previous clips are kept and the diagnostics are listed. Track mapping shows which track each MML track went to. Automatic synchronization is not available yet, so press Compile after editing linked files.

Automating the app

Everything the UI does is also reachable programmatically, which is how UAPMD is meant to be driven for anything repetitive.

The script editor

The Script Editor

System -> Scripting opens a JavaScript editor with Run and Load, plus Preset with the bundled Demo, PluginState, and TestDAG scripts. The demo script documents the API:

Object Covers
uapmd.catalog.* Plugin discovery and management
uapmd.scanTool.* Plugin scanning and caching
uapmd.instancing.* Plugin instance creation
uapmd.instance(id) A plugin instance -- getParameters, setParameterValue, showUI
uapmd.sequencer.* Audio engine, MIDI, and transport

There is also an object-oriented wrapper (PluginScanTool, sequencer) imported from remidy-bridge; both styles work.

MCP

MCP Settings

System -> MCP Settings exposes the app as an MCP server, so an agent can inspect and edit the project.

Press Connect to start and Disconnect to stop; the status line above the button reports what it is doing. Launching with --mcp-server [port] starts server mode without visiting this window.

The tool surface covers tracks (list_tracks, create_track, add_plugin_to_track), clips (list_clips, add_midi_clip, create_empty_midi_clip, add_ump_event, remove_ump_event), transport (play, stop, jump, set_tempo), the graph (connect_track_graph, ensure_dag_track_graph, revert_track_graph_to_simple), history (undo, redo, begin_compound, end_compound), projects (save_project, load_project), presets, freezing, latency compensation state, and run_script for the JavaScript API above.

On the Web build MCP is always active as a JavaScript export instead, called through Module.ccall('uapmd_mcp_call', ...), with Module.ccall('uapmd_eval', ...) for scripts.