Skip to content
cipp0Public

About

A node-graph editor for CDP8 sound processing, built as an Ableton Live extension and inspired by SoundThread

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

KLANG

A node-graph editor for CDP8 (Composers Desktop Project) sound processing, built as an Ableton Live extension and inspired by SoundThread. Right-click an Arrangement clip or time selection, build a chain of CDP processes as a node graph, and send the result back into Live as a new audio clip.

The 232 CDP command-line binaries are bundled in resources/cdp-bin/ — no separate CDP install needed. See Licensing below.

Setup (building from source)

This repo does not include Ableton's Extensions SDK/CLI packages (vendor/, gitignored) — Ableton's SDK license forbids redistributing the SDK itself outside your own application, so every developer needs their own copy:

  1. Download the Extensions SDK beta from https://ableton.github.io/extensions-sdk/
  2. Copy ableton-extensions-sdk-*.tgz and ableton-extensions-cli-*.tgz from the download into a vendor/ folder at the repo root.
  3. Copy .env.example to .env and point EXTENSION_HOST_PATH at your local Ableton Live install (see comments in the file).
  4. npm install, then npm start to build and run in Live's Extension Host, or npm run package to produce a .ablx.

If you just want to use KLANG rather than build it, grab the prebuilt .ablx from this repo's Releases instead — the CDP binaries are already bundled in it, only the SDK/CLI build tooling is excluded from source control.

Usage

  1. In Live's Arrangement View, select a clip or a time range on an audio track.
  2. Right-click → Open in KLANG.
  3. A window opens with the selection's audio already loaded as a source node.
  4. Click + CDP Process to add a node, drag from an output port (right) to an input port (left) to connect nodes. Ports are colour-coded by format — blue for .wav, purple for .ana (PVOC frequency-domain data) — and won't connect if the formats don't match.
  5. Click a node to edit its parameters, then Run to process it (and everything upstream of it).
  6. Once you have a result you like, click Send to Live on that node — it's imported and placed right after your original clip/selection on the same track. The original is never overwritten.
  7. Save Thread / Load Thread persist a node graph (not the audio) for reuse.
  8. Close the window with ✕ Close Window — if Clean up on close is checked (default), all audio/analysis files generated during the session are deleted; the graph itself isn't affected.

KLANG only registers for the Arrangement View (a clip and a time-selection context menu action) — it does not appear in Session View / clip slots.

An Audio Input node can also load a file directly (Choose audio file…, or paste/drop a path), so you can use KLANG without an Arrangement selection.

Automating a parameter: parameters CDP can sweep over time show a ⟳ button. Turn it on and the value becomes a list of time/value points — 0:1 2.5:40 5:4 — which CDP interpolates between across the sound. The ✎ button draws that curve instead of typing it.

Supported input formats: uncompressed audio only — .wav, .aif, .aiff, .aifc, .amb. CDP's soundfile library cannot read MP3, FLAC, OGG or M4A; convert those first. Audio is normalised to 32-bit float before frequency-domain analysis (see the note in the changelog), so processed output comes back as 32-bit float WAV.

Where's the cache?

KLANG writes generated audio/analysis files to Ableton's per-extension temp directory, and saved threads + the process manifest to its per-extension storage directory:

  • Temp (generated audio, cleared automatically): $TMPDIR/Ableton Extensions/cipp0.klang/ ($TMPDIR is macOS's per-user temp folder, typically /var/folders/.../T/; run echo $TMPDIR in a terminal to see yours)
  • Storage (saved threads, manifest): ~/Library/Application Support/Ableton/Extensions Data/cipp0.klang/

With Clean up on close checked (the default), the temp folder is emptied every time you close the KLANG window, so it shouldn't grow unbounded. If you ever want to clear it by hand (e.g. after leaving the window open for a long session), it's safe to delete the contents of the temp path above — nothing there is needed once the window is closed. Never delete the storage path's threads/ folder unless you want to lose your saved graphs.

Building / running this extension

npm start                  # build + run in Live's Extension Host
npm run build               # production bundle of src/extension.ts
npm run build:dev           # dev bundle (sourcemaps, not minified)
npm run package              # build for production + create a .ablx archive

The path to Live's Extension Host is stored in .env as EXTENSION_HOST_PATH.

Codesigning the bundled CDP binaries

The bundled binaries in resources/cdp-bin/ are unsigned. macOS Gatekeeper normally blocks unsigned binaries downloaded from the internet, so on first activation the extension runs a best-effort xattr -d com.apple.quarantine pass over resources/cdp-bin/* — this is usually enough for local/personal use, since files installed as part of a packaged extension rather than downloaded directly don't always carry the quarantine flag the same way a direct download does.

If you hit a Gatekeeper block anyway, or want to distribute this extension to other people, sign the binaries properly instead of relying on the quarantine-removal workaround:

# Ad-hoc signing (no Developer ID needed, fixes local Gatekeeper blocks):
find resources/cdp-bin -type f -perm +111 -exec codesign --force --sign - {} \;

# Proper signing for distribution (requires an Apple Developer ID certificate):
find resources/cdp-bin -type f -perm +111 -exec codesign --force --timestamp \
  --options runtime --sign "Developer ID Application: Your Name (TEAMID)" {} \;

# Verify a binary is signed:
codesign -dv --verbose=4 resources/cdp-bin/pvoc

If you'd rather build CDP from source than use the bundled binaries (e.g. to get a signed build, or a newer CDP release), the source is at ComposersDesktop/CDP8; build per its own instructions and drop the resulting executables into resources/cdp-bin/, keeping the same filenames referenced in resources/manifest.json.

CDP tools used

53 CDP executables, invoked as separate processes (never linked into this extension), power the 156 processes in resources/manifest.json:

Executable Used for
blur Spectral blur, average, suppress, chorus, drunk walk, noise, random thinning
bounce Bouncing Ball — accelerating, decaying repeats
cascade Echoed/cascading repeats
distort Waveset reverse, pitch warp
distortt Waveset repeat
distrep Wavecycle repeat
distshift Half-wavecycle shift
distwarp Progressive sample warp
extend Zigzag, loop, drunk walk, repeat segments
filter Low/high-pass filter
focus Accumulate, stepped freeze, exaggerate, focus, fold
gate Noise gate
grain Time warp, reverse grains
hilite Highpass filter, trace (retain loudest partials)
housekeep Mono/stereo channel splitting (internal, for stereo support)
hover Zigzag read at a frequency
interlx Stereo interleave (internal, for stereo support)
modify Speed change, stack (layered transpositions)
morph Spectral morph between two sounds
multiosc FM synthesis (4-operator)
newdelay Pitched delay
pitch Pitch transpose, pitch shift, tune spectrum to a frequency
pvoc PVOC analysis / resynthesis (frequency domain in/out)
quirk Power-curve distortion
reverb / rmverb Reverb
scramble Waveset reorder
spec Freeze (magnify a window), trim (cut)
specav Spectral average
specfnu Formant operations: narrow, squeeze, invert, rotate, negative, move/shift, randomise partials, transpose under formants
specnu Spectral squeeze, randomise window order
spike Envelope-to-peak shaping
spin Stereo image rotation
splinter Shrinking waveset repeats
strange Frequency shift, glissandi (Shepard / inharmonic / self), waver, spectral invert
stretch Time stretch, spectral stretch above/below a split point
subtract Subtract one file from another
synspline Random-overtone synthesis
synth Basic waveform / noise synthesis
tremenv / tremolo Tremolo (envelope-following / fixed-rate)

Changelog

See CHANGELOG.md for what's been added and fixed.

Licensing

Three different licenses apply to different parts of this project:

  • This project's own code (src/, resources/ui/, resources/manifest.json) — MIT, see LICENSE.
  • The bundled CDP binaries (resources/cdp-bin/) — unmodified CDP Release 8 command-line tools, © the Composers Desktop Project (Trevor Wishart, Richard Dobson, et al.), licensed under LGPL 2.1. See resources/cdp-bin/LICENSE-LGPL-2.1.txt and resources/cdp-bin/NOTICE.md. They're invoked as separate OS processes (subprocess calls), not linked into this extension's code, and are redistributed here verbatim. Source: https://github.com/ComposersDesktop/CDP8
  • Ableton's Extensions SDK/CLI (used to build this project, not included in this repo) — © Ableton AG, under Ableton's own Extensions SDK License, which explicitly forbids redistributing the SDK itself outside of an application built with it. That's why vendor/*.tgz is gitignored rather than committed — see Setup for how to get your own copy. This restriction applies only to the SDK/CLI tooling, not to this project's own source code or to the CDP binaries above.

Built by cipp0_ — Francesco Casanova.

About

A node-graph editor for CDP8 sound processing, built as an Ableton Live extension and inspired by SoundThread

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages