Turn your own MetaSound into an instrument or effect that TheRaK offers in + Add Device, next to Afterglow and the Stereo Delay. You build the sound in the MetaSound editor; DAWntless checks it, keeps its knob layout, and wires it into rack chains for you. No C++ is needed.
What a device is
#A DAWntless device is two assets:
- The graph: a MetaSound Patch, or a MetaSound Source for an instrument, that declares a DAWntless interface. The interface gives the graph its rack connections: MIDI in for an instrument, a bypass flag for an effect, and the tempo for anything that wants it. Audio goes in and out through Unreal's standard audio format interfaces.
- The definition,
DA_, saved next to the graph. It holds what a MetaSound cannot keep in a packaged game: the name and category shown in Add Device, the colour, the knob ranges and units, and the validation stamp.Device_<GraphName>
The Device Validator checks a graph against the rules on this page, renders it offline, and registers it, which stamps and saves the definition. Only registered devices whose stamp is still current appear in + Add Device, under INSTRUMENTS > User > <Category> or EFFECTS > User > <Category>, with a USER tag.
In a rack, TheRaK embeds your graph in the chain's own MetaSound, wires MIDI, audio and tempo to it, and turns its inputs into knobs on the device card. Every device in every rack keeps its own knob values; the definition is shared by all of them. In a game, a Blueprint can set your device's Float knobs through the TheRaK Performer's Set Parameter with their chain names (see Parameters and names).
Three example devices, built from stock MetaSound and Harmonix nodes, are in DAWntless Content > Examples > UserDevices (enable Show Plugin Content): Chorus (effect), Pluck (instrument) and Source Lead (a Source instrument). See Example devices.
Formats: Patch or Source
#| Role | MetaSound Patch (recommended) | MetaSound Source |
|---|---|---|
| Instrument | Declares DAWntless. and UE. (or .Mono) | Allowed. A Stereo or Mono Source already has its output format: add DAWntless. and make it Referenceable |
| Effect | Declares DAWntless.Effect, UE. (or .Mono) and UE. (or .Mono) | Not possible (error E6): use Duplicate as Patch... |
Use a Patch unless you already have a Source instrument you want to reuse:
- A Patch is Referenceable by default, so a chain can embed it at once. A Source starts without that access flag; the validator's Make Referenceable fix sets it (E7).
- A Source's own settings (attenuation, sends, source effects, concurrency, rate overrides) do nothing inside a chain, because the chain is the sound that plays (warning W1). One Shot is ignored too: the chain keeps playing and never reads On Finished (W2).
- The rack starts an embedded Source for you: it connects the chain's On Play to your Source's On Play, so a graph that waits for On Play works unchanged.
- Sources are instruments only. In Unreal Engine 5.8 a Source cannot declare
UE.InputFormat.*, so it has no audio input and cannot process a chain's sound. A Source that declaresDAWntless.Effectgets error E6 and the Duplicate as Patch... button. It creates a new Patch next to the Source, with the effect and format interfaces declared, opens it, and lists what to connect. The Source itself is never changed.
The DAWntless interfaces
#Add interfaces in the MetaSound editor, in the MetaSound's Interfaces list, or let the Device Validator's Fix buttons add them. Members are never renamed; new members arrive only in new interface versions, and old versions keep working.
| Interface | Members (inputs) | Use |
|---|---|---|
DAWntless. | DAWntless. (MIDI, MIDI Stream) | The chain's notes: the STPR-1 pattern, your keyboard when the instrument has MIDI focus, and printed clips. Patch or Source. |
DAWntless.Effect | DAWntless. (Bypass, Bool, default false) | True while the rack bypasses the effect. Patch only. |
DAWntless. | DAWntless. (Float, 120), .Beat (Float), .Playing (Bool), .BeatsPerBar (Float, 4) | The rack clock, for tempo-synced LFOs and delays, and for self-sequenced instruments. Patch or Source, either role. |
Audio uses Unreal's format interfaces: the inputs In Left and In Right of UE. (members UE. and .Audio:1) and the outputs Out Left and Out Right of UE.. Mono works too: a mono output is copied to both channels (W8), and a mono effect input receives the average of left and right.
- MIDI. Notes arrive on track 1, channel 1. The Harmonix MIDI Note Trigger reads every track and channel, so it works as it is. A Fusion Sampler needs its Track Number at 1 or 0. When a rack stops, the instrument receives all-notes-off; MIDI Note Trigger ends its note on it.
- Bypass. The rack wraps every effect in a crossfade, and while the effect is bypassed the chain hears the effect's input exactly, so a rack never needs more. The Bypass member is true at the same time: while it is true, pass your input through unchanged. The validator checks that (R8, a warning) by rendering your effect without the rack's crossfade. The Chorus example does it by setting its delays' wet level to 0 and dry level to 1 while Bypass is true.
- Transport. BPM is the quarter-note tempo, Beat the position in quarter notes at the start of each audio block, and Beats Per Bar the bar length in quarter notes (4 in 4/4, 3 in 3/4 and in 6/8), so the bar phase is Beat modulo Beats Per Bar. Playing is true while the rack transport runs.
Parameters and names
#Every input of your graph besides the interface members, of type Float, Int32, Bool or Trigger, becomes a device parameter: a knob, a switch or a button on the card, and a name you can automate. Inputs of other types (arrays, audio, objects) stay internal (W3). Constructor inputs cannot change while the sound plays: changing one rebuilds the chain (W4), and they cannot be listed in the definition.
Inside a chain each parameter gets a unique name:
| Device | Chain input | Example |
|---|---|---|
| Instrument | Inst_<Pin> | Inst_Cutoff |
| Effect | <ShortTag><n>_<Pin>, bypass <ShortTag><n>_ | Chorus1_Rate, Chorus1_Bypass |
n is the lowest number the tag does not use yet in the rack when you add the effect. It stays when you move the effect; a copy gets a new one. Characters other than letters, digits and _ become _ (Filter Cutoff becomes Inst_), and two pins that end up with the same name are an error (E11). These are the names Add MetaSound Automation lists for a printed chain.
Reserved names. Case does not matter. A pin, or an effect's short tag, must not produce:
- a name starting with
Rack_,Chain_,Wave_,Thumpr_,SQLCH_,Inst_,DrumKingorGLTCH; KeyorDelayfollowed by a digit (Key3_OnNote,Delay2Time);- a name containing a
.(theUE.andDAWntless.interface names); - exactly
Session.
A short tag has 1 to 10 letters and digits and ends in a letter, because the device number follows it: Chorus gives Chorus1, Chorus2, while Chorus2 would give Chorus21. Key, Delay, and tags starting with GLTCH or DrumKing are refused, because <Tag>1_ would be reserved. Instruments do not use the short tag: their parameters are always Inst_<Pin>.
The definition asset
#The Device Validator creates DA_ next to the graph, with Create definition or on Register, and fills it from the graph: the display name, a suggested short tag, no category (the device is listed directly under User), and one parameter per pin with a guessed range. The range always includes the pin's graph default, so a new definition never changes the sound. Edit it in the validator's parameter table or in the asset's details panel.
| Field | Meaning |
|---|---|
| Graph | Your MetaSound Patch or Source |
| Display Name, Description | The Add Device entry and its tooltip. Empty uses the graph's name |
| Category | The submenu under User. Empty lists the device directly under User |
| Short Tag | Effects: the stem of the chain names (Chorus gives Chorus1_Rate). Required for effects. The suggested tag is built from the graph name: MSP_/MSS_ dropped, letters and digits only, at most 10 characters, trailing digits removed |
| Color | The colour of a new instrument's chain |
| Has Built In Sequencer | A self-sequenced instrument (see below) |
| Sequencer Mode | The mode of an STPR-1 attached to the instrument. Keep Melodic for pitched instruments. Drum makes the render test play the pads instead of MIDI 60 (see Render checks) |
| Drum Root Note, Drum Pad Count, Pad Names | For drum instruments: the note of the first pad and the number of pads, which the render test plays in Drum mode. In TheRaK, an STPR-1 attached to the instrument runs in Drum Mode with one lane per pad (see Drum Mode in TheRaK) |
| Params | The knobs, in card order (below) |
| Stamp | Written only by Register (see Registration and stamps) |
Each entry of Params:
| Field | Meaning |
|---|---|
| Pin | The graph input it controls |
| Display Name | The knob label. Empty uses the pin name |
| Group | A titled row of knobs on the card. Entries without a group go in the first, untitled row |
| Kind | Float, Int, Bool or Trigger; it must match the pin's type |
| Min, Max, Default | The range, and the value a new device starts with. Default wins over the graph's own default |
| Curve | Linear; Log for frequencies and times (Min must be above 0); Stepped for whole values |
| Units | Shown after the value: Hz, ms, s, dB, st, or %, which shows a 0–1 range as 0–100 % |
| Enum Labels | Int only: one label for each value from Min to Max. The card shows a selector instead of a knob |
| Hidden | Not shown on the card; its value is still applied |
| Automatable | Offered in Add MetaSound Automation and in the knob's right-click menu (see Automating your parameters) |
A pin you leave out of Params plays at its graph default and has no knob. [...] > Reset on the card returns every knob to its default.
Automating your parameters
#Once a chain is printed into a Level Sequence, its MIDI track can automate your device from the track's MetaSound Automation lane, which you edit in Unreal's Curve Editor. The track's Add MetaSound Automation menu has one submenu per device of the chain, in chain order, and your device is one of them:
| Instrument | Effect | |
|---|---|---|
| Submenu and Sequencer group | The device's name on the card (Inst without one) | Its parameter tag, Chorus1 |
| Entries | Every Params entry with Automatable ticked, labelled with its Display Name | The same, plus Bypass |
| Chain input | Inst_<Pin> | Chorus1_<Pin>; Bypass is Chorus1_Bypass, the rack's crossfade |
Tooltips read Chorus1 > Rate: 0.. Triggers are never listed, and two entries with the same label are told apart by their group or pin.
- Kinds. A Float parameter gets a curve, an Int parameter a stepped channel that never interpolates, a Bool parameter an on/off channel. Each value reaches your graph in the pin's own type.
- Range. The channel keeps a copy of the entry's Min, Max and Units from the moment you add it, so a packaged game needs no definition to play it. Every value the lane sends is clamped into that range; keys keep what you typed. After you change the range in the definition, choose the checked entry again: it refreshes the copy and keeps the keys.
- Starting value. A new channel starts at the device's current value (the knob as it was printed, or the bypass state), and the menu keys that value at the playhead, so adding a channel changes nothing you hear.
- While playing, the lane wins. From Play to Stop (the Sequencer in the editor, the clock actor in PIE and packaged games) the automated value is the last value written to the input, even when the card or a preset re-applies the device's parameters. Values are sent at frame rate, not sample-accurately. When playback stops, or when you remove the channel (Remove MetaSound Automation), the input returns to the device's own value, the knob's.
- From the knob. Right-click a Float or Int knob of your device in TheRaK (only a parameter ticked Automatable: the others keep the card's menu): Automate in Sequencer adds the channel to the first printed track of the chain in the open Level Sequence, keys the knob's value at the playhead and opens the Curve Editor; Key current value only adds the key. Turning a knob never records.
- Scripts.
unreal.DAWntlessDeviceLibrary list_,automation_ targets add_andautomation_ channel add_use the same targets.automation_ keys
Self-sequenced instruments
#An instrument can play its own patterns instead of taking notes from STPR-1, as Thumpr and SQLCH do. Make it self-sequenced in one of two ways:
- declare
DAWntless.withoutTransport DAWntless.; orInstrument - tick Has Built In Sequencer in the definition. The graph then needs
DAWntless.(E10).Transport
TheRaK wires the rack transport to it. STPR-1 cannot attach to it, and the menu and the drag preview say so. Step your pattern from Beat and Playing: the instrument then follows the jam's tempo and launch point. Print skips it with "not printed: self-sequenced device", because it has no notes to write.
An instrument that declares both DAWntless. and DAWntless. is an ordinary instrument that also knows the tempo.
Make your first instrument
#- In the Content Browser, create a MetaSound Patch, for example
MSP_MySynth. - Open it and add the interfaces DAWntless.Instrument and UE.OutputFormat.Stereo. You can also skip this step and use the validator's Fix buttons in step 5.
- Build the voice. A minimal one: connect MIDI (
DAWntless.) to a Harmonix MIDI Note Trigger. Connect its MIDI Note # to MIDI To Frequency and on to a Saw's Frequency, and its Note On to the Trigger of an AD Envelope (Audio). Multiply the saw by the envelope with Multiply (Audio).Instrument. MIDI - Add a knob: create a Float input
Cutoffwith the default 2000, put a Ladder Filter after the multiply, connectCutoffto its Cutoff Frequency, and connect the filter to Out Left and Out Right. Save. - Open Tools > DAWntless > Device Validator, or right-click the asset and choose Validate as DAWntless Device.... Select
MSP_MySynth. The report lists every problem with its code; press Fix where one is offered, then save the graph. - Press Create definition. In the parameter table, give
Cutoffthe range 100 to 10000, the unitHzand the curve Log. Set a display name and a category. - Press Audition and play the on-screen keyboard. Then press Run render test and read the results under the report.
- Press Register and confirm the list of what is written. The definition is stamped and saved.
- In TheRaK, choose + Add Device > INSTRUMENTS > User > <your category> > MySynth. Attach an STPR-1 from SEQUENCERS, press Play jam, and turn Cutoff on the card.
The stock MIDI Note Trigger is monophonic: it plays one note at a time, so a chord plays only its last note. For chords, build around a polyphonic node. The Pluck example does it in five nodes: a Harmonix Fusion Sampler Stereo fed by MIDI, playing a Fusion patch, followed by a low-pass and a gain.
Make your first effect
#Create a MetaSound Patch
MSP_MyFilterand add DAWntless.Effect, UE.InputFormat.Stereo and UE.OutputFormat.Stereo, or add them later with Fix.Put a One-Pole Low Pass Filter after In Left, and another after In Right. Create a Float input
Cutoff(default 2000) and connect it to both filters' Cutoff Frequency.Wire Bypass so that the effect passes its input through unchanged while the rack bypasses it. Use it as a switch between the filtered and the dry sound:
- Connect Bypass (
DAWntless.) to the second operand of a Subtract (Float), and type 1 in its first operand. The editor inserts a Bool-to-Float conversion node. The conversion outputs 1 while the effect is bypassed and 0 otherwise; the Subtract outputs the opposite.Effect. Bypass - Left side: multiply the filter's output by the Subtract's output with a Multiply (Audio by Float). Multiply In Left by the conversion's output with a second Multiply (Audio by Float). Connect both products to an Add (Audio), and its output to Out Left.
- Do the same for the right side, into Out Right. Save.
While Bypass is false, the output is exactly the filtered sound; while it is true, it is exactly the input. Without this step the effect still works in a rack, whose crossfade bypasses it cleanly, but the render test warns with R8.
- Connect Bypass (
In the Device Validator, select
MSP_MyFilter, apply any Fix, and press Create definition. Set Short Tag toMyFilter, so the rack names the knobMyFilter1_Cutoff, and giveCutoffthe range 200 to 20000 Hz with the curve Log.Press Audition to hear a drum loop through the effect. Run render test plays an impulse, a 1 kHz tone and pink noise through it. With Bypass on, it checks that the effect returns its input.
Press Register. In TheRaK, select a card in a chain and choose + Add Device > EFFECTS > User > MyFilter, or User > <your category> > MyFilter if you gave it a category. Its (o) switch bypasses it through the rack's crossfade.
The Device Validator
#Open it from Tools > DAWntless > Device Validator, with the console command DAWntless., with Validate as DAWntless Device... on a MetaSound in the Content Browser, or with + Add Device > Manage user devices... in TheRaK.
+- DAWntless Device Validator -----------------------------------------------------------------------+
| [Search...] [x] Only assets declaring DAWntless interfaces | MSP_MyFilter (Patch) |
| MSP_MyFilter EFFECT ok | Role EFFECT Format Patch Stamp current |
| MSS_MyLead INSTR 2 errors | [ok] DAWntless.Effect v1.0 |
| MSP_OldPad --- legacy contract | [!!] UE.OutputFormat.Stereo [Fix] |
| | Parameters: pin|label|min|max|default|unit|curve|group|hide|auto |
| | [Audition] [Run render test] [Register] |
+--------------------------------------------------------------+----------------------------------------+
- The list shows your MetaSound Patches and Sources and the definitions, without loading them. Untick Only assets declaring DAWntless interfaces to see every MetaSound.
- The report checks the selected graph as soon as you select it: one line per problem, with its code and, when one exists, a Fix button.
- Fixes edit your graph. The window asks first; each fix is one Undo step and never saves, so save the graph afterwards. With source control on, the graph is checked out first; if the check-out is refused, nothing changes.
- The parameter table edits the definition's Params in place. Each edit is one Undo step and reaches devices already playing in TheRaK. An edit that would make the definition invalid, for example a Min above Max or a Log curve with a Min of 0, is refused with the reason.
- Audition plays the device through the same chain a rack builds: a two-octave keyboard for instruments, a drum loop for effects. It stops when Play In Editor starts.
- Run render test runs the checks in Render checks.
- Register creates the definition if needed, validates, stamps and saves (next section).
Registration and stamps
#Register validates the device: its structure, then the render test. Registration needs the render test, so it only works in an editor with audio (not under -nosound); save the graph first, because the stamp describes the graph on disk. Only when there is no error does it write the stamp into the definition, check the definition out (or mark a new one for add), save it, and add the device to Add Device. With errors, nothing is written.
The stamp records the validation rules' version, the graph (its path and class name), the graph's interface signature, a signature of the definition's parameters and sequencer settings, the result (Passed or Passed With Warnings), that the render test ran, the time, the engine version, and the render's CPU time and peak. It stays current while all of these hold: it passed after a completed render, the validation rules have not changed in a DAWntless update, the definition still names the same graph, the graph's interface signature is unchanged, and the definition's parameters and sequencer settings are unchanged. The signature covers every graph input (its name, type, access and default value), every output and the declared interfaces. Moving nodes or re-saving never changes it.
| You change | Result |
|---|---|
| Nodes, wiring or node settings inside the graph | The stamp stays current. The Device Validator shows Re-validate recommended when the graph was saved after its stamp; register again when the sound changed |
| A graph input or output (added, removed, renamed, retyped, or a new default), or an interface | NEEDS VALIDATION |
| The definition's parameter pins, kinds, ranges or curves, its built-in sequencer, sequencer mode or drum pads | NEEDS VALIDATION (undoing the change makes it current again) |
| The definition's display name, description, labels, units, groups, colour, category, short tag, hidden or automatable flags, or a default inside its range | The stamp stays current. A default outside its range, a Log curve with a minimum of 0 or below, a wrong number of value labels or an invalid short tag shows NEEDS VALIDATION with the reason; that parameter plays clamped or at its graph default |
| The definition's graph (another MetaSound) | The stamp is reset: register the device again |
| The graph asset is renamed or moved | NEEDS VALIDATION: the stamp names the old graph |
| A DAWntless update with new validation rules, or a device registered by an earlier DAWntless that did not record the render test | NEEDS VALIDATION on every such device until it is registered again |
NEEDS VALIDATION means:
- The device leaves Add Device until you register it again.
- Devices already in racks keep playing, and their cards show an amber NEEDS VALIDATION header.
- Their chains hold the graph they play now: nothing rebuilds them with the unvalidated graph. Their strips show GRAPH OUT OF DATE with the reason ("validate <device> to rebuild"). Play still uses the current graph; [Rebuild], Save rack and Print refuse those chains until the device is registered again. Other chains are not affected.
To clear it, open the device in the Device Validator, check the report, and press Register. Then press [Rebuild] on each strip still marked GRAPH OUT OF DATE and save the rack.
A user device can also be:
| Card | Meaning | What plays |
|---|---|---|
| MISSING (red header) | Its definition, or the definition's graph, was deleted or cannot load | An effect passes audio through; an instrument is silent. Its settings are kept: restore the asset and the device comes back |
| INVALID (red header; the tooltip names the error) | The graph no longer passes the structural check, for example because a DAWntless interface was removed, or the definition lists an input the graph does not have, or a constructor input | The same as MISSING. Fix the graph, then register it |
A mistake that is only in the definition's metadata never silences a device: a range, a curve, value labels, a parameter listed twice, or the short tag. The device shows NEEDS VALIDATION with the reason ("Its definition has an error: …"), and its chain holds its graph as described above. A parameter whose entry cannot be used plays at its graph default, and its knob shows "graph default". Values outside a range play clamped into it.
Render checks
#The render test builds a real chain around the device, renders it offline at 48 kHz in 480-frame blocks and 120 BPM, and measures it.
- Instruments get 20 seconds of notes on track 1, channel 1: nothing until 2 s; MIDI 60 at velocity 100 at 2 s, held 0.5 s; a 16-note chord in whole tones from MIDI 48, velocity 127, at 3 s, held 1 s; 64 fast repeats of MIDI 60 (1/64 notes) from 4.5 s; the last note-off at 6.5 s. (The checks call MIDI 60 "C3", as Ableton does; STPR-1 labels it C4.) A definition in Drum sequencer mode is played on its pads instead: its first pad (Drum Root Note) for the response check and the parameter sweep, every pad at once in place of the chord, and a roll over the pads in place of the repeats. The report names the note it played.
- Effects get an impulse, a 1 kHz tone at −6 dBFS and pink noise, 4 seconds each, through the same bypass crossfade a rack uses, compared with a dry reference. The delay of the effect's output is reported as its latency.
- Every parameter in Params is set to its minimum, maximum and default for 0.25 s each, and measured from 20 ms after the change (a smoothed input still carries the previous value in its first block).
- The render runs twice; any difference is reported as information.
- A check that cannot be measured is listed as "not measured", with the reason, and its level is
nullin the JSON. For example, the hanging-note check needs 10 s after the last note-off. - The report records the note the instrument checks played (
respondNotein the JSON): MIDI 60, or Drum Root Note in Drum mode.
| Check | Pass | Warning | Error |
|---|---|---|---|
| Operator build | Up to 2 s | — | E14 |
| NaN or infinity | None | — | E13, with the first frame and the stimulus |
| Silence at rest (instruments, from 0.1 s to the first note) | Below −90 dBFS | R2 (−90 to −60 dBFS) | R1 (above −60 dBFS) |
| Response to MIDI 60 (Drum mode: Drum Root Note) at velocity 100 (instruments) | Above −60 dBFS within 50 ms | — | R3 |
| Peak level (chord and repeats; effects: every stimulus) | Up to +6 dBFS | W6 (above +6 dBFS) | R4 (above +12 dBFS) |
| DC offset (mean of a channel) | Below 0.05 | R5 | — |
| Hanging notes (instruments) | Below −60 dBFS within 10 s of the last note-off | R6 | — |
| Stereo | Both channels carry signal | R7 (one channel below −90 dBFS; mono outputs exempt) | — |
| Bypass (effects) | Residual below −80 dB against the dry signal | R8 | — |
| Parameter sweep | Up to +12 dBFS | — | R9 (E13 for NaN) |
| Whole render | Above −90 dBFS somewhere | W5 (silent) | — |
| CPU per 480-frame block | 95th percentile up to 1 ms | W7 (depends on the machine) | — |
The render needs an editor that can play audio. Without one (for example with -nosound), the report says "render skipped (no audio)" as information, and the structural checks still run. A graph that reads an Audio Bus cannot be rendered offline and is refused (R10).
Error and warning codes
#Errors stop registration; warnings do not.
| Code | Problem | Fix |
|---|---|---|
| E1 | The asset is not a MetaSound Patch or Source, or the definition names another graph | Pick a MetaSound; point the definition's Graph at this one |
| E2 | No DAWntless role interface | Fix: Add DAWntless.Instrument or Add DAWntless.Effect (or add DAWntless. for a self-sequenced instrument) |
| E3 | Declares both DAWntless. and DAWntless.Effect | Remove one: a device is an instrument or an effect |
| E4 | No output format | Fix: Add UE.OutputFormat.Stereo (Patch). A Source gets its format when it is created: recreate it as Stereo |
| E5 | Effect without an input format | Fix: Add UE.InputFormat.Stereo |
| E6 | Effect in Source format | Duplicate as Patch..., then connect the new patch as it lists |
| E7 | Not Referenceable | Fix: Make Referenceable |
| E8 | A DAWntless member is missing or has the wrong type, or the interface version is unknown to this DAWntless | Fix: Update interface version, then reconnect the re-created members (the window lists them) |
| E9 | Output wider than stereo (Quad, 5.1, 7.1) | Use UE. or .Mono |
| E10 | An instrument without the DAWntless. input and without a built-in sequencer; or Has Built In Sequencer without DAWntless. | Restore the MIDI member (Update interface version), add DAWntless., or untick Has Built In Sequencer |
| E11 | A reserved or colliding name, an invalid short tag, or a definition parameter that does not fit its pin (not a Float/Int32/Bool/Trigger input, a constructor input, listed twice, the wrong Kind, Min/Default/Max out of order, Log with Min at or below 0, the wrong number of Enum Labels), or an effect without a valid short tag | Rename the input, change the short tag, or correct the Params entry, as the message says |
| E12 | The graph is marked Deprecated | Clear the Deprecated access flag |
| E13 | NaN or infinity in the render | Guard divisions by zero, logarithms of zero or negative values, and feedback of 1 or more. The report names the first frame and the stimulus |
| E14 | Preparing the graph took more than 2 s | Make the graph lighter: fewer nodes, smaller tables and assets loaded at start |
| W1 | A Source's own settings are ignored in a chain | Nothing to do; use a Patch to avoid the warning |
| W2 | UE. declared | The chain ignores On Finished; recreate the Source without One Shot, or ignore |
| W3 | Inputs of unsupported types are not exposed | Nothing to do if they are internal; use Float, Int32, Bool or Trigger for knobs |
| W4 | Constructor inputs are static | Make them normal inputs to change them while playing or to list them in Params |
| W5 | Silent during the whole render | Connect the outputs; for an instrument, connect the MIDI input |
| W6 | Peak above +6 dBFS | Lower the output gain |
| W7 | CPU above 1 ms per block | Simplify the graph. TheRaK shows a chain's CPU in orange above 420 µs |
| W8 | Mono output copied to both channels | Nothing to do; use Stereo for width |
| W9 | No parameters | Add Float inputs if you want knobs |
| W10 | The older DAWntless contract (MIDI Stream in, Out L/Out R out, no interfaces) | Fix: Add DAWntless.Instrument; connect its MIDI member where MIDI Stream was used, wire Out L/Out R to the output format, then delete the old members |
| R1 | Sound at rest above −60 dBFS: self-oscillation or DC | Gate every oscillator and noise source with an envelope |
| R2 | Noise at rest between −90 and −60 dBFS | As R1 |
| R3 | No response to MIDI 60 within 50 ms; in Drum mode, to Drum Root Note (the message names the note) | Connect DAWntless. to your note handling; a Fusion Sampler needs Track Number 1 or 0; a drum instrument needs a sound on its first pad |
| R4 | Peak above +12 dBFS | Lower the output gain |
| R5 | DC offset | Add a One-Pole High Pass Filter at about 10 Hz, or centre unipolar signals |
| R6 | Still sounding 10 s after the last note-off | Release on Note Off; keep release and decay times under 10 s |
| R7 | One channel silent | Connect both Out Left and Out Right, or declare UE. |
| R8 | Bypass is not transparent | Pass your input through unchanged while Bypass is true (the Chorus example: wet level 0, dry level 1). In a rack the crossfade still bypasses the effect cleanly |
| R9 | A parameter at its minimum or maximum peaks above +12 dBFS | Narrow its range in Params, or compensate the gain in the graph |
| R10 | The graph reads an Audio Bus | Take audio from the input format instead; Audio Bus readers cannot be devices |
| R11 | The test chain could not be built or rendered | Fix the cause the message gives, for example an asset the graph references that is missing. A MetaSound block-rate console variable (au.) also stops the render: reset it |
Example devices
#| Device | What it shows |
|---|---|
Chorus (MSP_, effect) | Two short delay lines, 12 ms and 14 ms, swept by sine LFOs 90° apart. Rate, Depth and Mix; short tag Chorus, so its knobs are Chorus1_Rate and so on. While Bypass is true it passes its input through (wet 0, dry 1), so R8 passes. |
Pluck (MSP_, instrument) | A polyphonic sampler wrapped into a DAWntless instrument in five nodes: MIDI → Fusion Sampler Stereo playing the engine's Harmonix StringsPizzicato patch (its Track Number stays at 1, the rack's track) → a Biquad Filter low-pass per side → a gain. Tone (the low-pass), Transpose (an Int knob, −24 to +24 semitones, wired to the sampler's Transposition) and Level. The patch's own envelope shapes each note. Swap the Patch for any Fusion patch to make your own sampler instrument. |
Source Lead (MSS_, Source instrument) | A Referenceable MetaSound Source: two saws detuned left and right, ladder filters and an ADSR envelope, with the knob groups Filter (Cutoff, Resonance) and Amp (Release, Level). |
The examples are registered, and Add Device lists them under INSTRUMENTS > User > Examples and EFFECTS > User > Examples. Duplicate an example to start your own device; the copy needs its own definition and registration.
Source control, cooking and CI
#Perforce and other source control:
- Fix checks out your graph and leaves it unsaved: save it.
- Register checks out the definition, or marks a new one for add, and saves it. It never saves the graph.
- Duplicate as Patch... saves the new patch and marks it for add. The Source is not touched.
- Submit together: the graph, its
DA_Device_definition, the racks and Level Sequences that use the device, and the newMSS_Chain_graphs (see Generated chain graphs and Perforce). - The stamp lives in the definition. When a teammate changes a graph's inputs, everyone sees NEEDS VALIDATION until someone registers the device again and submits the definition. Register after you sync a graph change.
- Chain graphs your experiments no longer use can be removed with TheRaK's [...] > Clean up unused chain graphs.... It keeps every graph that an asset on disk refers to, hard or soft, or that an open rack holds, and deletes the rest only after you confirm its report (see Clean up unused chain graphs). It never touches your device graphs or definitions.
Cooking. A rack's device references its definition, the definition references the graph, and every saved chain graph embeds the device graph, so cooking a level or sequence that uses the rack or its printed tracks cooks all of it, including assets the graph references, such as a Fusion patch. That includes a level whose TheRaK Performer component plays the rack (see TheRaK Performer (gameplay)). A packaged game neither looks for devices nor builds chains: it plays the chain graphs saved with your racks and printed tracks. A definition that no rack uses is not cooked, and is not needed there.
CI. The DAWntlessValidateDevices commandlet runs the same checks as the window and writes nothing to your assets:
UnrealEditor-Cmd.exe YourProject.uproject -run=DAWntlessValidateDevices -Paths=/Game/Devices,/DAWntless/Examples/UserDevices
-Render -AllowCommandletAudio -Report=Saved/DeviceValidation.json -unattended -SCCProvider=None
-Paths(required): content folders, searched with their subfolders, or single assets, separated by,or;. Every MetaSound there that declares a DAWntless interface, and every definition, is checked.-Render: run the render checks too. It needs-AllowCommandletAudio(a commandlet has no audio without it), no-nosound, and a Development editor build. Otherwise each device reports "render skipped".-Report: where to write the JSON report (folders are created). Without it, results go to the log only.- Each definition gets one entry, validated with its graph; a DAWntless graph gets its own entry only when no definition in the paths covers it (then with its definition from elsewhere, if it has one). An asset that does not load is an entry with an error.
- Exit code: 0 no device has errors, 1 at least one device has errors, 2 bad arguments (for example no
-Paths), 3 the report could not be written, 4-Renderwas asked for but the process cannot render (add-AllowCommandletAudio, drop-nosound). The last log line starts withDAWNTLESS_and carries the summary.VALIDATE_ DEVICES
Validate Assets (Unreal's Data Validation, including its commandlet) also checks every MetaSound that declares a DAWntless interface, structurally only.
Python. unreal. scripts the same workflow: validate_, fix_, create_ and register_ (it needs render true and an editor with audio). The fix names are SetReferenceable, AddInstrumentInterface, AddEffectInterface, AddOutputFormatStereo, AddInputFormatStereo, DuplicateAsPatch and UpdateInterfaceVersion. Registration from Python follows the same rules as the window: it stamps only a device without errors. Following Unreal's Python convention for functions that return a bool, validate_device and register_device return (report_ on success and None on failure, and fix_device returns (error, created_ on success (the new patch's path for DuplicateAsPatch) and None on failure; the reason, with the report, is then in the Output Log (a DAWntlessLog warning). create_ returns (definition, error).
measure_ renders one note of an instrument: velocity 100, held for 1 s. It returns (hz, error). hz is the note's fundamental frequency, measured over the steady part of the note, or 0 when the graph cannot render or has no clear pitch; error then gives the reason. Use it to check the tuning of a sampler patch or of a drum pad. It needs an editor with audio, like the render test.
Limits
#- Sources are instruments only (E6); effects must be Patches.
- Stereo at most (E9).
- Parameters are Float, Int32, Bool or Trigger inputs; constructor inputs rebuild the chain when they change. Automation lanes carry Float, Int and Bool channels (no Trigger) and send them at frame rate.
- Polyphony is up to your graph. The stock MIDI Note Trigger is monophonic and stock MetaSound nodes have no voice allocator. For chords use a polyphonic node: the Harmonix Fusion Sampler, as the Pluck example does, or a native MetaSound node, as Afterglow uses.
- One instrument per chain, and user effects go in chains only: master effects arrive in a later update.
- Self-sequenced instruments are not printed.
- Audio Bus readers cannot be devices (R10).
- Tempo comes as numbers (
DAWntless.). A Harmonix MIDI clock member is planned for a later interface version.Transport - Unreal Engine 5.8. The validation rules target 5.8's MetaSound formats; a DAWntless update that changes them asks for re-validation (NEEDS VALIDATION).