Skip to content

Releases: leizzo/resamper

v0.2.3 — M1.2 Fixes (alpha)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 17:34

M1.2 — Fixes on top of M1.1 — Devices & Plug-ins: Turkish UI, in-app updates, Time
Selection, and fixes to plug-ins, undo and the Arrangement.

Added

  • The UI speaks Turkish. Options → Language / Dil picks System, English or Türkçe; the choice
    applies after a relaunch, which the app offers.
  • On launch, a newer release shows an Update button and downloads in place. Restart swaps in the
    signed app. A development build opens the release in the browser.
  • The first launch of a version opens a dialog of what was added and changed since the version
    opened last time.
  • The Arrangement grid subdivides into beats, 1/8 and 1/16 as you zoom in, and clip moves and trims
    snap to the grid you see. The ruler's right-click menu turns Snap to Grid on or off and picks a
    fixed grid size; Mod still bypasses the snap.
  • The loop brace is always on the ruler, dim while Loop is off. Drag it to move the loop or drag an
    end to resize it; it always lands on the grid.
  • A Time Selection spans every track. Drag on empty lane space to select bars (Shift extends), drag
    its ruler handles to resize it, and drag inside it to move what it holds (Alt copies). Duplicate
    (Mod+D), Insert Duplicate (Mod+Shift+D), Split (Mod+E), Clear (⌫) and Delete Time
    (Mod+Shift+⌫) act on the clips and automation inside it, each one undo step. Mod+A selects
    every clip.
  • Right-clicking empty lane space adds a MIDI, Audio or Return track after the clicked lane, and
    offers Insert MIDI Clip, Select All and Loop Selection. Right-clicking a Time Selection opens its
    own menu.

Changed

  • Every context menu and drop-down has the design's look: a rounded, translucent menu with icons and
    a shortcut column.

Fixed

  • A loop dragged in the ruler started and ended between beats.
  • Alt-dragging a clip seemed to move it: the original now stays put and a ghost shows the copy.
  • A plug-in added to a Device Chain, or switched to or from Run in-process, played dry; exports were
    unaffected (#168).
  • A Plug-in Window went black after Bypass or a click, and some plug-in UIs stuttered (#168).
  • Switching Run in-process or reloading a plug-in lost the changes made since the last save
    (#171).
  • Parameters gives a plug-in with a small UI a readable window (#132).
  • Track and Bus mute and solo are one undo step each (#81).

Download

Open Resamper-0.2.3-macOS.dmg (Apple Silicon) and drag Resamper to Applications.

All changes

🔀 Pull requests

  • #163 ✨ feat(update): download a newer release and show what changed by @leizzo
  • #164 ✨ feat(i18n): UI Language plumbing — Preferences, LocalisedStrings, Language / Dil menu, lint and test by @leizzo
  • #165 🌐 feat(i18n): translate the Arrangement, Mixer, Detail View, Browser, Plug-in Windows and Piano Roll by @leizzo
  • #166 🌐 feat(i18n): translate the main window, menus and Command names by @leizzo
  • #167 🐛 fix(undo): track and Bus mute and solo are one undo step each by @leizzo
  • #169 🐛 fix(plugin-window): Parameters grows a small vendor area to a readable minimum by @leizzo
  • #170 🐛 fix(plugin-sandbox): Device Chain plug-ins play live; their UI stays on top and drags hold by @leizzo
  • #172 🐛 fix(plugin-hosting): Run in-process and Reload keep changes made since the last save by @leizzo
  • #174 🐛 fix(arrangement): grid subdivides and snaps, loop brace snaps and moves, Alt-drag ghost, marquee and empty-area menus by @leizzo
  • #178 ✨ feat(arrangement): Time Selection across every track — ruler handles, move / Alt-copy, context menu (#175) by @leizzo
  • #180 ✨ feat(arrangement): Track Area menu adds MIDI, Audio and Return tracks after the clicked lane (#176) by @leizzo
  • #181 💄 style(ui): every PopupMenu draws the design's menu chrome (#179) by @leizzo

✨ Features

  • ✨ feat(update): download a newer release and show what changed (cda0c1f) by @leizzo
  • ✨ feat(i18n): choose the UI Language at launch, with a Language / Dil menu (dc008af) by @leizzo
  • 🌐 feat(i18n): translate the main window, menus and Command names (34122b1) by @leizzo
  • ✨ feat(i18n): Turkish upper-casing and NEEDS_TRANS keys in the missing-translation check (0964264) by @leizzo
  • 🌐 feat(i18n): translate the Arrangement, Mixer, Detail View, Browser, Plug-in Windows and Piano Roll (4fd732c) by @leizzo
  • ✨ feat(arrangement): a Time Selection across every track, with its ruler handles, drag to move or Alt-copy, and its menu (#175) (855641f) by @leizzo
  • ✨ feat(arrangement): the Track Area menu adds MIDI, Audio and Return tracks after the clicked lane, with icons and shortcuts (#176) (9ae85a1) by @leizzo

🐛 Fixes

  • 🚨 fix(update): pass clang-tidy on the update check (cee95d1) by @leizzo
  • 🐛 fix(i18n): close a stale relaunch offer when the language changes again (dccc389) by @leizzo
  • 🌐 fix(i18n): review fixes to the area translations (cdf2ee5) by @leizzo
  • 🐛 fix(undo): track and Bus mute and solo are one undo step each (ddc9901) by @leizzo
  • 🐛 fix(plugin-window): Parameters grows a small vendor area to a readable minimum (17eb054) by @leizzo
  • 🐛 fix(plugin-hosting): a plug-in added to a Device Chain plays live (8e18abf) by @leizzo
  • 🐛 fix(plugin-sandbox): a sandboxed Plug-in's UI stays on top and its drags hold (1c63019) by @leizzo
  • 🐛 fix(plugin-hosting): Run in-process and Reload keep changes made since the last save (a30c989) by @leizzo
  • 🐛 fix(arrangement): the grid subdivides and snaps, the loop brace snaps and moves, Alt-drag shows a ghost, marquee and empty-area menus (d621b98) by @leizzo
  • 🐛 fix(arrangement): a moved loop brace keeps both ends on the grid; Loop Selection needs a selection in the menus (ebbcb6f) by @leizzo

♻️ Refactoring

  • ♻️ refactor(i18n): one relaunch hook, string-keyed submenus, multi-line lint matches (ad0eec6) by @leizzo
  • ♻️ refactor(arrangement): one statement of the new-track placement rule; the lane menu test checks the selected track (#176) (d672001) by @leizzo

✅ Tests

  • 📸 test(update): add the update button and completion dialog (d6e5a23) by @leizzo
  • 📸 test(i18n): snapshot the Language / Dil menu and the relaunch toast (e3ad764) by @leizzo
  • 📸 test(i18n): retake the main-window snapshots and fill the glossary gaps (fde2576) by @leizzo
  • 📸 test(i18n): English and Turkish snapshots of the translated areas (f5b395f) by @leizzo

📝 Documentation

🔧 Other

  • 🔧 chore: drop brand images and the GIN analysis, ignore Prototypes, update design (84484b7) by @leizzo
  • 💄 style(ui): every PopupMenu draws the design's chrome — translucent rounded menu, outline, 26-high rounded highlight, icon slot, mono shortcut column (#179) (da24215) by @leizzo

v0.2.2 — M1.1 Devices & Plug-ins (alpha)

Choose a tag to compare

@github-actions github-actions released this 04 Oct 00:29

Fixes and layout internals on top of M1.1 — Devices & Plug-ins.

Changed

  • Layouts are C++ components. Saving a theme file still re-styles the app. Developer Mode opens
    melatonin_inspector instead of the in-house inspector.
  • A plug-in saved in the Project but not installed is Missing. Plug-in Hosting starts it once a
    scan finds it.
  • The per-instance sandbox switch is named Run in-process.

Fixed

  • Menus, the Save Preset dialog, tooltips and toasts stay above a sandboxed plug-in's own UI.
  • A clip's context menu belongs to its lane, so it is dismissed when the lane goes.
  • The selected clip's outline comes from the Theme.
  • Undoing a plug-in insert drops that plug-in's pending sandbox load with the Edit. A load one Edit
    leaves pending is not taken up by the next Edit.

Download

Open Resamper-0.2.2-macOS.dmg (Apple Silicon) and drag Resamper to Applications.

All changes

🔀 Pull requests

  • #139 👷 ci(release): list the commits since the last published release by @leizzo
  • #146 ♻️ refactor(engine): Plug-in Hosting owns where a Plug-in runs by @leizzo
  • #147 ♻️ refactor(engine): push one Hosting State per Plug-in from Plug-in Hosting by @leizzo
  • #148 ♻️ refactor(engine): offline render with plug-ins waits for loading Plug-ins itself by @leizzo
  • #149 🐛 fix(engine): a pending Sandbox load doesn't leak into the next Edit by @leizzo
  • #150 ✨ feat(engine): Missing becomes a Hosting State that Plug-in Hosting starts by @leizzo
  • #151 ♻️ refactor(hosting): name the per-instance switch Run in-process by @leizzo
  • #152 🐛 fix(sandbox): keep popups above sandboxed plug-in UI by @leizzo
  • #153 📝 docs(agents): run the full suite when opening a PR by @leizzo
  • #154 Run the full suite only when opening a PR by @leizzo
  • #155 🏗 refactor: C++ layouts and compile-time engine guardrails by @leizzo

✨ Features

  • ✨ feat(engine): make Missing a Hosting State that Plug-in Hosting starts (9150b0a) by @leizzo

🐛 Fixes

  • 🩹 fix(engine): clearer Plug-in Hosting errors; tidy the AUv3 test double (e11bc67) by @leizzo
  • 🐛 fix(engine): a Sandbox load an Edit leaves pending is that Edit's only (a5afe34) by @leizzo
  • 🐛 fix(engine): an undone plug-in's pending load goes with its Edit too (32cb749) by @leizzo
  • 🐛 fix(sandbox): keep popups above sandboxed plug-in UI (6f58491) by @leizzo
  • 🚨 fix(ui): take the selected clip outline from the Theme (beb7a97) by @leizzo
  • 🐛 fix(ui): guard the clip menu by its lane; say why card size skips undo (eae670b) by @leizzo
  • 🚨 fix(ui): drop PianoKeyboard's unused model reference (421557a) by @leizzo

♻️ Refactoring

  • ♻️ refactor(engine): Plug-in Hosting owns where a Plug-in runs (1446362) by @leizzo
  • ♻️ refactor(engine): push one Hosting State per Plug-in from Plug-in Hosting (0abb0d1) by @leizzo
  • ♻️ refactor(engine): offline render with plug-ins waits for loading Plug-ins itself (1c38c0f) by @leizzo
  • ♻️ refactor(hosting): name the per-instance switch Run in-process (5bdc592) by @leizzo
  • ♻️ refactor(mixer): carry fader and send levels as Decibels (8a49ec7) by @leizzo
  • ♻️ refactor(ui): hold engine facades const; select through Commands (998c40f) by @leizzo
  • 🔥 refactor(ui): replace JSON layouts with C++ components (cada2e5) by @leizzo
  • 🏗 refactor(engine): stop UI and commands reading past the facades (74829ff) by @leizzo

✅ Tests

  • 🧪 test(sandbox): AsyncFormat names a plug-in from its identifier as its scan does (18f24d1) by @leizzo

📝 Documentation

  • 📝 docs(engine): document Plug-in Hosting's listener and engine side; keep its state private (3989e87) by @leizzo
  • 📝 docs(context): define Plug-in Hosting and Hosting State (fab1c44) by @leizzo
  • 📝 docs(sandbox): show popups above the sandboxed plug-in UI (4bb2536) by @leizzo
  • 📝 docs(agents): require a screenshot or video on each PR (87db370) by @leizzo
  • 📝 docs(agents): run the full suite when opening a PR (008f79b) by @leizzo
  • 📝 docs(agents): stop the PR when the full suite fails (0794115) by @leizzo
  • 📝 docs(changelog): milestones are minor releases, defect fixes are patches (3450ce6) by @leizzo

👷 Build & CI

  • 👷 ci(release): list the commits since the last published release (5abe144) by @leizzo
  • 👷 ci(lint): add Semgrep and clang-tidy checks (cde1f9b) by @leizzo
  • 💚 ci(lint): init melatonin_inspector before configure (62a9fe5) by @leizzo

🔧 Other

  • 🔧 chore(perch): close false positives from the Plug-in Hosting prefactor (ae84fec) by @leizzo
  • 💄 style(design): marketing screenshots cover their frames (6720d23) by @leizzo
  • 🔧 chore(perch): close a false positive on deferred Hosting State notification (0c541e2) by @leizzo
  • 🎨 style(ui): name the window's Hosting State and its crash rule for what they are (6ce11e2) by @leizzo
  • 🙈 chore(git): ignore .mcp.json (dad5480) by @leizzo
  • 🔇 chore(perch): close the AUv3 timeout lambda's false positive (d86cabb) by @leizzo
  • 🎨 style(engine): say why forgetGoneEdits drops another Edit's id in its doc (14324e0) by @leizzo
  • 🔇 chore(perch): close #144's false positives in unchanged methods (f69afe8) by @leizzo
  • 🎨 style(engine): read a started plug-in's state without inserting an entry (f013446) by @leizzo
  • 🔇 chore(perch): close the sandbox popup scan's false positives (19e5a20) by @leizzo
  • 🔀 chore: merge release versioning into main (e7021fd) by @leizzo
  • 🔧 chore(perch): tune engine-const-leaves-edit-alone against controls (5ea9c2e) by @leizzo
  • 🔧 chore(perch): narrow rules that misfired on this branch (75dbcd1) by @leizzo
  • 🔀 chore: merge layouts-as-components into abstraction guardrails (7d72bd4) by @leizzo

v0.2.1 — M1.1 Devices & Plug-ins (alpha)

Choose a tag to compare

@github-actions github-actions released this 02 Oct 20:31

Release fix on top of M1.1 — Devices & Plug-ins. v0.2.0 was tagged but never published: its
release build failed on a timing assertion in the tests.

Fixed

  • The test that a slow plug-in loads in the background bounds the insert by the plug-in's load time
    instead of a fixed 300 ms, which a CI runner can exceed (#138).

Also in this release (v0.2.0 was never published)

Milestone M1.1 — Devices & Plug-ins: native devices v2, plug-in hosting in a sandbox, plug-in
windows and lucide icons.

Added

  • EQ Eight v2 and Compressor v2 native devices, edited on their graphs (#67). EQ Eight: drag a
    node for frequency and gain, wheel for Q, double-click to switch a band; eight bands with type
    and on/off, pre/post spectrum, Q-width shading, St / L-R / M-S, Adaptive Q, audition. Compressor:
    drag the threshold on the Transfer graph, Transfer / Activity views, IN / GR meters, Lookahead,
    Peak / RMS / Expand, Makeup Auto / Mix / Out. Each gesture is one undo step.
  • Device cards for native devices and plug-ins (#66). A native card can be Folded, Compact or
    Expanded. A plug-in card shows vendor, format, up to 4 pinned parameters edited inline, and CPU,
    latency and sandbox state; a missing plug-in offers Locate and Replace. The chain ends in
    a drop zone.
  • Plug-in windows (#68) with host chrome: Bypass, presets, A/B compare, latency, CPU, sandbox
    state and UI scale 100 / 150 / 200 %. A plug-in's window opens when it is inserted, with a toast
    offering Undo and an Auto-open window on insert switch. One window per instance; position, pin and scale
    are saved with the Project. Esc / Mod+W close the focused window, Mod+Alt+P shows or hides
    them all.
  • Plug-in sandbox (#69): each plug-in runs in its own process by default. A crashing plug-in
    bypasses only its own device, playback keeps going, and Reload brings it back with its last
    saved state. Run in-process can be set per plug-in and is saved with the Project.
  • Plug-in scanning out of process (#78): a plug-in that crashes or hangs the scan is listed as
    Failed to scan with Retry, and the rest load. Browser rows show a VST3 / AU / CLAP badge.
  • A native Mixer Insert opens its device in a floating window, like a plug-in insert; plug-in
    inserts look different from native ones (#70).
  • The lucide icon set, sized and coloured by role (#79).

Changed

  • EQ Eight v2 and Compressor v2 replace the v1 EQ and compressor in the device list. Projects that
    use the v1 devices still load them.

Fixed

  • Inserting a sandboxed plug-in no longer blocks the app while it loads; export, bounce and freeze
    wait for plug-ins that are still loading (#134).
  • A sandboxed plug-in's CPU % is the plug-in's own time in its host (#136).
  • Undo right after a new track or a plug-in insert keeps Redo (#133).
  • A plug-in insert that is refused leaves no partial undo step.
  • Shortcuts typed in a plug-in window reach Resamper.

Known issues

  • AUv3 and other plug-ins that load asynchronously run in-process, outside the sandbox.
  • A plug-in that finishes loading during playback can cause a short gap.
  • Moving a plug-in's controls doesn't record automation yet (M3).

Download

Open Resamper-0.2.1-macOS.dmg (Apple Silicon) and drag Resamper to Applications.

All changes

🔀 Pull requests

  • #138 🐛 fix(tests): bound the background plug-in insert by its load time by @leizzo

🐛 Fixes

  • 🐛 fix(tests): bound the background plug-in insert by its load time, not 300 ms (6cba314) by @leizzo

🔀 Pull requests

  • #119 Device cards: native vs plug-in (DeviceCard/Native, DeviceCard/Plugin) by @leizzo
  • #123 ✨ Iconography: lucide icon set by name, sizes and colours by role (#79) by @leizzo
  • #124 ✨ Native devices v2: EQ Eight v2 and Compressor v2 (#67) by @leizzo
  • #125 ✨ Plug-in window: host chrome, auto-open on insert, window management (#68) by @leizzo
  • #126 ✨ Plug-in scanning out of process: format badges, Failed to scan, Retry (#78) by @leizzo
  • #127 ✨ Out-of-process plug-in sandbox and crash recovery (#69) by @leizzo
  • #128 ✨ Mixer inserts: InsertSlot/Plugin, native insert opens its floating editor (#70) by @leizzo
  • #137 🐛 Sandbox follow-ups: background loading, shared wait, host CPU, toast Undo by @leizzo

✨ Features

  • ✨ feat(devices): split DeviceCard into native and plug-in contracts (7308ba5) by @leizzo
  • 💄 feat(devices): draw the cards to the design; pin by touching; keep the plug-in window in front (695a2f1) by @leizzo
  • ✨ feat(devices): save device size on the device, Locate by file, float expanded devices (e4a2e5f) by @leizzo
  • ✨ feat(icons): lucide icon set by lucide name, sizes and colours by role (31479c1) by @leizzo
  • ✨ feat(devices): EQ Eight v2 and Compressor v2 native devices (#67) (77ace24) by @leizzo
  • ✨ feat(plugins): host-chromed plug-in window, opened on insert, with window rules (8e647e6) by @leizzo
  • ✨ feat(plugins): scan each plug-in in its own worker; Failed to scan with Retry; format badges (e980f58) by @leizzo
  • ✨ feat(plugins): run plug-ins in a sandbox process, with crash recovery (64827b0) by @leizzo
  • ✨ feat(mixer): plug-in inserts look apart; a native insert floats its device expanded (68e136c) by @leizzo

🐛 Fixes

  • 🐛 fix(plugins): close a plug-in's window when the plug-in goes (4e12792) by @leizzo
  • 🐛 fix(devices): hold the Compressor's detector across a waveform's zero crossings (#67) (ff37e58) by @leizzo
  • 🐛 fix(devices): keep EQ Eight's bands from cramping toward Nyquist (#67) (6dbeaf9) by @leizzo
  • 🐛 fix(plugins): cascade to a free spot, theme radii in the window chrome, steadier window tests (4f18d3b) by @leizzo
  • 🐛 fix(plugins): sandbox forwards program renames, keeps MIDI room, guards sizes, removes its listeners (566277a) by @leizzo
  • 🐛 fix(plugins): report a sandbox host that dies before its stand-in listens (bd3857d) by @leizzo
  • 🐛 fix(plugins): show a sandboxed plug-in's own UI in its window; Space plays from it (#68) (e97f467) by @leizzo
  • 🐛 fix(plugins): show a sandboxed plug-in's CPU as its host's own time (1592b4c) by @leizzo
  • 🐛 fix(undo): keep Redo after undoing a step that follows a new track (bf3e9fd) by @leizzo
  • 🐛 fix(plugins): leave no partial undo step when an insert is refused (a611853) by @leizzo
  • 🐛 fix(plugins): wait for background plug-in loads before rendering offline (b362cb5) by @leizzo

⚡️ Performance

  • ⚡ perf(devices): redesign an EQ Eight band only when its settings move (#67) (239e005) by @leizzo
  • ⚡️ perf(plugins): load sandboxed plug-ins in the background (d4bf7b0) by @leizzo
  • ⚡️ perf(plugins): share a block's wait along a chain; real-time hosts (bcf391d) by @leizzo

♻️ Refactoring

  • ♻️ refactor(devices): share a card's parameter spec and setter; tidy review nits (80e140e) by @leizzo
  • ♻️ refactor(icons): kebab-case icon size metrics, forward-declare Theme, test every icon (6f15508) by @leizzo
  • ♻️ refactor(ui): one shortcut rule for the main and plug-in windows (93236a5) by @leizzo

✅ Tests

  • ✅ test(devices): measure EQ Eight and Compressor v2 as Plugin Doctor does (#67) (18fc799) by @leizzo

📝 Documentation

  • 📝 docs(plugins): say why the touch watch ignores curve changes (4dbb168) by @leizzo
  • 📝 docs(funding): link the repo to GitHub Sponsors (587ce96) by @leiz...
Read more

v0.1.3 — M1 Core (alpha)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Oct 20:26

Arrangement and control fixes on top of M1 — Core.

Changed

  • A warped Audio Clip (a tempo-tagged loop, or one played faster or slower) stretches in real
    time: a trim, split, Clip Loop or tempo change is heard at once and no longer renders a new
    file or stops the transport.
  • Adding a FLAC, OGG or MP3 as a clip decodes it into the Project's Audio folder as a WAV, and
    the clip plays that copy. Projects saved by 0.1.x that use such a file directly are not
    migrated: they read it as it is, which can cost more CPU.
  • Waveforms are read on a normal-priority thread, so an Audio Clip's waveform appears sooner.

Fixed

  • An Audio Clip's waveform no longer hangs on "Preparing audio", stays put when the clip is split or
    moved (to the same or another track), and is not left generating when its file can't be read.
  • A clip's title no longer glitches or follows the Playhead during playback.
  • Clicking a track header selects the track instead of focusing its Record Arm button, and the
    header's menu can't act on a track that was deleted while it was open.
  • A Knob's focus ring is no longer clipped, and the value tag of a Knob or Fader sits beside the
    control instead of following the pointer.
  • Clicking a Mixer fader away from its cap jumps the cap to that dB, in one undo step with any drag
    that follows.

Download

Open Resamper-0.1.3-macOS.dmg (Apple Silicon) and drag Resamper to Applications.

All changes

🔀 Pull requests

  • #112 🐛 fix(arrangement): draw a stretched clip's source while its proxy renders by @leizzo
  • #113 🐛 fix(arrangement): keep a clip's title put while the Playhead repaints over it by @leizzo
  • #114 🐛 fix(arrangement): draw a split clip's waveform in the first paint by @leizzo
  • #115 ✅ test(arrangement): cover a dragged clip keeping its waveform (#90) by @leizzo
  • #116 🐛 fix(controls): anchor the ValueTag, keep the Knob focus ring inside, click-to-jump the Fader by @leizzo
  • #117 🐛 fix(arrangement): select the track on a header click; keep focus off Record Arm by @leizzo
  • #118 🐛 fix(arrangement): warp Audio Clips in real time instead of rendering proxies by @leizzo

🐛 Fixes

  • 🐛 fix(arrangement): draw a stretched clip's source while its proxy renders (a010cd2) by @leizzo
  • 🐛 fix(arrangement): don't leave a waveform generating when its audio can't come (7f9b70d) by @leizzo
  • 🐛 fix(arrangement): keep a clip's title put while the Playhead repaints over it (baaf519) by @leizzo
  • 🐛 fix(arrangement): draw a split clip's waveform in the first paint (30da7bb) by @leizzo
  • 🐛 fix(controls): anchor the ValueTag, keep the Knob's focus ring inside, click-to-jump the Fader (8e77d10) by @leizzo
  • 🐛 fix(arrangement): select the track on a header click; keep focus off Record Arm (611636a) by @leizzo
  • 🐛 fix(arrangement): keep the track header's menu items off a deleted header (bb9379e) by @leizzo
  • 🐛 fix(arrangement): warp Audio Clips in real time instead of rendering proxies (099bd98) by @leizzo

⚡️ Performance

  • ⚡️ perf(engine): read waveforms on a normal-priority thread (7d3f75e) by @leizzo

♻️ Refactoring

  • ♻️ refactor(arrangement): name the waveform progress padding, null-check the test clip (a175b59) by @leizzo
  • ♻️ refactor(arrangement): name the on-screen and painted areas, cover an off-screen strip repaint (1d9d54b) by @leizzo
  • ♻️ refactor(arrangement): null-check the dragged clip's component, say why its peaks stay whole (0fc288f) by @leizzo
  • ♻️ refactor(controls): name the ValueTag gap; tidy the control view test helpers (448fa14) by @leizzo
  • ♻️ refactor(tests): share the mouseEvent helper through TestFixture.h (a1775f6) by @leizzo
  • ♻️ refactor(arrangement): name a decoded clip after the added file; tidy review nits (5aae5d4) by @leizzo

✅ Tests

  • ✅ test(arrangement): cover a dragged clip keeping its waveform (0c4f266) by @leizzo
  • 🧪 test(waveform): null-safe first-clip helper; set aside perch false positives (f5a8510) by @leizzo

🔧 Other

  • 🔧 chore(perch): close findings on unchanged methods and pre-existing literals (076a43c) by @leizzo
  • 🔧 chore(perch): close three findings on unchanged ApplicationModel methods (a7aecba) by @leizzo
  • 🔧 chore(perch): set aside pre-existing ValueTag theme-token finding (5cee156) by @leizzo
  • 🔧 chore(perch): set aside a test-lambda false positive (2d7d71e) by @leizzo
  • 🔧 chore(perch): set aside pre-existing TrackHeader theme-token findings (f7138a0) by @leizzo
  • 🔧 chore(perch): set aside the recording-waveform null finding again (afc83d2) by @leizzo

v0.1.2 — M1 Core (alpha)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 30 Sep 14:41
ebbcc52

Mixer Bus Strips and release automation on top of M1 — Core.

Added

  • The Mixer draws a Strip for each Bus, after its last child: tinted in the Bus colour, with its
    input count, Output, Mixer Inserts, Sends, pan, mute/solo and meter. A Bus gets Add Send from
    the strip menu, and its fader, pan, mute and solo undo like a track's.
  • Each GitHub release ships the macOS app (Apple Silicon, signed and notarized) as a DMG, and its
    notes list every change with links to the commits and pull requests.

Changed

  • Mixer track numbers count tracks only, and Returns are ordered A–D.
  • A track's Output in the Mixer is the nearest Bus above it, following nested Buses, else the Master.
  • Internal: one Track Kind rule and track lookup for the Engine, and the Mixer reads a Strip model
    in signal-flow order instead of re-deriving Bus and Return membership in the view.

Download

Open Resamper-0.1.2-macOS.dmg (Apple Silicon) and drag Resamper to Applications.

All changes

🔀 Pull requests

  • #99 👷 ci(release): build, sign, notarize and publish releases from tags by @leizzo
  • #104 ♻️ refactor(engine): one Track Kind rule, Tracktion track lookup, getClip by @leizzo
  • #105 ♻️ refactor(mixer): a Strip read model in signal-flow order by @leizzo
  • #106 🔧 chore(perch): JUCE, Tracktion, DSP and UI rules by @leizzo
  • #107 ✨ feat(mixer): draw Bus Strips by @leizzo
  • #108 ♻️ refactor(mixer): fit the Bus Strip to #106's perch rules by @leizzo
  • #109 📝 docs(readme): add build, commit and release badges by @leizzo
  • #110 🐛 fix(mixer): detach the Mixer's meter clients from Bus and removed-track meters by @leizzo

✨ Features

🐛 Fixes

  • 🐛 fix(ci): match commit subjects after the hash prefix (cefac3a) by @leizzo
  • 🐛 fix(mixer): detach from a Bus meter when the Mixer goes (48df95d) by @leizzo
  • 🐛 fix(mixer): find a meter by id in the plug-in cache (04f4054) by @leizzo

♻️ Refactoring

  • ♻️ refactor(release): name the DMG once, build arm64 explicitly (50b49b1) by @leizzo
  • ♻️ refactor(engine): one Track Kind rule, Tracktion track lookup, getClip (d075e2f) by @leizzo
  • ♻️ refactor(engine): name the Track Kind and Return predicates (28a5f3c) by @leizzo
  • ♻️ refactor(mixer): a Strip read model in signal-flow order (303f03c) by @leizzo
  • ♻️ refactor(mixer): tidy the Strip read model after review (35f07cd) by @leizzo
  • ♻️ refactor(mixer): name the Bus Strip's style values, keep this out of menu callbacks (000d590) by @leizzo

✅ Tests

  • ✅ test(mixer): compare Strip order by id, not through an unchecked optional (529c6cc) by @leizzo
  • ✅ test(mixer): cover the Bus Strip view, Send order, colour and meter (4a95b92) by @leizzo

📝 Documentation

  • 📝 docs(readme): add build, commit and release badges (508f828) by @leizzo

👷 Build & CI

  • 👷 ci(release): build, sign, notarize and publish releases from tags (a00ffbf) by @leizzo

🔧 Other

  • 🔧 chore(perch): close two findings on unchanged lines (3125bfe) by @leizzo
  • 🔧 chore(perch): close the Return sort finding (c58ff4b) by @leizzo
  • 🔧 chore(perch): close three findings on unchanged or guarded lines (f5b31cc) by @leizzo
  • 🔧 chore(perch): close the strip-order test finding (bf9bbae) by @leizzo
  • 🔧 chore(perch): JUCE, Tracktion, DSP and UI rules (970f1c0) by @leizzo
  • 🔧 chore(perch): fit the rules to the code after review (e9948ea) by @leizzo
  • 🔧 chore(perch): spare owned callbacks, close test-proven Shaper undo (f511212) by @leizzo
  • 🔧 chore(perch): close findings from #106's rules on code this PR doesn't change (c8d4edf) by @leizzo
  • 🔧 chore(perch): close two findings on unchanged Mixer methods (f43ae0b) by @leizzo
  • 🔧 chore(perch): close a finding on setSendGain, which only moved (b8b1fca) by @leizzo

v0.1.1 — M1 Core fixes (alpha)

Pre-release

Choose a tag to compare

@leizzo leizzo released this 29 Sep 20:25

Fixes and groundwork on top of M1 — Core.

Changed

  • The product is renamed from Papercut to Resamper. Projects saved by 0.1.0 are not
    migrated: re-create them in 0.1.1.
  • A JSON layout button that names a Command needing arguments fails to load with a
    layout error, as a button naming an unknown Command already did.
  • Internal: the app, tests and snapshots are built from one composition root; each
    Command is declared once, invoked through a typed handle whose arguments the
    compiler checks, and menu items get their IDs from the menus' order.

Fixed

  • Undo: a continued drag no longer merges into an undo step another part of the app
    started, so one Undo reverts only one change (for example, a volume drag and a
    plug-in bypass are now two steps).
  • Plug-in scans: stopping a scan (including on quit) no longer blocks for up to
    two minutes or crashes afterwards.
  • A missing value no longer zeroes a plug-in parameter or picks the first clip colour.
  • A theme file whose JSON isn't an object is reported instead of crashing, and
    theme colours reject non-hex digits.

Full changelog: v0.1.0...v0.1.1

v0.1.0 — M1 Core (alpha)

Pre-release

Choose a tag to compare

@leizzo leizzo released this 28 Sep 11:11

Milestone M1 — Core: shell, transport, Arrangement, device chain with plug-ins,
basic Mixer, and the Papercut design system.

Added

  • Engine vertical slice: Project, Commands, JSON UI, Arrangement and playback.
  • Clip editing: select, move, resize and split clips; seek the playhead from the timeline.
  • Track channel controls: volume, pan, mute and solo.
  • Audio recording with input selection, live waveform and takes.
  • MIDI tracks and clips, piano roll note editing and quantize.
  • Plug-ins, mixer, shapers, session and recovery foundations.
  • Design tokens: Papercut DS colours, type and scales (#17).
  • Shared control library and continuous-control interaction model (#18).
  • Top bar with menu, transport, status readouts and view switcher (#19).
  • Library Browser with search, categories, drag to track and sample preview (#20).
  • Detail view with clip panel and horizontal device chain of DeviceCards (#21).
  • Arrangement clip operations: loop-extend, duplicate, consolidate and clip menu (#24).
  • Arrangement zoom limits, lane height and Follow (#25).
  • Mixer toolbar: section chips, meter modes, reset peaks, signal-flow indicator (#27).
  • Mixer inserts: 8 slots, bypass, reorder, copy, picker and context menu (#28).
  • Global interaction layer: selection, Esc, context menus, tooltips, toasts, drag-and-drop (#29).
  • Per-view keyboard shortcut map kept in data (PRD §17) (#30).
  • Record count-in; Shift-click Rec skips it (#61).
  • MIDI recording from a MIDI input on armed MIDI tracks (#63).

Changed

  • Track device chain separated from mixer Inserts (#22).
  • Arrangement ruler, lanes, track headers and clips restyled to the M1 design (#23).
  • Mixer channel strip rebuilt: head, fader dB mapping, stereo meter, buttons (#26).

Removed

  • Pre-redesign UI from the M1 shell.

Fixed

  • Silent tempo-tagged loops with no waveform.
  • M1 review findings and design parity in lanes, devices and the mixer.