Changelog
What changed in the JamChip plugin, newest first. The format is
Keep a Changelog and the versions are
semantic. The version lives in
addons/jamchip/plugin.cfg; pnpm release VERSION cuts Unreleased into a
dated section and tags plugin/vVERSION. A line lands here with the pull
request that earns it: a feat under Added, a fix under Fixed, a !
under Changed or Removed; docs/PROCESS.md has the rule.
Unreleased
Changed
- The SFX tab’s picker holds ten actions, Tick, Confirm, Deny, Pickup, Jump,
Hit, Boom, Swell, Warn and Drop, then Random, in place of the seven
actions of 0.1.0. An action sets the shape of a sound, which way the
pitch goes, the envelope, the arpeggio, the length, and Generate rolls
its character, so ten Jumps are ten different waves and pitches that all
jump. The six feels, Bright, Calm, Tense, Sad, Fast and Big, are the
tracker’s: the loop, the kit and the rack’s Generated instruments use
them, through
ChiptuneSfx.generate_feel.ChiptuneSfx.FEELSis gone and the one list isChiptuneSongGenerator.FEELS. Old.sfx.tresfiles open and play as they did,ChiptuneSfx.generatestill answers a feel’s name, and an unknown word gives Tick. The example sounds are rolled again from an action each.
Added
-
The SFX tab explains itself. Every rack row answers a hover with its own sentence, “60 is middle C” among them, over the drag line, and the stage says what Generate does. The strip carries a status line that says a save, an export or a refusal, and an Edit menu with Undo and Redo. The context bar keeps Play, Stop and Loop on one row when the dock is narrow, has no word before either picker, and a separator before Random; the arpeggio’s Steps field is a Custom… chip that opens a row of step spins, eight at most, each two octaves either side; narrow, the stage takes the larger share, and Motion starts folded.
-
The companion has a Web preset.
pnpm --filter companion export webexports the three tabs toapps/companion/build/web/, packs the wasm under the Worker’s asset cap, and runs the build check and the browser’s own inside the build in a headless Chrome: a document of each kind is saved to the browser’s storage, survives the tab being closed, downloads throughJavaScriptBridgeand opens back from a file input or from?open=on the link. A Worker of its own serves it,.github/workflows/companion.ymldeploys it on every merge, anddocs/notes/web-export-spike-2026-09.mdhas what it weighs and how long it takes to open. Nothing in the plugin changed for it. -
A save reaches the running game. Run the game from the editor, draw in the Pixel tab or edit a sound in the SFX tab, Ctrl+S, and every
PixelSprite2D,PixelSpriteTexture,PixelSpriteFramesandChiptuneAudioStreamholding that file takes the new document in place, on the animation and frame it was on, with no restart. A document that changes on disk behind the editor reaches the game the same way once the editor has scanned it. The path goes over the debugger connection the editor already holds; an exported build carries the autoloadJamChipLiveand nothing arrives. Songs wait on streaming playback. The project settingjamchip/live/push_to_gameturns the send off. -
An export ships the runtime alone. With the plugin enabled, exporting a project carries the runtime half of each module,
runtime model paint format palettes iconsfrom pixel andruntime model synth format iconsfrom chiptune, and the kit scripts they open, and leaves the dock, the editors, the glyphs, the fonts and the suites behind, with nothing to set in the preset. The README’s Install section shows theexclude_filtera preset would carry to say the same. -
A padlock beside the eye on every layer row locks the layer: the pencil, the eraser, the shapes, the fill, a drag of the selection, Delete, cut, paste, flip and the quarter turns leave it alone and the status line says
Locked:and its name. The picker, copy and selecting still work, and All layers moves round a locked layer.Lockedis on the row’s menu too. The lock saves with the document, an Aseprite export carries it the way Aseprite does, and it’s not an undo step, so undo never unlocks a layer. Older documents open unlocked. -
Generate loop gives a different loop each press, not the same tune in a new key: every feel draws from several lead rhythms, one per pattern so the B pattern turns, several kick-and-snare patterns, and a rest chance that varies by song. The same seed still gives the same song.
-
A Saving page in Preferences: how many seconds between copies of unsaved work to the recovery file, thirty unless you change it, five at the least, the same for all three tabs. The timers take it as soon as it’s changed. It’s
saving/autosave_intervalinuser://jamchip/preferences.cfg. -
A new Pixel document opens on the project’s palette: the file the project setting
jamchip/pixel/default_palettenames, else the one your preferences name underpixel/default_palette, else the palette shipped with the addon. Save palette as project default… in the Palette rack asks where in the project to put the swatches, saves them there and points the setting at the file, so nothing is written insideaddons/jamchip/and an upgrade cannot take your palette with it. -
The Pixel colour picker is the wheel, the sliders and the hex field. Its own preset and recent rows are gone; the rack’s swatches and its Recent list are where colour lives.
-
The tracker’s bar has Grid and Roll. Roll shows the pattern as a piano roll, one channel at a time, time across and pitch down: click a channel’s name in the header to switch. Click to place a note, drag right to make it longer, click a note to select it and its Ins and Vol show in the bar; Delete removes it. It’s the same pattern the grid shows, so Grid after Roll has the note and its note-off, and Ctrl+Z takes it away. With a key set, pitch rows outside it are shaded across the roll and the root rows are lined, and the grid’s band behind an off-key note is stronger.
-
Duplicate on the Theme page copies a theme under a name you give it and opens it on the Edit Theme page: eight swatches,
surface,surface_alt,lane,accent,playhead,ok,warninganddanger, the rest worked out from them. Each change is saved as you make it and the dock follows when it’s the theme in use. A swatch under the contrast floor says so beside itself, and the Theme page greys the theme with the same words in its tooltip until it’s fixed. Edit on a theme file’s row reopens it. The editor writes only its eight keys, so a role set in a text editor stays. -
Outside the editor, the menus hold only what an app can do: no Add to Scene, no README item, no Help under the jar, no Editor theme or Show Folder in Preferences. Inside the editor nothing moves. Every rack scrolls under a finger where a touchscreen is present, through
JamChipTouch, which an app asks for and the plugin never does; a drag that starts on a slider and goes up or down scrolls and puts the slider back. The glyphs are kept files the kit rasterises at the scale they are seen at, the editor’s inside it and the window’s content scale outside, so they are sharp on a tablet and unchanged on a desktop. -
The JamChip menu under the jar lists the last ten documents you opened or saved in this project, newest first. Pick one and its tab opens it; a tab with unsaved work asks first. A file you’ve deleted is off the list the next time the menu opens. The list is per project, in
user://jamchip/preferences.cfg. -
A Pixel tag plays forwards, in reverse, ping-pong or ping-pong reverse, for ever or a number of times, and has a colour, the way Aseprite’s do. The rack row is where a tag is edited: the selected row opens into its name, range, direction, Loops, repeat and colour, and the popover is gone. The exported
SpriteFramesand the live one hold the expanded frames, soplay("hop")ping-pongs without the game knowing; Play in the lane does the same. An Aseprite import keeps direction, repeat and colour, and an export writes them. Old documents read unchanged. -
A new song’s grid offers a first song: Generate a loop in one of six feels writes a four-channel loop in a key and a tempo and plays it once, Generate a kit sets the instruments and the key, Start blank takes the offers away. The same generators sit under Song ▸ Generate loop and the Instruments menu ▸ Generate kit once a note exists. A note outside the song’s key gets a band behind it, so it reads.
-
The Pixel tab’s Palette section fills the rack: the default sixteen swatches show without a scrollbar, Recent appears only once a colour has been painted, and the pair in the header is two wells the size of the buttons beside it. Layer rows in the lane are twenty-two units tall, up from sixteen.
-
The example game is a platformer, and every asset on it came out of the dock: a player, an enemy and a coin as
PixelSprite2Ddocuments, the ground aTileMapLayeron aTileSetthe Pixel tab exported from a sheet drawn on a grid, three sounds and a song from the SFX and Tracker tabs.pnpm exportruns it headless after the probe. -
The example game runs from a title to a win: it opens on a title card, any key starts it, and the last coin shows an end card. Both cards are Pixel documents,
examples/art/title.pixel.tresandend.pixel.tres, on aPixelSprite2Deach, so a stroke on one reaches the running game the way a stroke on the player does. -
The site uses the plugin’s colours and fonts: both themes come from the same palette the dock uses, headings and buttons are Pixelify Sans, code is VT323, and the site serves both itself. The landing page says who JamChip is for, what it does, what it costs and how to install it.
-
The site shows the three tabs in both themes, rendered by script from the tree, and gains a releases page, a showcase, about and support.
-
Every tooltip, hint, status line and dialog is rewritten under
docs/VOICE.md: shorter, says the one thing the screen can’t, and gives the plain word next to a music term. Menu items keep their names; three change (“Add PixelSprite2D to Scene”, “Add ChiptunePlayer to Scene”, “Duplicate frame”). -
A Pixel tile sheet exports as a PNG with a Godot
TileSetbeside it, fromFile > Export TileSet...: one atlas tile per grid cell that has a pixel in it, cut from the document’s grid, and a re-export keeps the collision and custom data a game added to the tiles still drawn.View > Snap to gridmakes the marquee, a move and a paste land on the cells. -
The Pixel canvas grid takes a cell of any width and height and an offset, both saved with the document: the cell reads on a button beside the grid toggle and is set in the popover under it, the offset under View, and the square presets stay under View ▸ Grid size.
-
A song can name its key and scale, from a Key section on the tracker’s rack, and the grid then tints every note outside the scale; none is set until you pick one, and nothing about playback changes.
-
A
+above the layer rows adds a layer over the selected one, and so does Shift+N; the rows are taller, so a name reads at scale 1. -
Sounds, songs and palettes can be built and changed from a script at run time, not only in the dock.
-
A document built into a scene is editable in the dock and saves where it lives, rather than only a document on disk.
-
ChiptuneMusicPlayercarriesloopand one-shot, and a looped song wraps without a gap. -
LICENSEat the root, MIT, and it ships inside the zip besideplugin.cfg.
Changed
- The jar on the pin rail opens the JamChip menu: Preferences…, Help, About JamChip. Preferences is a window with one page so far, Theme. About leaves the three Help menus; they keep their shortcuts and README.
- The inspector shows what a person authors and hides what a hand edit would break, on every document and node.
- A one-frame animation tag does not loop, and the Pixel tab says which tags do.
addons/jamchip/README.mdstates the licence and the Godot version the plugin is tested against.
Fixed
-
A stroke on the example platformer’s tile sheet shows in the game on the next run, with no export step between.
tiles.pngis gone from the examples. Export TileSet… is unchanged for a project that wants a file. -
A new song’s grid is empty cells and nothing else. The card offering Generate a loop, Generate a kit and Start blank over them is gone; Song ▸ Generate loop and the Instruments menu ▸ Generate kit, with the same six feels, are where a first song starts.
-
A Bright sound on the SFX tab stays bright. Its pitch now rolls from F#5 rather than C5, and its slide can fall no faster than 20 semitones a second where before it drew from the full range, so a low roll with a steep fall no longer leaves the register the feel promised.
-
A scene holding a
PixelSprite2Dloads without “There is no animation with name” on every sprite, and comes back on the animation it was saved on. The name is stored on the node assaved_animationrather than asanimation, which a scene wrote before the script and so before the frames existed to hold it; every scene the editor saved, and every exported one, printed that error and fell back to the first tag. -
A saved
PixelSpriteTextureorPixelSpriteFramesno longer carries a copy of the artwork beside the document it follows. Both are rebuilt from the document on load, so the file holds the document and the frame, and a scene with a seven-frame animation in it is kilobytes smaller. -
The JamChip mark shows in an exported app. The kit decoded it from the PNG’s bytes, which an export drops in favour of the imported texture; it now loads that texture when the bytes are gone.
-
The SFX and Tracker tabs save outside the editor. Both built their file dialog only inside it, so an exported app could draw but not keep a sound or a song; the kit answers for the dialog wherever the tab runs.
-
The plugin’s panels load in an exported build. Five scripts named an editor class the export template does not have, so every tab failed to parse outside the editor; the kit now asks for the editor by name and hands out a plain file dialog over the app’s own folder where there is no editor.
-
A save or an export never overwrites a file the dialog did not confirm.
-
Clicking the lit arpeggio chip again on the SFX tab no longer adds an undo step that changes nothing.
0.1.0 — 2026-09-07
The build the V1 jam ran, at 8bde7a8. The first version with one plugin,
one dock and three tabs.
Added
- One plugin: the two addons merged into one dock with Pixel, SFX and Tracker as sibling tabs on a pin rail, under the name JamChip.
- Pixel: layers, frames, onion skin, palette, animation tags shaped as Aseprite’s frame tags, and its own undo history.
- SFX: an sfxr-style generator over the shared synth.
- Tracker: a pattern tracker over the same synth, with selection, copy, paste and transpose, and an Edit menu naming every key.
- View and Frames menus on the Pixel strip; tags moved to the rack and the grid gained a size.
- Autosave and recovery for the Pixel tab, so a killed editor comes back with the drawing.
- Every tab opens on an untitled document, with each stage’s hint as its tooltip.
- Import and export: Aseprite both ways, spritesheet slicing on import, GIMP
.gplpalettes, PNG andSpriteFramesout,.wavout of both audio tabs. - Runtime nodes and resources that need no dock and no enabled plugin:
PixelSprite2D, the threeChiptunePlayernodes,ChiptuneMusicPlayer,PixelSpriteTexture,PixelSpriteFrames,ChiptuneAudioStream. - JamChip: Copy Diagnostics, which puts plugin and engine versions, platform, what the tabs held and the last recorded failures on the clipboard.
- A theme token layer with the roles held to a WCAG ratio by the suite, and the plugin’s own icon set.
Changed
- One word per document suffix:
.pixel.tres,.sfx.tres,.chiptune.tres,.instruments.tres,.palette.tres,.frames.tres. The old names are read and never written. - Chiptune’s rough edges: the mixer saves with the song, songs have a library, and the tracker plays back streaming.
Fixed
- Discard reloads from disk into the instance the scene holds.
- Both chiptune tabs measure unsaved changes against the last save.
- A layout reload opens into an empty panel only.
- The oscillator clamps at Nyquist.
- The 2015 Aseprite palette chunk has the modern one’s ceiling.
- A first save takes the path over.
- An exported PNG remembers its frame.
Removed
- sfxr and Bfxr preset import. It was built and taken out again: nobody could produce a fixture to check it against.
JamChip 0.1.0, by GlitterSnack. MIT licence. Built from the source on every merge, artwork and screenshots included, with JamChip.