Dan is a MIDI effect plugin by Umaru Industrial Waste that lets you draw tempo-synced Bézier curve envelopes and trigger them from MIDI notes, outputting MIDI CC (or MPE pitch-bend) to modulate any parameter in your DAW or hardware.
| Platform | Formats |
|---|---|
| macOS (Universal: arm64 + x86_64) | VST3, AU, CLAP, Standalone |
| Windows (x64) | VST3, CLAP, Standalone |
| iOS 15+ | AUv3, Standalone |
- Draw envelopes as piecewise cubic Bézier curves on a beat-locked time grid
- Anchor points (filled circles) are draggable; each has two independent control handles (squares) for precise shaping
- Double-click empty canvas space to add an anchor; double-click an interior anchor to remove it
- Curves are always monotone in time — handles are automatically constrained so the curve never doubles back
- Length (1–64 beats, 0.5-beat resolution): changing the length rescales the entire envelope proportionally
- Loop toggle: when enabled the envelope repeats indefinitely; the loop icon in the toolbar reflects the current state
- Playback bar: a yellow vertical line tracks every active instance of the selected envelope in real time at 30 Hz, locked to the DAW transport
- + button adds a new envelope; sweep button (broom icon) removes all envelopes not assigned to any note mapping
Map any MIDI input note to an envelope with per-mapping parameters:
| Column | Range | Default | Description |
|---|---|---|---|
| Note | C−2 – G8 | C3 | Input MIDI note that triggers the envelope |
| Envelope | — | Envelope 1 | Which envelope to play |
| Stretch | ⅛ – 8 | 1 | Time-stretch the envelope; 7-stop segmented control |
| CC | 0 – 127 | 74 | Target CC number (14-bit: this CC is MSB, CC+32 is LSB) |
| Channel | 1 – 16 | 1 | MIDI output channel |
| Resolution | 7-bit / 14-bit / MPE | 7-bit | Output precision; MPE sends per-note pitch-bend |
| Note-off stops | on/off | off | Stop envelope immediately on note-off; otherwise runs to end (or loops) |
| Scale | −1 – 1 | 1 | Multiply the envelope value before output |
| Offset | −1 – 1 | 0 | Add to the value after scaling |
Output transform (scale and offset operate in bipolar signal space [-1, 1]):
processed = offset + scale × envelopeValue (envelopeValue ∈ [-1, 1])
finalNorm = clamp((processed + 1) / 2, 0, 1)
- Default (scale=1, offset=0): passthrough
- Invert: scale=−1, offset=0 →
(−signal + 1) / 2= 1 − default, true flip about centre
Retrigger behaviour: a new note-on for a note that is already playing always restarts its envelope, regardless of settings. This prevents multiple instances of the same envelope from simultaneously fighting over the same CC output.
Primacy: if two mappings target the same output channel + CC, the one higher in the list takes priority. The lower-priority instance continues to evaluate (so it takes over immediately when the dominant one ends) but its MIDI output is suppressed.
Shadowing: if two mappings share the same input note, the lower one is greyed out (a second note on the same pitch has no additional effect).
Smart Add: new mappings clone the last row and increment the note by one.
Real-time oscilloscope display for all active CC and MPE pitch-bend outputs. Each output lane (identified by channel + CC) gets its own scrollable cell showing the last 256 samples. When no envelopes are active, an empty-state illustration is shown.
Route the plugin's MIDI output directly to any hardware or virtual MIDI device — useful when running as a Standalone app or when you want to drive hardware outside the DAW routing.
- Device combo: lists all available MIDI outputs; selecting one opens it immediately
- Refresh: rescans available devices (use after plugging in hardware)
- New Virtual (macOS only): creates a CoreMIDI virtual source named "Dan" that any app on the machine can subscribe to (appears in IAC-style device lists)
All MIDI generated by the envelopes (CC, pitch-bend, and note passthrough) is mirrored to the selected device.
Requirements
- macOS 10.13+, Xcode 14+ with Command Line Tools (
xcode-select --install) - CMake 3.22+ (
brew install cmake) - Internet access on first build (fetches JUCE 8.0.9 and clap-juce-extensions)
- (Optional) librsvg for app icon generation (
brew install librsvg)
# Build + create dist/Dan-0.1.0-macOS.pkg
bash build.sh
# Build only (skip packaging)
bash build.sh --no-package
# Build and package separately
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j$(sysctl -n hw.logicalcpu)
bash package-mac.shThe PKG installer puts:
/Applications/Dan.app/Library/Audio/Plug-Ins/VST3/Dan.vst3/Library/Audio/Plug-Ins/Components/Dan.component/Library/Audio/Plug-Ins/CLAP/Dan.clap
To sign the PKG with your Developer ID:
DEVELOPER_ID="Developer ID Installer: Your Name (XXXXXXXXXX)" bash package-mac.shFor a quick local install without packaging:
bash install.shApp icon: if rsvg-convert is on your PATH, CMake automatically converts Resources/dan_icon.svg into a multi-resolution Dan.icns during the configure step and embeds it in every bundle. build.sh always re-runs cmake configure so the icon is refreshed whenever the SVG changes.
Requirements
- Windows 10+, Visual Studio 2022 (or Ninja + MSVC/clang-cl)
- CMake 3.22+
- Internet access on first build
- (Optional) ImageMagick for app icon generation (
winget install ImageMagick)
:: Build + create dist\Dan-0.1.0-Windows.zip
build-win.bat
:: Build only
build-win.bat --no-packagepackage-win.ps1 produces dist\Dan-0.1.0-Windows.zip. If NSIS is in PATH it also produces dist\Dan-0.1.0-Windows-Setup.exe, which installs:
%CommonProgramFiles%\VST3\Dan.vst3%CommonProgramFiles%\CLAP\Dan.clap%ProgramFiles%\Dan\Dan.exe+ Start Menu and Desktop shortcuts
App icon: if magick (ImageMagick) is on your PATH, CMake converts Resources/dan_icon.svg into a multi-resolution Dan.ico at configure time and embeds it in the executables.
Requirements
- Mac with Xcode 14+, CMake 3.22+
- Apple Developer account (Team ID required for device signing)
- (Optional) librsvg for app icon generation (
brew install librsvg)
bash build-ios.sh XXXXXXXXXX # replace with your Team IDFirst-time setup (required once before the script can archive):
- Connect your iPad
- Run
bash build-ios.sh <TEAM_ID>— the script opens the Xcode project automatically - In Xcode, select both
MidiEnvelopePlugin_StandaloneandMidiEnvelopePlugin_AUv3targets, set the team to your Apple Developer account, and press ⌘R to build and install once - After that,
bash build-ios.sh <TEAM_ID>will archive and producedist/Dan.ipa
The AUv3 bundle ID is com.umaruwaste.dan.danAUv3. Load the Standalone in AUM or any AUv3 host; the AUv3 will appear as a MIDI effect.
App icon: if rsvg-convert is available, CMake generates a 1024×1024 PNG from Resources/dan_icon.svg at configure time; Xcode scales it for all required iOS icon slots.
# Quick install (copies + re-signs all formats)
bash install.sh
# Or manually:
cp -r build/MidiEnvelopePlugin_artefacts/Release/VST3/Dan.vst3 \
~/Library/Audio/Plug-Ins/VST3/
xattr -rd com.apple.quarantine ~/Library/Audio/Plug-Ins/VST3/Dan.vst3
codesign --force --deep -s - ~/Library/Audio/Plug-Ins/VST3/Dan.vst3After installing, quit and relaunch your DAW:
- Ableton Live: drag Dan from the browser under Plug-Ins → VST3 → Umaru Industrial Waste onto a MIDI track device chain
- Logic Pro: AU components are scanned automatically on launch; if it doesn't appear, run
sudo killall coreaudiodin Terminal - Bitwig / Reaper / CLAP hosts: rescan plug-in folders in settings
- Insert Dan as a MIDI effect before an instrument on a MIDI track
- In the Envelopes panel, draw a curve and set its length
- In the Key Map panel, click Add Mapping and configure the trigger note, target CC, and output channel
- Play notes — each note-on fires the mapped envelope and streams CC values in sync with the DAW transport
- (Optional) In the MIDI Out panel, select a device to also send all output there directly
- Invert a curve: set Scale = −1, Offset = 0
- Layer two envelopes on the same CC: the mapping higher in the list wins; the lower one takes over when the higher one finishes
- Send to hardware: use MIDI Out → New Virtual to create a CoreMIDI virtual port, then route it in Audio MIDI Setup to your hardware interface
- Running free of a DAW: the Standalone app free-runs at the last known BPM; set BPM via your hardware clock or the DAW when hosted
Source/
├── EnvelopeData.h — Data model: AnchorPoint, Envelope, KeyMapping, EnvelopeBank
├── EnvelopePlayer.h/cpp — Audio-thread envelope engine, primacy logic, direct MIDI send
├── EnvelopeEditorComponent.h/cpp — Bézier curve editor UI (draw, drag, loop, sweep)
├── KeyMapperComponent.h/cpp — Mapping table UI
├── ScopeComponent.h/cpp — Real-time CC oscilloscope
├── MidiOutputComponent.h/cpp — Direct MIDI device routing panel (macOS/Windows)
├── Icons.h — SVG icon factory + panel header helper
├── MonokaiLookAndFeel.h — Flat Monokai theme
├── PluginProcessor.h/cpp — JUCE AudioProcessor; owns shared state + direct MIDI out
└── PluginEditor.h/cpp — Resizable split-panel editor
Resources/
├── dan_icon.svg — App icon source (1024×1024 viewBox); converted to .icns/.ico at build time
├── icon_add.svg — Green plus
├── icon_loop.svg — Cyan circular arrow
├── icon_envelope.svg — Bézier curve with anchors
├── icon_keymap.svg — Piano keyboard
├── icon_scope.svg — Oscilloscope screen
├── icon_sweep.svg — Broom
└── icon_midiout.svg — Arrow + DIN-5 connector
CMakeLists.txt — Build system (JUCE 8 + clap-juce-extensions); iOS/macOS/Windows
build.sh — macOS build + package
build-win.bat — Windows build + package
build-ios.sh — iOS archive + IPA export
package-mac.sh — Creates dist/Dan-x.x.x-macOS.pkg
package-win.ps1 — Creates dist/Dan-x.x.x-Windows.zip (+ Setup.exe if NSIS present)
installer-win.nsi — NSIS installer script (used by package-win.ps1)
install.sh — Quick local install on macOS
Copyright © Umaru Industrial Waste. All rights reserved.