Skip to content

Repository files navigation

Dan

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

Features

Envelope Editor

  • 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

Key Mapper

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.

Scope

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.

MIDI Out (macOS and Windows only)

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.


Building

macOS

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.sh

The 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.sh

For a quick local install without packaging:

bash install.sh

App 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.

Windows

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-package

package-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.

iOS / AUv3

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 ID

First-time setup (required once before the script can archive):

  1. Connect your iPad
  2. Run bash build-ios.sh <TEAM_ID> — the script opens the Xcode project automatically
  3. In Xcode, select both MidiEnvelopePlugin_Standalone and MidiEnvelopePlugin_AUv3 targets, set the team to your Apple Developer account, and press ⌘R to build and install once
  4. After that, bash build-ios.sh <TEAM_ID> will archive and produce dist/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.


Installation (manual, macOS)

# 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.vst3

After 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 coreaudiod in Terminal
  • Bitwig / Reaper / CLAP hosts: rescan plug-in folders in settings

Usage

  1. Insert Dan as a MIDI effect before an instrument on a MIDI track
  2. In the Envelopes panel, draw a curve and set its length
  3. In the Key Map panel, click Add Mapping and configure the trigger note, target CC, and output channel
  4. Play notes — each note-on fires the mapped envelope and streams CC values in sync with the DAW transport
  5. (Optional) In the MIDI Out panel, select a device to also send all output there directly

Tips

  • 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

Project Structure

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

License

Copyright © Umaru Industrial Waste. All rights reserved.

About

A VST, AU, and CLAP plugin that takes MIDI note data in and maps it to defined functions which are then output as MIDI CC

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages