Skip to content

SarahhhhFoster/DanTheAutomator

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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors