Curve Editor
The Domain Editor's main surface is the curve editor: an SVG canvas where you place anchors and shape their bezier curve. What follows covers each gesture, what gets clamped, and how the right-click menu copies and mirrors curves between bindings. For the data model (domain, binding, curve), see Authoring Overview. Stepped-output mechanics live in Stepped Output: the step set picker, editing steps on the canvas, and saving step sets.
The editor surface
The Domain Editor lays out top-down:
- Title — the domain's display name (e.g. Incoming 3-Band EQ).
- Side tabs (when both sides exist) — Incoming / Outgoing. Each side has its own bindings; switching sides reloads the canvas.
- Ghost mode selector — top-right of the side-tabs row. Switches the underlay (see Ghost Overlays).
- Slot tabs (FX domains only) — one button per slot. Double-click a slot button to rename it (suppressed in the read-only Preview mode opened by Import Domain).
- Parameter tabs — one button per parameter binding in the active side and slot (for 3-Band EQ: Low / Mid / High; for an FX slot: Wet/Dry, Param 1, …). Click to switch which binding the canvas is editing.
- Curve canvas — the SVG editing surface itself. On a stepped binding, dashed reference lines and a labeled gutter down the left edge replace the grid. Stepped Output covers editing steps there.
- Property strip — sits below the canvas. Shows the binding's interpolation and step set status; see Interpolation below and Stepped Output.
The side-tabs row only appears when both sides exist. Single-side domains skip it.
Reading the canvas
The canvas is a square frame:
- X axis is transition progress (0% → 100%).
- Y axis is the binding's normalized value (0 to 1). What 0 and 1 mean for a specific control is set by the binding's address; the canvas just shows you the shape.
Visual conventions:
- Orange anchors are the endpoints, at progress 0 and progress 1. You can drag them up and down only; their X position is fixed.
- Blue anchors are middle points. You can drag them in both axes, clamped between their neighbors so they never cross another anchor.
- The selected anchor grows slightly larger with a yellow outline. Clicking another anchor moves the selection; clicking empty canvas clears it.
- Small squares off an anchor are its bezier handles, drawn at the end of a thin line. The selected anchor's handles render yellow too. A handle dragged off the top or bottom of the plot draws hollow, with a dashed stem, instead (see Handles beyond the canvas edge).
- A faint grid plus axis labels render behind continuous curves. Stepped curves replace the grid with dashed reference lines at each step level.
The anchor cap is 16, for continuous and stepped curves alike. The editor stops adding anchors when you hit the cap.
A curve never draws or sends a value outside 0 to 1. If a handle pushes the shape past the top or bottom of the plot, the curve flattens against that limit instead of exceeding it. Curve limits below has the detail. What the canvas draws is exactly what the DJ app receives.
Anchor manipulation
- Select — click an anchor.
- Move (end anchor) — drag. Vertical motion only; the X position stays at 0 or 1.
- Move (middle anchor) — drag. The anchor follows the cursor, clamped to stay between its left and right neighbors with a small reserved gap (so adjacent anchors can't overlap).
- Add — click Add in the footer toolbar. See below for where the new anchor lands.
- Remove — select a middle anchor, then click Remove in the footer. Endpoints can't be removed; the editor enforces a minimum of two anchors.
- Deselect — click empty canvas.
Values snap. Continuous bindings snap to a fine grid so anchors land on clean numbers; stepped bindings snap to the nearest step level.
Where a new anchor lands
Add doesn't place the anchor where you clicked. It finds the widest gap between two adjacent anchors and inserts at that gap's midpoint, taking its value from the existing curve so the output is unchanged. Repeated clicks keep bisecting the widest remaining span.
So you add first and position second: click Add, then drag the new anchor where you actually want it. The Add button carries the count (Add (3/16)) and disables at 16.
Interpolation: Bezier, Linear, Hold
Below the canvas, the property strip carries an Interp control, a segmented switch between Bezier, Linear, and Hold. Changing it changes what the DJ app receives, not only how the canvas draws the curve:
- Bezier (the default). The curve eases through each anchor along a spline shaped by bezier handles. This is the mode for a musical fade rather than a mechanical one. If an anchor sits higher than both its neighbors, the curve eases up into it and back down without passing it. The peak you placed is the maximum value the DJ app receives, and the same holds at a trough.
- Linear. Straight segments between anchors, no handles to drag. A control on a Linear span moves at a constant rate from one anchor to the next.
- Hold. Sample-and-hold: the curve jumps to each anchor's value and holds it flat until the next anchor, with no ramp in between. That suits stepped or stuttered output, and gates (an on/off control that should snap rather than ramp).
Switching to Bezier derives handles from the neighboring anchors so the curve visibly bows, rather than leaving a straight line. Hand-shaped handles are never overwritten by a mode switch, so switching Bezier → Hold → Bezier returns exactly the shape you had before. There's no confirmation prompt for a mode switch, because switching back is the undo.
The whole-curve control above sets every anchor at once. Interpolation can also be set per point, so one curve can carry a mix of Bezier, Linear, and Hold spans. See Per-point interpolation below.
Hold works on any curve, with or without a step set attached. The property strip also carries a separate Step Set control (Attach… / Change… / Detach) that constrains anchors to a fixed, named list of levels on top of Hold. Stepped Output covers when that constraint is worth adding. When a step set is attached, Interp pins to Hold and the control disables.
Building a staircase in Bezier costs more than reaching for Hold. You can place Independent handles at each step and flatten them by hand, but it takes twice the control points that Hold needs for the same shape, and switching interpolation mode afterward reshapes it into something you didn't intend. If the output should be stepped, use Hold, with or without a step set.
Per-point interpolation
Right-click a control point and choose an option under Interpolation to next point to set the mode for just the span between that point and the next one, independent of the rest of the curve. Choosing a mode applies it immediately, even re-choosing the mode a point already shows. That last case is the fix for a curve that reads "Bezier" in the toolbar but still draws a straight line: a fresh Bezier point derives its handles on the spot.
This option is absent on the curve's last point, since there's no span after it, and absent on step-set curves, since a step set always holds.
When a curve carries more than one mode, the toolbar's whole-curve control shows blank rather than guessing which mode "wins."
Bezier handles
Bezier is the default interpolation (see Interpolation above); this section covers the handles that shape it.
Each middle anchor has two handles: an in-handle controlling the curve coming in from the previous anchor, and an out-handle controlling the curve going out to the next. End anchors carry only the relevant single handle.
- Drag — click a handle's square and drag. The line and square track the cursor.
- Clamp, sideways — the out-handle can't extend past the next anchor; the in-handle can't extend past the previous one. The editor stops the drag at that limit.
- Vertically, a handle can leave the canvas. See Handles beyond the canvas edge below.
- Default position — new anchors get 1/3-distance handles toward each neighbor, producing a smooth shape with no kink.
Linked vs Independent handles
Each middle anchor has a handle mode:
- Linked (the default, and what an anchor with no stored mode means). Dragging one handle drags the other to match, keeping them in line through the anchor, so the curve passes through smoothly.
- Independent. Each handle moves on its own, so the curve can turn sharply at the anchor.
Toggle the mode for a selected middle anchor via the right-click menu's Handles group, or the Handles button below the canvas. The button reads Linked or Independent for the current selection, and shows the neutral label "Handles," disabled, when nothing eligible is selected. When no bezier segment touches the point, the Handles group is left off the right-click menu entirely rather than greyed out, since handles do nothing on a Linear or Hold span. End anchors don't have a mode.
Handles beyond the canvas edge
A handle can be dragged above or below the plot. Its real position keeps traveling with the pointer and keeps shaping the curve, but its drawn marker freezes at the edge of the canvas, hollow and with a dashed stem, so it's clear the marker isn't where the handle actually is.
To bring it back, grab the frozen marker and drag inward. The pointer separates from the marker as you drag: the marker stays pinned until the handle's real position comes back into view, and then the two rejoin. If a handle has gone too far to fish back in one motion, release and re-grab it, or use Reset handles on the right-click menu to restore the derived shape outright.
A handle only ever goes missing vertically. Its sideways travel is already limited by the neighboring anchors, so it can't leave the plot left or right.
Curve limits
A curve never draws or sends a value outside 0 to 1. If handles push a shape past the top or bottom of the plot, you'll see a flat plateau where the curve holds at the limit, instead of a curve that keeps climbing off-screen. That plateau is exactly what the DJ app receives.
The footer toolbar
The row under the canvas is where add, remove, and save live. It's the same set of controls in every state, which makes it the reliable path when the right-click menu isn't offering what you want.
| Control | What it does |
|---|---|
| Clear | Deletes the current binding's curve entirely |
| Add (n/16) | Inserts an anchor in the widest gap. Disabled at 16 |
| Remove | Deletes the selected middle anchor. Disabled unless one is selected and the curve has more than two |
| Handles / Linked / Independent | The selected anchor's handle mode. Reads Handles when nothing eligible is selected, and appears only when the lane has a bezier segment |
| Reset | Discards your edits to the current binding |
| Cancel | Discards every unsaved edit in the editor and closes |
| Save | Commits your edits and keeps the window open for the next binding |
| Save & Close | Commits and closes. When there's nothing to save, this button reads Close |
Curve work is not autosaved. The Domain Editor has its own Save boundary, unlike the detail view around it. Close it with unsaved anchor drags and they're gone, so save before you move on.
The right-click menu
Right-click the canvas to open the curve context menu. What it offers depends on whether an anchor is currently selected, not on what sits under the cursor.
With no anchor selected
- Add Control Point. Same insertion as the footer's Add: widest gap, midpoint. Offered whenever a curve exists; at 16 anchors, clicking it does nothing.
Click empty canvas first to clear the selection if this is the item you're after.
With an anchor selected
Right-clicking anywhere on the canvas acts on the selected anchor. Three groups, separated by dividers. Each item shows a dot next to the option currently in effect, rather than naming what clicking it would do:
- Interpolation to next point — Bezier / Linear / Hold. Sets the span between this point and the next one (see Per-point interpolation above). Absent on the curve's last point and on step-set curves.
- Handles — Linked / Independent, plus Reset handles to restore the derived shape. Left off the menu entirely when no bezier segment touches this point. See Linked vs Independent handles above.
- Remove Control Point. Available on any middle point; endpoints can't be removed.
Copy Curve...
A submenu of sibling names at the top of the menu. It copies the current binding's curve to a sibling binding under the same domain on the same side. What counts as a sibling depends on the domain shape:
- 3-Band EQ / Stems domains — siblings are the other parameters at the same role (when editing Incoming EQ Low, siblings are Incoming EQ Mid and Incoming EQ High; when editing an Incoming Stems Volume slot, siblings are the other stem slots on the incoming side).
- FX Unit / FX Bank — siblings are the other parameters in the same slot (when editing Incoming FX1 Wet/Dry, siblings are Incoming FX1 Param 1, Param 2, …).
The menu lists each sibling by name. Selecting one overwrites that sibling's curve with the current curve. If the current binding is empty, the menu inverts: it lists siblings that already have curves, and selecting one copies it into the current binding.
Mirror to opposite track
Copies the curve to the opposite side's matching binding (e.g. Incoming EQ Low → Outgoing EQ Low). The mirror flips progress around the midpoint (1 − progress) and reverses anchor order; values are unchanged. Use it to derive a "fade-in" curve from a "fade-out" you already authored.
Mirror works in either direction. If the current side is empty and the opposite side has a curve, the menu offers to mirror the other way.
Items only appear when they can do something. With no curve anywhere, no siblings, and no opposite-side source, the menu doesn't open.
Ghost overlays
The ghost mode selector at the top-right of the side-tabs row draws a faded reference curve underneath the active one. Three modes:
- No Ghost. Just the active curve.
- Opposite Track. Shows the matching binding on the opposite side (e.g. while editing Incoming EQ Low, draws Outgoing EQ Low as a ghost). This is the overlay for designing complementary fades: the two curves should cross cleanly mid-transition.
- Same Track. Shows the sibling bindings on the same side (e.g. while editing Incoming EQ Low, draws Incoming EQ Mid and Incoming EQ High). Useful for keeping the bands musically aligned.
Ghost curves render in their own colour at reduced opacity with a small label near the middle of the curve. They're read-only. To edit a ghost, switch to its binding via the side or parameter tabs.
Empty state and creation
A binding can exist without a curve: a freshly added domain on a side that hasn't been edited yet, for example. In the editor's normal (writable) mode the canvas shows "No binding — click to create" centered.
Clicking the prompt creates a default binding:
- Continuous parameter. A two-anchor flat line at the parameter's default value (typically 0.5 for bipolar controls, 0 or 1 for unipolar), ready to reshape.
- Button parameter (e.g. a kill switch). A three-anchor stepped curve with
Off → Onflipping at progress 0.5, step set{Off, On}. Convert other curves to stepped via Attach… on the property strip below the canvas. See Stepped Output. - FX slot with no effect name yet. The editor first prompts for an effect name (the label that appears on the FX slot tab). Cancel aborts creation.
In read-only contexts (Session View, or the Import Domain preview) the same message reads "No binding" with no click affordance.
Read-only preview mode
When you open a fusor via Import Domain → Preview (see Domains), the editor enters read-only mode:
- The empty-state click-to-create is suppressed.
- The right-click context menu is suppressed.
- Anchor and handle drags are discarded, since the source binding can't be mutated.
Use Preview to navigate a candidate source's curves before committing the import; nothing you do can change the source file.
Tips
- Pick the mode for the job: Hold for stepped or stuttered output and gates, Linear for a constant-rate move, Bezier for a musical ease. A staircase built in Bezier with Independent handles costs twice the control points of the same shape in Hold, and switching modes on it afterward won't give you back the staircase.
- Linked handles suit musical fades. Reach for Independent only when you want a deliberate kink, which most authored curves never need.
- A handle you can't find is probably pinned at the top or bottom edge. Look for the hollow, dashed marker, then grab it and drag inward. Reset handles is the bail-out if that fails.
- Mirror flips progress, not value. If a mirrored result looks wrong, the original probably isn't centered around 0.5. Mirror first and re-shape with the handles afterwards rather than starting over.
- Copy Curve... is the fastest way to build EQ Low/Mid/High as variations of one shape. Author one band, copy it to the others, then tweak each separately.
- Ghost = Opposite Track is the best check for an EQ swap. The two curves should meet cleanly in the middle of the transition, and the overlay makes the cross visible at a glance.
- Most curves want three or four anchors. If you're pushing toward the cap of 16, that's usually over-authoring rather than a real need for the extra room.