Changelog

What changed on CedarGroove, newest first.

All notable changes to CedarGroove are listed here.

This project follows Keep a Changelog format. Dates are ISO 8601.

[Unreleased] — toward 2.0.0

Added

  • A duotone icon set across the site: every tool card (home, tools index, related tools), the feature cards on the audio-to-MIDI pages, the upload card, the examples and the stem glyphs on the splitter pages now carry one-colour icons drawn in three layers of the site's cyan, in place of the line icons in round chips. On hover the icon's back layers brighten and it lifts a pixel over 0.2 s; nothing moves under reduced motion. One inline sprite (partials/icons.html), no library and no third-party request.
  • Animated audio waves flow out of the splitter box on the stem pages, left and right to the screen edges, on wide screens; still under reduced motion.
  • A back-to-top button on every page: it appears bottom-right once a screen has scrolled by on pages longer than two screens, scrolls smoothly to the top (instantly under reduced motion) and hands keyboard focus to the heading.
  • A 36-second 1080p tour of the macOS app (/macos/demo.mp4), rendered from the owner's captures by scripts/render-macos-video.js (canvas pans and zooms, caption cards in the site's type, recorded in Chromium) and given its duration by scripts/fix_fmp4_duration.py; it plays muted while on screen on the home page and with controls on the macOS page.
  • The macOS app is featured on the home page above the tools, with the Apple mark, the tour video (plays while on screen, muted) and a link to its page. /macos-app/ shows the app: the full capture under the hero, eight "What is inside" cards, a gallery of the grid, the knobs and the export controls (/macos/*.png, cropped from the one real capture), the screencast, and the gated download at the top and the bottom.
  • The two widget pages take their own kind of file: the drum transcriber page audio (a waveform-tinted drop zone, a "Transcribed" legend, an empty grid that asks for a loop), the drum generator page MIDI or a drawn pattern. A file of the other kind opens a small dialog that points at the page that handles it instead of an error; the generator's copy and manual say audio goes through the transcriber first.
  • Take the tour on the drum generator and the drum transcriber: an invitation strip under the widget's header on a first landing (slides in once the page has settled, dismissable, gone for good on that page once the tour starts) and a quiet Tour button in the header open an eight-step spotlight walk through the controls, with Back / Next / Skip, arrow keys and Escape; each step is one tour event so the dashboard can see where people stop. The widget now grows on phones instead of hiding its drop zone under the toolbar, and the shortcuts dialog sits in the viewport again.
  • The home page is the gateway: a hero that sells the drum transcriber with an animated two-bar preview you can hear, a note from Paul, every tool in four groups in order of importance, how it works with links to the technology pages, and a three-tap quiz that points you at the right tool and says something nice about your taste. The page renders from the same templates as every other and weighs 21 KB. Every link to a section of the old home page forwards to where that section lives now.
  • /macos-app/: the macOS installer's own page, with the same email-gated download.
  • New pages in the shell: /about/ (the story behind CedarGroove and a note from Paul), /feedback/, /technology/ with the drum transcriber and the generation model, /research/, /genres/ (rendered from the genre registry). The grid manual now lives on the generator page. First step of the home-page rework (spec 2026-09-30-home-gateway-design).
  • /wav-to-midi-drums/ is the drum transcriber's own tool page: the grid widget opens in transcribe mode (drop zone first, generation behind "Generate from this", which opens by itself once a loop is on the grid), with the article below. The widget's chrome is rebuilt in the site's design: knobs you can drive with the keyboard (arrows, PageUp/Down, Home/End, wheel, double-click to reset), the modals and row menus as dialogs, a status line, hover help in the header strip, the theme remembered; the engine underneath is unchanged and the generate request is byte-identical. The widget no longer carries its own logo and tools menu (the site header has them). The MIDI button says what it does: Download MIDI. /groove-generator/?genre=<id> opens the generator with a genre selected (the genres page's "Generate in" links); the stem splitter's "Transcribe these drums" lands on the transcriber page.
  • Every long job (stem split, transcription) is recorded to its owner in a new jobs table, the index the account portal will read. A mail goes out when a split or transcription finishes.
  • Cancel for a running split or transcription: the separator kills Demucs within a second, the transcriber stops between model batches.
  • /account/, your account page: everything you did on the site in one log (transcriptions, stem splits, drum MIDI, newest first, filter by tool, expired entries kept as greyed records) with the actions each entry still allows, the jobs still running as cards with progress and Cancel, your masked address, Sign out and Sign out everywhere, and the newsletter preference (unsubscribe, opt back in). Signed out it shows the same email step the tools use, and the mailed link lands back on the page. The page is not indexed or listed.

Fixed

  • The mad scientist on /research/ dances again, as he did on the old home page: his animation was left behind in the old stylesheet when the page moved into the new shell.
  • A second technical review, this time of every frontend and backend module with twelve reviewers (2026-10-02), fixed four critical findings and some eighty others. A failed deploy's rollback would have deleted the app's Python environment (the rollback now excludes it like the snapshot does); a visitor off the LAN could not split a song because the sign-in dialog's page was refused by the server; a 35-byte MIDI file could freeze the service and exhaust its memory (the parser now caps bars and notes, looks tempo up in logarithmic time and runs off the event loop, and MIDI uploads have their own 5 MB ceiling); and an audio file declaring an absurd sample rate could make the drum transcriber or the key finder allocate gigabytes (both decode through the same bounded decoder as the splitter). Also fixed: the hourly session sweep never ran; an unsubscribed address could not receive its sign-in links; shared, example and account exports of the audio-to-MIDI tool rendered at 120 BPM with no key; a dropped file loaded twice and the BPM readout froze after typing a value; the groove template and Amount knob never reached the preview or the MIDI; the splitter's progress gave up on the first network blip, and dismissing its sign-in dialog left the page stuck; the account page fell to the sign-in form on a network hiccup; a running job's status answered 404 during a database outage (now 503 with Retry-After); two more ways a beacon could wedge the metrics loader; the dashboard's Activity tree could run script from a crafted URL; the sitemap's modification dates regressed on every deploy; five changed scripts were served under a day-old cache stamp (the stems scripts now carry their own stamp and the stage step refuses a stale one); sessions renew their cookie as they slide; a verification link cannot be used twice at once; stem downloads check the hour and the owner; a crashing split is failed instead of retried forever; the recorder stops at 9:59 so the take is never over the limit, and cancelling while the microphone prompt is open no longer leaves it hot; plus some fifty smaller fixes to validation, escaping, retries, labels and tests.
  • Open on a stem split in your account said the stems were not available when the split had been downloaded while signed in (or from the LAN), because the personal stems page only recognised jobs that had gone through the email gate. It now recognises the job's owner from the job record; the gate record remains as the fallback for older mailed links.
  • A technical review of every endpoint, front and back (2026-10-01): a generate request could ask for an unbounded number of bars and hold the single worker for minutes (the parameters are now typed and bounded, infinities refused, and generation and transcription run off the event loop); one malformed analytics beacon could stall the metrics loader for good (it now coerces the text fields and skips a bad row instead of failing the batch); job and share capabilities no longer reach the uvicorn or Apache access logs; request bodies are capped per endpoint before they are read; account, pitch and job writes refuse cross-site requests; a refused split or transcription no longer spends the caller's hourly submit; the gate's sign-in page answers 403 and is never cached; expired sessions are deleted hourly; cancelled or failed jobs answer 410, downloads accept HEAD, and the separator's budget and ETA leave room for long songs; MIDI files with a tempo map, channel-10 drums or rounding at bar edges parse correctly; a share link is minted once per browser; a cancelled upload on the pitch tool cancels its job; the promote script refuses to fast-forward until the prod database carries every migration and enum value the new code expects; and some thirty smaller fixes to validation, logging, file names and tests.
  • A full content review of every page (2026-10-01): a phone-width transcription drew nothing and threw; the bars stepper ignored a transcription; the exported tom notes disagreed with the manual; the stem splitter's file picker could not be reached from the keyboard; Privacy and Terms said uploads were never kept; llms.txt told assistants the site could not do pitched audio to MIDI; three-genre copy survived on nine-genre pages; the generator page still advertised audio input; the stems pages said the email was asked at download; "six files" listed five; one name per tool across nav, footer, cards and structured data; the technology page now says what we build on and what the server keeps; a CedarGroove share image, manifest and changelog; and some forty smaller fixes to copy, spelling, links and labels.

Removed

  • The drum generator from the home page: it lives at /groove-generator/. The demo tracks section and the home page FAQ are gone (each tool page keeps its own questions).

Changed

  • Sign-in comes before a stem split, as it already did before a transcription: the splitter opens its email step first and then resubmits the same file.
  • The email chip in the header opens /account/ (it used to jump into the converter's history view, which collided with the converter) and shows a small "n running" badge while any of your jobs is queued or running. The converter's own history view retired; /audio-to-midi/#history forwards to the account page and the portal's Open action deep-links a row as #row=.
  • The sign-in link mail for the audio-to-MIDI converter and the account page says it signs you in; it no longer talks about a download there is none of.
  • The header nav spans the width of the page with the tools in order of importance: Home, our own Drum generator (set in the display face with a slow shimmer), Drums to MIDI, Audio to MIDI, Stem splitter, Key & BPM, then More tools; the More menu lists every tool in the same order. Links fold into the menu as the window narrows.
  • The grid's "+" button adds a drum row again: the menu it opens was being closed by the same click, and the canvas now redraws whenever its box changes size, so the button is where the hit test expects it.
  • Tool pages are headed by the tool's name (Stem splitter, Vocal remover, Drum generator, WAV to MIDI drums…) and the small label above every heading is gone; the search phrases stay in the page titles and the lines under the headings.
  • The generator's controls are one connected toolbar in two rows (bars, tempo, slots, transport and Download MIDI; then the knobs, groove, genre and Generate) instead of boxed groups wrapping wherever they fell. The dark/retro switch is gone: the site has one look.
  • The engraved score no longer scrolls the page: Play used to jump to the top and every cursor step re-centred the window. The score starts folded to a few systems in its own scroll box that follows the cursor by itself; "Show the whole score" unfolds it (remembered per browser), and the unfolded score never moves on its own.
  • A transcription with no notes (a drum loop, a whole song) now says so on the result page and the shared page, with links to WAV to MIDI drums and the stem splitter, instead of an empty roll and a Play button that did nothing. A transcription opened from the account page no longer offers the Original and Both play modes, which were silent because the recording is kept for an hour only; the page says so.

Changed (design)

  • Every mail the site sends — welcome, download link, job finished, newsletter issues, the daily digest — now uses one layout in the site's design, and the pages a mail opens (the verified landing, unsubscribe) render in the site shell, so a link from a mail lands in the design it left.

Security

  • The email gate signs in only the browser that opens the link. Until now the browser that merely typed an address was signed in as well once the link was used anywhere, so typing someone else's address and having them click their mail signed the typist in as them. The waiting dialog now says when a link was opened on another device. The start response no longer reveals whether an address is already known.

[1.9.0] — 2026-09-30

Added

  • Six more reference genres for the drum generator — Hip Hop, Trap, Techno, Reggaeton, Afrobeat, Jazz — ten sub-styles each, authored as influence data like the first three; every entry in the Reference Genre dropdown now works. Jazz approximates swing on the straight-sixteenth grid the way Blues Rock (Shuffle) does, and says so.

Changed

  • The genres are a data-driven registry (server/data/genres/*.json, tracked in git): the three shipped genres were converted from the legacy files and pinned byte-exact. Selecting a genre without a sub-style now applies that genre's kick and snare tendencies (House and Rock applied nothing before). House's four-on-the-floor, offbeat-hat and backbeat-clap behaviour is declared in its file, not in code. /api/genres carries a catalog and a roadmap, and the dropdown is built from it.

[1.8.0] — 2026-09-30

Added

  • Audio to MIDI for pitched instruments: /audio-to-midi/ with presets /bass-to-midi/, /piano-to-midi/, /guitar-to-midi/, /vocals-to-midi/. One instrument per file; piano roll, engraved score, sampled playback, sensitivity, grid, tempo, meter, key and transpose, MIDI and MusicXML downloads, microphone recording, a twelve-month history, revocable share links, curated example pages at /examples/.
  • A new site shell (header, footer, tokens, fonts) on the audio-to-MIDI pages; it is the site's standard design from here on.
  • The stem splitter, the isolate-drums page and the personal stems page moved to that design (same copy, URLs and structured data; the separation widget re-themed through its tokens).
  • Every other page followed on 2026-09-30: vocal remover, acapella extractor, drumless and bassless backing tracks, song key & BPM finder, WAV to MIDI drums, the tools index, privacy, terms and the changelog are all rendered in the shell with one shared header (now with a Home link). Same copy, URLs and structured data. Only the home page keeps its own design.
  • /groove-generator/: the drum generator as a tool page in that design, listed under /tools/ and in every menu; the home page keeps its own copy of the generator for now.
  • Fixed: an upload whose title had no Latin letters (a Chinese, Arabic or Cyrillic name) was refused as an unsupported file type, because the cleaned name was reduced to its extension alone; MP3 was always accepted.
  • The audio-to-MIDI upload card carries an amber "No drums here" callout pointing drum loops and drum stems at WAV to MIDI drums: the pitched model finds nothing in a drum loop, and an empty MIDI looked like a broken export. In the page's opening line, "for a whole song, split it first" is highlighted in the same amber with a hover tooltip explaining that drums mask the quieter parts.
  • Fixed: a transcription submitted from the LAN by a signed-in browser was stored without its owner, so "Your transcriptions" stayed empty for the operator; the LAN exemption now means a session is optional, not ignored.
  • Fixed: "Your transcriptions" rendered its seven-column table inside the 440 px upload card and overflowed it to the right; the history now widens the card like the result view, and on a phone each row stacks as a card (file, details, actions).
  • The home page features the audio-to-MIDI converter first: an amber strip right after the "New tools" banner, with the four instrument pages and a link to the converter. The home page stays the drum generator page; a /groove-generator/ tool page comes with the site-wide restyle.

Changed

  • The email gate accepts the Transcribe and macOS-app actions it was already sent (a first-time visitor no longer gets an error from those two buttons).
  • The metrics snapshot is schema 10: audio to MIDI is the fifth tool in usage, journeys and the digest.

[1.7.2] — 2026-09-30

Fixed

  • A first-time visitor could not sign in from the stem splitter's Transcribe button or from the macOS app download: the email gate refused those two actions as unknown. Both are accepted now.

[1.7.1] — 2026-09-30

Fixed

  • An upload whose title had no Latin letters (a Chinese, Arabic or Cyrillic name) was refused as an unsupported file type: the cleaned name was reduced to its extension alone, which reads as no extension at all. MP3, WAV, FLAC and AIFF were always accepted; the name now keeps its extension.

[1.7.0] — 2026-09-29

Added

  • /song-key-bpm-finder/: the key (with its relative and a confidence), the tempo with the half/double-time alternative and a meter guess for any song or loop. Free, nothing stored, no email.

[1.6.0] — 2026-09-29

Added

  • Four one-file pages on the stem separator: /drumless-backing-track/, /bassless-backing-track/, /vocal-remover/ and /acapella-extractor/.
  • A bassless track (vocals + drums + other) as a sixth file in the stem splitter's All stems mode.
  • Downloads and stem loads ask for an email once per browser; the link in the mail unlocks them.

[1.5.1] — 2026-09-07

Fixed

  • Stem inspector fixes on both pages: the playhead and trim guide are visible on the dark isolate-drums page, error text is readable there, and the FAQ on that page renders correctly again.

[1.5.0] — 2026-09-07

Added

  • Stem inspector on the splitter: each stem draws its waveform, plays with a moving playhead, and can be trimmed. Download the trimmed selection, or send a trimmed drum stem straight to the transcriber.

Changed

  • The stem splitter page has a new design.
  • The isolate-drums page returns just the drum stem; the other stems are on the splitter.

[1.4.0] — 2026-09-07

Added

  • Stem splitter at /stem-splitter/: split a song into vocals and instrumental, or into vocals, drums, bass, other and a drumless backing track. Free, no signup, WAV output.

Changed

  • The isolate-drums page uses the same splitter, preset to all stems, and keeps the one-click drum transcription.

[1.3.0] — 2026-09-07

Added

  • Stem separation at /isolate-drums-from-a-song/: drop in a song and get back an isolated drum stem and a drumless backing track.
  • "Transcribe these drums" sends the separated drum stem straight to the converter.

Changed

  • Uploaded songs and their stems are kept for one hour after a separation finishes, then deleted. Transcription still keeps audio in memory only. The site's wording now says so.

[1.2.0] — 2026-09-06

Changed

  • The transcriber analyses 16 bars instead of 8.
  • Clip limit raised from 45 seconds to 3 minutes.
  • Length and size problems are reported in a dialog naming the file and its duration.

Fixed

  • MIDI export timing for patterns with simultaneous hits.
  • The Generate button was unreachable on narrow screens.

[1.1.0] — 2026-09-03

Added

  • MP3 input, alongside WAV, AIFF and FLAC.

Changed

  • Clarified that the browser version transcribes on the server and does not store uploaded audio; only the macOS app runs offline.

[1.0.0] — 2026-04-28

First public release.

Added

  • macOS Universal app (ARM64 + x86_64).
  • Drum pattern generator with three genre models: Drum & Bass, House, Rock.
  • Audio-to-MIDI drum transcription (WAV, AIFF, FLAC input).
  • Browser version at cedargroove.com.
  • 16-step grid editor and Standard MIDI File export.