{"id":51144956,"url":"https://github.com/seajaysec/war-bells","last_synced_at":"2026-06-26T02:01:18.967Z","repository":{"id":365726032,"uuid":"1273095651","full_name":"seajaysec/war-bells","owner":"seajaysec","description":"Granular · glitch · delay · looper multi-effect module for the Ableton Move (Schwung framework)","archived":false,"fork":false,"pushed_at":"2026-06-18T16:26:53.000Z","size":78,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T16:29:53.954Z","etag":null,"topics":["ableton-move","audio-effect","dsp","granular","looper","schwung"],"latest_commit_sha":null,"homepage":"https://seajaysec.github.io/war-bells/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seajaysec.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-18T07:50:53.000Z","updated_at":"2026-06-18T16:27:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/seajaysec/war-bells","commit_stats":null,"previous_names":["seajaysec/war-bells"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/seajaysec/war-bells","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seajaysec%2Fwar-bells","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seajaysec%2Fwar-bells/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seajaysec%2Fwar-bells/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seajaysec%2Fwar-bells/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seajaysec","download_url":"https://codeload.github.com/seajaysec/war-bells/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seajaysec%2Fwar-bells/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34799570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ableton-move","audio-effect","dsp","granular","looper","schwung"],"created_at":"2026-06-26T02:01:16.056Z","updated_at":"2026-06-26T02:01:18.960Z","avatar_url":"https://github.com/seajaysec.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# War Bells\n\n**War Bells** is a granular-sampling / delay / looping multi-effect **module for the\nAbleton Move**, built on the open-source [Schwung](https://github.com/charlesvestal/schwung)\nframework. It is a hand-written C `audio_fx` plugin: eleven effects across four families,\nforty-four variations, four grain envelopes, a Hold sampler, a four-mode stereo reverb with\n**shimmer**, a resonant low-pass filter, pitch modulation, **scale-locked pitch**, a tempo-synced\n**Motion** mod-LFO, a generative **Evolve/Dice** engine, input-ducking, a 60-second phrase looper,\neight character presets, and a 16-slot user-preset bank that saves your sounds *and* their loops.\n\n🎛️ **[Interactive manual \u0026 live demo →](https://seajaysec.github.io/war-bells/)** \u0026nbsp;·\u0026nbsp;\n💬 **[Discuss on the Schwung Discord →](https://discord.com/channels/1480993331243778193/1517609182445178983)**\n\n## The effects\n\nEleven effects in four families, each with four named variations:\n\n| Family | Effects | Character |\n|--------|---------|-----------|\n| **Loops** | Glide · Seq · Stack | layered short loops at different speeds — rhythms \u0026 octaves |\n| **Grains** | Cloud · Drone · Chain | clouds of tiny fragments — washes, drones, textures |\n| **Glitch** | Arp · Cutup · Chop | real-time rearrangement — stutters \u0026 bursts |\n| **Delays** | Taps · Warp | a **stereo** multi-tap delay line — rhythmic, filtered, pitched, ping-pong echoes |\n\nEach effect's four variations have their own short labels (e.g. Stack → `oct+ / oct- / x2 /\nrange`, Taps → `line / swng / trip / wide`).\n\n## Controls\n\nWar Bells is a standard Schwung `audio_fx` module. The host renders menu **pages** and maps\nthe **8 knobs** per page; metadata is served from the plugin (`chain_params` + `ui_hierarchy`)\nso every parameter is editable on the device.\n\n- **Root** — Preset · Effect · Variation · Activity · Repeats · **Rv Tone** · Mix · Space · Filter\n- **Tone** — **Shape** · Resonance · FX Vol · **Grain Env** (Soft / Pluck / Swell / Gate) · **Scale** (Off / Maj / Min / Pent / Oct / 5th)\n- **Time** — Clock (Free / Sync / Manual) · Subdivision · Tempo\n- **Space FX** — Reverb (Room / Dark / Hall / Vast) · **Shimmer** (Oct± / 5th) · **Width** · Mod Depth · Mod Rate\n- **Motion** — Mod Dest (Act / Filt / Space / Mix / Mod) · Rate (8 bar…1/8) · Depth · Wave\n- **Generate** — **Evolve** · Range (Soft / Mid / Wild) · **Dice**\n- **Perform** — Reverse · Hold · Hold Mode (Latch / Gate) · **Duck**\n- **Looper** — on/off · Transport · Reverse · Level · Fade · Speed · Route · Quantize\n- **Looper 2** — Fade shape · Record order · Looper-Only · Burst\n- **User Slots** — User Slot (1–16) · User Op (Save / Load / Del)\n- **Config** — Input (Stereo / Mono) · Input Gain · Bypass · Bypass Mode (Buf / Trail / True)\n\nThe macro knobs **Activity, Repeats, Mix, Space, Filter** (and **Shape**, on the Tone page)\nre-interpret per effect. **Activity** = more/less of the effect's thing; **Repeats** = how\nlong it rings on. **Rv Tone** is a bipolar reverb shaper on its own root knob: centre = flat,\nturn down to high-pass the tail (thins the lows / tames ambient low-end build-up), turn up to\nlow-pass it (darker, warmer). It filters the reverb *send*, so it stops mud at the source.\n\n### Timing\n\nTiming **defaults to Free** — a free-running internal tempo that drifts gently, so the\nrhythmic engines breathe rather than lock metronomically (a free-running, never-quite-locked\nfeel). **Sync** locks hard to the Move's host clock; **Manual** holds a fixed\nBPM. Onset-driven effects (Arp, Chain) also trigger from audio transients and MIDI note-ons.\n\n### Saving your sounds\n\n- **Character presets** — the `Preset` row sets the effect + all macros to one of eight\n  curated starting points (Init, Erase, Edit, Chor, Shimr, Birds, Glass, Pad).\n- **User-preset bank** — on the *User Slots* page, pick a slot (1–16) and **Save**; it writes\n  every parameter *and* the recorded loop to disk under the module folder. **Load** restores\n  both; **Del** clears the slot.\n- **Whole-chain patches** — War Bells serializes its full state, so a Signal-Chain patch saved\n  via the Schwung Manager captures it too (parameters only — not the loop audio).\n\n### MIDI\n\nChannel-wide CCs map the main controls (6 Activity · 7 Shape · 8 Filter · 9 Mix · 11 Repeats ·\n12 Space · 20 Reverb · 33 Rv Tone · 22 Looper · 28–35 transport · 47 Reverse · 48 Hold · 102\nBypass, plus more). **Program Change** selects effect + variation directly (effect = PC ÷ 4,\nvariation = PC mod 4).\n\n### Web control\n\nWar Bells ships a custom **web UI** (`web_ui.html`) — believed to be the first Schwung module to\ndo so. It's dual-purpose:\n\n- **[Interactive demo + manual](https://seajaysec.github.io/war-bells/)** on GitHub Pages — the\n  synth panel runs as a simulation alongside the docs (live device control is disabled there\n  because a browser can't open an insecure socket from an https page).\n- **Live controller** when opened *from the Move* (an http origin), with War Bells in a chain\n  slot: `http://move.local:7700/api/remote-ui/module-assets/war_bells/web_ui.html`. It connects\n  to the Schwung Manager WebSocket, finds War Bells in your slots, drives the DSP, and reflects\n  hardware-knob moves back into the page.\n\n## How it works\n\n```\nin -\u003e input gain/mono -\u003e capture ring (frozen by Hold)\n   -\u003e 6 granular voices + multitap delay -\u003e wet\n   MIX(dry,wet) -\u003e chorus(pitch-mod) -\u003e SPACE(delay + reverb) -\u003e resonant LP filter\n   -\u003e looper (thru + base/overdub) -\u003e bypass crossfade -\u003e out\n```\n\nAll DSP is hand-written, realtime-safe C (header-only primitives in `src/dsp/core/`):\nwindowed granular voices over a rolling live-input buffer (`grain.h`, four envelope shapes),\na 4-tap delay with a pitch shifter (`multitap.h`, `pitchshift.h`), a chorus (`chorus.h`), a\nSchroeder–Moorer reverb with four mode presets (`reverb.h`), a TPT state-variable resonant\nfilter (`svf.h`), a two-buffer 60-second looper (`looper.h`, WAV save/load), and an onset\ndetector (`transient.h`). The per-variation \"brain\" lives in `effects.c`.\n\n## Install (no build required)\n\nYou do **not** need to compile War Bells — install it through the **Schwung Manager**\n(`http://move.local:7700` → **Modules**):\n\n- **From the catalog** *(once listed — see below)* — find **War Bells** under audio FX and tap\n  **Install**. One tap; auto-updates when a new release ships.\n- **Custom → from GitHub URL** — paste **`seajaysec/war-bells`**. The Manager reads\n  [`release.json`](release.json) and pulls the correct tarball from the latest GitHub Release.\n- **Custom → from file** — download the **`war_bells-module.tar.gz`** asset from the\n  [latest Release](https://github.com/seajaysec/war-bells/releases/latest) and upload it.\n\n\u003e ⚠️ Use the **`war_bells-module.tar.gz`** asset, **not** GitHub's auto-generated\n\u003e \"Source code (tar.gz)\". The source archive keeps `module.json` under `src/`, so the Manager\n\u003e reports **\"No module.json found in tarball.\"** The packaged asset has the right layout\n\u003e (`war_bells/module.json`).\n\nBuilding from source is only for development:\n\n```sh\nbash scripts/run_tests.sh      # host-side C tests (native cc)\nbash scripts/build.sh          # cross-compile war_bells.so (aarch64) + tarball\nMOVE_HOST=ableton@move.local bash scripts/deploy-dev.sh   # sideload to a Move\n```\n\nSee [`INSTALL.md`](INSTALL.md). The shared object is `war_bells.so` and exports\n`move_audio_fx_init_v2` (audio_fx ABI v2). `requires_continuous_processing` keeps the\ngranular / looper / delay state alive through silence.\n\n## Status\n\nDSP is verified by `tests/test_smoke.c`: dry passthrough is unity, all 44 variations render,\nthe looper records / plays / overdubs / undoes / erases / saves / loads, character presets and\nthe user-slot bank round-trip (params **and** loop audio), Hold↔Looper exclusivity holds, and\n`state` / `chain_params` / `ui_hierarchy` serialize cleanly. The aarch64 `.so` cross-compiles\nclean and exports the entry symbol. Final analog *voicing* is tuned on-device.\n\n## License \u0026 credits\n\nWar Bells is released under the [GNU Affero General Public License v3.0](LICENSE) © Chris Farrell.\nBecause it's served over a network (the web UI), AGPL §13 applies — the in-app footer links back\nto this source.\n\nIt links the Schwung host ABI: `src/host/audio_fx_api_v2.h` and `src/host/plugin_api_v1.h` are\nredistributed unmodified from [Schwung](https://github.com/charlesvestal/schwung) (MIT ©\nCharles Vestal) — see [`THIRD_PARTY.md`](THIRD_PARTY.md). The reverb is adapted from the\npublic-domain Freeverb (Jezar at Dreampoint). Documentation is illustrative.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseajaysec%2Fwar-bells","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseajaysec%2Fwar-bells","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseajaysec%2Fwar-bells/lists"}