Chapter 8 · Section 14
Sound
The BPT law
BPT Part 4.9 (The Note of a Universe) opens: "If a universe is built on a pulse, it has a pitch." The pulse holds 0 and 1 for a Rhythm each, so it is a square wave, and its Square Pulse Spectrum is a_h = 2/(π·h) for the odd harmonics alone: "The pulse holds its fundamental and its odd harmonics alone." A universe sounds the Universe Note Frequency, f₁ = 1/①⥂⧗⌂, one over its Pulse Tempo; for ours 1.855 × 10⁴³ Hz. Octave Transposition, f♪ = f₁/2^k, brings it into hearing without changing it, since "A note moved by whole octaves keeps its name": ours, down 135 octaves, sounds at 425.9 Hz, "43 cents above G♯ and 57 cents below A".
Every note comes from one first note. The Prime Pulse Note is f_ℨ = 1/ℨ ≈ 4.38 × 10¹⁰⁵ Hz, "brought into hearing, 244.4 Hz, a B 18 cents flat", and the Lineage Note, f₁ = f_ℨ/(2·f)^L, carries it down: each level an octave lower and about 30.9 cents more. A universe then builds a chord: by Data Harmonics (BPT Part 3.6) "Each nova adds its harmonic of the universe's own note ... the fundamental at its Pulsecore, the octave as it pours out its data, the twelfth as it becomes physical, the double octave with spacetime, and the Harmonic Novas filling the series as its life closes." The book is plain about what this is: "No instrument hears a universe; its note is the frequency of its pulse, read as music." How the game computes the note (universeNote(), primeNote()) is the note's own law and belongs with Part 4.9; this Part covers how it is played.
The established physics
A square wave's Fourier series holds only the odd harmonics, with amplitudes a_h = 4/(πh) of the wave's height, or 2/(πh) for a pulse from 0 to 1 (Fourier's series; textbook). Whole octaves, factors of 2, keep a note's name. Equal temperament puts 100 cents in a semitone, with A4 at 440 Hz and MIDI note 69 (standard tuning).
The game's math
The tone (playPulseTone(freq, duration) app.js:3861): a sine at freq starting at gain 0.05 and falling exponentially to 0.001 over duration. It plays on each step that births cells, at 220 + 440·min(1, born/50) Hz for 0.1 s (app.js:4525), and for a toast at 440 + 110·tier Hz for 0.18 s.
The pulse's wave (pulseWave() app.js:3930): a periodic wave with the odd harmonics h = 1, 3, …, 15 at 2/(πh), the first 16 terms of the square pulse's series.
The gong (gong(freq, dur, peak) app.js:3955). A strike is the note stacked over six octaves (GONG_OCTAVES: −3, −2, −1, 0, +1, +2 at levels 0.55, 0.75, 0.8, 1, 0.42, 0.22), the pulse's own wave in the note's octave and sines elsewhere, each kept only between 28 and 9,000 Hz; the note's octave through a low-pass filter falling from min(16,000, 24·f) to max(200, 2.5·f) over 0.7 of the strike; a sine 1.00087 times the note (1.5 cents) for the shimmer; and a drum, a sine at the note folded under 90 Hz, falling from 2.6 times it in 0.09 s and gone in 0.9 s. The envelope rises to peak in 6 ms and falls exponentially to 10⁻⁴ over dur. One compressor on the way out (threshold −16 dB, knee 10, ratio 6, attack 4 ms, release 0.3 s, then gain 0.9) lets it be loud without breaking up (bus() app.js:3947).
The launch and the novas. soundLaunch() app.js:3980 folds the universe's note by octaves into the octave just below the Prime Pulse's note (noteBase) and strikes it, 10 s at 0.16. soundNova(layer) app.js:3992 strikes harmonic h = layer of noteBase, 10 s at 0.16/√h; past the 16th harmonic h is halved until it is at most 16 (the same note, octaves down), and only every eighth such nova sounds. Sound plays only with the Sound switch on.
In the game
The universe is silent until the player checks "Enable Sound" (index.php:224). Then, at Start, the root is struck (soundLaunch(), called at the first step, app.js:4770): one long gong, ten seconds, of this universe's note folded into the octave just under the Prime Pulse's, so the player hears the first note carried down the lineage. Each nova strikes its own harmonic of that root over the ringing of the last: the octave at the Data Nova, the twelfth at the Physical Nova, the double octave at spacetime, and on up the series, the chord of BPT Part 4.9 built as the layers come. Each strike carries the pulse's own square-wave color in its root octave, a shimmer and a soft drum under it. While the rule runs, each step that births cells ticks a short sine, higher the more cells were born.
The "Note:" readout names the note at all times: <name><octave> ±…¢ · … Hz · from the Prime Pulse's <name> ±…¢ (app.js:2143), under the tooltip "The note this universe's pulse sounds: one over its Pulse Tempo, moved by whole octaves into hearing (book Part 4.9). Turn on Sound to hear it at the launch and the chord its novas build" (index.php:84). The "Null mass M_null/M_P" control (index.php:181) is the player's lever on the note before Start: it sets this universe's Tempo, ①⥂⧗′⌂ = ①⥂⧗⌂·(M_null/M_P)^½ (describeUniverse() universe.js:296), so a heavier well gives a slower Tempo and, by the Child Note of BPT Part 4.9, f₁′ = f₁·(M_P/M∅)^(1/2), a lower note.
The scale model
The note is scaled by whole octaves only, from f₁ (far above or below hearing) into the 220 to 440 Hz band or the octave below the Prime Pulse's note, so the note's name and its cents are exact; only the octave is chosen for the ear.
Where the game and the theory differ
- BPT has each nova add its harmonic of the note, the series filling as the life closes. Past the 16th harmonic the game folds each strike down by octaves, h/2 until h ≤ 16, and sounds only every eighth Harmonic Nova.
gong()takes a glide (1.2 s, 2.6 s) that no caller passes.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 0.05, 0.001, 0.1 s | playPulseTone() app.js:3861–3871 |
tone level, decay floor, default length | DISPLAY |
| 220, 440, 50 | app.js:4525 | birth tone range and its top at 50 births | DISPLAY |
| 440, 110, 0.18 s | app.js:259 | toast tone | DISPLAY |
| 523, 659, 784 Hz, 0.25, 0.4 s, 180 ms | app.js:1895 | discovery chord (C, E, G) | DISPLAY |
| 2/(πh), odd h | pulseWave() app.js:3933 |
the square pulse's harmonics | PHYSICS (Fourier series of a square wave) |
| 16 (N) | app.js:3931 | terms of the series kept | METHOD (series truncated at the 15th harmonic) |
| GONG_OCTAVES (−3 … +2, 0.55 … 0.22) | app.js:3954 | six octaves and their levels | DISPLAY |
| 28 Hz, 9,000 Hz | app.js:3963 | octaves kept within hearing | DISPLAY |
| 16,000, 24, 200, 2.5, 0.7, 0.7 (Q), 0.006 s, 10⁻⁴ | app.js:3957–3960 | filter and envelope | DISPLAY |
| 1.00087, 0.3 | app.js:3969 | shimmer | DISPLAY |
| 90 Hz, 2.6, 0.09 s, 9, 0.004 s, 0.9 s, 1 s | app.js:3971–3975 | the drum | DISPLAY |
| −16, 10, 6, 0.004, 0.3, 0.9 | bus() app.js:3950–3951 |
compressor and master gain | DISPLAY |
| 1.2 s, 2.6 s | app.js:3955 | glide timing (no caller passes a glide) | DISPLAY |
| 10 s, 0.16, √h | app.js:3988, 4000 | strike length and level | DISPLAY |
| 16 (fold), every 8th | soundNova() app.js:3994, 3998 |
harmonics folded by octaves; only every eighth past 16 sounds | DISPLAY |
| 220–440 Hz | universeNote() app.js:3886 |
the hearing octave for the note | BPT (Part 4.9: whole octaves keep the note) |
| 440 Hz, 69, 12, 100 cents | app.js:3887, 3896 | note names | PHYSICS (equal temperament, A4 = 440 Hz) |