INVISIBLE ARTFORMS

MIDI MetaSound automation

Automating instruments and effects in the Curve Editor

A MIDI track's MetaSound Automation lane animates the inputs of the MetaSound the track plays: a filter sweep, an effect's mix, a GLTCH pattern change, a bypass switch. You edit the curves in Sequencer and in Unreal's own Curve Editor. The lane plays in the editor, in PIE and in packaged games.

Use it

#
  1. In Sequencer, right-click a MIDI track and open Add MetaSound Automation.
  2. Open the submenu of the device you want to automate, such as GLTCH1 (GLTCH), Wave (Afterglow) or Delay1 (Stereo Delay), and choose a parameter, such as Mix or Cutoff. Hover over an entry to see its range and the value it rests at, for example Wave > Cutoff: 30 to 18000 Hz; rests at 1200.
  3. Expand the track's MetaSound Automation row. The channels are grouped by device and named after the parameter. Select a channel and edit its keys in Sequencer or in the Curve Editor.

A new channel starts with one key at the playhead, set to the value the parameter rests at: the device's current value, a macro's default (GLTCH Mix 1, Pattern -1), or the MetaSound's default for Other inputs. Choosing a parameter that is already automated (it shows a check mark) keeps its keys and only refreshes its name, range and units. To delete a channel with its keys, use Remove MetaSound Automation on the same track menu, which lists the channels as Group > Label (GLTCH1 > Mix). Adding and removing are one undo step each. The menu is disabled for read-only sequences, and a track whose sound has no inputs shows No inputs available.

The lane spans the whole sequence and plays through rests. You can trim or mute it with the normal Sequencer section controls. Scrubbing updates the parameters without triggering MIDI notes.

What the menu lists

#

The submenus follow what the track plays:

  • A printed TheRaK chain (a track made by Print): one submenu per device of the chain in chain order, the instrument first and then its effects. Each submenu is named after the device's automation group and type: Wave (Afterglow), DrumKing (DrumKing), Thumpr (Thumpr FM Drum), a user instrument's name, and for effects their number, Delay1 (Stereo Delay), GLTCH1 (GLTCH), Chorus1 (your device's name), and SQLCH (SQLCH) for an SQLCH chain's sound (see SQLCH sound settings). STPR-1 has nothing to automate. A parameter is listed only when the chain's generated MetaSound really has that input; SQLCH's sound settings are the one exception, because they reach the SQLCH sequencer directly.
  • A classic rack track: Wave (Afterglow) and Rack_Delay (Stereo Delay).
  • Any other MIDI track (the shared playback graph): Wave (Afterglow) for the track's route (2_Wave_Cutoff on route 2), and Thumpr (Thumpr FM Drum) when the track plays a Thumpr kit (2_Thumpr_Master on route 2), with the kit's ranges and values.
  • Other inputs: every other float input the menu offered before this change, sent exactly as written with no range. The rules have not changed: a rack track lists its own source's inputs by name, and every other track lists its route's inputs of the shared graph. The mixer's chain inputs, interface members and note inputs are hidden.

The parameters come from the device's own description. That description gives the label, the units, the range and the value the parameter rests at:

DeviceParameters
Afterglowevery sound parameter the preset sends, such as Cutoff (Hz), Resonance, the envelopes, the modulation amounts, Master, and Enabled (on/off)
Stereo DelayTime (s, 0.001 to 2), Feedback (0 to 0.9), Mix (0 to 1), Enabled (on/off)
DrumKingVolume (dB, -60 to 6), Tune (st, -12 to 12), Enabled (on/off)
GLTCHMix (0 to 1), Pattern (whole numbers -1 to 11; -1 plays the device's own pattern), Repeat (on/off), Bypass (on/off)
Thumprthe kit's controls, such as Master, Drive, Delay, and Enabled (on/off)
SQLCHCutoff (Hz, 30 to 16000), Resonance (0 to 1), Env mod (octaves, 0 to 6), Decay (s, 0.03 to 2), Accent (0 to 1)
User devicesevery parameter the definition marks as automatable (Float, Int or Bool; triggers are never listed), with the definition's range and units, plus Bypass (on/off) for a user effect

A parameter rests at the value the device has now: on a printed track, the value its copy of the device had when it was printed. Adding Wave > Cutoff to a pad whose filter sits at 1200 Hz keys 1200, never the class default.

Whole numbers and switches

#

Most channels are ordinary float curves. Two kinds of channel play in steps instead:

  • Int channels hold whole numbers and never interpolate. They are used for GLTCH Pattern, the discrete Afterglow parameters (Filter mode, Mode, the LFO shapes, the modulation slots' sources and destinations, and Voices) and a user device's Int parameters. The tooltip ends with (Int).
  • Bool channels are switches, such as GLTCH Bypass and Repeat, every Enabled, and a user effect's Bypass. The tooltip ends with (Bool).

A channel sends its value in the type the MetaSound input expects. GLTCH's Pattern input is a float in the graph, so pattern 3 arrives as 3.0 and never as 2.7. Int values round half away from zero, and a Bool curve is on above 0.5.

Ranges and clamping

#

A device-aware channel keeps the parameter's range from when you added it, so it plays the same in PIE and in packaged games, where no editor metadata exists. Every value it sends is clamped into that range: a Feedback key drawn at 1.2 plays 0.9. The keys themselves keep what you drew. Channels under Other inputs have no range and are sent exactly as written, as before this change. If a device's range changes later, choose the entry again to refresh the channel.

Manual lane and STPR-1 phrase lanes

#

Every channel you add goes into the track's manual lane, which covers the whole sequence and is never touched by STPR-1. When Print Phrase writes a ControlParameter, it creates a separate phrase lane that ends where the phrase ends, and Update Phrase replaces that lane.

Before this change the menu could put your curve into the phrase lane, and Update Phrase then deleted it. It now always uses the manual lane. Curves that were already added to a phrase lane are rescued: Update Phrase moves every channel except the phrase's own control into the manual lane, with its keys, in the same undo step. If the manual lane already has a channel with that name, the manual lane's channel is kept and the log names the one that was dropped. After the move, a rescued curve applies to the whole track rather than only to the phrase.

A phrase refuses to print its control onto a parameter that the manual lane already automates, for example Wave_Cutoff on the same chain, and gives the usual overlap message.

The lane owns its parameter while playing

#

While the sequence plays, an automated parameter follows its curve, whatever else writes to it:

  • Only changed values are sent. A value is sent again when the chain rebuilds (adding an effect, powering a chain), when the track's device pushes its own settings (a preset or bypass change on the printed copy), and after MIDI-learn writes to the same input, so the curve's value is always the last one applied.
  • When playback stops (the Sequencer's Stop, the end of the sequence, or the clock actor's stop), and when you remove a channel, the parameter goes back to the device's own value and keeps it (the Sequencer's own update at the stop position sends no lane values): for example the delay's Feedback returns to the value on the card, GLTCH Pattern returns to -1 (the device's own pattern), and Bypass returns to the card's power state.
  • Scrubbing a stopped sequence sends the values under the playhead without taking ownership, exactly as before, so a preset edit made while stopped is not overridden.
  • Pausing the Sequencer is not a stop: the parameters keep the lane's values at the paused position, and the lane owns them again as soon as playback resumes.

The same rules apply to printed TheRaK chains, classic rack tracks and shared-graph tracks, in the editor (the Sequencer), in PIE and in packaged games (the DAWntless sequence clock actor).

An active lane that automates an input, with any kind of channel, takes precedence over a note-level curve of the same name. Note-level curves still work for other inputs.

SQLCH sound settings

#

An SQLCH chain's sound is not made of MetaSound inputs: the SQLCH sequencer inside the chain plays it. Its five main knobs can still be automated, from the SQLCH (SQLCH) submenu of the printed track:

ChannelKnobRange
SQLCH_CutoffCutoff30 to 16000 Hz
SQLCH_ResonanceResonance0 to 1
SQLCH_EnvModEnv mod (the panel's Env octaves)0 to 6 octaves
SQLCH_DecayDecay0.03 to 2 s
SQLCH_AccentAccent0 to 1
  • While the sequence plays, each changed value replaces that knob in the sound the chain's SQLCH sequencer plays, once per frame, without restarting the pattern. The SQLCH device, its sound and the rack are never changed, and nothing is added to the undo history.
  • The lane owns these knobs like any other parameter: editing the printed copy's sound while playing keeps the lane's value for the automated knob, and stopping the sequence or removing the channel gives the knob back to the device's own sound.
  • The Curve Editor shows the cutoff in Hz on a linear scale. For a sweep that sounds even, key it in octaves (equal ratios between keys, such as 250, 500, 1000 and 2000 Hz). The Techno_Rulez demo's SQLCH > Cutoff on the Acid is a curve edited by hand in the Curve Editor.
  • The SQLCH panel's knobs have no Automate in Sequencer menu; use the track's Add MetaSound Automation menu.

Automate a TheRaK knob

#

Knobs do not record. Instead, right-click a parameter in a TheRaK device card to choose one of the following:

  • Automate in Sequencer: adds the parameter's channel to the chain's printed track in the open Level Sequence and keys the control's current value at the playhead. It then selects the channel and opens the Curve Editor. This is one undo step.
  • Key current value: keys the control's current value at the playhead. It adds the channel first if it is missing. A second key at the same playhead replaces the first one. The selection does not change. This is one undo step.

The value is the one the card shows now (what the jam plays), clamped into the parameter's range. It may differ from the printed copy of the device. If the chain was printed more than once, the first printed track in the sequence is used; the other tracks can be automated from their own Add MetaSound Automation menu.

The menu is offered on the Afterglow body's knobs and parameter boxes, the Stereo Delay's Time, Feedback and Mix boxes, and a user device's Float and Int knobs whose parameter is ticked Automatable in the device's definition. Everywhere else, including the standalone Afterglow window, classic racks' rows and a user knob that is not Automatable, right-click behaves as before: on a TheRaK card it opens the card's menu. Thumpr's kit boxes and the DrumKing and GLTCH macros have no knob menu; automate them from the track's Add MetaSound Automation menu.

Both entries are disabled, with the reason as their tooltip, when:

ReasonWhat to do
Open a Level Sequence to automate it.Open the sequence in Sequencer.
The open Level Sequence is read-only.Unlock the sequence.
Classic racks and legacy-engine chains print without a chain id: upgrade the chain to automate it here.Upgrade the chain, print it, or use the track's Add MetaSound Automation menu.
This device is not part of a chain: automation targets a chain's printed track.Put the device in a chain.
Print this chain into the open sequence first.Print the chain.
This device was added after the chain was printed: print the chain again.Print the chain again.
<parameter> is not a MetaSound input of this chain.The printed graph has no such input. Print the chain again after changing the device.

Filter sweep example

#

Open /DAWntless/Demos/LS_MidiFilterSweep (DAWntless Content > Demos).

It contains eight MIDI notes on route 1 and three automation channels:

  • Cutoff Min and Cutoff Max: matching 300 → 1,200 → 6,000 → 1,200 → 300 Hz curves.
  • Resonance: 0.2.

Both MSS_MIDISequencerPlayback_SimpleSynth and the project's configured MSS_MIDISequencerPlayback_DAWntless already expose these controls. Matching Min/Max makes the existing LFO-controlled filter follow a direct cutoff sweep. Animate only Max if you want to retain the LFO's movement between Min and Max. No additional filter was needed. These channels are listed under Other inputs and are sent as written.

These unprefixed filter inputs control the shared synth graph. A per-instrument filter needs a distinct exposed input in the MetaSound, such as 2_FilterCutoff. The number is the MIDI route, and a track's route is its position among the sequence's MIDI tracks; it is not stored (see Routes). An unprefixed name is sent exactly as written. A lane whose name starts with a route number is sent under the track's current route: if deleting an earlier MIDI track moves this track from route 2 to route 1, a 2_FilterCutoff lane is sent as 1_FilterCutoff. The lane keeps its keys and its displayed name, and nothing needs re-saving; the playback MetaSound must expose the input on the new route for the curve to be heard. Internal graph variables and constructor-only inputs cannot be animated through this menu. Epic's MetaSounds reference describes exposed graph inputs.

The Techno_Rulez demo (/DAWntless/Demos/Techno_Rulez) uses device-aware lanes throughout: an Afterglow filter sweep, GLTCH mix and pattern fills, delay throws, a Thumpr master dip, a GLTCH bypass switch and a hand-edited curve on the Acid's SQLCH cutoff (see RackGuide.md).