← All modules
AvailableInstrument

Bells

A bell voice whose chord stays minor in any key.

Engine preview

VST3

About

The reason a church bell sounds like a church bell is one interval. A founder tunes five partials by name, hum at half the strike note, prime at the note itself, tierce, quint and nominal, and the tierce is a MINOR third. So a bell rings a minor chord over whatever it is pitched at, in a major piece as readily as a minor one, and no amount of EQ turns it into anything else. The whole family here is that idea repeated with different tables: change the ratios and you change the instrument, because on a modal core the ratios ARE the instrument.

Orchestral chimes are the strange one. A tubular bell is a vibrating tube, so its modes follow the thin-tube series, 1, 2.76, 5.40, 8.93 and up, and the ear cannot make a pitch out of that directly. What it does instead is notice that modes four, five and six sit in the ratio 2 : 3 : 4 and supply the fundamental they imply, an octave below mode four. That pitch is where the note lives, and there is no partial on it at all. The dataset here is normalised around that virtual pitch, which is why the tube's own low modes come out well below the note you played and read as the knock under the attack.

Handbells break the tower bell's rule on purpose. A handbell founder tunes the first overtone to a twelfth rather than to the octave, and the next near six to one, no tierce and no hum, so a handbell choir is consonant where a peal of tower bells is famously not. It is also the smallest bank in the module: four partials, dying inside a couple of seconds, which is most of why handbells are playable at speed.

The singing bowl is built from doublets. No hand-beaten bowl is perfectly round, so every shell mode splits into two standing waves a fraction of a percent apart, and the slow beating between the halves is the warble the instrument is bought for. It is written into the mode list rather than applied afterwards, so it survives being played polyphonically and is audible in one ear, an amplitude modulation on the output would be neither.

This is a preview instrument. The DSP is hand-written Web Audio in the website's stand-in engine, good enough to hear a tierce turn a bell minor and a doublet beat, but not a compiled kernel and not covered by any parity claim.

System requirements.

The downloadable Bells release supports the hosts and systems listed below.

  • VST3macOS · arm64

    Works in Ableton Live, Reaper, Cubase, Studio One, Bitwig and FL Studio.

Version 0.1.0

Build evidence

Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.

Module
music.codex.bells v0.1.0
Built at
Closure hash
508fd00089ad…
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)
Builtweb

bundle sha256 dfc0eb2241ff… · 407 KB

Built, but no downloadable archive was recorded.
Browser package (WASM)
Builtweb

bundle sha256 2bcc95cb9df6… · 2.0 MB

Built, but no downloadable archive was recorded.
VST3
Builtdarwin-arm64Steinberg validator + VST3 host render: passed

bundle sha256 b136b2b3dba7… · 2.2 MB

CodexBells-vst3-darwin-arm64.zip

archive sha256 a9a07516221e… · 2.2 MB · darwin-arm64

Audio UnitNot built

no recorded artifact row for au; native-lane-report.json is absent or records no au row for this module

Not built for macOS
CLAPNot built

no recorded artifact row for clap; native-lane-report.json is absent or records no clap row for this module

Not built for macOS, Windows or Linux
Standalone appNot built

no recorded artifact row for standalone; native-lane-report.json is absent or records no standalone row for this module

Not built for macOS, Windows or Linux

Parity

browser-js = browser-wasm = vst3 qualified against their own recorded digests. Not recorded: au, clap, standalone.

Presets

Start from a named sound, then adjust the instrument to make it yours.

InitCathedral CarillonDeep BourdonAngelus TollEvening ChimesTubular TollChoir of HandbellsWinter BellsGlass HourToy GlockenspielMeditation Bowl

Signal graph.

Experimental

Migration fallback: approximated from parameter groups, not a runtime wiring diagram.

How it works.

Each note is a clapper strike convolved with an impulse response synthesised for that exact note: one and a half to twelve milliseconds of low-passed noise with a leading tick, driving a bank of exponentially-decaying sinusoids placed at the selected family's measured partial ratios. Convolving the strike with those modes is what excites them, which is why the Clapper control changes the balance of partials rather than only the brightness, a wider excitation spectrum reaches further up the bank.

The five datasets are the module. A carillon gets ten partials with the founder's five tuned ones at the bottom (0.5, 1, 1.2, 1.5, 2) and a hum whose decay is the slowest in the bank, so it outlasts everything above it. A tubular bell gets the thin-tube series normalised so that ratio 1.0 is the virtual strike note an octave below its fourth mode. A handbell gets four partials with the twelfth on top of the fundamental. Glass gets a near-harmonic series with a small stiffness stretch and very fast upper decays. A bowl gets three shell modes, each split into a doublet a fraction of a percent apart so the halves beat against each other in both channels.

Strike position is applied to the modes before the impulse response is rendered, so it changes which partials exist rather than filtering the ones that do. Two lobes are blended across the bank: at the soundbow the low partials are full and the top of the bank sits at about a third of its weight, and up the waist that inverts. Nothing is ever weighted to zero, because a clapper has width and never lands on a mathematical point, a bell struck off its soundbow is thinner, not absent.

Casting size is applied to the partial ratios about the played pitch rather than about the lowest mode in the bank. That distinction is load-bearing here in a way it is not for the sibling instruments: a carillon's lowest mode is the hum, half an octave below the note, so pivoting there would drag the prime, and therefore the pitch you hear, every time the knob moved. Pivoting on the note itself leaves the pitch immovable at every size and lets only the inharmonicity breathe, which is the real difference between a small bell and a large one.

Velocity does two things, both physical. Level follows velocity squared, the repo's own perceptual curve. And a harder swing is a shorter contact, which is a wider excitation spectrum, so velocity is coupled into the clapper's effective hardness, a quiet strike is genuinely duller and not merely quieter. There is no knob to defeat that coupling, because a clapper cannot be chosen independently of the stroke that swings it. The exciter burst is drawn from a seeded generator forked by the clapper setting, so a given touch always produces the same burst; Math.random has no place in this path.

Rendering an impulse response is millions of sine evaluations, so they are cached per family and note and dropped wholesale whenever a parameter that changes the samples moves, family, ring, damping, casting, width or position. Voices are capped at eight with oldest-first stealing, and a voice's nodes are freed on a nine-second tail cap with a short fade, or as soon as a note-off's release has run, whichever comes first. Tuning is twelve-tone equal temperament with A4 at 440 and nothing else: a founder casts to concert pitch, and every key on the keyboard has a bell behind it.

Goes well with.

Preview

Gamelan

Modelled bronze instruments with flexible tuning.

Preview
Preview

Handpan

Nine tuned steel notes, with no extra tenth note.

Preview
Preview

Gong

A struck gong voice with a late shimmer.

Preview