Changelog
All notable changes to Freally Flipcopy. The version ladder is on the docs site ("The road to 1.0"); every rung is a tag. Release builds for each rung are published as draft releases in this repository; the docs site offers no downloads until v1.0.0.
[0.3.0] — 2026-10-01 — Audio → MIDI: the magic moment
Put an audio loop on the glass, press START, and its MIDI comes out — one page for every layer the copier hears, back to back from one scan, each its own file, framed in lime and dragged into your DAW on its own or all together. A MIDI file with several parts comes out the same way: one audio page per part, and the whole file as one mix.
Added
- Audio → MIDI. An audio loop is read into its layers — drums, bass, melody, a countermelody where the loop has a second, independent line, and chords — with MIDI Master's classic-DSP extractor (no AI). Each layer found is its own page and its own
.mid, named as a DAW shows it (Loop - Bassline - 120 BPM - C# Minor); a layer that isn't there gets no page, and a loop with no notes at all is refused rather than copied blank. The key is printed only when it was read clearly. - A stack of pages. The pages eject one after another from the single scan, fanned on the tray, each titled by its form and its part (MIDI MELODY, AUDIO BASSLINE) with PAGE n/N. Click a page to bring it to the top. Nothing drags until the last page has landed.
- Two drags from the finished stack. The top page carries two lime tabs: All parts drags every page as separate files, so the DAW lays them out as one track per layer; Complete mix drags one file of everything — a multi-track
.midof every part, or the whole render as a.wav— written beside the pages and never printed. Hover the tab for the mix's facts; without a pointer, Save the complete mix as… saves it. - MIDI → audio, part by part. A MIDI file with several parts prints one audio page per part (AUDIO MELODY, AUDIO BASSLINE), each rendered on its own and drawn from its own WAV, plus the Complete mix — the parts sum to the mix, under one headroom gain.
- Loops of up to 16 bars. The glass refuses a longer clip with its length in bars, never cutting it short; a one-, two- or four-bar loop is still copied. An audio loop's bars are counted at the tempo the copier reads it at.
- Honest pages. A Chords page says it is a progression, not the played voicing; when a sung line was heard and left alone, the first page says so, and a loop that is only a sung line is refused saying that, not "nothing to copy". Every tempo printed names where it came from — read from the loop, or, when the loop's hits fit no grid, the host's, the file name's or the default.
flipc, the command line, running the plugin's own glass and copier:flipc copy <file> --out <dir>,flipc facts <file>(the data block exactly as the paper prints it),flipc score(the corpus scorer) andflipc bench(timings).- The corpus gate. The audioTest corpus is scored on every local CI run where it is present — and says SKIPPED where it isn't — against floors that only rise.
Changed
- The host's tempo is followed block by block, and a MIDI file with no tempo of its own is copied at the host's tempo at the moment you press START.
- The session tempo only breaks the octave tie. A 120 BPM loop dropped in a 90 BPM session is read at 120 (four bars), not at 90 (three) — fixed in MIDI Master's shared extractor, for every Freally product that reads loops.
- Free today, not promised forever. Freally Flipcopy is free today, but it might not be free forever: future versions may be sold. Every page of the docs site now says so.
- The repository moved to the maintainer's own GitHub account, private and All Rights Reserved, with the shared Freally crates coming from Freally MIDI Master and Freally Oscillate beside it; the plugin's web address is the docs site's new one.
- Continuous integration runs on the maintainer's machine before every push — every gate on Windows, and the Linux gates in Docker Desktop — and none on GitHub Actions. Every commit carries
[skip ci]. (For a few hours on 2026-09-30, the repository was public and CI ran on GitHub for every push.)
Fixed
- The editor keeps its own browser profile. Flipcopy's WebView2 data (
%APPDATA%\Freally Flipcopy\webview) had been filed under Freally MIDI Master's folder, and two products sharing one WebView2 profile can leave each other's editor blank when both run in the same DAW. It is Flipcopy's own now. - A copy's Complete mix can only ever be its own file: a
record.jsonedited behind the copier can't point a drag, a Save As or a Reveal anywhere else. - A copy is written whole or not at all. Every page and the mix are on disk before any of them takes its name, so a failure part-way never leaves pages in a numbered folder that no copy owns.
- No page clips. The one headroom gain is set by every file a copy writes — a part can peak above the mix where the others cancel it.
- A 16-bar loop exported a tick long is 16 bars, not 17 — a last note released a thirty-second past the bar line is not a bar of its own.
- Controllers reach a page even on a channel that plays no notes.
[0.2.0] — 2026-09-30 — The copier and the first copy
The copier stands on the stage, playing the Blender copier story videos' beats in their order: drop a MIDI file on the glass, press the green START, and a real audio copy comes out onto the tray — printed from its own file, framed in lime, and dragged straight into your DAW.
Added
- The copier on the stage. The machine rendered by the same Blender scene as the two story videos — its base, its lid as sprite frames, the pressed keys, the glass and tray mattes — rendered over the window's own ground (
#090c09) on transparent film, so it stands in the room with no seam. The phases are the videos' beats in the videos' order (the sheet flips and lands face-down, the lid swings shut with its bounce, the START beep, the lamp sweeps side to side leaking cyan out of the front seam while the whole room dims, the copy slides out onto the tray), at the in-app cut's shorter durations; a test fails if the app ever plays a beat the story doesn't have, skips one, or plays them out of order. It fills whatever room the window gives it and never mirrors in a right-to-left language. - The green START is the only trigger. Dropping a clip only puts it on the glass. START (or
Ctrl/Cmd+Enter, which presses the same key) starts the copy; STOP (orEsc) cancels it mid-scan with nothing left behind; HOME clears the glass. The key carries an angled START, turned to the touch panel, and its LED is lit whenever a copy can start. A plugin test sends every command and fails if any butcopier_startstarts a job, and a build gate fails if the page ever sends it from anywhere but the START key. - The glass. Drop an audio or MIDI file from Explorer or Finder anywhere on the window (the glass lights up as it arrives), or press
Enteron the empty glass to pick one. It is read on a thread of its own and printed face-up before it lands — the real notes or the real waveform, with the file's own facts. Network paths, oversized, over-long, silent, damaged, SMPTE-timed and format-2 MIDI files are each refused with their own sentence. Two files at once: the first goes on, and the machine says one clip at a time. A new clip dropped on a finished copy is laid on the glass the same way, and the tray clears (the copy stays in the Copies folder). A file the glass refuses leaves the clip that was on it where it is. - MIDI → audio. The copy renders the file's notes through a default toner — MIDI Master's own preset voices for the pitched parts and a drum machine, one voice per GM lane, for the drums — honouring pitch bend and the sustain pedal (each channel's on that channel's notes only), with a 2.5 s tail, at the file's tempo (else the host's — the standalone has none — else the one in the file name, else 120 — and the page names which), kept under −0.3 dBFS, and written as a 24-bit WAV at the host's sample rate (44.1 kHz in the standalone) that a DAW places on the beat grid. A copy is as long as a page can be printed from — five minutes, or 2:30 above 48 kHz — and a longer one is refused before it is rendered, never cut short. Audio → MIDI arrives at
v0.3.0; until then START on an audio clip says so, honestly. - The Copies folder (
Documents/Freally Flipcopy/Copies): one numbered folder per copy, taken atomically so two DAWs never share a number; pages named the way a DAW shows them (Title - Part - 120 BPM, Key.wav); every page written atomically, read back and verified — and never moved, overwritten or deleted, because your DAW refers to it by its path. - Prints, from the files themselves. Every page — the original on the glass and the copy in the tray — is laser-printed like the story videos' prints: title, source line, bar ruler, the piano roll with its velocity lane or the waveform with its new spectrum strip, and the data block, all computed by the plugin from the bytes on disk. A bar of an odd meter keeps its half beat (7/8 prints three and a half beats a bar). A copy's page says what its render left out — controllers it did not play, drum notes the kit has no voice for — never dropping them quietly. A test reads the structure of the app's pages and of the videos' own prints and holds them to each other.
- Drag the copy into your DAW. The ejected page wears a lime frame round its clip with Drag to DAW beneath it — the frame is the handle. Press inside it and move 4 px, and the copy's own file is dragged (with a mini print on the cursor) into FL Studio, Ableton, Reaper or any DAW that takes files. Nothing drags until the page is fully out; where no drag can be made here, the frame turns grey and dashed and offers Save As instead.
Enteron the page opens Save As or shows the file in its folder. - The machine's sounds, synthesised from scratch for this copier (place, lid, beep, scan start, one whir per lamp sweep, eject) and mixed by the plugin into its own output — never an HTML
<audio>— at −18 dB through the Monitor level, quiet while your DAW plays (the standalone has no DAW transport to be quiet for), silent in an offline bounce, and never in place of your track's audio. Settings has them on/off, their level, and the "quiet while playing" choice. - The touch screen shows what the machine is doing, the clip it holds, and every refusal in the producer's language.
- Gates for all of it, each watched failing before it was trusted: the ground-match trio (the render's colours equal the tokens; ΔE2000 around the machine's own alpha silhouette in every phase at DPR 1 and 2; nothing between the machine and the ground paints), the START gate (static, plugin and Playwright), print parity, the drag frame's pixels, and the new app-leg specs in the real standalone.
Changed
- Shared code:
freally-extract(the decode door and the audio analysis),freally-encode(WAV, resampling, the DAW-grid chunks) andfreally-drag(the native drag source) are consumed from MIDI Master atshared-v5, withfreally_library::audition::NoteRenderer,read_facts' controller events, and the web view adapter's file-drop hook, its re-placing of the web view when the window moves and its blank caption added upstream there. - The icon is the owner's own — the lime F over a waveform and a piano roll — on the executable, the plugin bundles, the Linux and macOS icons and the docs site, in place of the placeholder.
- The window. The standalone's title bar wears the icon, is dark and the colour of the room, and says nothing: no title in the title bar of the standalone or of a plugin window in a DAW whose caption names Flipcopy, since the turning name across the top of the window already says it. That turning name is twice the size, to be read at a glance, and centred over the copier's side of the window; the file browser runs from the top of the window to the preview dock beside it.
- The bridge takes requests up to 2 MiB (a drag image);
host_infosays whether a page can be dragged here. - Before the licence agreement is accepted, the page can read the interface language and nothing else, through a command of its own (
locale_get);prefs_getanswers only once it is accepted.
Fixed
- Moving the window on a scaled display. With Windows set to 150 %, dragging the standalone window by its title bar drew its contents a third of the way behind the window, towards the screen's top-left corner, hiding the right and bottom edges until the window was moved back to that corner. The contents now stay exactly under the window wherever it is moved.
- The standalone at your display's own scale. On a scaled display (150 %) the standalone ran as an old-style, unscaled program: Windows stretched its window while the page inside it drew at true pixels — the root of the drag and drop-down misplacements listed here. It now declares itself per-monitor DPI aware before it opens a window, as Freally MIDI Master's and Freally Unloop's standalones do, so the page draws crisply at the display's scale and the window opens at its intended size.
- The language list opens under its field. On a scaled display the system's own drop-down list opened down and to the right of the Settings field, further off the further the field sat from the window's corner; the list is now drawn by Flipcopy itself, straight under the field, in the window's own dark style, with each language written in its own script.
[0.1.0] — 2026-09-26 — Foundation & CI spine
The empty product every later rung builds on: it loads, passes audio through untouched, asks for the licence agreement, opens its dark window, and every quality gate runs.
Added
- The plugin, in every format from one binary. A nih-plug CLAP plugin with VST3 and AUv2 entry points projected by
clap-wrapper(licence-clean: no GPL VST3 bindings), plus the standalone application — a native desktop app with its own window and audio device, never a web app. Stereo in and out, a note input for the later "Scan from track", zero latency, and the track's audio passed through bit for bit (a null test proves it). A host Bypass switch and a Monitor level for the sound Flipcopy itself will add (the machine's sounds and the preview, fromv0.2.0) — it never touches the track. A versioned saved state that is bounded, migrated and refused as a whole rather than half-loaded, so a damaged project never crashes the host. - The licence agreement (
EULA.md, structured like Freally Oscillate's) and its gate: Flipcopy asks you to accept it on first open and stays inert until you do — it reads nothing, copies nothing and adds nothing to your track. The agreement is compiled into the plugin and served from it, Agree waits until the text has been read to the end, and your answer is shared by every open instance and the standalone. A decline that could not be saved says so. - The window, opening at 1400 × 875 (Freally Unloop's size) and scaling as one to any size — everything keeps its proportions, with no band around it — under a title bar where Freally Flipcopy and its version turn on the Y axis in 3D, the same way Freally Oscillate's and Freally MIDI Master's do (and stand still for reduced motion): the dark shell with the browser rail and the preview dock on the inline-start side, a draggable splitter (260–420 px, arrow keys too), and the stage — which has no background of its own, so the copier will stand in the room with no seam around it. One theme, dark, and nothing that could make a second one.
- Eighteen languages for everything in the window, with the choice saved per computer and shared by every instance; right-to-left layouts for Arabic.
- Google's Noto fonts, vendored into the bundle under the SIL Open Font License 1.1, with the licence shipped beside them.
- The docs site, built like Freally Oscillate's and dark-only, in the same eighteen languages (each loaded only when a reader picks it): the home page with the version ladder (generated from
docs/ladder.jsonand held to the private plan by a gate), the two Blender copier stories in "See it copy", the documentation, this changelog, and a download page that says plainly there is nothing to download beforev1.0.0. The stories play with their sound, only when you press the angled START on the copier's green key (or play), and come to rest on their first frame when they end or are stopped; the audio → MIDI story prints a page per layer — MIDI Melody, MIDI Chords, MIDI Bassline and MIDI Countermelody — one after another onto a stack in the tray, each framed in lime with Drag to DAW beneath it. - Text stays inside its containers in all 18 languages, at the default window and the smallest one (a Playwright check over every label).
- The gates, each watched failing before it was trusted: formatting, clippy, every test, type checks, lint, the locale gate (18 catalogs, identical keys and placeholders, actually translated), the logical-CSS lint, design tokens and contrast, dark-only, the denylist (no AI, no network, no telemetry), the licence audit, the shared-crate gate (consume, never fork), product names (never a copier maker's trademark), bindings drift, the ladder, no downloads before 1.0, the asset budget,
clap-validatorandpluginvalat strictness 10, local CI on Windows and in Docker for Linux, and Playwright on two legs — the browser and the real standalone window.
Security
- The editor loads only the page compiled into the binary, under a strict Content Security Policy; its bridge answers only the page's own JSON
POST, refuses anything over 64 KiB and any path with.., and before the agreement is accepted answers only an allowlist of commands. Release builds open no DevTools and no remote-debugging port. - No network code in the plugin or the standalone, checked by the compiler (
clippy.toml) and the dependency graph (scripts/check-denylist.mjs). - The files Flipcopy keeps in your app-data folder (the agreement answer and the preferences) are read with a size bound and written atomically, so a damaged or hand-edited file loads as the defaults and a crash never leaves half a file.