Skip to content

Releases: vibetuned/midi-sink

midi-sink v2.0.0-rc.5

midi-sink v2.0.0-rc.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Oct 08:28

midi-sink v2.0.0-rc.5

toward 2.0: Phase 6, the Medium (steps 35–46; pre-release v2.0.0-alpha.1), Phase 7, Sound (steps 47–55; pre-release v2.0.0-alpha.2, cut at the 55b fold), Phase 8, Suzu — the synth (steps 55b, 56–59, 59b–59c; pre-release v2.0.0-alpha.3) and Phase 9, Instruments (steps 60–66; pre-release v2.0.0-alpha.4)

Phase 10 — publish; step 67, the documentation (2026-10-06, DECISIONS_9 #1–#5; evidence docs/evidence/step67). The book caught up with Phases 6–9. The operator book gained the five electric operators from the Phase-6 drafts checked against Part V — wave torsion, Chladni (the keys as eddies, the Taylor–Green flow kept as the gesture), the burst with the author's serendipity note and its Jaffer-lineage line, the spark as the Anod strike on its charge (#88), Chirikov with the 1.25 ceiling — plus the Anod medium and the palette model, and its index now tables fourteen operators by class. A Suzu book of nine chapters mirrors it: the thesis and the DSP class table, the cells (the Gordon–Smith oscillator), the modal voice and the bow, strings and chaos, the winds, the orbit trace, the sound profiles, the patches and knobs, and the lab — each voice family's live panel embedded through a new <Lab> component, the lab composed at /marble/suzu/ from the same tag as the marble app (DECISIONS_9 #2; lab-core.js's docs root two levels up; compose-marble.mjs and pages.yml copy suzu-dist). The user guide gained the instruments, the medium, sound, presets and replay pages, and every 1.0 page learned the thirteen layouts, the strip's Panic and Next, the fingering panel, the S Pen's limit, the prints ledger, the two media, the web's overlays and ?replay=; the settings reference is rewritten from the desktop window's twenty sections; the architecture book gained the replay page and hostmpe's fingering engines. The MIDI chart gained the fingering CCs, CC 120/123/122, a Voxo input section and two output sections verified against the step-63 iPad logs now in tests/fixtures/bytelogs/ (chart_check.py: 52 ok). Citations: the electric medium's and the synth's papers, Moser and Gordon–Smith among them; thanks with Professor Jaffer first. check.mjs requires all seventeen scenes and the six lab pages embedded, admits no other iframe, and reports a pending gallery replay. The gallery's three new cards (an Anod piece, a trumpet piece, a bowed Suzu piece with the trace) are pending with their replay links — the recordings and captions are the author's, after the book (#4). Every [ITERATE] of the four specs is resolved by an entry or documented as a limit on its page (#1, the table). The author's call on the live site (#2): the first v2 release candidate ships the book to the testers — pages.yml embeds /marble/rc/ and names the RC in the footer while an RC is newer than the stable, the lab's docs root is read from its own address, and the gallery's nine 2.0 cards are "coming soon" until the captures land. The author's two fixes on the book (#6, #7): the medium toggle on every scene, permanent from the first strike — and every scene's strike is the medium's, the spark on its charge under Anod (the Anod scene no longer switches at the end), and the first v2 RC's red Windows lane — MSVC has no clock_gettime; the deviceless Voxo backend reads the performance counter there, proven by the push's Windows lane before the next RC — which failed again: the Windows box takes it (_work/HANDOFF_WINDOWS.md), and a second hand-off, _work/HANDOFF_SUZU_VCSL.md, briefs a later session on fitting Suzu's patches to the Versilian Community Sample Library. The install page no longer says the app makes no sound of its own. The author's two asks on the fitted sounds (#10, #11): Voxo 0.16.0 owns a patch table — the tablets' five and the six VCSL fits, one list for the desktop's new Suzu patch picker (with a Suzu attack knob) and both tablets' Sound pages, pinned to presets/*_vcsl.json by a test gate — and the orbit trace became a shared host library (trace/, the desktop's step-59 bridge under a pure-C surface) with the tablets' Sound pages gaining the Synth trace rows: the orbits into the water, the scope on the canvas. The RC's Linux lane (#12): the deb check expected v1.0.0's eleven files and the deb has carried the demo instrument's eighteen since Phase 7 — the count is 29 now, with the no-header intent asserted directly. The RC's macOS lane (#13): the synth suite's two headroom gates read a preempted block on the shared runner as a stall (one 5 ms block in a second averaging 0.3 ms) — they now measure the second up to three times and read the best attempt, every attempt's worst printed; the criterion stands.

The Windows box on the RC lane (DECISIONS_9 #8; evidence docs/evidence/step67/windows). The second red was three MSVC stops behind the clock, none in the core: the INI loader's else-if chain of 134 keys past MSVC's 128 nested blocks (the chain restarts at the Suzu keys), a GCC attribute on the web reference's exports (the macro is empty where there is no __attribute__), and M_PI in the Suzu suite (defined when absent). Build clean, ctest 12/12 (one unreproduced voxo_tests crash under a parallel compile), the release configure's --version reading the injected tag, and the D3D11 gates green: the field at the reference tier with step 55b's numbers, the composite within one step, the replay bitwise on the recording box with the wall-time negative diverging, the storm at 0 XRuns; the live recorder round and the window's Record by hand.

Phase 9 — the instruments. The stateful probe the ABI has carried since
step 41 is filled: the trumpet and the trombone sound their partials under
the fingering CCs (valves 110–112, the slide 113, global on the master
channel, decoded by the normalizer into the engine's layout state —
libsumi 1.4.0), then Wicki–Hayden, the strings under three tunings and
the theremin (1.5.0): every named layout ships. hostmpe learned the
widgets — the valve buttons, the positional slider, the brass retune, the
theremin surface, panic, quick-switch, mirroring, the per-device offer —
and the iPad and the Tab play all eight keyed layouts with a fingering
panel (on the Tab in a window of its own, the S Pen and the fingers never
meeting; the Tab's input reader keeps them apart anyway). Session replay:
a pure-C library beside the presets records the bytes, gestures, settings,
dips and frame boundaries exactly — the producer stages, the render thread
drains — and every shell plays a recording on the scripted clock, the
desktop re-sounding it; bit for bit on the recording device, the Pixel's
GLES recording on the Mac within the mobile tier, the iPad's a few percent
of displacement off (the open question of Part VIII #24). The web draws
every keyed layout as an overlay and plays a recording. Decisions:
DECISIONS.md Part VIII #1–#26 (DECISIONS_8 #n). The pre-release tag
v2.0.0-alpha.4 marks the close.

Phase 8 — the synth. Voxo gains Suzu, a source beside the sampler:
symplectic phase-space cells — the leapfrog with its orbit re-based on
retune, the shears, a modal lattice whose coupling is compensated at load
and refused past its bound, a breath bow that is an energy servo, a Verlet
chain under the CFL bound, a hybrid string, a Duffing cell, a kicked rotor
and a chaotic modulator, an acoustic bore with a jet, a reed and a pair of
lips whose gate is the mouth's energy ledger — every element declaring its
class, every voice shipping its sound profile. The synth draws its own
phase portrait into the water through the gesture ABI, and the scope view
(libsumi 1.3.0, the phase's one core touch, additive) shows the
polylines on the canvas. Suzu compiled to WebAssembly plays in the browser
as itself: the lab's six panels, each proven against a native build and in
headless Chrome. The field's payload became a displacement first (step
55b, libsumi 1.2.0). Decisions: DECISIONS.md Part VII #1–#35
(DECISIONS_7 #n). The pre-release tag v2.0.0-alpha.3 marks the close.

Phase 7 — the app has a sound. Voxo, a sibling library behind a pure C
ABI, plays Decent Sampler presets and libraries from the same MIDI bytes the
visuals draw — velocity layers, round robins, release samples, loops, a
low-pass under the slide, the MPE sources through the preset's bindings, a
reverb and a delay on the bus, an advisory memory gate, a compat report
whose copy is the docs' by test — on CoreAudio, AAudio, WASAPI and
PulseAudio; every shell gained a Sound setting, the tablets an instrument
library with imports, and a CC0 demo (the Dan Tranh) sounds at first launch.
The engine (libsumi) was not touched: the field fixture stayed bitwise
trivially. The Phase-7 steps follow the Phase-6 ones below.

Phase 6 — the Medium.

The engine gains a second medium. Five operators join the shared library,
each declaring its class and passing a four-part conservation gate that was
built first; the one ABI break of the arc lands (libsumi 1.0.0) and
everything after it is additive (1.1.0); Anod reads the same field as a
discharge record — strain-glow over black glass, the water drawing the
field's deformed grid, a bloom — with its own binding table; palettes become
one model with a library and an editor, the substrate gets knobs, presets
get one pure-C serializer shared by four shells, prints re-export at any
size from a ledger; the marble gestures follow the medium; the iPad, the web
page and the Android shell carry the session; and the last mile measured GL,
D3D11 and the Adreno. Decisions: DECISIONS.md Part V #1–#89
(DECISIONS_5 #n). The author's step numbering: 44a iOS, 44b web, 45a
Linux, 45b Android, 46 Windows.

Step 35 — Phase opening & the conservation gate

_work/DECISIONS_5.md opened with the phase's resolutions (Anod, four
phases and 2.0.0, one ABI break c...

Read more

midi-sink v1.0.0

Choose a tag to compare

@github-actions github-actions released this 21 Sep 17:03

midi-sink v1.0.0

Phase 5 shipped: every release lane, the beta, and the feedback batches (steps 28–33)

The release-candidate line v0.5.0-rc.1…rc.5 (below) carried the spine, the
web, the docs and the macOS lane; this release adds the remaining lanes and
procedures — Windows, Linux and apt, the iOS and Android checklists — and the
Step-33 feedback batches, the one step allowed to touch the core: ABI
0.5 → 0.9.0, every fix landing with the test that would have caught it,
every suite green on all five platforms, the §4.6 field fixture untouched.
Decisions: DECISIONS.md Part IV #37–#81 (#81: the first v1.0.0 run
failed its Windows gate because PowerShell handed CMake 1 for
-DSUMI_APP_VERSION=1.0.0; the configure steps now run under bash with the
version quoted, and CMake refuses an injected version that is not X.Y.Z).

Step 28 — iOS release procedure (manual by design)

No CI lane: iOS is built and released from the Mac (#38, flagged against the
roadmap's compile-check line). ios/prepare_release.sh derives marketing
version, build number and the full describe from the tag, rebuilds libsumi
with SUMI_APP_VERSION injected (the stale-core trap) and regenerates the
project; About shows X.Y.Z (build) · describe and libsumi a.b.c;
ios/RELEASING.md is the checklist (tag → prepare → Archive → TestFlight →
About on the iPad); ios/metadata/ the listing, App Privacy "Data Not
Collected" and the screenshot plan (#37). ITSAppUsesNonExemptEncryption = false answers export compliance once.

Step 29 — Windows release lane

The windows job: MSVC + Ninja, dist-windows = an Inno Setup per-user
installer (Start-menu entry, uninstaller, settings survive uninstall unless
opted in, #39) and a portable zip, both sha256'd; static CRT so a clean VM
needs no redistributable, VERSIONINFO from the tag (#40); signing if
WINDOWS_CERTIFICATE is present, an unsigned release otherwise with the
SmartScreen note in the README (#41); publish-winget.yml on release: published, skipping pre-releases, with the staged Vibetuned.MidiSink
manifest conventions (#42). Found on the way: the settings window's HiDPI
scale, captured in Step 23 and never applied, is applied (#43). Verified on
the author's Windows 11 box: 69 023 loopMIDI messages in 30 s at 164 fps, zero
dropped.

Step 30 — Linux release lane

cmake/LinuxPackaging.cmake: a CPack DEB of the desktop-integration
component only — eleven files, absolute Exec, Debian version 0.5.0~rc.N
from 0.5.0-rc.N (#44) — plus the bare tarball; the linux job builds on
ubuntu-22.04 for glibc reach and installs, runs and removes the package in
a clean container. publish-apt.yml rebuilds the Pages tree on every
published release and adds /apt/ with stable and rc suites signed by
APT_GPG_PRIVATE_KEY (#45); the install page carries the keyring line. The
Flatpak spike closed as "spike, not a channel" (#46): ALSA MIDI needs
--device=all. The ROLI played over ALSA from the installed deb: 1 728
channel messages in 18 s, MPE per-note bend and pressure present.

Step 31 — Android release procedure (manual by design)

Version from git in build.gradle.kts (versionName numeric, versionCode
= commit count, BUILD_DESCRIBE for About, -DSUMI_APP_VERSION into the
CMake arguments; no Android CI job by the author's decision, #47);
android/prepare_release.sh, android/RELEASING.md (Generate Signed Bundle →
Play internal → About → USB-MIDI to the Linux box), android/metadata/ with
Data safety "nothing collected". The Android paper dip became two buttons —
save the print to Pictures, or discard (#48).

Step 33 — Feedback incorporation (the scoped unfreeze)

Opened early, while the beta ran; twelve batches on the Mac, then a
verification pass on each machine. Core (0.5 → 0.9.0, all additive):
the §4.3(7) swirl as a gesture (SUMI_VORTEX_LAMB_OSEEN) and the
interior-copying feed drop (SUMI_DROP_FEED), the print double-buffer
recycling its older unread print (#49, #51); the viscous stylus stroke —
the 2-D unsteady Stokeslet displacement kernel, derived, numerically checked
and sub-stepped ≤ a/4, behind wake_profile / wake_spread (#53); the input
dialect as a setting (MPE by default, never a heuristic) with MPE mode
giving a channel-1 keyboard per-note voices and wind mode reading the IMU
layer on its one voice (#60); the palette-morph CC travelling the whole ring
(#61); CC 64 never dips the paper (#62); wind mode = MPE plus a wake
between notes
, breath unbounded, the wandering brush retired (#63); two
more piano rolls, from the right and from the bottom (#64); the bend-driven
ripple four times more sensitive (#66); the Airwave map as symmetric
hands
— Raise/Glide/Slide per hand, the left a vortex, the right a new
Lamb–Oseen swirl control trio, Grasp the pinches, Tilt the ripple, Flex free,
five new control dimensions (#69, written on the Windows box). Every
shell:
the Marble-mode pressure gesture (long press on the tablets,
Shift + right drag on desktop: hold/push = feed, pull = swirl, #49); the
stylus draws its wake in Marble mode on the tablets (#54); the measured then
redesigned Airwave map (#50, #69); settings parity — palette, look, tempo
and roll speed, vortex profile, ripple, the CC map editor and the MIDI inputs
list on iOS and Android, with the desktop window as the contents spec (#55,
#56); --window <w>x<h>, Fullscreen with its chord and --fullscreen, and
the title bar kept on every platform after the borderless experiment (#57,
#58, #59 → #67 → #70); Canvas (paper dip) as the first settings section (#78);
a persisted CC map that is an older stock map upgrading itself (#71); a
single-arch local DMG dry run (#72). Platform verifications: Windows —
the borderless canvas could not be snapped or dragged, so it keeps its title
bar, and layouts 6/7 did not survive an INI reload (% 6 → % 8) (#67,
#68); Linux — leaving fullscreen on X11 under mutter re-asserts the windowed
geometry (#73), the Wayland launch overlap of the two windows accepted as is
(#76); Android — the native library linked for 16 KB pages (#74), the control
strip a setting hidden by default on phones (#75), the persisted ripple
sliders re-sent at startup (#77). Docs: a settings reference page, the
guide rewritten for the setting instead of the detection and for the new wind
model, the operators' index moving the wind legato under Wake, the web's
icons rounded like every other platform's (#79), and the gallery's five real
performances with synth and "based on" fields, Ali Paşa kept as the Jaffer
tribute (#80). Tests: --pressure-test, --stokeslet-test, the mapper
suites at 18 455 checks on every platform, the field gate bitwise on Metal and
bit-stable on D3D11 and GL, the wasm scene sweep and WebGPU gate green, the
Play-mode byte-log asserts green on a Pixel.


Notes generated from docs/CHANGELOG.md by the release workflow at commit 92d2bcb0c4ff.