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
11 changes: 10 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"

- name: Build
run: cmake --build build --target voice_allocator_test render_test render_cli ui_test plugin_host_test Drosera_VST3
run: cmake --build build --target voice_allocator_test render_test render_cli ui_test plugin_host_test Drosera_VST3 Drosera_AU

- name: Test the release check
run: python3 tools/test_release_check.py
Expand All @@ -65,6 +65,15 @@ jobs:
unzip -q pluginval.zip -d pluginval-bin
pluginval-bin/pluginval.app/Contents/MacOS/pluginval --strictness-level 5 --validate-in-process --validate "$VST3"

# Audio Units are found only in the plugin folders, so install the built one for the runner's user.
- name: auval and pluginval on the AU
run: |
mkdir -p ~/Library/Audio/Plug-Ins/Components
ditto build/Drosera_artefacts/Release/AU/Drosera.component ~/Library/Audio/Plug-Ins/Components/Drosera.component
killall -9 AudioComponentRegistrar 2>/dev/null || true
auval -v aumu Dros Cdsk
pluginval-bin/pluginval.app/Contents/MacOS/pluginval --strictness-level 5 --validate-in-process --validate ~/Library/Audio/Plug-Ins/Components/Drosera.component

- name: Check reference renders
run: tools/hardware-comparison/check_reference.sh build/render_cli

Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,24 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Ver
- Echo Pong: a second echo, off by default, whose repeats bounce between left and right and saturate, with PONG, Drive, Tone, Width and Level in its own PONG tab.
- The Ember Pong preset.

### Fixed

- The echo's first repeats after loading, or after the engine recovers from a bad sample, came late and warped:
its delay line started at 5 s and glided towards the knob for seconds, settling up to 3 ms short of it. It now
starts at the knob. The three reference renders with echo change throughout, the seven without are byte-identical,
so `tools/hardware-comparison/reference/SHA256SUMS` was regenerated.
- Bypass delays the input by the declared latency, so hosts at rates other than 48 kHz keep the bypassed audio aligned.
- A host that prepares with a sample rate of 0 no longer makes the resampling buffers unbounded.
- The noise generator multiplied a signed integer past its range, which is undefined behaviour: it now wraps
as unsigned. Same sound.
- The parameter registry no longer depends on the standard library's hash-map order: its handlers run in a
fixed order, the one the reference renders were made with.
- The Audio Unit is built and validated with `auval` and `pluginval` in CI.
- JUCE is fetched by commit, not by tag.
- A restored project takes its parameters at once instead of gliding from the defaults, so it settles on the
same drone every time it loads. Presets chosen in the window still glide.
- The manual says how far Reverb Mix detunes low MIDI notes, from measurement.

## [0.1.1] - 2026-11-01

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ if(DROSERA_BUILD_PLUGIN)
include(FetchContent)
FetchContent_Declare(JUCE
GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
GIT_TAG 8.0.9
GIT_TAG f72bad64d29715216226685810c5196bd0d79d77 # 8.0.9, pinned to the commit: tags can move
GIT_SHALLOW ON)
FetchContent_MakeAvailable(JUCE)

Expand Down
7 changes: 6 additions & 1 deletion docs/MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ accepted. While a note is in control:
- Body is snapped to a whole number of the note's periods, so the Body knob selects a multiple.
- A band-pass on the note keeps the loop on the fundamental.

Keep Reverb Mix low while playing notes below C3 (note 48): the reverb sits in the loop and pulls low notes out
of tune, up to about half a semitone at 35 % (see the known limits).

Moving Frequency returns control to the knob once no key is held. A knob moved while a key is down does not take
pitch back after release: move it again.

Expand Down Expand Up @@ -169,7 +172,9 @@ others turns POLY off. "Ember Pong" uses PONG and sustains itself, and choosing
the free drone finds another resonance instead.
- With MIDI Pitch or LOCK on and Body at about 0.7 or more, a few chord notes sit up to about 60 cents off, at any Coupling,
on a neighbouring Body resonance.
- Reverb Mix detunes MIDI notes, because the reverb sits in the loop and its phase is not compensated. With POLY on,
- Reverb Mix detunes MIDI notes, because the reverb sits in the loop and its phase is not compensated. Measured
dry, notes 18 to 84 stay within 17 cents at every Body; at 35 % Mix, notes below 48 read up to 46 cents off
(and one case of +105 cents at Body 0.9), while notes from 48 up stay within about 20 cents. With POLY on,
chords can go sour: with "Chord Keys" otherwise as it is, at Reverb Mix 35 % a C major chord read +20, -28 and -8 cents.
- The values of "Open Fifths", "Sympathetic", "Chord Keys" and "Ember Pong", and the defaults of Echo Drive, Echo Tone and Echo Level,
were chosen by measurement and have not been judged by ear.
Expand Down
Loading
Loading