Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 73 additions & 9 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,36 +57,100 @@ jobs:
- name: 📦 Install frontend dependencies
run: pnpm install # change this to npm, pnpm or bun depending on which one you use.

# Build the Splicerr Bridge plugin from source so the shipped binaries
# provably match the auditable C++ in plugins/splicerr-daw-bridge.
- name: 🎛️ Build Splicerr Bridge plugin (macOS)
if: startsWith(matrix.platform, 'macos')
run: |
cmake -B plugins/splicerr-daw-bridge/build -S plugins/splicerr-daw-bridge \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
cmake --build plugins/splicerr-daw-bridge/build --config Release
artefacts="plugins/splicerr-daw-bridge/build/SplicerrBridge_artefacts/Release"
dest="src-tauri/resources/plugins"
rm -rf "$dest/Splicerr Bridge.component" "$dest/Splicerr Bridge.vst3"
cp -R "$artefacts/AU/Splicerr Bridge.component" "$dest/"
cp -R "$artefacts/VST3/Splicerr Bridge.vst3" "$dest/"

- name: 🎛️ Build Splicerr Bridge plugin (Windows)
if: matrix.platform == 'windows-latest'
shell: pwsh
run: |
cmake -B plugins/splicerr-daw-bridge/build -S plugins/splicerr-daw-bridge
cmake --build plugins/splicerr-daw-bridge/build --config Release
$artefacts = "plugins/splicerr-daw-bridge/build/SplicerrBridge_artefacts/Release"
$dest = "src-tauri/resources/plugins"
Remove-Item -Recurse -Force "$dest/Splicerr Bridge.vst3" -ErrorAction SilentlyContinue
Copy-Item -Recurse "$artefacts/VST3/Splicerr Bridge.vst3" "$dest/"

- uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version.
releaseName: 'Splicerr v__VERSION__'
releaseBody: |
## Splicerr v1.0.13community fork
## Splicerr v1.15.0DAW Bridge + UI refresh

Temporary fork of [Robert-K/splicerr](https://github.com/Robert-K/splicerr)
that restores functionality and adds bonus features.
that restores functionality and adds DAW bridge sync.

### 🐛 Fixes
- **No more downloading samples on hover.** Samples were being prepared
(descrambled + written to disk) as soon as you hovered a row, showing a
spinner. Preparation now happens only on press, so a sample is downloaded
just when you play or drag it.
### New
- **New "dre4moff" theme** — an optional macOS-style dark glass interface
(updated sidebar, search, filters, result rows, waveform surface, floating
player). It's opt-in: the classic **Dark** and **Light** themes are the
defaults and look as they always did. Pick it under Settings → Theme.
- **Splicerr Bridge plugin** for DAW sync — AU + VST3 on macOS, VST3 on Windows.
- **Bridge installer in Settings** with Install/Reinstall/Uninstall actions.
Installs into the system plug-in folders so any DAW finds it; this asks
for administrator rights (UAC on Windows, your password on macOS).
- **Clickable install path** in Settings — reveals the installed plugin in
your file manager.
- DAW transport sync for play/stop, BPM, bar position, loops, and one-shot triggers.
- DAW-mode drag-and-drop for the currently selected sample stretched to the host BPM.

### 🧰 Included from previous releases
### Fixes
- DAW bridge audio rendering now runs in a **Web Worker**, so long
pitch-shifted samples no longer freeze the UI.
- Pitch shift and tempo stretch run in one combined SoundTouch pass; renders
are abortable and cancel stale jobs when you switch samples quickly.
- Lower memory pressure while browsing — capped preview blobs, chunked WAV
writes, isolated AudioContexts closed after each render, and cached renders
no longer read full WAVs back into the WebView.
- Cold audio/waveform downloads prefer a direct WebView fetch (with Tauri HTTP
fallback), avoiding large transfers through IPC before rendering.
- DAW-mode play buttons start on the first click; selecting a sample re-enables
bridge playback; changing transpose re-renders the synced sample instead of
the muted local preview.
- The app preview is muted automatically while connected to the DAW.
- Bridge audio renders directly inside the DAW plugin; waveform and player
progress follow the plugin's real sample cursor.
- One-shot waveform progress resets between bar triggers.
- Waveforms/rows no longer drop out while scrolling results (duplicate
samples returned by Splice pagination are de-duplicated).
- (macOS) Closing the window hides it and reopening brings it back.

### 🙏 Credits
- The dre4moff theme and DAW-mode stability work in this release come from
[@dre4moff](https://github.com/dre4moff)'s pull request — thank you!

### Included from previous releases
- **Collections** — create local collections, Likes, tag filtering, export
to `.zip`, and toast notifications.
- **Transpose** — shift samples by key or by semitones, tempo-preserving,
applied to both preview playback and exported WAV.
- Drag-and-drop crash fix on macOS Sequoia and the Cloudflare 403 fix
(requests routed through a real browser engine).

### 🔒 Build & transparency
- The Splicerr Bridge plugin is **built from source in CI**, not shipped as a
prebuilt binary — so the bundled plugin matches the public C++ in
`plugins/splicerr-daw-bridge`.

### 📦 Downloads
- **Windows** — `.exe` (installer) or `.msi`
- **macOS** — `.dmg` (Apple Silicon & Intel)
- **Linux** — `.AppImage`, `.deb`, `.rpm`
- **Linux** — `.AppImage`, `.deb`, `.rpm` (DAW bridge not included)

> Once the headers fix is merged upstream, please switch back to the original repo.
> All credit to the original authors — please ⭐ the original
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ node_modules
/build
/.svelte-kit
/package
plugins/**/build

# Bridge plugin bundles are built from source (in CI or locally), never committed.
src-tauri/resources/plugins/*
!src-tauri/resources/plugins/.gitkeep
!src-tauri/resources/plugins/README.md
.env
.env.*
!.env.example
Expand Down
55 changes: 55 additions & 0 deletions RELEASE_NOTES_1.15.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Splicerr v1.15.0 — DAW Bridge + UI refresh

Temporary fork of [Robert-K/splicerr](https://github.com/Robert-K/splicerr) that
restores functionality and adds DAW bridge sync.

## New

- **New "dre4moff" theme** — an optional macOS-style dark glass interface (updated
sidebar, search, filters, result rows, waveform surface, floating player). It's
opt-in: the classic **Dark** and **Light** themes are the defaults and look as they
always did. Pick it under Settings → Theme.
- **Splicerr Bridge plugin** for DAW sync — AU + VST3 on macOS, VST3 on Windows.
- **Bridge installer in Settings** with Install/Reinstall/Uninstall actions.
Installs into the system plug-in folders so any DAW finds it; this asks for
administrator rights (UAC on Windows, your password on macOS).
- **Clickable install path** in Settings — reveals the installed plugin in your
file manager.
- DAW transport sync for play/stop, BPM, bar position, loops, and one-shot triggers.
- DAW-mode drag-and-drop for the currently selected sample stretched to the host BPM.

## Fixes

- DAW bridge audio rendering now runs in a **Web Worker**, so long pitch-shifted
samples no longer freeze the UI.
- Pitch shift and tempo stretch run in one combined SoundTouch pass; renders are
abortable and cancel stale jobs when you switch samples quickly.
- Lower memory pressure while browsing — capped preview blobs, chunked WAV writes,
isolated AudioContexts closed after each render, and cached renders no longer read
full WAVs back into the WebView.
- Cold audio/waveform downloads prefer a direct WebView fetch (with Tauri HTTP
fallback), avoiding large transfers through IPC before rendering.
- DAW-mode play buttons start on the first click; selecting a sample re-enables
bridge playback; changing transpose re-renders the synced sample instead of the
muted local preview.
- The app preview is muted automatically while connected to the DAW.
- Bridge audio renders directly inside the DAW plugin; waveform and player progress
follow the plugin's real sample cursor.
- One-shot waveform progress resets between bar triggers.
- Waveforms/rows no longer drop out while scrolling results (duplicate samples
returned by Splice pagination are de-duplicated).
- (macOS) Closing the window hides it and reopening brings it back.

## Build & transparency

- The Splicerr Bridge plugin is **built from source in CI**, not shipped as a
prebuilt binary — so the bundled plugin matches the public C++ in
`plugins/splicerr-daw-bridge`.

## Credits

- The dre4moff theme and DAW-mode stability work in this release come from
[@dre4moff](https://github.com/dre4moff)'s pull request — thank you!
- All credit to the original authors — please ⭐ the original
[splicedd](https://github.com/ascpixi/splicedd) and
[splicerr](https://github.com/Robert-K/splicerr).
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
{
"name": "splicerr",
"version": "1.0.13",
"version": "1.15.0",
"description": "",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"test:render-stress": "node --expose-gc scripts/stress-transpose-render.mjs",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
Expand Down
53 changes: 53 additions & 0 deletions plugins/splicerr-daw-bridge/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
cmake_minimum_required(VERSION 3.22)

project(SplicerrBridge VERSION 0.1.0)

include(FetchContent)

FetchContent_Declare(
JUCE
GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
GIT_TAG 8.0.13
GIT_SHALLOW TRUE
)

FetchContent_MakeAvailable(JUCE)

juce_add_plugin(SplicerrBridge
COMPANY_NAME "Splicerr"
BUNDLE_ID "de.kosro.splicerr.bridge"
PLUGIN_MANUFACTURER_CODE Expr
PLUGIN_CODE SpBr
FORMATS AU VST3 Standalone
PRODUCT_NAME "Splicerr Bridge"
IS_SYNTH TRUE
NEEDS_MIDI_INPUT TRUE
NEEDS_MIDI_OUTPUT FALSE
IS_MIDI_EFFECT FALSE
COPY_PLUGIN_AFTER_BUILD FALSE
)

target_sources(SplicerrBridge
PRIVATE
Source/PluginEditor.cpp
Source/PluginProcessor.cpp
)

target_compile_features(SplicerrBridge PRIVATE cxx_std_17)

target_compile_definitions(SplicerrBridge
PUBLIC
JUCE_WEB_BROWSER=0
JUCE_USE_CURL=0
JUCE_VST3_CAN_REPLACE_VST2=0
)

target_link_libraries(SplicerrBridge
PRIVATE
juce::juce_audio_formats
juce::juce_audio_utils
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags
)
63 changes: 63 additions & 0 deletions plugins/splicerr-daw-bridge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Splicerr Bridge

JUCE DAW bridge plugin for Splicerr.

The plugin reads the host playhead and sends UDP JSON packets to the Splicerr
app on `127.0.0.1:37651`. Splicerr listens automatically while the app is open
and uses those packets to sync preview play/stop, playback BPM, and the first
beat of each 4-bar phrase.

For DAW audio output, Splicerr renders the currently selected sample as a WAV
file and sends the file path to the plugin on the dynamic control port reported
in each sync packet. The plugin loads that WAV and renders it directly in the
DAW audio callback, locked to the host PPQ position. Loops follow the current
4-bar phrase phase; one-shot samples are detected by duration (up to 3 seconds)
and trigger once at the start of each bar, then play to completion.

## Build

```sh
cmake -S plugins/splicerr-daw-bridge -B plugins/splicerr-daw-bridge/build -DCMAKE_BUILD_TYPE=Release
cmake --build plugins/splicerr-daw-bridge/build --config Release
```

The CMake configure step downloads JUCE `8.0.13` with `FetchContent`.

On macOS, the build creates AU, VST3, and Standalone targets. With
`COPY_PLUGIN_AFTER_BUILD` enabled, JUCE also copies plugin bundles to the
standard user plugin folders when possible.

## Protocol

Example packet:

```json
{
"source": "splicerr-bridge",
"version": 1,
"playing": true,
"bpm": 128.0,
"ppqPosition": 42.0,
"timeInSeconds": 19.25,
"packetSentAtMs": 1781808000000,
"audioPort": 49231,
"timeSignatureNumerator": 4,
"timeSignatureDenominator": 4,
"sampleRate": 48000.0
}
```

Sample load packet sent by the app to `audioPort`:

```json
{
"source": "splicerr-app",
"version": 1,
"uuid": "sample-uuid",
"path": "/absolute/path/to/rendered.wav",
"oneShot": false,
"durationMs": 8000,
"sourceBpm": 120,
"renderedBpm": 128
}
```
Loading
Loading