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
16 changes: 14 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,23 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Ver
### Added

- Three-string polyphony: up to three notes at once as separate feedback loops, with Coupling between them.
- The STRINGS tab, with POLY, LOCK, Coupling, Interval 2 and Interval 3. LOCK chooses between a tuned chord and the free drone.
- POLY, LOCK, Coupling, Interval 2 and Interval 3. LOCK chooses between a tuned chord and the free drone.
- Three presets: Open Fifths, Sympathetic and Chord Keys.
- 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.
- Echo Pong: a second echo, off by default, whose repeats bounce between left and right and saturate, with PONG, Drive, Tone, Width and Level.
- The Ember Pong preset.

### Changed

- A new window, on one page with no tabs: the plant in the centre with Frequency and Body beside it, one row of FILTER,
REVERB, PONG and ECHO below, and a SETUP panel for Strings, Output and MIDI. Red marks the controls inside the
feedback loop, amber those after it.
- The plant is drawn as a sundew whose tentacles unfurl with the sound, and marks the strings' notes under POLY.
- An arc over Highpass and Lowpass draws the band that survives in the loop, and one over Tone draws the echo's band-pass.
A dot beside Echo Time blinks at the real time between repeats.
- The window scales from 75 % to 150 %, and the scale is saved with the project in place of the open tab.
- Interval readouts show the interval a voice really plays when the note range holds it back, tagged LIMIT.
- The interface's fonts, Inter and Cormorant Garamond, are embedded, under the SIL Open Font License.

### Fixed

- The echo's first repeats after loading, or after the engine recovers from a bad sample, came late and warped:
Expand Down
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ tools/hardware-comparison/check_reference.sh build/render_cli
| `src/plugin/PluginEditor.*` | The window: assembles the interface and runs its timer |
| `src/plugin/EditorBridge.h` | What the editor reads from the processor, beyond parameters |
| `src/plugin/SpectrumTap.h` | Lock-free FIFO from the audio thread to the display |
| `src/plugin/ui/` | Theme, knob drawing, plant, tabs. `SpectrumBands.h` and `Readouts.h` have no JUCE, so tests use them alone |
| `src/plugin/ui/` | Theme and fonts, knob drawing, plant, header, control row, setup panel. `SpectrumBands.h`, `Readouts.h`, `ResponseArcs.h` and `EchoPulse.h` have no JUCE, so tests use them alone |
| `src/plugin/Presets.h` | Factory presets, plain C++ so tests can use them |
| `tests/` | `render_test`, `voice_allocator_test`, `ui_test`, `plugin_host_test`, `editor_snapshot` (draws the window to a PNG), measuring tools |
| `assets/fonts/` | The interface's fonts, embedded as binary data, with their licences |
| `third_party/` | Vendored DaisySP |
| `tools/hardware-comparison/` | Comparison against a real unit, and the reference checksums |
| `docs/superpowers/` | Design specs and implementation plans |
Expand Down
16 changes: 13 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,21 @@ if(DROSERA_BUILD_PLUGIN)
GIT_SHALLOW ON)
FetchContent_MakeAvailable(JUCE)

# The interface's fonts, both under the SIL Open Font License (assets/fonts/OFL-*.txt)
juce_add_binary_data(DroseraFonts SOURCES
assets/fonts/CormorantGaramond-Medium.otf
assets/fonts/Inter-Regular.ttf
assets/fonts/Inter-Medium.ttf)

set(DROSERA_PLUGIN_SOURCES
src/plugin/PluginProcessor.cpp
src/plugin/PluginEditor.cpp
src/plugin/ui/DroseraLookAndFeel.cpp
src/plugin/ui/LabeledKnob.cpp
src/plugin/ui/PlantView.cpp
src/plugin/ui/TabPanel.cpp)
src/plugin/ui/ControlRow.cpp
src/plugin/ui/HeaderBar.cpp
src/plugin/ui/SetupPanel.cpp)

juce_add_plugin(Drosera
COMPANY_NAME "codeskine"
Expand All @@ -74,6 +83,7 @@ if(DROSERA_BUILD_PLUGIN)
JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0)
target_link_libraries(Drosera PRIVATE
DroseraDSP
DroseraFonts
juce::juce_audio_utils
juce::juce_dsp
juce::juce_recommended_config_flags
Expand Down Expand Up @@ -105,7 +115,7 @@ if(DROSERA_BUILD_PLUGIN)
tests/editor_snapshot.cpp ${DROSERA_PLUGIN_SOURCES})
target_compile_definitions(editor_snapshot PRIVATE JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0)
target_include_directories(editor_snapshot PRIVATE src/plugin)
target_link_libraries(editor_snapshot PRIVATE DroseraDSP
target_link_libraries(editor_snapshot PRIVATE DroseraDSP DroseraFonts
juce::juce_audio_utils juce::juce_dsp juce::juce_recommended_config_flags)

# The interface's logic and the editor's behaviour (see tests/ui_test.cpp)
Expand All @@ -114,6 +124,6 @@ if(DROSERA_BUILD_PLUGIN)
target_include_directories(ui_test PRIVATE tests src/plugin)
target_compile_definitions(ui_test PRIVATE JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0
DROSERA_STATE_FIXTURE="${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures/state-baseline.bin")
target_link_libraries(ui_test PRIVATE DroseraDSP
target_link_libraries(ui_test PRIVATE DroseraDSP DroseraFonts
juce::juce_audio_utils juce::juce_dsp juce::juce_recommended_config_flags)
endif()
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Drosera

![Drosera's interface: a sundew whose tentacles show the sound's spectrum, with Feedback at its heart](docs/images/drosera.png)
![Drosera's window: a sundew whose tentacles show the sound's spectrum, Feedback at its heart, Frequency and Body beside it, and one row of filter, reverb and echo controls below](docs/images/drosera.png)

A feedback drone synth, as a VST3 plugin for macOS 11 or newer, on Apple silicon and Intel.

Drosera makes sound on its own: a noise floor feeds two string resonators inside a saturating loop, and you steer
what the loop settles on. Play it with its knobs, excite it with audio, or put it on a note with MIDI. It comes with
15 presets.
what the loop settles on. Play it with its knobs, excite it with audio, or put it on a note with MIDI, up to three
notes at once. It comes with 16 presets.

## Install

Expand All @@ -24,6 +24,12 @@ xattr -dr com.apple.quarantine ~/Library/Audio/Plug-Ins/VST3/Drosera.vst3

## Using it

Everything is on one page. In the middle, a sundew shows the sound's real spectrum: each tentacle is a frequency band,
from the lowest at the top, clockwise, and it unfurls as its band sounds. Feedback sits at its heart, with Frequency and
Body beside it. Below, one row holds the filters, the reverb and the echo, with its PONG controls. Red controls are
inside the feedback loop and change what the drone sustains; amber ones come after it and colour what comes out.
Strings, Output and MIDI open from the SETUP field. Drag the window's corner to scale it from 75 % to 150 %.

See the [manual](docs/MANUAL.md) for every control, MIDI, and the known limits.

## Status
Expand Down
2 changes: 2 additions & 0 deletions THIRD_PARTY_LICENSES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Read this before distributing a binary. Nothing here is legal advice.
| `ReverbSc`, `Tone` from that DaisySP | `third_party/DaisySP/Source/Effects/reverbsc.*`, `Filters/tone.*` | **Treat as LGPL-2.1** | See below. |
| JUCE 8.0.9 | fetched by CMake | **AGPLv3 or commercial** | A binary built on it must comply with one of the two. |
| VST3 SDK | inside JUCE | Steinberg proprietary or GPLv3 | See JUCE's `LICENSE.md`. |
| Inter 4.1 (The Inter Project Authors) | `assets/fonts/Inter-*.ttf`, embedded in the plugin | SIL Open Font License 1.1, see `assets/fonts/OFL-Inter.txt` | The interface's text. Unmodified. |
| Cormorant Garamond 4.002 (the Cormorant Project Authors) | `assets/fonts/CormorantGaramond-Medium.otf`, embedded in the plugin | SIL Open Font License 1.1, see `assets/fonts/OFL-Cormorant.txt` | The name in the header. Unmodified. |

## ReverbSc and Tone

Expand Down
Binary file added assets/fonts/CormorantGaramond-Medium.otf
Binary file not shown.
Binary file added assets/fonts/Inter-Medium.ttf
Binary file not shown.
Binary file added assets/fonts/Inter-Regular.ttf
Binary file not shown.
93 changes: 93 additions & 0 deletions assets/fonts/OFL-Cormorant.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
Copyright 2015 the Cormorant Project Authors (github.com/CatharsisFonts/Cormorant)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
92 changes: 92 additions & 0 deletions assets/fonts/OFL-Inter.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL

-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION AND CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
10 changes: 6 additions & 4 deletions docs/BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ Checks how MIDI notes are assigned to the three voices, with no JUCE.
build/ui_test_artefacts/Release/ui_test
```

Covers the interface: the spectrum path to the plant, the readouts, tabs, and what the editor shows while MIDI and WARP
change what sounds. It opens no window on screen.
Covers the interface: the spectrum path to the plant, the plant's shape and how it follows the sound, the filter and
Tone arcs, the readouts, the setup panel, the window's scale, and what the editor shows while MIDI, POLY and WARP change
what sounds. It opens no window on screen.

```bash
build/plugin_host_test_artefacts/Release/plugin_host_test build/Drosera_artefacts/Release/VST3/Drosera.vst3 tests/fixtures/state-baseline.bin
Expand All @@ -66,6 +67,7 @@ proves the engine still renders exactly the same.
## Other tools

- `build/pitch_probe [body] [first] [last] [step]` prints the pitch measured for a range of MIDI notes.
- `editor_snapshot <out.png> [paramId=value | program=N | note=N | tab=N | sound=1 ...]` draws the window to an image.
`sound=1` renders a second of audio first, so the plant shows real sound.
- `editor_snapshot <out.png> [paramId=value | program=N | note=N | sound=1 | setup=1 | scale=N ...]` draws the window
to an image. `sound=1` renders a second of audio first, so the plant shows real sound. `setup=1` opens the setup panel,
and `scale=N` draws the window at N times 900×560.
- `tools/hardware-comparison/` compares the plugin against a recording of a real unit. See its `PROTOCOL.md`.
Loading
Loading