• v0.3.0 49cb75356f

    v0.3.0 — new drop 🔥
    All checks were successful
    release-plz / release-plz (push) Successful in 3m36s
    release / build-and-test (push) Successful in 8m23s
    release / release (push) Successful in 14m58s
    Stable

    psk released this 2026-06-27 22:27:22 +00:00 | 27 commits to master since this release

    Added

    • Headless render-to-video (soundy-bits render …, native-only). The same binary renders a
      clip to an MP4 (H.264 video + Opus audio, in sync) or a PNG frame sequence with no window or
      display — deterministic and reproducible, runnable on a headless server. Reuses the real
      visualization/post-process plugins via an offscreen RenderTarget::Image + gpu_readback, a
      fixed-step clock, and a frame-indexed offline audio pump. Encoding is a pluggable
      VideoSink/VideoEncoder seam (src/headless/) so AV1 can drop in. Requires libopus-dev at
      build time and libopus.so at runtime.
      • Hardware H.264 via NVENC (--features nvenc, NVIDIA) — auto-selected by default with the
        software encoder as fallback; capped-VBR with a configurable --bitrate. The crate vendors its
        headers and dlopens the driver at runtime, so it builds with no CUDA toolkit (but hard-links the
        NVIDIA encode lib, so the nvenc binary only runs on NVIDIA hosts — hence an opt-in feature, not
        default). Reuses a pooled, pipelined set of NVENC buffers, so a full song renders at ~7× real
        time at 1080p60
        (≈420 fps on a 4090) and exits cleanly.
      • Software encoder (fallback) is multi-threaded: encode/mux on a worker thread overlapping GPU
        rendering, constant-QP + multi-slice so it parallelizes across cores, parallel RGBA→I420.
      • Flags: --encoder auto|hw|sw, --bitrate <Mbps> (NVENC), --quality <QP> (software CQP,
        default 22), --speed (faster software), --software (render on Mesa lavapipe for GPU-less hosts).

    Changed

    • Upgraded to Bevy 0.19. The custom 3-pass post-process chain (Tilemap → Combined effects →
      Vector SDF/filters) and the ColoredMesh2d pipeline were ported from the removed render-graph
      node API to the new schedule-based renderer (passes are render-world systems on the Core2d
      schedule, ordered after tonemapping in Core2dSystems::PostProcess). UI scaling moved from
      EguiContextSettings::scale_factor to the EguiZoomFactor component, and egui/Bevy deprecations
      were cleared.
    • Refreshed all dependencies to their latest compatible versions. cpal is intentionally held at
      0.17 to stay aligned with rodio 0.22 (which pins cpal 0.17), avoiding a duplicate native audio
      backend in the tree; it will follow once rodio bumps.
    • Releases are now automated via release-plz: a "Release PR" carries the
      version bump + changelog, and merging it tags + publishes. CI runs on pull requests only.

    Fixed

    • Release archives now extract into a single top-level soundy-bits-<ver>-<target>/ folder instead of
      scattering the binary + assets into the current directory (no more "tarbombs").

    🌐 Live WASM demo (latest build): https://public.pages.ssy.dk/soundy-bits/
    This release's exact browser build is the soundy-bits-0.3.0-wasm.zip asset.

    Downloads