Skip to content

Short knob-grid labels for 18 parameter(s) - #2

Open
charlesvestal wants to merge 1 commit into
filliformes:masterfrom
charlesvestal:short-names
Open

charlesvestal wants to merge 1 commit into
filliformes:masterfrom
charlesvestal:short-names

Conversation

@charlesvestal

@charlesvestal charlesvestal commented Aug 29, 2026

Copy link
Copy Markdown

Adds short_name to this module's parameters, so the Schwung knob grid can
label each cell with the word that identifies it rather than a squeezed
abbreviation of the full name.

Part of a fleet-wide pass over every catalogued module. Each name was chosen
by hand against the page it appears on: where a page is already called
"Filter Envelope", its cells say ATTACK and DECAY rather than F.ATK and FENVDEC.

What changes

  • forge — 18 parameters labelled

Nothing else is touched: no version bump, no behaviour change, no new params.

forge — rendered

forge

Left is what the grid draws today, right is with this change — 8 of 21 changed pages.

Before / after

page key grid drew now draws
Main rnd_kit_params RKPARA PARAM
Main rnd_voice RNVCE VOICE
Main, Perf all_decay ALLDEC DECAY
Main rnd_pan RNDPAN PAN
Main save_kit SAVKIT SAVE
Perf all_punch APUNCH PUNCH
Perf all_bright ABRIGH BRIGHT
Perf all_drive ALDRV DRIVE
Perf all_snap ALSNAP SNAP
Perf all_bend ALBEND BEND

The page matters where a name repeats: the same role under two sections
gets the same short name, and the section it sits under is what tells
them apart.

The full name is not lost

A short name is what the cell says at rest. The moment a knob is
touched, the header shows that parameter's full name and its value
so nothing becomes unidentifiable, it just stops being shouted at you
eight times on one page.

touched

rnd_kit_params on Main: the cell reads PARAM at rest, and the header reads RND KIT PARAMS under the finger.

Safe to merge now

short_name is a new field — it lands in the next Schwung release. On the
currently released host (v0.12.1) it is simply ignored.

This was checked rather than assumed: for every file here, the v0.12.1
page planner was run against the module contract before and after the change
and asserted to produce byte-identical pages — same page count, same cells,
same order. Merging today changes nothing; the labels appear when users update.

Not included — these live in your DSP

78 more parameters take their metadata from the plugin's chain_params at runtime, so they
cannot be labelled from module.json. Adding short_name beside each one
in your chain_params JSON is all that is needed. Suggested values:

all_mono  ->  Mono                            # Patch
init_decay  ->  Decay                         # Patch
init_freq  ->  Init                           # Patch
same_freq  ->  Same                           # Patch
copy_a_b  ->  A→B                             # Patch
copy_b_a  ->  B→A                             # Patch - 2
swap_ab  ->  A↔B                              # Patch - 2
rnd_b_from_a  ->  A                           # Patch - 2
morph_src  ->  Src                            # Patch - 2
morph_curve  ->  Curve                        # Patch - 2
cv_click_type  ->  Type                       # Voice/Osc - 2
cv_click_smp  ->  Smp                         # Voice/Osc - 2
cv_click_lvl  ->  Lvl                         # Voice/Osc - 2
cv_click_dec  ->  Dec                         # Voice/Osc - 2
cv_xfm  ->  FM                                # Voice/Osc - 2
cv_noise_lvl  ->  Lvl                         # Voice/Osc - 3
cv_noise_dec  ->  Dec                         # Voice/Osc - 3
cv_noise_base  ->  Base                       # Voice/Osc - 3
cv_noise_width  ->  Width                     # Voice/Osc - 3
cv_noise_type  ->  Color                      # Voice/Osc - 3
cv_f1_type  ->  Type                          # Voice/Filter
cv_f2_type  ->  Type                          # Voice/Filter - 2
cv_bit  ->  Crush                             # Voice/Filter - 2
cv_rate  ->  Crush                            # Voice/Filter - 3
cv_kt1  ->  F1                                # Voice/Filter - 3
cv_kt2  ->  F2                                # Voice/Filter - 3
cv_e1_crv  ->  Curve 1                        # Voice/Env
cv_e1_rep  ->  Repeat                         # Voice/Env
cv_e2_crv  ->  Curve 2                        # Voice/Env
cv_e2_dest  ->  Dest 2                        # Voice/Env - 2
cv_e1_rep_rate  ->  E1 Rep                    # Voice/Env - 2
cv_pe_crv  ->  Curve                          # Voice/Env - 2
cv_v_e1_lvl  ->  Vel→E1                       # Voice/Env - 2
cv_v_e1_t  ->  Vel→E1                         # Voice/Env - 3
cv_v_e2_amt  ->  VelE                         # Voice/Env - 3
cv_fie1_amt  ->  FM Env1                      # Voice/Env - 3
cv_fie1_dec  ->  FM Dec 1                     # Voice/Env - 3
cv_fie2_amt  ->  FM Env2                      # Voice/Env - 3
cv_fie2_dec  ->  FM Dec 2                     # Voice/Env - 3
cv_lfo_w  ->  Wave                            # Voice/Mod
cv_lfo_r  ->  Rate                            # Voice/Mod
cv_lfo_s  ->  Sync                            # Voice/Mod
cv_lfo_d  ->  LFO                             # Voice/Mod
cv_xlfo_src  ->  Src                          # Voice/Mod
cv_trig_rst  ->  Reset                        # Voice/Mod
cv_mod_dest  ->  Dest                         # Voice/Mod
cv_mod_dpth  ->  Depth                        # Voice/Mod
cv_lfo_p  ->  Phase                           # Voice/Mod - 2
cv_lfo_pol  ->  Pola                          # Voice/Mod - 2
cv_lfo_rt  ->  Resta                          # Voice/Mod - 2
cv_mod_src  ->  Src                           # Voice/Mod - 2
cv_mod_crv  ->  Curve                         # Voice/Mod - 2
cv_lfo_w2  ->  LFO Wave                       # Voice/Mod - 2
cv_lfo_morph  ->  Morph                       # Voice/Mod - 2
cv_lvl  ->  Lvl                               # Voice/Setup
cv_tune  ->  Tune                             # Voice/Setup
cv_init  ->  Init                             # Voice/Setup
cv_pan  ->  Pan                               # Voice/Setup - 2
cv_mute  ->  Mute                             # Voice/Setup - 2
cv_fx1  ->  FX1                               # Voice/Setup - 2
... and 18 more

If a label is wrong

These are suggestions from someone reading the grid, not from the person who
wrote the synth. Change any of them in this branch, or close it — no hard
feelings either way. Layout problems are a separate matter and will come as
their own issues.

Labels each knob cell with the word that identifies the control rather than
a squeezed abbreviation of its full name. Additive only -- the released
host (v0.12.1) ignores the field, and its page planner was verified to
produce identical pages before and after.
@charlesvestal

Copy link
Copy Markdown
Author

While rendering every page of every catalogued module to review knob-grid
layout, a contract checker flagged the following here. Posting it because
it is easy to miss — none of it shows up as a crash, it shows up as a page
that quietly has less on it than you meant.

No action implied, and I have deliberately not sent a patch: each of
these is a question about intent that only you can answer.

forge

Characters the device font cannot draw

8 string(s) contain characters the 5x7 device font cannot draw (they render as nothing): copy_a_b.name: "Copy A→B"; copy_b_a.name: "Copy B→A"; swap_ab.name: "Swap A↔B"; Filter.cv_e1_to_cut.label: "E1→F1" and 4 more

Parameters no page can reach

152 chain_params are listed in no level, so no UI can reach them: pv1_level, pv1_pwm, pv1_fbk, pv1_f1_cut, pv1_f1_res, pv1_f1_drv, …


Checked with Schwung's validate_contract, against the contract the
module publishes on-device. Happy to be wrong about any of it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant