A hardware-aware DAW for the Sega Mega Drive.
The first release, built from 544 commits.
Downloads
| platform | portable | installed |
|---|---|---|
| Windows x86-64 | mdd-0.1.0-windows-x86_64-portable.zip |
mdd-0.1.0-windows-x86_64-setup.exe |
| Linux x86-64 | mdd-0.1.0-linux-x86_64-portable.tar.gz |
mdd-0.1.0-linux-x86_64-installer.tar.gz |
| Linux arm64 | mdd-0.1.0-linux-arm64-portable.tar.gz |
mdd-0.1.0-linux-arm64-installer.tar.gz |
| macOS x86-64 | mdd-0.1.0-mac-x86_64-portable.tar.gz |
mdd-0.1.0-mac-x86_64.dmg |
| macOS arm64 | mdd-0.1.0-mac-arm64-portable.tar.gz |
mdd-0.1.0-mac-arm64.dmg |
A portable copy keeps its settings, projects and banks in a userdata folder beside the
executable, so it can live on a memory stick and leaves nothing behind. An installed copy
keeps them under your documents. Both are the same application, and the updater offers
whichever kind you already have.
Checking a download
SHA256SUMS lists every file, and each file has a .sigstore bundle beside it,
SHA256SUMS included. The signature is what proves a download came from this repository: a
checksum on its own only proves the file matches whichever list you read it from.
:::sh
sha256sum -c SHA256SUMS --ignore-missing
cosign verify-blob --bundle SHA256SUMS.sigstore \
--certificate-identity-regexp '^https://github.com/MeguminBOT/md-synth-daw/' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
SHA256SUMS
The same workflow records build provenance, which the GitHub CLI reads:
:::sh
gh attestation verify mdd-0.1.0-windows-x86_64-portable.zip --repo MeguminBOT/md-synth-daw
What changed
544 changes, grouped by the part of the application they moved
### Sound chips (5) - **Sn76489** Add docstrings and the licence to the psg - **Ym2612** Every channel keeps its own frequency high byte - **Ym2612** Add docstrings and the licence to the fm core - **Ym2612** A block and frequency high byte lands in one latch the whole part shares - **Ym2612** The YM2612 and the SN76489, and the reference the FM core is held to ### The song model (40) - A kit is the bank the converter holds, not every sample in the document - The converter plays as a drum kit, so a drum pattern arrives whole - Answer whether the arrangement ever sounds a part - Add docstrings to the model - A clip knows where in its pattern it starts, so a cut keeps the music where it was - The whole song can be nudged, and it is not done on import - The tempo can move the grid instead of the music - A clip on the playlist can drive one parameter of a channel it does not hold - A point carries the shape that reaches the next one - A held automation value is found by search, not by walking every point - Patterns reused and written out flat, and the arrangement that places them - The model, the tempo map and the command stack - **Edit** Taking a recording out and scaling one up are undoable steps - **Edit** The mixer settings become commands - **Edit** Patch and envelope edits become commands - **Edit** Add docstrings to the command stack - **Edit** A track can be named, cloned, reset, inserted and have its clips merged - **Edit** The slice tool cuts a clip in two - **Edit** A track carries its own colour and icon, and nothing is coloured for it - **Edit** A pattern's length follows the notes in it - **Edit** A clip moves between tracks, and a track moves between rows - **Edit** A nudge moves the music by what it says rather than by twice it - **Edit** A nudge that pushes something against nought undoes to where it was - **Edit** Undoing a pattern removal or a channel change restores the song exactly - **Edit** A pattern can be moved to another channel - **Edit** Dragging a note can be taken back - **Edit** Moving or stretching a clip can be taken back - **Edit** A pattern can be removed, and the pattern list acts on one - **Patch** A drum kit that owes nothing to anybody - **Patch** Two more banks, read out of Sonic the Hedgehog 3 and Mickey Mania - **Patch** The noise drums of Sonic the Hedgehog ship with its bank - **Patch** A preset rests where a driver rests - **Patch** Add docstrings to the patches, banks and the shipped library - **Patch** A patch reads and writes its fields by index - **Patch** The voice importer reads its operators in the order the chip does - **Patch** The importer masks the bits the chip ignores, and twelve presets are named - **Patch** A preset carries an icon, and the reader's own patches load beside the shipped ones - **Patch** Two banks ship, lifted from the games' own sound drivers - **Patch** An instrument carries tags, and the shipped library is built into the binary - **Patch** An instrument carries the icon it is drawn with ### Playback and export (56) - **Bounce** A progress reading is one value, not three that can disagree - **Bounce** Render one part at a time, at the mix's own gain - **Bounce** Settle the coupling filter before recording anything - **Bounce** Add docstrings to the offline render and its settings - **Bounce** An export carries its tempo, normalises to nought and resamples on 512 taps - **Bounce** A bounce reports its progress and leaves the window drawing - **Bounce** A bounce parks for the collector and holds what it is working on - **Bounce** A bounce is finished when it says it is, and it writes its own file - **Bounce** A bounce no longer holds the collector, so the window keeps drawing - **Bounce** A mixdown for opus takes a rate the encoder accepts - **Render** Add docstrings and the licence to the render path - **Render** The output stage is fitted to captures of the console itself - **Render** The console's output stage stands between the chip and the speakers - **Render** The dc blocker keeps its corner in hertz, and the resampler carries a phase bank - **Render** The band a render keeps is the same whatever rate the device asks for - **Render** A whole stream is walked once instead of poured again every block - **Render** The square output is filtered before it is decimated - **Render** The chip output is filtered before it is decimated - **Render** The render thread holds the cushion it primed instead of draining it - **Render** The audio device, the register queue and the render thread - **Sequencer** A cut no longer restarts the music at the cut - **Sequencer** Sequence one part alone, for a stem - **Sequencer** Add docstrings to the sequencer and what feeds it - **Sequencer** A mode that holds each frame to the writes a driver could actually make - **Sequencer** A shaped segment is written once a frame, and only where it changes - **Sequencer** An imported note drives what is played, and its automation rides it - **Sequencer** Velocity reads as decibels, so a drawn note is not fifteen down on an import - **Sequencer** A converter hit paces its sample across the span the driver took - **Sequencer** Priming writes only what the song has already reached, so a square starts silent - **Sequencer** A seek puts the chip where playing to that point would have left it - **Sequencer** An imported note takes its pitch from the lane that recorded what the driver wrote - **Sequencer** A key on is the last write at its tick, and a level lane owns attenuation - **Sequencer** A key off lands where the file put it now that a tick is a sample - **Sequencer** Every operator register, the noise control and the third square follow the file - **Sequencer** The squares follow their own registers, and equal ticks keep their order - **Sequencer** The stereo register has one writer, and pitch automation reaches the chip - **Sequencer** The voice resolver read one past the end of a lane - **Sequencer** An export is built in spans the sequencer can hold - **Sequencer** A key off lands before the key on that follows it - **Sequencer** An imported square keeps the envelope the driver wrote - **Sequencer** The output was thirty decibels quiet, and channels had no fader - **Sequencer** What each part is sounding, read back from the register writes - **Sequencer** The sequencer, voice resolution and the register stream - **Stream** The separate operator frequencies count from one - **Stream** Add docstrings and the licence to the register stream - **Stream** The stream writes a register only where it changes what the chip holds - **Stream** A channel takes the pitch the file wrote, and the third channel its own mode - **Stream** A channel keeps the side it is played on - **Transport** An audition sounds the drum its note names - **Transport** Add docstrings to the transport - **Transport** The flag that hushes a note is read and cleared in one step - **Transport** An audition can be held until it is released - **Transport** A sample can be struck without the song playing - **Transport** Stop silences the chips, and mute and solo reach a replayed stream - **Transport** The keyboard gutter sounds, and playback is confirmed against four sonic tracks - **Transport** An imported vgm plays as itself, and the song is guarded while it sounds ### File formats (56) - **Audio** A folder of recordings becomes a kit, keyed by what each hit is - **Audio** A wave file's twenty four bit samples are read as twenty four bits - **Audio** A recording becomes a sample through stages that are each a decision - **Audio** A wave file is band limited on the way down, not decimated - **Audio** Add docstrings to the encoders, and the licence to flac - **Audio** The flac header stops shifting a 32 bit count by 32 - **Audio** Opus takes a mode, a frame size and a bitrate mode, and its granule counts at 48 kHz - **Audio** An opus encode that fails says so rather than writing a short file - **Audio** The flac encoder codes stereo as a pair and fits a predictor - **Audio** A wav round trip is exact, and a flac signs what it holds - **Audio** Vorbis and opus are encoded through libogg - **Audio** A mixdown is padded, faded and normalised, and writes wav or flac - **Audio** The wav converter resamples to the rate it is given - **Midi** A file is looked through before any of it is imported - **Midi** Carry the velocity an import was written with - **Midi** Add docstrings to the midi reader and the tempo guess - **Midi** A midi arrives as a pattern for each part - **Midi** The tempo is refined after it is found - **Midi** An imported file is read for its tempo - **Midi** Midi is written big endian at a standard division, as every reader expects - **Midi** Wav and midi, and a piece composed, exported, imported and compared - **Project** A piece keeps one copy of each recording, not two - **Project** Add docstrings to the project file and the json it is written in - **Project** A project lands through a partial file, so a failed save keeps the old one - **Project** A project file is closed even when reading or writing it fails - **Project** A corrupt file cannot make a reader loop or allocate without end - **Project** A patch reads and writes as a tfi, and a song's patches lift to the library - **Project** The project format, with its own json rather than a map's order - **Vgm** A gzipped recording reads as the recording it is - **Vgm** Add docstrings and the licence to the register log and the transcriber - **Vgm** A drum played twice is one sample - **Vgm** A dac run is cut without sorting its gaps once a sample - **Vgm** The converter names a pattern's part rather than reaching for its colour - **Vgm** A converter sample ends where the driver changes pace, and carries its own rate - **Vgm** A converter run ends where the driver changes pace, and the song carries the stall - **Vgm** A converter run keeps the console's own bytes, so a drum played twice is one sample - **Vgm** A converter run is stored at the rate it was written, and a still lane is no pattern - **Vgm** A key on and key off on one tick becomes a note, because the envelope hears it - **Vgm** A long converter run keeps its whole length, where the byte count used to overflow - **Vgm** The pitch lane records the word at every key on, not the note it rounds to - **Vgm** A converter run keeps the byte the file held at every tick - **Vgm** A channel written only to drive another keeps its lane when the import splits - **Vgm** The squares, the noise and the converter keep the register writes the file made - **Vgm** A tick is one sample, and the converter takes a rate the tick rate divides - **Vgm** A tick is a whole number of samples, so a note lands where the file put it - **Vgm** An import lands on a tick fine enough to keep the channels in phase - **Vgm** A key on keeps the exact f number, and channel three keeps its operators - **Vgm** The squares keep their period and level, and one converter rate serves the file - **Vgm** A converter run is resampled onto the rate it was written at - **Vgm** An imported vgm becomes a song rather than a stored stream - **Vgm** An imported vgm gives every part a pattern of its own - **Vgm** A transcribed note no longer overlaps the one before it - **Vgm** The vgm reader and writer, and a register stream read back as notes - **Xgm** Add docstrings and the licence to the driver format - **Xgm** A drawn converter note reaches an exported xgm, and the file carries its own name - **Xgm** Xgm reads and writes ### Editors and panels (110) - **Bar** The grid offers the same divisions wherever it is set - **Bar** The grid divides down to a sixty fourth - **Bar** Mark unity on the monitoring fader - **Bar** Add docstrings to the transport, the rail, the tools and the status - **Bar** The transport carries the shift, and it moves by a tick - **Bar** The tools say what they are, and only appear where they work - **Bar** The tab beside the presets is the synthesizer - **Bar** The pattern list goes, warnings join the editors, and the strip below is a status line - **Bar** The master is a listening level, so it sits in the transport as one - **Bar** The mixer carries a master strip for the level this machine plays at - **Bar** The panels group into what edits, what reads back and what is raised - **Bar** The session, the file actions and the strings leave the panels - **Bar** A panel index outside a tab strip is refused rather than shown as nothing - **Bar** The shell holds together in a small window - **Bar** A control on the bar sits above it, and the tools line up with the tabs - **Bar** The operator envelopes are drawn, and the tools the roll shares are on the header - **Bar** The transport carries the controls and the fields it is specified with - **Bar** The zones hold what the interface design says they hold - **Bar** Tooltips and context menus on the panels, and the file operations gated - **Bar** The dock, its mixer and its warnings, and a warning that links to its cause - **Editor** A drum sits on the key it is rooted at, not on a row of its own - **Editor** The automation view asks for a frame as the playhead moves - **Editor** A note resizes from its start as well as its end - **Editor** The operator bars follow the pointer across - **Editor** A drawn note lands in the step that was pointed at - **Editor** Add docstrings to the roll, the tracker and the automation lanes - **Editor** A drawn note takes the grid, never shorter than a sixteenth - **Editor** The automation tab scrolls sideways on a bar of its own - **Editor** A drawn note is a sixteenth until one is given a length of its own - **Editor** Stepping a note with the arrows keeps the lane in order and undoes - **Editor** A tracker cell copies, cuts and pastes - **Editor** A selection left behind by an undo acts on nothing - **Editor** A velocity change and a bend are undoable, once each - **Editor** Dragging a point is one step of history rather than one a frame - **Editor** Holding alt drops the grid while something is dragged - **Editor** A tracker cell takes a note typed into it - **Editor** A selection is many notes, clips or points - **Editor** The automation tab holds every lane, folds them, and scrolls - **Editor** The roll shows one lane, named by a chooser the wheel turns - **Editor** The automation editor holds every lane a channel has, not one - **Editor** A point takes a bigger target, and ctrl aims it - **Editor** A point can be typed rather than aimed at - **Editor** A lane can be given the room it needs, and gives it back - **Editor** A lane carries a title, a scale, and the controls it used to hide - **Editor** An import shows the automation it captured, and a curve can move to the playlist - **Editor** A sixth editor holds one curve at a time, full height - **Editor** The lane strip under the roll becomes a stack of editable envelopes - **Editor** An editor frames itself to the resolution the song is written at - **Editor** A note typed past the first clip lands inside the clip it is under - **Editor** The tracker shows the arrangement when the transport is on the song - **Editor** The converter's rows fill the roll and the rest reads as out of range - **Editor** The lanes under the roll draw what is written in them - **Editor** A note takes the length it is drawn to, and its end resizes it - **Editor** The tracker, the same pattern data written in hexadecimal rows - **Editor** The compose spine: transport, rack, piano roll and the operator editor - **Monitor** Muting and soloing from the scope go on the undo stack - **Monitor** Add docstrings to the register timeline, the scope and the meters - **Monitor** The scope walks its ring instead of taking a modulo per sample - **Monitor** A register row says which chip took the write - **Monitor** Context menus on the sample slots and the register rows - **Monitor** Context menus on the scope lanes and the bank headers - **Monitor** The scope switches between waveform and spectrum - **Monitor** Nine menus, and the register timeline the centre was missing - **Overlay** The kit sheet is built from controls rather than painted boxes - **Overlay** A folder of recordings becomes a kit from a sheet - **Overlay** Flac carries no floating point depth, so it is not offered - **Overlay** The export panel reads times in seconds and dims what a codec refuses - **Overlay** Offer stems on the export panel - **Overlay** Add docstrings to the sheets and the progress bar - **Overlay** The export keeps its own output stage once the row is touched - **Overlay** Every export row draws its choices, and the timings are typed in - **Overlay** A control is learned and aimed from the midi preferences - **Overlay** A chord can be caught and rebound where it is listed - **Overlay** An about sheet, and the strip below carries what the machine is doing - **Overlay** Preferences sort into categories, and cancel means cancel - **Overlay** The way automation is written is chosen on the first run and kept - **Overlay** The progress window is visible, and the export dialogue keeps its rows in place - **Overlay** A modal window shows what long work is doing and lets a render be stopped - **Overlay** Every preference is a dropdown, and a typeface is named rather than translated - **Overlay** The panels that outlive a load follow the song that replaced it - **Overlay** The export window offers the lossy formats and what they are worth - **Overlay** One window sets the format, the shaping and the tags an export carries - **Playlist** Muting a track from the rail goes on the undo stack - **Playlist** Add docstrings to the arrangement - **Playlist** Shift takes a range and ctrl takes one, in both editors - **Playlist** A clip carries a corner that offers what to do with it - **Playlist** A clip shows its notes, and pan shows which speakers it reaches - **Playlist** A playlist clip draws the notes it holds, and a track can be made taller - **Playlist** The playlist and the roll zoom to fit, take alt wheel and carry a rein to drag - **Rack** The precision key steps a channel fader one at a time - **Rack** Add docstrings to the channel rack and the sample editor - **Rack** The pattern list follows the pattern the roll is showing - **Rack** The preset bank and the sample editor, and banks in the song and its file - **Synth** The envelope's fields spell out where a narrower face fits them - **Synth** The precision key steps a value one at a time again - **Synth** A double click puts a value back where a fresh patch has it - **Synth** The synth editors undo, take the left button only, and follow - **Synth** Add docstrings to the instrument editors - **Synth** Presets sort by bank, by name or by tag - **Synth** A preset says what it is tagged with - **Synth** A preset carries tags, and the panel searches by name and tag - **Synth** A table says what can be automated on each part, and what a value means - **Synth** The patches and banks are presets, and the three languages read like software - **Synth** The patch list groups by bank, and the converter's samples are one kit - **Synth** The bank lists every kind at once, and loading a patch changes what the part plays - **Synth** The algorithm is drawn as separate wires, not one line through every box - **Synth** A bank of instruments ships, and the editors have controls to turn - **Synth** A sizing pass, and presets can be saved, renamed and dropped - **Synth** The imported bank is marked as temporary and can be kept - **Synth** The scope, the square editor, and the inspector that follows the channel ### The interface (57) - **Control** A menu longer than the window scrolls rather than running off it - **Control** A number is typed in what it is shown in, and typing ends - **Control** A slider's grip stays under the pointer, and ctrl takes hold mid drag - **Control** Add docstrings to the controls - **Control** The accent surfaces are shaded the way the notes and the transport already were - **Control** A menu sits above the page rather than in it - **Control** The centre tabs read as tabs and sit in the order the work follows - **Control** The menu bar carries open, save and preferences at its right - **Control** A value field that fits the bar it sits on, and the lanes under the roll - **Control** Selecting a tree item is not the same as choosing one - **Control** A menu bar, and a menu tells its opener when it closes - **Control** Tooltips, context menus, the tree, and the animation system - **Control** The control catalogue, scrolling and cached sheets - **Input** Add docstrings to the events and the keys - **Input** Chords reach the session, and a field being typed into keeps its plain keys - **Locale** The swedish envelope fields take the terms the rest of the file uses - **Locale** Every language says whether a machine translated it - **Locale** The synthesizer's fields are read in the language being worn - **Locale** The status bar is read in the language being worn - **Locale** Two export rows say what they are in fewer words - **Locale** Ten more languages ship - **Locale** Name two more grid divisions - **Locale** Name the stems row - **Locale** Add docstrings to the string table - **Locale** The update strings name installing rather than downloading to - **Locale** A translation table compiled from json, and a language chosen on the first run - **Paint** A condensed face, for a label with no room for the chosen one - **Paint** Add docstrings to the painter, the faces and the theme - **Paint** The icon catalogue is imported from where the build generates it - **Paint** A glyph the chosen face has no outline for is cut from a fallback that does - **Paint** The atlas keeps a shelf, so a codepoint it never baked is drawn on first ask - **Paint** The glyph atlas reaches past ascii, so a diacritic is drawn rather than dropped - **Paint** A character code is read as an int rather than boxed and unboxed nine times - **Paint** A quad is built once rather than as two triangles - **Paint** A polyline rounds only a corner that would show a gap - **Paint** A rounded shape tiles without gaps again - **Paint** Every edge lands on a pixel, curves are no longer stepped, and panels meet on one line - **Paint** A rounded thing gets a rounded border, and nothing sits on its container's last row - **Paint** A gradient interpolates across its own vertices instead of stacking bands - **Paint** A lit control carries a gradient, a field fits its text, and a rescale reflows - **Paint** The ruler scrubs, a tab strip follows what is shown, and panels fit - **Paint** The clip stack is guarded, and a fault leaves a record - **Paint** Paint, the font atlas and the theme tables - **Widget** The scroller drops the bar it never drew - **Widget** A sheet holding a form is not lost to a press beside it - **Widget** A tooltip opens at the pointer, not at the corner of its widget - **Widget** A press on the empty scrollbar track moves the thumb there - **Widget** Add docstrings to the widget tree and the root - **Widget** The render bar draws above every sheet, and one file handler outlives a song load - **Widget** An edit chord goes to the editor under the focus, and never past a field - **Widget** The host is told when a widget wants characters, so text can be typed - **Widget** A menu closes when another opens or when the pointer goes elsewhere - **Widget** A tree row draws its icon from the atlas rather than from hand-written geometry - **Widget** A tree row can carry a drawn icon in place of its dot - **Widget** A press inside a modal reaches it rather than closing it - **Widget** One modal sheet, the word table every string comes from, and preferences over both - **Widget** The widget tree, input routing and the shell ### The application (25) - **Files** A recording going into a kit does not put the kit sheet away - **Files** The change stamp says what it answers - **Files** Every format read here opens by its suffix - **Files** A patch import holds the render thread off while it lands - **Files** Write a folder of stems beside the mix - **Files** Add docstrings to the file operations and the updater - **Files** An update replaces the files it downloaded - **Files** A portable copy is offered an archive and an installed one an installer - **Files** The updater reads the architecture as well as the platform - **Files** Saving on its own follows what the song writes out, not the undo depth - **Menus** Playing through a driver goes on the undo stack - **Menus** Add docstrings to the menus, the bindings and the midi mapping - **Menus** A keyboard arrives with eight controls already aimed at something - **Menus** A control change drives a patch field of the channel in hand - **Menus** Every chord comes from one table - **Session** The kit menu entry is wired after the menus are built - **Session** The grid is remembered between pieces and between sessions - **Session** The rack write lands inside the lock a new instrument took - **Session** The usage line is read every frame, not only on an edit - **Session** The grid is a division of a bar, not a count of ticks - **Session** The monitoring fader carries make up above unity - **Session** Add docstrings to the application, the session and the window - **Session** The update check leaves a running export's modal alone - **Session** A new document is empty, and the file menu opens one - **Session** Shift with the export key opens the audio window ### Window, audio and system (40) - **Crash** Add docstrings and the licence to the crash reporter - **Crash** Add docstrings to the crash handler binding - **Crash** A mingw build names the Haxe line its stack stopped on - **Crash** A mingw build reports its stack, named from its own symbol table - **Crash** A crash names the Haxe line it stopped on - **Device** Add docstrings to the audio device implementation - **Device** Add docstrings to the audio device - **Draw** Add docstrings to the drawing calls - **Draw** Add docstrings to the renderer binding - **Draw** Windows takes direct3d11 until the other backends hold up under playback - **Draw** The render backend is chosen by a setting or a launch flag, and settings can be reset - **Draw** The idle frame sleeps rather than presenting a buffer it did not draw - **Draw** The texture blit carries an alpha, and the desktop's reduce-motion setting is read - **System** The windows file dialogs are the ones windows has now - **System** The collector counts bytes, and now says so - **System** Add docstrings to the shell, the dialogs, midi, usage and one instance - **System** Add docstrings and the licence to the discord transport - **System** Add docstrings to the paths, settings, collector and the rest - **System** A portable copy registers itself as what opens a project file - **System** An astral character reaches discord whole, not as two replacement marks - **System** The host reports its own cpu and memory on linux and macos - **System** A surrogate pair is not cut in half on its way to discord - **System** The discord application and its art assets are named in the build file - **System** Discord is told what is being written, and how much of the chip it takes - **System** The collector runs when the frame is quiet rather than whenever it likes - **System** A midi keyboard plays the chosen channel - **System** A project takes its own suffix and registers as a named file type - **System** Releases read from github, userdata under documents, and one running copy at a time - **System** A full name, portable settings, saving on its own, a consenting updater and packaging - **System** Settings that survive a run, written when a preference changes - **Text** Add docstrings and the licence to the font instancer - **Text** Add docstrings to the rasteriser binding - **Text** A font file is bounded against its own table lengths before it is instanced - **Text** A variable face is instanced to its regular weight as it loads - **Text** One codepoint can be rasterised on its own, and a texture patched where it lands - **Window** A file dropped on the window opens - **Window** The pointer takes a shape over what it is on - **Window** Add docstrings to the window, the renderer and the events - **Window** Add docstrings to the sdl binding - **Window** The window opens filling the display and remembers that it was ### Diagnostics (7) - The sample budget says what it is, a quarter of a megabyte cartridge - The machine stops claiming a sample ceiling it cannot support - A sample costs the machine nothing until a note reaches for it - A warning is read in the language being worn - Add docstrings to the profiles, the budget and the diagnostics - A frame that writes more registers than a driver can now says so - Hardware profiles, the budget pass and the diagnostics it raises ### Building and packaging (55) - Add docstrings to the build command - A release carries notes written from the commit log - Provenance is attested only where github will store it - A search path that is not on the machine is not handed to the compiler - Libopus gets lrintf, and the noise from generated code is quietened - A test build's artifact holds the program, not an archive of it - The portable copy and the installer go up as separate artifacts - A package carries the platform and the architecture in its name - An installer no longer carries the marker that makes a copy portable - A release builds and publishes rather than running the gate again - A link flag carrying a space becomes one entry per token - A macos job says where homebrew put SDL3 before it tries to build - A macos release carries its dmg, and windows is given inno setup - The linux jobs put a display in front of the gate and fetch the reference - The zlib hxcpp bundles is unpoisoned before a macos build - An include path that is already absolute is not prefixed with the root - Macos looks for SDL3 where homebrew puts it, under either prefix - The mdd command is marked executable, so a clone can run it - Haxe comes from a package manager where the official archives have no arm64 - A release can be rehearsed in full, publishing nothing at the end - The build workflow names its shell once instead of through the matrix - Every release file is signed with sigstore and carries its provenance - Five targets build from the Actions tab, and only the owner cuts a release - A build reads the architecture it is running on, and arm64 takes its own define - A mingw release sheds the debug sections the crash report never opens - A clang-cl build reads its own toolchain, and compiles without a precompiled header - The release link drops what nothing calls, and a flag can reach the compiler or the linker - A release build drops what nothing reaches, and keeps the native build class - An icon entry names a folder once and lists what is in it - The build file says which names are platforms and which are toolchains - The generators write their escapes, not the line endings they were checked out with - The presence art is drawn from svg, and each state has its own badge - The build file's attribute values carry the colour, and the punctuation recedes - The LGPL reference is fetched only when asked, and the gate says when it did not run - The build file keeps its data and leaves the explanations to the notes - A built binary is executable off windows, and a linux build is reproducible - The string catalogue is generated from the reference language, so a lookup is an index - A vendored source can say where a system that packages it keeps it - The build file reads in sections, with the asset lists last - The native sources build under a compiler that is not the Microsoft one - A build picks its compiler, and llvm is preferred wherever llvm is installed - The build names the fallback faces, and setup fetches the three that carry cjk - The executable names itself for the task manager - The typefaces are declared once and nine pairings ship - The interface icons are rasterised from svg into an atlas at build time - The native sources sit beside the Haxe they belong to - A native tree compiles a fetched library, and the ogg encoders arrive with it - The build file is mdd.xml, and it writes the editor's completion files - A crash says which function it stopped in - A copy whose destination already matches is skipped - A debug build carries the hxcpp debug server - Four typeface pairings ship, and each carries its licence - An icon on the window, the executable, the installer and the desktop entry - A target ships whichever of its binaries was built last - Project.xml replaces the hxml files, and the platform gates work ### The repository (6) - A clip that draws automation is named for it - A member nothing outside its class reaches is private - A keyboard shortcut is called a shortcut, and the editors keep no copies of one - The window, the device, the panels and the menu bar each own their state - The command stack and the controls each get a package of their own - A window, and one command that builds it ### Documentation (12) - Update "Make a kit" screenshot - The xgm sample rate is 14000 exactly, and the note says where that is stated - Add screenshots - The grid, undo and the importers say what they now do - The chip has no pan pot, and that is a decision to write down - Undo really does cover everything now - Say which languages ship, and which of them an AI wrote - Stems are no longer among the things that are not here - The feature list says the workflow draws on fl studio - The playlist section stops repeating what a clip colour falls back to - Two section names say what is under them, and translation is the feature - The readme, the feature list and the hardware notes are in the tree ### Checks (74) - The gate says which program left the memory behind - The bounce check stops when the bounce stops - The gate stops naming one machine's scratch drive - Drive the synth editors through the event tree - Ask the fallback chain for a glyph, not one face - Measure the grid against the resolution it sits in - Check a preset against the level a driver rests at - Measure the stems against the mix they came from - The updater is driven end to end against a local release server - The updater checks say which kind of copy is asking - The flac check reads the header back and compares it with what went in - A check with no corpus is not run rather than failed - A deliberate fault faults whatever compiler reads it - The bounce check measures a frame loop, not an allocation storm - An astral character is written as one, since only some targets keep half a pair - Ten scripts, seven of them past latin, are cut from the chain and drawn - A glyph past the atlas is baked, cached, drawn and measured - Every letter a shipped language uses has a glyph to draw it with - The presence names nothing of the song when it is turned down - The collector leaves a busy frame alone and sweeps a quiet one - A collection forced while the device plays never reaches it - The vgm check reuses its streams and can say where its time goes - The corner of a clip answers and offers its commands - A patch edit with no command behind it is saved on its own - The length a note is drawn at follows the grid and the last one set - A frame is measured for allocation from a swept heap - A control message reaches the field it is aimed at - A control drives what it is aimed at, and is learned and remembered - A note stepped past its neighbours leaves the lane sorted - A nudge is measured where the music sounds, not where a note is stored - Every edit is applied and undone byte for byte - A pattern removal and a channel change are undone byte for byte - The corrupted files include an xgm and a packed project - Every reader is fed corrupted files - A frame's allocation is measured with the collector off - A shot can render to the window rather than to a texture - The automation tab's frame time is measured with every lane open - A shot can feed the scope, and the frame count is not shadowed - The fuzz holds modifiers down and types letters - A filled shape is checked for a pixel darker than its neighbours - The sound of a file is measured against its register stream for tempo - The fixtures walk the vgm corpus by folder - The gate measures how much of a frame continuous automation can cost - The shot program can set the track height and give every patch an icon - The mix check exports a real song through the paths the menus use - Drift renders the same converter bytes struck twice, and finds where a run stops - The stream check measures what priming sounds like at the first tick - Drift compares the file's own converter runs against each other, byte and pace - The seek check names every register it finds apart - The stream check measures what a seek leaves the chip holding - Drift compares only as far as the file writes, so a held note is not read as a fault - The rate check holds the zero crossings to one per cent as well as the peak - The opus tone is as long as the encoder is told it is - Drift dumps square writes and renders one part on its own - The drift report compares waveforms and two envelope windows - The drift report compares samples as well as envelopes - The drift report times each square change against the file - The drift report bisects the mix by part, and a device rate is judged by its peak - The drift report renders both and compares their envelopes - An ogg and an opus are written and measured - The mixdown and the flac writer are measured - A square is measured against its own harmonics - The drift report reads the squares, the key edges and the mix - The xgm check can write what it read back to a wav - An xgm round trip, and a report of where a song drifts from its file - The gate can stop on purpose, to read back what the crash handler wrote - A gate crash writes its fault beside the build - The converter is centred before it is switched off - The keyed state is counted off the writes, not sampled - The shell is measured at nine hundred by six hundred - Five games are read back register by register, not one - The wav writer takes a rate, a length and the track it is asked for - The vgm program writes what it renders - The gate's programs move out of the application's source pathEvery commit: https://github.com/MeguminBOT/md-synth-daw/commits/main