Show a Pan node as a one-knob device in cyan (#392)
game-maker / gate (push) Successful in 4m13s
game-maker / suite (push) Failing after 15m23s

After the Gain, the Pitch and the Mix, the Pan is the next node that
is just one number. It now gets the same device in the graph instead
of a row for its pan.

- PAN_DEVICE: the Gain's 160x160 plate in cyan with one bipolar knob
  for Pan. The middle stands straight up, and the turn goes evenly to
  L and R, which are engraved at its ends like A and B on the Mix.
- PAN_TAPER in hardwareView is 1, so left and right are heard alike.
  Device and unit test read the same constant.
- PAN_ROW is exported from the core, so the knob has the node's range.
- A linked Pan greys the knob, as for the Gain.
- The test hook __gm.pan.panel returns the same shape as the Gain's.
- No instrument preset uses a Pan, so no preset columns change.

Tests:
- Unit hardware-view: 17 tests, 2 new (the turn, and L and R inside
  the plate and clear of the screws). Counter-check: PAN_TAPER 2
  turns the turn test red.
- e2e 34 (melektaus-atx): 135 checks, 1 new.
- Gate (melektaus-atx): 287 files, 4399 tests.
- Pictures looked at: Gain, Pitch, Mix and Pan in a row, Pan at -0.35.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-10 18:26:17 +02:00
1 parent fe4e0d9f1a
commit 389d9555fa
8 files changed
+102 -12

No files matched your search

+3 -3
View File
@@ -999,7 +999,7 @@ export const SoundFxFlanger: SoundFxNodeDef = effect(
'own',
);
const PAN = numberRow('pan', 'Pan', -1, 1, 0.01);
export const PAN_ROW = numberRow('pan', 'Pan', -1, 1, 0.01);
export const SoundFxPan: SoundFxNodeDef = effect(
{
@@ -1009,11 +1009,11 @@ export const SoundFxPan: SoundFxNodeDef = effect(
description:
'Moves the sound left or right: -1 is all left, 1 all right, 0 leaves it in the middle. A mono sound is spread on both sides and then moved. A stereo sound keeps the side it goes to, and the other side moves over into it: at 1 both sides are heard on the right. It can change while the sound plays, and in an instrument an Envelope can move it.' +
BLENDS,
inputs: [audioIn, followingIn(PAN)],
inputs: [audioIn, followingIn(PAN_ROW)],
outputs: [audioOut],
params: [],
emit: (sounds, amounts) => {
const pan = held(amounts.pan, PAN);
const pan = held(amounts.pan, PAN_ROW);
return withStages(arriving(sounds), isNone(pan) ? [] : [{ kind: 'pan', pan }]);
},
},