Skip to content

Sound Design (Pass 1)

With the piano samples imported, the next step is mapping all 16 velocity layers onto the keyboard. Done by hand, one sample at a time, this would be extremely tedious — so instead, this walkthrough uses the editor’s built-in AI support to do the mapping.

Prerequisite: AI features require a registered — and possibly subscribed — account. The editor itself is free to use, with no registration required. Without an account, however, AI features are not available: they run against a backend service, which has a real cost attached, so they’re gated behind an account rather than offered for free to anyone.

Once registered (covered in its own piece of documentation — this walkthrough assumes it’s already done), an account gets a limited amount of AI usage at no extra cost. Beyond that initial allowance, continued use requires a subscription, which grants a monthly-refilled quota of token credits.

This walkthrough assumes both prerequisites are in place: the reader has a registered account, and — if its free allowance is already used up — an active subscription. Without at least a registered account, the AI-assisted steps in this chapter cannot be followed as written.

Having an account isn’t quite enough on its own — the editor also needs to know you’re signed in to it. Check the small profile icon button in the upper-right corner of the editor window: it looks different depending on whether you’re signed in.

Profile icon button, signed-out state

Profile icon button, signed-in state

If it shows the signed-out state, click it and sign in before continuing — none of the AI steps below will work otherwise.

In the project file tree, select main.zmap — at this point the project’s only zone map, created automatically along with the project.

Selecting the project's only zone map in the file tree

Click the AI chat icon button in the top right of the editor window.

AI chat icon button in the top right of the editor window

The chat panel slides open on the right side of the editor.

AI chat panel open on the right side of the editor

With main.zmap still selected, type the following into the chat input and click the submit icon:

map my piano samples

Chat prompt "map my piano samples" ready to submit

What happens next can vary. In the best case, the AI understands the request immediately and the finished mapping — all 16 velocity layers, correctly spread across the keyboard — appears in the zone map a short while later. “Short” can mean anywhere from a few seconds to a minute or two, depending on network conditions and backend load.

Completed velocity-layer mapping in the zone map, generated by the AI

Why the AI might ask follow-up questions. The samples folder imported in the previous chapter doesn’t only contain the sustain samples this mapping needs — it also contains the damper-noise and pedal-noise samples that get used later, in Sound Design (Pass 2). Those must be deliberately excluded from this mapping. The AI usually figures this out on its own, but not always — it may ask for confirmation about which samples to use, or how to distribute the velocity layers across the keyboard. If it does, answering its question(s) is normally enough to get to a correct mapping within one or two replies.

Once the mapping looks right, click the AI chat icon button again to close the panel and get the full editor width back.

The recorded velocity layers exist because a real piano sounds different when struck softly versus hard — not just quieter, but different in tone and character. That’s exactly why they were mapped one-to-one onto MIDI velocity in the first place. The problem is that “softly versus hard” also means the raw recordings are, quite literally, quieter and louder — actual volume differences are baked into the samples.

That’s a problem in this instrument’s design, because volume is meant to be controlled entirely by MIDI velocity, through a velocity modulator added later in this chapter. If the raw samples are also getting quieter and louder on their own, the two effects stack: velocity would be affecting loudness twice, once through the modulator and once through the recording itself, on top of correctly bringing out the tonal differences between the layers.

The fix is to normalize the recorded volume differences out of the zone map, while leaving the tonal differences between layers untouched. This happens entirely non-destructively — the underlying WAV files are never modified. Each zone stores a relative gain property, and normalizing simply adjusts that property per zone.

Click a single zone in the zone map to select it — it changes color from blue to orange, marking it as the current selection.

Open the zone inspector side panel via the tool button in the top right of the zone map editor.

Zone inspector tool button in the top right of the zone map editor

The panel opens on the right, showing every property of the selected zone, including its relative gain — the property normalization is about to adjust.

Zone inspector side panel showing the selected zone's properties, including relative gain

Select every zone in the map using the select-all tool button above the zone map. All zones turn orange once selected.

Select-all tool button above the zone map

With everything selected, open the Tools menu and choose Normalize volume.

Tools menu with "Normalize volume" selected

A dialog opens with the normalization settings.

Normalize volume dialog

The defaults are fine as-is — the one setting that matters is the mode. Pick Peak, not RMS.

Why Peak, not RMS? RMS normalization measures a sample’s average energy, which suits sustained, tonal material well. Piano samples are inherently percussive: a sharp transient attack followed by a long decay. Perceived loudness of that kind of material is dominated by the attack, not the average level across the whole sample — so RMS normalization would get it wrong, chasing an average that doesn’t match how loud the note actually sounds. Peak normalization targets the transient directly and gets it right.

Confirm the dialog to normalize every selected zone in one pass.

Select the individual velocity zones for a single note and check their relative gain in the inspector — the soft layers should have picked up a noticeably larger boost than the hard ones, since they started out much quieter. On A2, for example, the softest layer ends up normalized to roughly +20.6 dB, while the loudest layer only needed about +1.5 dB.

Relative gain values across A2's velocity layers after normalization — softest layer boosted much further than the loudest

Expand patches -> main -> layers in the file tree and double-click main.flr to open the layer editor. It starts out as a minimal default layer — just the source, nothing else.

Default minimal main.flr layer, just after opening

Drag an Amp processor from the processor list on the right and drop it directly below the source processor in the chain.

Dragging an Amp processor in below the source

Switch to the Modulators tab in the processor list.

Modulators tab in the processor list

Drag an AHDSR Envelope onto the amp’s Vol. knob.

Dragging an AHDSR Envelope onto the Amp's Vol. knob

Then drag a Velocity modulator onto the same Vol. knob.

Together these two modulators shape the amplitude: the envelope controls the attack and release contour of each note, while velocity scales the overall level so harder-played notes sound louder — exactly the behaviour the normalization pass earlier in this chapter was clearing the way for. With the recorded volume differences evened out, velocity is now the only thing controlling loudness.

Amp processor with AHDSR Envelope and Velocity both connected to Vol.

Rather than dialing in the envelope’s stages by hand, this walkthrough ships a ready-made preset in the custom asset bundle from Gathering Assets. Open the envelope’s preset dialog.

Envelope preset dialog

Click Import and pick the matching preset file from the unpacked asset bundle. Double-click the newly imported preset in the dialog to apply it — this also closes the dialog.

Newly imported preset applied to the envelope

The velocity modulator ships with a ready-made preset too, from the same asset bundle. Apply it the same way as the envelope preset above: open the velocity modulator’s preset dialog, click Import and pick the matching preset file, then double-click it to apply.

What We’re Building: One Instrument, Several Models

Section titled “What We’re Building: One Instrument, Several Models”

Before going further, it’s worth being explicit about where this sound design is headed. The goal is a piano with only a handful of user-facing controls, but which can switch between a few distinct overall characters — different models. In this platform, that’s implemented with snapshots: a snapshot captures a specific set of parameter values across the patch, and recalling it applies all of those values at once. The practical consequence for sound design is that the processors doing the shaping get built now, in a neutral, general-purpose state; a later pass turns their parameters into a set of named snapshots, one per model.

This being an educational project, the model list stays short. Four models are planned:

  • Standard — the baseline piano, with no additional sound shaping beyond what’s already been built in this chapter.
  • Bright — the same signal chain, with an EQ curve that lifts the top end.
  • Mellow — the same chain again, with a different EQ curve going the other direction.
  • Honky — a honky-tonk / bar-piano character, achieved with detuning at the zone-map level rather than with EQ.

Separately from the four models, there’s also a global reverb, shared across all of them, built around an impulse-response (IR) sample rather than an algorithmic reverb.

Honky-tonk is built first, while the zone map is still simple — it needs a second, detuned zone map rather than just another processor, so it’s easiest to set up before the rest of the shaping processors add more to keep track of.

A real honky-tonk piano gets its characteristic wavering, slightly-out-of-tune sound from multiple strings per note that aren’t quite in tune with each other. The equivalent here is a second, fully detuned copy of the zone map, layered underneath the original — when both play together, the same note sounds from two sources a fraction of a semitone apart, producing the same beating effect.

Right-click patches -> main -> zone_maps -> main.zmap in the file tree and choose Copy “main.zmap”.

Copying main.zmap from the context menu

Right-click the zone_maps folder itself and choose Paste here.

Pasting the copied zone map into the zone_maps folder

A new file appears; give it a name — this walkthrough uses honky.zmap.

Double-click honky.zmap to open it, then select all zones the same way as during normalization earlier in this chapter.

With multiple zones selected, open the zone property inspector panel again. Most fields now show an asterisk instead of a value — this indicates the selected zones don’t all share the same value for that property.

Zone inspector with multiple zones selected — most fields show an asterisk for differing values

The Tune property is the exception: it still shows 0.0, because every zone in a freshly copied map starts out with zero relative detune.

Set Tune to 25 cent — type 25 into the field and press Enter. Every selected zone is detuned by +25 cents at once.

Detuning the copy doesn’t do anything on its own — the source processor also needs to know to play both zone maps. Back in main.flr, click the Edit button on the source processor.

Edit button on the source processor

A dialog opens listing the zone map(s) the source triggers. Click Add… and select the newly created honky.zmap.

Source processor's zone map dialog, adding honky.zmap

Click OK to confirm. Playing on the keyboard now clearly sounds like a honky-tonk bar piano — main.zmap and honky.zmap are both sounding on every note, a semitone-fraction apart.

The detuned zone map should only be active when the honky model is actually selected — not all the time, and not while the other three models are being built. Open the source processor’s zone map dialog again (same Edit button as above) and change honky.zmap’s trigger condition from Always to Never, then click OK.

The piano is back to its normal, single-zone-map sound — but the honky-tonk layer is in place, ready to be switched back on for its own model later, when snapshots are built.

Back in main.flr, drag an EQ processor onto the layer, directly below the amp built earlier in this chapter. This is the processor the Bright and Mellow models will shape later — for now, leave it at its neutral, flat default. Its curve gets dialed in per model once snapshots are built.

Dragging an EQ processor into the chain, below the amp

Drag one more Amp processor onto the layer, after the EQ. This one acts as the voice’s overall master volume, and gets wired up to a single global volume knob later.

Give it a descriptive name so its purpose is unambiguous. Click the pencil icon next to the new amp’s name, in the top-left corner of the processor.

Pencil icon next to a processor's name, used to rename it

Rename it — this walkthrough uses Master. Beyond making the chain easier to read at a glance, a clearly-named processor also helps the built-in AI later, if any sound-design tasks get delegated to it: a processor named “Master” is something it can reason about directly from a prompt that mentions “master volume,” rather than having to guess at an anonymous chain position.

The convolution reverb heard on the piano isn’t a processor inside main.flr — like the send busses in the 303 walkthrough, it’s a separate send layer, a small audio-only chain the main layer’s signal gets routed to. This walkthrough only needs one such layer, for reverb; there’s no chorus or delay send this time.

Right-click the layers node in the file tree and choose Create new Layer.

Create new Layer context menu on the layers node

Name it reverb.

In the dialog that follows, pick Audio only — a send layer has no zone map or source of its own, it only processes incoming audio.

Choosing "Audio only" for the new layer

Double-click the new reverb layer to open it. It starts out as a blank audio layer.

Blank reverb layer after creation

In the new reverb layer, drag in a Convolution Reverb processor.

Convolution Reverb processor dropped into the blank reverb layer

Two settings can be taken care of right away, before the IR sample itself is even loaded:

  • Set the Mix parameter to 100%. Since this processor only exists inside a dedicated send layer, its whole purpose is to return processed (wet) signal — there’s no dry signal to blend against, so it should always be fully wet.
  • Drag in one more Amp processor, after the Convolution Reverb, and set its Vol. knob to -20 dB. This is the reverb’s overall return level — how loud the wet signal comes back into the mix, independent of the actual reverb parameters. -20 dB is a reasonable starting point; it gets refined once the IR is actually loaded and audible.

Loading the actual impulse response and dialing in the reverb’s character happens later in this chapter, once the IR sample has been marked as usable by the project.

Switch back to main.flr. Drag a Send Levels processor to the very end of the chain, after the Master amp. Unlike the processors above, this one has no preset — a send connection is specific to the layers in your project, so it can’t be saved that way.

Assign the reverb layer to the first slot of the Send Levels processor.

The bundler only packages assets that are actually referenced somewhere in the patch. Left as-is, the IR sample imported in Gathering Assets just sits unused in the project’s asset folder and would silently be dropped when the instrument is published later — it has to be explicitly told it’s needed.

Double-click patches -> main -> settings.pst in the file tree to open the patch settings.

Opening settings.pst from the patches/main folder

Switch to the first tab, Patch Assets, and drag the IR sample — from its place under the assets folder — into the list. It appears as a new row.

IR sample dragged into the Patch Assets list, appearing as a new row

To keep the list manageable, give the row a speaking name instead of leaving it as a raw filename. Double-click the first cell in the row to edit it — this walkthrough uses Plate.

Switch back to the reverb layer and click Pick IR on the Convolution Reverb processor. In the dialog that opens, double-click Plate.

Pick IR dialog, selecting "Plate"

The convolution reverb is now using the EMT-140 plate IR.

With the IR loaded, the piano now audibly uses the reverb send whenever a note is played. The overall amount of reverb is controlled by the Level parameter on the reverb slot of main.flr’s Send Levels processor — turn it up or down to taste.

  • Master volume, exposed as a global (host-automatable) parameter
  • End state: a playable, if not yet pedal-aware, piano voice