diff --git a/Architecture.md b/Architecture.md index ec0857b..39de497 100644 --- a/Architecture.md +++ b/Architecture.md @@ -130,10 +130,10 @@ web/index.html Vite source page (dev) index.html built page web/play.html a released game (#266) play.html built page (generated, served) src/main.ts, play.ts the two entries; page.ts is the canvas both are (the WebGL context, root, resize) src/core/model/ Project (object holders), Asset + AssetTypes, SceneObject (and what a list calls one: - `objectName`, `groupName`), Properties (value types, and the walks over a nested value: `mapNested`, a struct field taken out or renamed), hierarchy, walk (generic parent/child walks), instance (container content resolved from its template), usages (where an asset is used), container (the cycle guard), placement (what may be dropped where), texture (frames, the slice grid, a frame's collision outlines, and the nine-slice and sort line of any picture, #308), cutTarget (which picture a nine-slice or sort line is set on: a texture frame, or pixel art and vector art as a whole, #308), frameOutline (#193: a frame's outlines as a collider wears them, centred, a pixel to a unit, cut into pieces once per drawn list), traceCollision (#161: a frame's outlines read off its picture — the pixels from an alpha threshold on are solid, each 4-connected island is walked round along the pixel edges and cut down to a few corners without ever crossing itself; crumbs below 1 % of the frame drop out), generated (pictures that are drawn rather than uploaded, #185: the key `gen:@`, the register of readers that tell the picture path an asset's canvas size and revision, and the `fingerprint` pixel art and vector art make their revision with), vectorart (#129: the canvas as a property, which ring is worth drawing, and the revision as a fingerprint of the drawing rather than a counter, a texture fill's picture included) + vectorPath (what a shape draws, as plain commands: closed rings fill, every ring strokes, a segment is a line while neither of its ends carries a handle; a paint resolved to sorted stops or the picture it names) + vectorPaint (#186: gradients and texture fills — where a paint lies when it is switched on, the colour between two stops, adding, moving and removing a stop, a paint moved with its shape, and the rule that a texture fill takes uploaded pictures only) + vectorBoolean (#187: union, subtract, intersect and exclude on the sampled outlines, each shape read by the even-odd rule; the result rings in the order Pixi's hole detection needs, every outline followed by its holes and preceded by the islands inside them) + vectorCurves (#208: every sampled point remembers its cubic and its `t`, so a run of result points along one cubic becomes that cubic again, cut with de Casteljau), pixelart (#130: the palette a picture is painted in, how the layers of a frame come together, the sheet of all frames, a frame id read as a cut of it, and the revision) + pixelCel (the file of one layer on one frame, and its SHA-256 name worked out in the browser) + pixelDraw (what the tools do to the indices: brush, line, rectangle, ellipse, fill, resize about an anchor, merge, a palette colour taken out) + pixelEdit (every edit of layers, frames and cels as a function from one state to the next), polygon (an outline checked, cut into convex pieces and clipped to a rectangle), tile (the three kinds and their block shapes, reading a tile's pictures, the animation step), autotile (which quarter tile a neighbourhood asks for, the 47/16 tiles a block produces, 1 for a plain tile), tilemap (the cells of a layer, which neighbours a cell is joined to, the cells a stroke or a rectangle covers), tilemapCollision (the solid cells of a map, drawn in or out by their tile's collision scale and merged into rectangles, one group per one-way angle and per surface (`tileMaterials`, #193), the outlined cells as polygons — an autotile's outlines cut into its quarters and pieced together per cell like its picture —, where one sits in the world, and which cells of a placed map a world rectangle can reach, in cells (`cellsWithin`, #184)), tilemapMemo (what a map's cells work out to, kept while they hold the same: a version per cell map compared cell by cell, since strokes paint in place), animation (which frame at time t, a row's value there, what a row may aim at, the players on an object; KeyRef and its lookups) + animationPreview (the root at a frame, written into copies), curve (#247: a drawn easing evaluated at t — each segment a cubic solved for t by bisection, held to its rules by `sanitizedCurve`: ends at 0 and 1, no point overtaking another, no handle past its neighbour — and which keys and `Lerp` nodes use one) + curvePresets (the built-in eases traced as curves, a segment halved only where it strays), graphLookup (what a graph sees of the project: behaviors to run, state machines to read, curves to ease along), structTypes (#253: Struct assets as types — every typed struct variable, struct field and `Pack`/`Expand` found and brought in line with its asset, a renamed field carried through every value first, the cycle rule), Scope (how long a shared value lives: per instance, one for the run, or one per scene and rebuilt with every scene that loads, #164 — for a state machine's current state and for the values of a Variables asset), video (#402: a video or a clip of it by id, the stretch a clip plays inside its video, and the key `video:#~~~` a playing video goes by where a picture is named by `TextureRef.file`), collisionLayers (which colliders may meet: the project's named layers, a collider's layer and mask, and the one rule `layersMeet` the engine, Solids and the event pair search all answer by), renderLayers (#302: which cameras see an object — the project's named render layers, an object's own choice or its parent's, a camera's `Sees` and `Overlay`) -src/core/properties/ PropertySchema, kinds (one row per value kind), listItems (an item's kind, read off its value), resolve (the only override merge), deviation (what is gold), collider/camera/bounds geometry, clip (the region clip areas cut each object to, a convex polygon, #260) (with the side a one-way collider blocks from, and the rectangle around a shape a broad phase looks at first, #184), convex (capsules and polygons: rounded convex pieces against each other), ray (where a ray meets a shape, in double precision), rigidbody (what the engine reads off a rigidbody, a collider's material and the scene), joint (what it reads off a joint: its settings, where its far end is, its length and a hinge's limits, #154), aspect, enabled, editorRun, assetRef/textureRef (how a reference reads), declaredRows (the row a Property node declares in a shader or particle graph, and the params that node has in both) -src/core/util/ list (take out, put back and move an item — what a command's undo is made of), vec (dot, the closest point on a segment — shared by the collider maths, the outline hit area and the polygon grips; a cubic Bezier at `t` and cut in two at `t` — shared by vector art, its Boolean operations and the curve grips), color (`mixColor`, channel by channel — keys of an animation, stops of a gradient, the particles' Mix colour), recorder (#253: assignments taken back last first — the undo of an edit whose reach is not known in advance) -src/core/commands/ undoable commands (pixelArtCommands: one command runs any pixel art edit and keeps the state before it, #130), CommandStack, SetBagValueCommand base, RenameCommand base (undone by renaming back: variable, struct field, port), MoveCommand base (undone by moving back: tile picture, tilemap layer, vector shape), vectorArtCommands (#129: the shapes of a drawing, one gesture one command), one import command shape for texture/font/sound, require.ts (validated lookups, and what an instance may not change), naming.ts + `objectName`, `groupName`), Properties (value types, and the walks over a nested value: `mapNested`, a struct field taken out or renamed), hierarchy, walk (generic parent/child walks), instance (container content resolved from its template), usages (where an asset is used), container (the cycle guard), placement (what may be dropped where), texture (frames, the slice grid, a frame's collision outlines, and the nine-slice and sort line of any picture, #308), cutTarget (which picture a nine-slice or sort line is set on: a texture frame, or pixel art and vector art as a whole, #308), frameOutline (#193: a frame's outlines as a collider wears them, centred, a pixel to a unit, cut into pieces once per drawn list), traceCollision (#161: a frame's outlines read off its picture — the pixels from an alpha threshold on are solid, each 4-connected island is walked round along the pixel edges and cut down to a few corners without ever crossing itself; crumbs below 1 % of the frame drop out), generated (pictures that are drawn rather than uploaded, #185: the key `gen:@`, the register of readers that tell the picture path an asset's canvas size and revision, and the `fingerprint` pixel art and vector art make their revision with), vectorart (#129: the canvas as a property, which ring is worth drawing, and the revision as a fingerprint of the drawing rather than a counter, a texture fill's picture included) + vectorPath (what a shape draws, as plain commands: closed rings fill, every ring strokes, a segment is a line while neither of its ends carries a handle; a paint resolved to sorted stops or the picture it names) + vectorPaint (#186: gradients and texture fills — where a paint lies when it is switched on, the colour between two stops, adding, moving and removing a stop, a paint moved with its shape, and the rule that a texture fill takes uploaded pictures only) + vectorBoolean (#187: union, subtract, intersect and exclude on the sampled outlines, each shape read by the even-odd rule; the result rings in the order Pixi's hole detection needs, every outline followed by its holes and preceded by the islands inside them) + vectorCurves (#208: every sampled point remembers its cubic and its `t`, so a run of result points along one cubic becomes that cubic again, cut with de Casteljau), pixelart (#130: the palette a picture is painted in, how the layers of a frame come together, the sheet of all frames, a frame id read as a cut of it, and the revision) + pixelCel (the file of one layer on one frame, and its SHA-256 name worked out in the browser) + pixelDraw (what the tools do to the indices: brush, line, rectangle, ellipse, fill, resize about an anchor, merge, a palette colour taken out) + pixelEdit (every edit of layers, frames and cels as a function from one state to the next), polygon (an outline checked, cut into convex pieces and clipped to a rectangle), tile (the three kinds and their block shapes, reading a tile's pictures, the animation step), autotile (which quarter tile a neighbourhood asks for, the 47/16 tiles a block produces, 1 for a plain tile), tilemap (the cells of a layer, which neighbours a cell is joined to, the cells a stroke or a rectangle covers), tilemapCollision (the solid cells of a map, drawn in or out by their tile's collision scale and merged into rectangles, one group per one-way angle and per surface (`tileMaterials`, #193), the outlined cells as polygons — an autotile's outlines cut into its quarters and pieced together per cell like its picture —, where one sits in the world, and which cells of a placed map a world rectangle can reach, in cells (`cellsWithin`, #184)), tilemapMemo (what a map's cells work out to, kept while they hold the same: a version per cell map compared cell by cell, since strokes paint in place), animation (which frame at time t, a row's value there, what a row may aim at, the players on an object; KeyRef and its lookups) + animationPreview (the root at a frame, written into copies), curve (#247: a drawn easing evaluated at t — each segment a cubic solved for t by bisection, held to its rules by `sanitizedCurve`: ends at 0 and 1, no point overtaking another, no handle past its neighbour — and which keys and `Lerp` nodes use one) + curvePresets (the built-in eases traced as curves, a segment halved only where it strays), graphLookup (what a graph sees of the project: behaviors to run, state machines to read, curves to ease along), structTypes (#253: Struct assets as types — every typed struct variable, struct field and `Pack`/`Expand` found and brought in line with its asset, a renamed field carried through every value first, the cycle rule), Scope (how long a shared value lives: per instance, one for the run, or one per scene and rebuilt with every scene that loads, #164 — for a state machine's current state and for the values of a Variables asset), video (#402: a video or a clip of it by id, the stretch a clip plays inside its video, and the key `video:#~~~` a playing video goes by where a picture is named by `TextureRef.file`), composition (#417: objects along a time axis in frames of the composition's own fps; `compositionAt` is the one rule of what runs at a frame, for the tab and the game alike, `compositionHolder` writes it out as objects for a view) + compositionEdit (what the Composition tab does to items and clips, as plain functions on lists: items of a track may overlap, clips may not, and where a paste lands), collisionLayers (which colliders may meet: the project's named layers, a collider's layer and mask, and the one rule `layersMeet` the engine, Solids and the event pair search all answer by), renderLayers (#302: which cameras see an object — the project's named render layers, an object's own choice or its parent's, a camera's `Sees` and `Overlay`) +src/core/properties/ PropertySchema, kinds (one row per value kind), listItems (an item's kind, read off its value), resolve (the only override merge), deviation (what is gold), collider/camera/bounds geometry, clip (the region clip areas cut each object to, a convex polygon, #260) (with the side a one-way collider blocks from, and the rectangle around a shape a broad phase looks at first, #184), convex (capsules and polygons: rounded convex pieces against each other), ray (where a ray meets a shape, in double precision), rigidbody (what the engine reads off a rigidbody, a collider's material and the scene), joint (what it reads off a joint: its settings, where its far end is, its length and a hinge's limits, #154), aspect, enabled, editorRun, assetRef/textureRef (how a reference reads), videos (#402/#404: a video's rows and a sprite's Video clock, time and volume), compositions (#417: a composition's rows, apart from its model), declaredRows (the row a Property node declares in a shader or particle graph, and the params that node has in both) +src/core/util/ list (take out, put back and move an item — what a command's undo is made of), vec (dot, the closest point on a segment — shared by the collider maths, the outline hit area and the polygon grips; a cubic Bezier at `t` and cut in two at `t` — shared by vector art, its Boolean operations and the curve grips), color (`mixColor`, channel by channel — keys of an animation, stops of a gradient, the particles' Mix colour), recorder (#253: assignments taken back last first — the undo of an edit whose reach is not known in advance), bytes (`concatBytes`, shared by the Ogg and Matroska writers) +src/core/commands/ undoable commands (pixelArtCommands: one command runs any pixel art edit and keeps the state before it, #130), CommandStack, SetBagValueCommand base, RenameCommand base (undone by renaming back: variable, struct field, port), MoveCommand base (undone by moving back: tile picture, tilemap layer, vector shape), vectorArtCommands (#129: the shapes of a drawing, one gesture one command), compositionCommands (#417: tracks, items and clips written whole once the pointer lets go, an item together with its object) + compositionSprites (#419: the sprites a composition keeps to itself, held to that after every edit), one import command shape for texture/font/sound, require.ts (validated lookups, and what an instance may not change), naming.ts src/core/graph/ graph model, NodeRegistry/NodeContext/values (a travelling list may hold live objects, #157; liveObjects' `withoutObjects` empties them on every way out of the run, #238), interpreter, dropTarget, nested (behaviors as nodes), emitGraph (the walk both graph compilers share: each node once, in dependency order; cycles and property names reported), @@ -180,16 +180,29 @@ src/core/music/ time (ticks, 480 to the quarter, tempo and meter, a posit ogg (#340: Opus in Ogg, the pages around an encoder's packets and back, also read as the bytes come in, #349), streams (#349: which names stream from which copy, which clips decode from their own, what copies are missing, how a played sound walks its copy) + streamQueue (#349: the - samples a streamed sound plays from on the worklet, read at the rate of the context) + samples a streamed sound plays from on the worklet, read at the rate of the context), + compositionAudio (#418: the audio items of a composition as sequences on the audio + clock, each on a bus of its own, its fades ramps of that bus' level) +src/core/recording/ recording (#405: what Start recording asks for and the rules a recording is made by — + size, name, H.264 profile, when a frame is taken, the steady pace of one not in real + time, #423), matroska (the `.mkv` writer: the encoders' frames and Opus packets in + clusters as they come, the head at the end) + avcColour (the colour written into + the stream's SPS, where a player that reads only the stream finds it), + editorRecording (main menu → Start recording…: what the dialog offers and the size + and sharpness a choice comes out at), cursors + cursors/ (the mouse pointer an editor + recording draws, one SVG per shape with its hot spot) +src/core/site.ts the path the site is served under (`/feuerwerk/`, #422) and the data paths built from it 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; a tapped node gets a `tap` in front and behind, #374), parametricEq (#367: the bands, the curve Web Audio plays of them, and its axes); 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) + dynamics (#326), lfo (#320: Tremolo and Vibrato), acid (#421: the + Acid's saw or square through a resonant low-pass, sample by sample); 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), +src/core/instrument/ the instrument graph (#331): nodes (Notes, Sample, Parameters, Sound FX, Envelope, + Chip, Acid), 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) @@ -203,7 +216,11 @@ src/runtime/ GameRun (one run: start, tick, `Load scene` — shared by order, state changes and saves) + behaviorPulses (the pulses one frame's events send into an instance: keys, timers, collisions, finished animations) + behaviorContext (the `NodeContext` a node is handed: world, collisions and rays, physics, sound, the clock), - Audio (the AudioSink a run plays into — the counterpart of Input on the way out) + Audio (the AudioSink a run plays into — the counterpart of Input on the way out), + audioSwitch (#423: the run's sound goes to the live sink until a recording not in real + time diverts it into its own), CompositionSystem (#417: the compositions playing, the + objects of their items and the videos they drive) + compositionSound (#418: the sound + of one composition, started again where the picture is after a hitch) src/runtime/physics/ engine (loads Rapier once, reports its state, converts between pixels and metres), PhysicsSystem (Play's collisions: one engine body per rigidbody, free collider and tilemap, the fixed step, the poses handed back, the contact pairs sorted into events and their @@ -217,7 +234,8 @@ src/runtime/physics/ engine (loads Rapier once, reports its state, converts be src/ui/ widget toolkit (generic, knows nothing about assets); fonts (the faces the editor ships: Source Sans 3 in 400, 500 and 600, Source Code Pro 400, Latin only, #202/#214/#273), icons + Icon (the menu's tick boxes and current-entry dot as SVG files, and a widget that shows one file - on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a `Grip` (the row's mark, wrapped: dots once it drags, lit under the pointer while the block is washed), a block being every row it covers, #310); Knob + knob (#378: a slider bent into a circle, its name above and a number field below, or a chrome dial of any size, #379; where a value sits on the turn and what a drag or the wheel makes of it, kept apart so it is measured without a canvas) + on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a `Grip` (the row's mark, wrapped: dots once it drags, lit under the pointer while the block is washed), a block being every row it covers, #310); TextPool (the texts of a ruler or a row of names: made as they are wanted, a text that + already shows a string keeps it, #360), download; Knob + knob (#378: a slider bent into a circle, its name above and a number field below, or a chrome dial of any size, #379; where a value sits on the turn and what a drag or the wheel makes of it, kept apart so it is measured without a canvas) src/viewport/ WorldViewport (the drawing of a world or a holder, the base of every view; it draws from a `ViewSource` — the project and word of a change — so a released game draws without the editor, #266; a view through a camera keeps only what that camera `Sees` and lays one @@ -247,6 +265,14 @@ src/viewport/ WorldViewport (the drawing of a world or a holder, the ba the video has shown its first frame (`openVideo`), a clip sent back to its start at its end, a run that starts every player over and hears it through the master, a player nobody asked for in 2 s let go) + the poster library of the video picker, + videoFollow (#404: how a driven video keeps up with the time its wearer asks for, playing + at that speed and nudged, holding and seeking only where it stands or jumps) + videoSeek + (only the newest wish waits while a seek runs), + GameRecorder (#405: the game view recorded by a behavior — the picture read back from + the GPU, `PictureReader`, encoded in a `RecordingTake`, the sound from a tap of the + master or, not in real time, from `SteadySound` on an offline context, #423) + + backgroundBeat + backgroundTimers + timerWorker (a recording goes on behind another + tab: a worker's beat ticks the editor and a worker's timers keep their pace), 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), @@ -304,7 +330,7 @@ src/editor/ App → Editor (layout + ticker), PlaySession (the run), the commands are `core/commands/groupCommands`), debugHook (installs `window.__gm`; the hooks are grouped by area in debug/: ui, scene, graph, documents, pixel art, vector art, - render — `tools/` sees one flat object as before), + render, sound, pattern, song, routing, bake, video, curve — `tools/` sees one flat object), textProbe (finding widgets by their text — the ground floor of the test hook, shared with the sign-in screen), auth/LoginScreen + auth/PasswordDialog + auth/loginRules + auth/FormStatus (the sign-in screen and the change-password dialog in the canvas, what either may complain about, and the warning line and busy state both show, #177/#182), autosave, polygonEdit (points of an outline: what is under the pointer, whether a point is inside, @@ -318,6 +344,10 @@ src/editor/ App → Editor (layout + ticker), PlaySession (the run), the video one shows a conversion on its way and asks again until it is done, #402), video/ (#402: VideoEditor + VideoCanvas, the Video tab — preview, ruler, clip strip and track on the time axis of the Sound tab's `waveView`; videoInfo, what a video is in words), + EditorRecorder + EditorRecordingDialog + editorRecordingSettings + recordingUploads + (main menu → Start recording…: the whole editor recorded with the pointer drawn in, + the last choice kept in the browser, the file's way into the project), + editorCursors (the editor's pointer from the files a recording draws), framing (fit/marquee/snap maths), FormDialog (the small modal forms: label column, Cancel + confirm, one open at a time; `dialogButtons` is the closing row every dialog shares, the pickers' included), AssetTabEditor (the shared shell of the asset tabs), TabHeader (the bar across the top of a tab — asset tabs, the plugins and accounts lists, NodeBoard; drawn by `drawHeaderBar` like the toolbar and the breadcrumb), TabStrip + tabRow (the tab row and what it does when the tabs outgrow it; plugin tabs are inserted at run time), assetTabs (which asset kind opens into which tab, and so which kind has an editor at all), @@ -360,7 +390,7 @@ src/editor/inspector/ Inspector panel, host (what a section builds into, and `e every variable), shapeSection (the shapes of a vector drawing: the list, the four order buttons and the style of the picked one, #129; Fill type and Line type with the stop bar, the picked stop's rows or the texture, #186), portSection, aspectAction, - objectQueries/vectorRows/parentRow, cutSection (the Nine-slice and Sorting rows, shared by the frame and the drawing inspectors, #308), + objectQueries/vectorRows/parentRow, cutSection (the Nine-slice and Sorting rows, shared by the frame and the drawing inspectors, #308), compositionSection (#417: a track, an item with its timing and audio, a clip), SpritePreview (a sprite as `syncSpriteMesh` draws it in the scene) + previewFit (whole device pixels per unit, the corner on one) src/editor/panels/ AssetPanel, assetGroups (the categories, the type groups in them and their order, #176), assetIcons (one SVG per @@ -404,6 +434,11 @@ src/editor/vectorart/ VectorArtEditor (header: the three tools, the picked poin src/editor/animation/ AnimationEditor (header, preview over timeline), PreviewCanvas (the root at the playhead, a FreeViewport over animationPreview.ts), TimelineCanvas (rows, keys, ruler, clipboard), timelineView (its geometry), RowDialog + FramesDialog (FormDialogs) +src/editor/composition/ CompositionEditor (#417: header with Add track and Play, the picture above the timeline), + CompositionCanvas (what is alive at the playhead, drawn and edited like a container's + template), CompositionTimeline (heads, ruler, items and clips in one widget, assets + dropped in, the gestures and keys) + compositionView (its geometry, the Song tab's with + frames for ticks) src/editor/curve/ CurveEditor (header: Preset, the picked point's type, Preview, #247), CurveCanvas (the curve as a graph drawn from curveValue, points and handles edited with the vector art gestures, the preview dot and its rail) + curveView (the curve laid onto a picture for those gestures and @@ -414,7 +449,8 @@ src/editor/pattern/ PatternEditor (header: Play, Grid, Bake; plays through th src/editor/music/ timeView (the time axis: ticks to pixels, zoom, the lines of bars, beats and grid) + TimeRuler (bars, loop, start and playhead) — for the piano roll and the song tab — + transport (one piece plays at a time: a song or a pattern, #334) + BakeButton (#340: bakes the pattern - or song shown, lit while its bake holds) + or song shown, lit while its bake holds) + dropWhenSaved (a file a bake or a stream copy + left behind, deleted once no saved project names it) src/editor/song/ SongEditor (header: Play, Grid, Bake; plays through the scheduler, sets the tracks' buses and 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 @@ -423,7 +459,8 @@ src/editor/song/ SongEditor (header: Play, Grid, Bake; plays through the s 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 + waveform, the clips as bands, the cut) + waveView (its time axis) + clipStrip (the + clips' names in their bands, shared with the Video tab), SoundPreview (play and length in the inspector), SoundPicker (the "+ → Sound" rows with their play mark), StreamKeeper (#349: the copies streamed sounds and every clip play from, made in the browser and let go once no longer wanted) @@ -439,24 +476,26 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla ratio to drag, and the levels in and out tinted where it squeezes), CompressorPanel + hardwareView (#379: the Compressor as a device, its meter, LEDs and plate worked out apart from the drawing), CompressorFace + nodeFaces (#380: the panel as what a - Compressor node shows in the graph, #381 the EQ's as well), KnobPanel + KnobFace (#384: - the Gain as an orange plate with one knob, `drawPlate` shared with the Compressor; - #390 the Pitch in green and the Mix in blue with a lever, #392 the Pan in cyan, - each a `KnobDevice`), + Compressor node shows in the graph, #381 the EQ's as well), deviceParts (what every + device is built of: the brushed plate and its engraved names, a row of chrome knobs + with their captions, the bezel, lamps, levers and type buttons) + deviceFace (what + every face does with its node: finds it, tells what a link feeds, turns a knob as + one undo step, hears its tap, loads its sound's picture), KnobPanel + KnobFace (#384: + the Gain as an orange plate with one knob; #390 the Pitch in green and the Mix in + blue with a lever, #392 the Pan in cyan, each a `KnobDevice`), ChipPanel + ChipFace + chipView (#386: the Chip of an instrument as a device, its - wave and its pitch over a note worked out apart from the drawing, the - Compressor's `Lever` for "follow note"), EnvelopePanel + EnvelopeFace + envelopeView - (#388: the Envelope as a device, its curve over a note with squeezed time worked - out apart from the drawing), ReverbPanel + ReverbFace + reverbView (#389: the - Reverb as a device, its tail as rings on a round screen worked out apart from - the drawing), DelayPanel + DelayFace + delayView (#393: the Delay as a device, - its echoes as bars on a screen and the light that runs over them at their beat - worked out apart from the drawing), SaturationPanel + SaturationFace + - saturationView (#396: the Saturation as a device, the wave a sine comes out as - and the heat it glows with worked out apart from the drawing; its type buttons - are the Reverb's `PickButton`), LimiterPanel + LimiterFace + limiterView (#397: - the Limiter as a device, what it takes away read from its taps and caught from - the start of a sound, held once it ends, worked out apart from the drawing), + wave and its pitch over a note worked out apart from the drawing), EnvelopePanel + + EnvelopeFace + envelopeView (#388: the Envelope as a device, its curve over a note + with squeezed time worked out apart from the drawing), ReverbPanel + ReverbFace + + reverbView (#389: the Reverb as a device, its tail as rings on a round screen + worked out apart from the drawing), DelayPanel + DelayFace + delayView (#393: the + Delay as a device, its echoes as bars on a screen and the light that runs over them + at their beat worked out apart from the drawing), SaturationPanel + + SaturationFace + saturationView (#396: the Saturation as a device, the wave a sine + comes out as and the heat it glows with worked out apart from the drawing), + LimiterPanel + LimiterFace + limiterView (#397: the Limiter as a device, what it + takes away read from its taps and caught from the start of a sound, held once it + ends, worked out apart from the drawing), ModulationPanel + ModulationFace + modulationView (#398: the Tremolo, the Vibrato, the Phaser and the Flanger as one kind of device, the volume or the pitch over time, or the response with a lane of where it goes, worked out @@ -467,7 +506,10 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla SamplePanel + SampleFace + sampleView (#400: the Sample as a device, the waveform of its sound or clip from the library's peaks, cut into what is played once, looped, played after the note and never heard, worked out - apart from the drawing), + apart from the drawing), AcidPanel + AcidFace + acidView (#421: the Acid as + a device, the filter where it rests and at the top of a note's sweep), + `knobGroups` in hardwareView (the row of grouped small knobs the Chip, the Delay + and the Acid share), nodeParamDrag (a knob's drag as one undo step, for the tab and the node, several settings at once since #389), nodeTabs (which nodes open a tab of their own) diff --git a/Home.md b/Home.md index bc735cb..032d693 100644 --- a/Home.md +++ b/Home.md @@ -23,9 +23,10 @@ Live: · Widget playground: