beds
Eight looping pieces: one per state of the run, plus the air of the crypt.
sound.beds
Eight looping pieces: one per state of the run, plus the air of the crypt.
local Beds = require("sound.beds")
local canvas = Beds.render("belfry")
| bed | when it plays | what it is |
|---|---|---|
title | the title card and the opening | the bell tower at night, open and patient, the crack already in it |
nave | chamber 1 | a slow pulse, like something breathing in the walls |
cloister | chamber 2 | standing water, moving when nothing is moving it |
belfry | chamber 3 | under the bell, a semitone away from agreeing with itself |
boss | the Bellwarden | 90 bpm, twenty-four beats to the lap, and a tritone |
death | the death card | two notes a few cents apart, beating slowly |
victory | the victory card | the one bed with a major third in it |
ambience | the whole descent | air through stone, the room's own note, water finding its way down |
The crypt is in A, because the great bell's hum is A1 and the music should agree with the bronze rather than fight it.
Why they loop silently
Audio.looping wraps the whole clip, so the join between the last sample
and the first is audible once a lap. Two rules keep it silent, both in the
synthesiser rather than in a loop marker — a .soundClip stores loopStart
and loopEnd and no playback surface reads them, so interior markers are
not an option:
- a sustained partial is snapped to a whole number of cycles across the
buffer (
Synth.drone), so it arrives back where it started; - noise is generated for two laps and cross-faded onto itself
(
Synth.loopNoise), so the wrap is continuous.
A bell struck inside a bed is placed early enough that its tail has died before the end. Nothing is faded at the edges and nothing is trimmed: an edge fade is itself a dip once a lap.
The Mix component proves each one with audio.loopSeam as it bakes and
records the ratio in sound.state. All eight read seamless.
They are baked as codec = "pcm" rather than Opus, because an Opus clip
loses its first few milliseconds on decode and a looping bed hears that as
a click at every lap.
Scoped to this part · feeds back into the world's score.