Bring the sound pages and Architecture up to date (#85, round 10)

Refactoring round 10 checked the wiki against the code since round 9.
Most of what had gone stale is about sound.

- Architecture: src/core/soundfx, src/core/instrument,
  src/editor/sound, src/editor/soundfx, src/editor/instrument and
  src/editor/routing had no row. src/core/music named five of its
  fifteen modules. The worklet was still called pitchWorklet. New
  are fxNodes, PreviewParams, nodes/shared, addLink and
  drawFloatingBox.
- Home: "Sound has no mixer, no fade" is not so since the buses, the
  Master routing and the fades of songs. The rows of Sounds and
  Songs name what the pages cover now.
- Songs: a new song snaps to 1/16 since #365, the intro still said
  the bar. "Not yet" named the Reverb (#328) and a bus without sound
  FX, both there by now.
- Instruments: "Not yet" named the Phaser (#341), which is there.
- Patterns, Songs, Instruments: swing points to #372, the end of a
  song to #373. Lines that ran past the width are wrapped.
- Every path the wiki and the README name exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-09 15:31:51 +02:00
1 parent 6b8d3e07fa
commit 1395c56efd
5 files changed
+73 -34

No files matched your search

+49 -10
@@ -141,7 +141,9 @@ src/core/graph/ graph model, NodeRegistry/NodeContext/values (a travellin
savedValues (#166: the SaveArea a run reads persistent Variables assets from and writes them to, and restoring a save through today's declaration),
stateMachine (the State node, a machine's states, the ports they become), variablePorts, propertyPorts,
typedValues (#271: what fits a struct type, and a written variable held to its declaration),
lookup (what a node may look up: behaviors, state machines, struct types, what a variable declares), keyRepeat; nodes/{events,flow,data,action,variable}/<Name>.ts
lookup (what a node may look up: behaviors, state machines, struct types, what a variable declares), keyRepeat; nodes/{events,flow,data,action,variable}/<Name>.ts,
nodes/shared (the ports several nodes share: `checkPort`, the sound pickers, `detachedPort`,
`fxParamsPort`, `playedBusPort`, `letRingPort`)
src/core/particles/ nodes (the catalogue), compile (a graph → one function per output),
emission (which particles are alive at a second — a pure rule, no state)
src/core/store/ serialize (untrusted JSON → Project), projectPlugins (which plugins a project switches on, read off the raw
@@ -160,7 +162,26 @@ src/core/music/ time (ticks, 480 to the quarter, tempo and meter, a posit
of the test's own; a song's sound items as clips, taken up mid-way where the playhead
lands, #334), pattern (#333: a pattern's notes, grid, meter, tempo and loop, held to
their rules, and the sequence it plays), song (#334: tracks and items held to their rules,
the sequence a song plays, the level of a track's bus, an item cut at a tick)
the sequence a song plays, the level of a track's bus, an item cut at a tick),
routing + routingNodes (#350: a song's routing graph, a node per track and the output;
`addLink` is the one rule for a link both routings keep), projectRouting (#351: the
Master routing, a node per sound, instrument, pattern, song and bus and the master; a
new asset takes the links most others of its type have), songBuses (the buses a song
plays on, mute and solo as gates), mixer (the master bus and `mix:<id>`), needs (a
sound FX with its parameters, or none), playbacks (what a sequence loads before it
plays), embedded (#355: what a song keeps to itself), ghosts (#339: the notes around a
pattern item), take (#342: a recorded take as 16-bit WAV, cut to where the song started)
src/core/soundfx/ the sound FX graph (#311): nodes (every effect and what it adds to a plan), compile (the
graph walked back from the Output to a plan; a parameter stays open until a voice
starts), parametricEq (#367: the bands, and the curve Web Audio plays of them); the
effects the FX worklet runs, plain classes tested in Node: pitchPlayer (#317/#346, a
phase vocoder), chip (#329), crusher (#322), phaser (#341: Phaser and Flanger),
dynamics (#326), lfo (#320: Tremolo and Vibrato); reverb (#328) and saturation (#323)
for the Web Audio nodes that do theirs
src/core/instrument/ the instrument graph (#331): nodes (Notes, Sample, Parameters, Sound FX, Envelope),
compile (one note walked back from the Output, its triggers and sources), notes (MIDI
numbers and names), envelope (#335), chipPresets (#329: Preset, Randomize and Mutate the
way sfxr makes its sounds)
src/runtime/ GameRun (one run: start, tick, `Load scene` — shared by Play and a released game, #266),
World, Entity, System interface, Input tracker, CollisionSystem (the editor run's detection),
solids (what `Move` collides with and how it slides — one-way solids let it through unless
@@ -214,14 +235,21 @@ src/viewport/ WorldViewport (the drawing of a world or a holder, the ba
PixelCels (the pixels of pixel art in memory: a painted cel is named at once, the ones the
server lacks are uploaded before a save, #130) + pixelArtPicture (every frame composed on the
CPU and laid side by side onto one canvas, so a frame is cut out like a texture frame),
SoundLibrary + pitchWorklet (the AudioWorklet that plays a way with a Pitch through
core/soundfx/pitchPlayer, a phase vocoder, #317; a note of an instrument is one voice
of what reaches its Output, each way with its own file, #331; a voice can start and be released
at a second of the audio clock, #332; a clip of a song from a second into its sound until
its end, a bus per track of a song with its level and pan, #334), music (the scheduler on
SoundLibrary + fxNodes (what each stage of a sound FX becomes as Web Audio nodes, and
how the knobs of a playing voice move) + fxWorklet (the AudioWorklet of the effects Web Audio has no node for: a
`Source` plays a sound of its own, a way with a Pitch, #317, or a Chip, #329; an `Effect`
sits between two stages, the pitch of a bus, #346, a Bitcrusher, a Phaser, a Flanger, a
Limiter, a Tremolo or a Vibrato; `Start` keeps either silent until its voice starts,
#332; what each of them works out is in core/soundfx; a note of an instrument is one
voice of what reaches its Output, each way with its own file, #331; a voice can start and
be released at a second of the audio clock, #332; a clip of a song from a second into its
sound until its end, a bus per track of a song with its level and pan, #334; the buses of
the mix and the Master routing, #325/#351), music (the scheduler on
the library's clock, its notes played by the project's instruments and its clips by
the library: the player of the Pattern and Song tabs, #333/#334, and `__gm.music`) + musicTimer
(the Web Worker whose interval is the scheduler's beat, #332), ShaderLibrary, ParticleLibrary,
(the Web Worker whose interval is the scheduler's beat, #332), takeRecorder + takeWorklet
(#342: the microphone on the library's clock, its samples with the frame they were taken
at), ShaderLibrary, ParticleLibrary,
particles (one ParticleContainer per source), tilemap (one container per layer),
shaderPicture (the picture a shader is laid over when it shades a camera's frame, #299, or
a particle field, #170: drawn anew each time into a render texture kept while its size
@@ -269,7 +297,7 @@ src/editor/ App → Editor (layout + ticker), PlaySession (the run),
TabButton (how a tab is drawn: the card of the one showing, plain weight, no pressed fill, #176),
DocumentTab (a document's tab: kind, name, close cross, a right-click menu), documents (#171: where a new document's tab goes, which one shows
after a close, a tab going on to another document — pure, so checkable without a browser),
FloatWindow + floating (#371: a document's pane lent to a window above the editor and given back on Dock; where a window opens and how it stays on the screen).
FloatWindow + floating (#371: a document's pane lent to a window above the editor and given back on Dock; where a window opens and how it stays on the screen; drawn by `drawFloatingBox` like a popup).
One editor per kind serves every open document of that kind: `Editor` points it at the one on
screen (`AssetTabEditor.showAsset`), and it keeps each document's view through `saveView`/`restoreView`
src/editor/plugins/ startPlugins (list, import, host; runs before the first project) → loader (PluginManager: syncTo makes the
@@ -362,7 +390,18 @@ src/editor/song/ SongEditor (header: Play, Grid; plays through the schedul
follows edits, #334), SongTimeline (heads, ruler and lanes in one widget, dropping assets
in, the gestures and keys) + songView (its geometry: tracks, items and their ends, the
parts of a head) + songEdit (what a gesture does to the items) + songActions (deleting
tracks and items, shared with the inspector and Delete)
tracks and items, shared with the inspector and Delete), meterView + meterDraw (#359:
the level meters of the heads), TakeMeter (#342: the input's level while recording),
ownFx (#355: a sound FX the song keeps for a song, a track or an item)
src/editor/sound/ SoundEditor (#343: header with Play, the clip's direction and fades), WaveCanvas (the
waveform, the clips as bands, the cut) + waveView (its time axis), SoundPreview (play
and length in the inspector), SoundPicker (the "+ → Sound" rows with their play mark)
src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Play and Stop), PreviewParams (the
header's fields for the parameters a tab plays with, shared with the Instrument tab),
EqEditor + eqView (#367/#370: the Parametric EQ in a tab of its own, its curve on a picture)
src/editor/instrument/ InstrumentEditor (#331: the graph over the keys, Preset, Randomize, Mutate, Audition),
PianoKeyboard + keys (the keys drawn, played by the pointer and the computer keyboard)
src/editor/routing/ RoutingEditor (#351: the Master routing tab, one per project)
src/editor/tile/ TileEditor (header + kind), TileCanvas (every tile of the block and a sample map, animated),
PictureStrip (the pictures as animation steps; its reorder maths is `dropIndex` in ui/sortable),
TilePalette (the tiles as a grid of pictures in the tilemap panel, #139)
+9 -8
@@ -21,10 +21,10 @@ Live: <https://nockal.com/game-maker/> · Widget playground: <https://nockal.com
| [Vector art](Vector-Art) | The vector art asset, canvas and shapes, the Pen and Select tools, the shape list, how a drawing is worn |
| [Pixel art](Pixel-Art) | The pixel art asset and its palette, the tools, layers and frames, onion skin and the preview, resizing, how frames are worn and where the pixels are stored |
| [Fonts](Fonts) | Uploading a typeface, what a text wears, what the editor falls back to |
| [Sounds](Sounds) | Uploading a sound, what the asset says, its tab and the cut, `Play sound` and `Stop sound`, sound FX (gain, pitch, EQ, mix, delay) and how long a voice rings on, what a pause and a stop do to a voice |
| [Sounds](Sounds) | Uploading a sound, what the asset says, its tab, the cut and clips, `Play sound` and `Stop sound`, buses, the master and the Master routing, sound FX and their nodes (filters, EQs, delay, reverb, dynamics, modulation, Bitcrusher) and how long a voice rings on, what a pause and a stop do to a voice |
| [Instruments](Instruments) | The instrument asset: Notes, Sample, Parameters, Sound FX, Envelope and Output, triggers, zones and layers, the keys of the Instrument tab, `Play note` |
| [Patterns](Patterns) | The pattern asset and its piano roll: drawing, moving and sizing notes, the grid, the ruler with start and loop, velocities, playing it in a loop |
| [Songs](Songs) | The song asset: tracks with volume, pan, mute and solo, pattern and sound items laid out, moved, cut and split, playing it in a loop |
| [Songs](Songs) | The song asset: tracks with volume, pan, mute and solo, pattern and sound items laid out, moved, cut and split, its routing, recording a take, embedded assets, playing it in a loop and from a game |
| [Animations](Animations) | Animation assets, the Animation tab, how they run |
| [Curves](Curves) | Easings drawn by hand, the Curve tab, using one on a key or a `Lerp` |
| [Tiles](Tiles) | The tile asset, plain tiles and the two autotile kinds, the pictures as animation steps, the Tile tab |
@@ -52,9 +52,10 @@ into issues #1-#50, closed ones included, each carrying the commits it was filed
## Not yet
A touch-optimised layout. Sound has no mixer, no fade and no
`Set volume` on a playing voice (see [Sounds](Sounds)). Animations have no events on the
timeline and no preview in the Scene tab. Slicing cuts a regular grid only — no detection of where the sprites actually
sit on the sheet. Unreferenced image files are never collected by themselves — deliberately, since the image
picker offers them again; a file goes only when its owner (or an administrator) presses
**Delete** in the picker and no project uses it.
A touch-optimised layout. A voice that is already playing has no volume of its own to change:
`Set bus volume` turns a whole bus up or down (see [Sounds](Sounds#buses-and-the-master)).
Animations have no events on the timeline and no preview in the Scene tab. Slicing cuts a regular
grid only — no detection of where the sprites actually sit on the sheet. Unreferenced image files
are never collected by themselves — deliberately, since the image picker offers them again; a file
goes only when its owner (or an administrator) presses **Delete** in the picker and no project
uses it.
+6 -7
@@ -1,9 +1,9 @@
An **instrument** (**+ → Instrument**, #331) makes a note a sound. It is a node graph like a
[sound FX](Sounds#sound-fx): **Notes** nodes bring the note in, a **Sample** plays a sound for it
or a **Chip** makes one the way old game consoles did (#329), the effects of a sound FX shape it
and the **Output** is what is heard. It is the first piece of
the music tools planned in #330: a [pattern](Patterns) (#333) plays one, and a [song](Songs) (#334) lays patterns out.
A behavior plays one with **Play note**, and the tab plays it from its keys.
and the **Output** is what is heard. It is the first piece of the music tools planned in #330: a
[pattern](Patterns) (#333) plays one, and a [song](Songs) (#334) lays patterns out. A behavior
plays one with **Play note**, and the tab plays it from its keys.
Instruments are listed under **Instruments** in the asset panel, patterns under **Patterns**.
A new one starts as *Notes* → *Sample* → *Output*: every note from C4 to B4 plays the Sample,
@@ -352,7 +352,6 @@ the game's, so a slow frame or a busy page never moves a note. The Pattern tab p
## Not yet
No swing. No view of the waveform a Chip makes, no import of sfxr or jsfxr codes, no WAV export
(#340), no phaser (#341). An Envelope
shapes notes of an instrument only, not a sound played through a sound FX. Notes can not be played from an `.mid` file or a MIDI
keyboard.
No swing (#372). No view of the waveform a Chip makes, no import of sfxr or jsfxr codes, no WAV
export (#340). An Envelope shapes notes of an instrument only, not a sound played through a sound
FX. Notes can not be played from an `.mid` file or a MIDI keyboard.
+3 -3
@@ -183,6 +183,6 @@ once it was gone by itself after its bar.
## Not yet
No ghost notes from another pattern without a song, no lanes for
pitch bend or an instrument's parameters (automation, #337), no swing. The computer keyboard does
not play notes in this tab as it does in the Instrument tab, and there is no step input.
No ghost notes from another pattern without a song, no lanes for pitch bend or an instrument's
parameters (automation, #337), no swing (#372). The computer keyboard does not play notes in this
tab as it does in the Instrument tab, and there is no step input.
+6 -6
@@ -4,7 +4,7 @@ pattern (#333). Several songs and tracks can use the same pattern: an edit to it
it lies.
Songs are listed under **Songs** in the asset panel. A new song has one empty track, 120 BPM in
4/4, and items snap to the bar.
4/4, and items snap to 1/16.
## What a song says
@@ -381,8 +381,8 @@ bus. Stop let it go. An item's *Sound FX* offered *From the asset*, *None* and t
## Not yet
A link sends at one volume; it cannot be moved over time, and there is no reverb to send to yet
(#328). Nothing tells a graph that a song played once has ended, and there is no node that changes the
volume of a playing song. No start at a marker (#338), no automation (#337), no song inside a song, no held note (drone) as an item. A variation of a pattern for one item is *Embed a copy* in the
item's menu (see [Embedded assets](#embedded-assets)). A bus cannot have a sound FX of its own,
and a song cannot keep an instrument to itself.
A link sends at one volume; it cannot be moved over time. Nothing tells a graph that a song played
once has ended (#373), and there is no node that changes the volume of a playing song. No start at a
marker (#338), no automation (#337), no swing (#372), no song inside a song, no held note (drone) as
an item. A variation of a pattern for one item is *Embed a copy* in the item's menu (see
[Embedded assets](#embedded-assets)). A song cannot keep an instrument to itself.