Sonic — micro analysis of prose as heard composition
Source path: knowledge-base/specs/sonic/README.md
# Sonic — micro analysis of prose as heard composition
Status: **rough spec (direction).** Nothing here ships until scheduled. No new force, no new stored
field, and no new canonical state is proposed: every quantity below is a *reading* of prose that already
exists in the record (a scene's `prose`, its `BeatPlan`, its `BeatProseMap`). Where a formula is stated
it is a **candidate**, and every constant is a dial to be calibrated, never a theorem.
Priority: **the value-add**, second behind the causal simulator itself
([specs map](../README.md#priorities-2026-09-21)). A simulator that models only what happened is not
enough to rehearse a situation in; it must carry what it felt like while it happened — the pause, the
tone, the pressure — and this is the micro layer (`Words → Rhythm → Sound → Emotion → Perception`) under
the macro one the pentad already measures (`World → Forces → Causality → Consequences`).
**Micro is in service of macro (2026-09-20).** The micro layer is not a peer research programme. Its job
is engagement — holding a reader's attention on the scene — and conveying the macro movement (what the
world did) so that a computed consequence is felt rather than reported. Its north star is therefore
**engagement dynamics**: the push and pull of attention across a scene — tension and release, withholding
and disclosure, an open question pulling forward and a consequence pushing back — a candidate eastern
ontology of complementary forces (yin/yang) at the grain of prose, mirroring the feed/bound cycles the
pentad already has at macro grain. The western music ontology below is **one candidate instrument** for
reading those dynamics, kept because it names the reader's inner hearing precisely; it is not the north
star. Any measure proposed here is graded by one question: does it improve how well the screen carries
the board ([strategy 14 §1a and Track G](../../knowledge/product/strategy/14-the-causal-simulator-monopoly.md)).
The idea in one line, from the founder (2026-09-18):
> **Meridians has mastered macro delta analysis; it has not touched micro prose beauty. Authors are
> textual musicians. Each scene (~500 words) is a composition, and the bridge from delta extraction to
> micro elegance is music theory — the sounds we produce in our head while we read.**
Authority: the [pentad spec](../pentad/README.md) owns the five forces and their measures; this spec owns
the finer grain beneath them and must not redefine a force. [Positioning](../../knowledge/product/positioning/delivery-and-worldview.md)
owns what may be said publicly: the sonic layer is direction, never capability.
Read first: [pentad §7.8 (grain)](../pentad/README.md), `src/lib/core/constants/scale.ts`
(`WORDS_PER_BEAT`, `SCENE_UNIT_WORDS`), `src/types/domain/beat.ts` (`BeatFn`, `BeatMechanism`,
`BeatProseMap`), `src/lib/core/io/sentence-tokenization.ts` (`splitIntoSentences`).
---
## 1. Two grains — what Meridians does and what it cannot yet do
| | Macro delta analysis (shipped) | Micro sonic analysis (this spec, unbuilt) |
|---|---|---|
| Unit | the scene, as one point on a curve | the syllable, the clause, the sentence, the beat, inside one scene |
| Signal | what a scene **changed**: slots landed, entropy moved, Flags set | what a scene **sounds like**: stress, length, phoneme, repetition, cadence |
| Question answered | is the arc moving, where does it turn, what depends on what | is this passage beautiful to hear, does it entrance, where does it sag |
| Measures | five force realisations, grade, Activity, Signature, shape, scale, density, pacing, causal weight, open mass, force flow | metre, tempo, dynamics, contour, timbre, motif, phrase, cadence, form (§3) |
| Strength | comparative and structural: two works, two branches, two intervals | local and prescriptive: this sentence, this beat, revise here |
| Blind spot | reads nothing inside a scene — a flat, tuneless 500 words and a gorgeous one score the same if they land the same slots | reads nothing across scenes — cannot tell a turning point from a lull |
Every macro measure is a function of the per-scene force snapshot; the activity curve has one point per
scene and the classifiers (Legendre spectrum, ×2.5 ladder, growth exponent β, turnover τ) decompose that
one curve. This is why the classifiers are elegant and also why they saturate: four reads of one signal.
The honest limit is stated in the pentad and positioning contracts. The sonic layer is the second signal.
### 1.1 The macro classifiers — how elegant, and what is missing
Shape, scale, density, and pacing are each one stated rule with named dials, and each is orthogonal in
*form* (spectrum, ladder, exponent, turnover). They are not orthogonal in *input*: shape and pacing read
the same activity curve, scale and density read the same scene count. A record therefore has two
independent macro coordinates and four labels. The record already computes quantities that would add
genuinely new axes; classifying them is the obvious next macro step, and none requires new data:
| Candidate | Reads | Formula sketch (dials in bands) | Separates |
|---|---|---|---|
| **Depth** | `dependency-chains` | longest Flag chain ÷ ln(scenes) | a serial of episodes from a plotted epic at equal length |
| **Concentration** | `causal-hubs` | Gini of per-scene causal weight | hub-driven (few pivots) from distributed causality |
| **Openness** | `composition.openMassAt` | open mass at cursor ÷ peak open mass | a closed work from an unfinished or deliberately open one — this also fairly contextualises low Fate on series |
| **Constitution** | `constitution.fitConstitution` | dominant feed edge and dominant bound edge | which ring edge drives the work (World→System lore, Causality→Fate plot, …) |
| **Register** | `theme-analysis.attentionEntropy` | mean normalised Theme entropy | monothematic from polyphonic works |
Each is a delta-grain measure and belongs in the pentad spec's classifier ledger, not here; they are
listed so the boundary is clear: **every one of them is still macro**. None hears the prose.
The two grains meet at the **beat**: the plan says what each ~100-word beat must do (`BeatFn`) and how it
is delivered (`BeatMechanism`); the prose realises it; macro reads the scene's structural delta; sonic
reads the passage's sound. Same object, two ears.
## 2. The hierarchy — music nested in prose nested in plan
The existing generation stack already has a metrical hierarchy; it lacks only the bottom rungs and the
ear that reads them.
| Music | Prose | Exists today | Nominal size |
|---|---|---|---|
| Piece | Scene | `Scene.prose`, `proseEnvelope(grain)` | `SCENE_UNIT_WORDS` = 500 (grain 500–2500) |
| Section / movement | Beat | `Beat { fn, mechanism, what, propositions }`, `BeatProseMap` | `WORDS_PER_BEAT` ≈ 100, 0.7×–1.3× |
| Phrase | Paragraph | reading-paragraph grouping in `sentence-tokenization.ts` | 1–5 sentences |
| Bar / measure | Sentence | `splitIntoSentences` | 5–40 words |
| Motif | Clause | — | 2–10 words |
| Note | Syllable (stressed / unstressed) | — | — |
| Timbre | Phoneme (vowel quality, consonant class) | — | — |
Plans and beats are the **form** of the piece — the structural plan a composer writes before the notes.
Sonic analysis is the **score as heard**: what the realised notes do inside the form. The plan sets the
goal of each beat (`breathe`, `advance`, `turn`, `reveal`, `resolve`, …); the sound is how the passage
carries the listener to it.
## 3. The ontology — a western music vocabulary for prose, with candidate measures
Each element names a listening experience, the textual quantity that carries it, and a candidate measure.
All measures are computed per **beat** (the section) and per **scene** (the piece); sentence-level values
are the raw series. Notation: a scene has sentences \(s_1..s_n\); \(L_i\) = syllables in \(s_i\);
\(S_i\) = stressed syllables in \(s_i\); \(\sigma_i\) = stress sequence of \(s_i\) as 0/1.
### 3.1 Metre — the pulse
Stress alternation is the beat the inner voice keeps. Measure the **stress regularity**: the lag-2
autocorrelation of the concatenated stress sequence (iambic/trochaic prose peaks at lag 2, dactylic at
lag 3); report the dominant lag and its strength. Prose that never settles a pulse reads as prose; prose
that locks one reads as verse. Both are choices — the measure names which, and where the pulse breaks.
### 3.2 Tempo and rhythm — the length series
\(L_i\) is the bar length. **Tempo** is mean syllables per sentence; **rhythm** is how \(L_i\) moves.
The same turnover statistic the pacing classifier uses applies unchanged at this grain:
```text
τ_sentence = mean|L_{i+1} − L_i| / σ(L)
```
τ near the memoryless point (≈1.13) is neutral; low τ is a held rhythm (runs of similar sentences); high τ
is whiplash (long–short–long). A *good* passage usually shows local runs broken by a short bar at the
moment of weight. Also report the **short-bar rate**: sentences under a third of the scene's mean length,
and where they fall relative to beat boundaries.
### 3.3 Dynamics — loud and soft
Dynamics is felt intensity. Candidate loudness per sentence:
```text
d_i = S_i / L_i · (1 + punctuation weight) · (mean L / L_i)^γ
```
— stress density, terminal punctuation (`!`, `?`, `—` weigh more than `.`), and brevity (short sentences
land louder), γ a dial. The **dynamic curve** \(d_1..d_n\) is decomposed with the same Legendre spectrum
as the activity curve: a positive slope term is a **crescendo**, negative a **diminuendo**, curvature a
**swell** or **hollow**, residual **terraced** dynamics. A beat with no dynamic range is a monotone;
the founder's "crescendos and structures in music" are literally the first two Legendre terms of \(d\).
### 3.4 Contour — the melody line
Vowels carry pitch-like colour: front/high vowels (`ee`, `i`) read bright, back/low (`oo`, `aw`) dark.
Map each stressed vowel to a two-dimensional (height, backness) position and read the **contour**: the
sequence's drift across a sentence and across a beat. A sentence that descends into dark vowels at its
close lands heavier than one that stays bright. Report drift and range per beat.
### 3.5 Timbre and dissonance — consonant colour
Consonant classes have sonority: liquids and nasals (`l r m n`) are smooth, fricatives (`s f sh`) hiss,
plosives (`p t k b d g`) strike. Per beat report the class distribution and its **clustering**: runs of
plosives within a clause read as hard; runs of liquids as fluid. **Dissonance** is the density of
adjacent unlike-class clusters that are hard to voice (consonant pile-ups across word boundaries).
Dissonance is not an error — it is tension, to be spent, not avoided.
### 3.6 Motif and repetition — what entrances
Music holds a listener by returning. Prose does the same with **lexical motif** (a word or phrase
recurring), **phonetic motif** (alliteration, assonance, consonance — recurring onsets, recurring stressed
vowels, recurring codas), and **syntactic motif** (parallel clause shapes). Measure recurrence by
self-similarity of the beat's clause sequence on each channel; report motifs that recur ≥ 3 times, their
spacing, and whether they cross beat boundaries (a motif that spans beats binds the scene; one confined to
a beat colours it). Excess is doggerel; absence is prose that nothing holds together. The sweet band is a
dial, calibrated on lyrics and on the operator's library.
### 3.7 Phrase and cadence — how things end
A phrase ends on a cadence; a sentence ends on its last stressed syllable and what follows it. Per
sentence classify the **ending**: *strong* (final syllable stressed, monosyllabic close), *feminine*
(trailing unstressed syllable), *suspended* (ends on a subordinate clause, a comma-spliced continuation,
a question, a dash). Per beat and per scene report the **cadence profile** — the last sentence's ending
class and its length relative to the beat's mean — and the **resolution rate**: what share of paragraphs
end strong. A `resolve` beat that ends suspended, or a `turn` beat that ends on a feminine trailing
clause, is a plan/sound mismatch the reading should surface.
### 3.8 Form — the beat sequence heard as structure
The `BeatFn` sequence is already a form (ABA, AABB, arch). Read it as music does: **repetition** (the same
fn recurring), **contrast** (adjacent fns of opposite weight — `breathe` after `turn`), and **return**
(the closing beat echoing the opening one). The existing `BeatTransitionMatrix` is the form's grammar; this
spec adds the reading of a realised sequence against it and against the scene's dynamics — does the loud
beat sit where the plan put the turn?
### 3.9 What is deliberately *not* in the ontology
Key, harmony, and chord progressions have no honest textual carrier; they are metaphor, not measure, and
are excluded until someone shows a computable quantity. Semantic beauty (imagery, wit) is not sound and is
out of scope here.
## 4. From reading to guidance — optimising prose
Macro analysis compares; sonic analysis prescribes. The loop the founder is asking for:
```text
plan (BeatFn sequence, propositions, grain)
→ prose (per-beat passages, [BEAT:N] aligned)
→ sonic reading per beat: metre, tempo, dynamics, contour, timbre, motif, cadence
→ deviation from the beat's target profile
→ revision instruction for that beat only
```
A **target profile** is a small set of bands per `BeatFn`, e.g. `breathe` → low dynamics, long bars,
smooth timbre, feminine cadence; `turn` → crescendo into a short strong bar; `resolve` → falling contour,
strong final cadence, a returning motif. Targets are dials, authored once and calibrated against the
library; they are prompt material (an extension of `ProseProfile.sentenceRhythm`, which today is a
qualitative word), not stored state. The revision step edits one beat's passage and re-reads; the macro
delta of the scene is unaffected because propositions are preserved — sound changes, structure does not.
This is the sense in which the two grains are orthogonal and can be optimised independently.
## 5. Corpora and calibration
- **Song lyrics** are the calibration corpus for the sonic dials: high motif density, deliberate metre,
cadences that must land. They tell us what "entrancing" measures as before we ask it of prose.
- **Verse** (metrical and free) brackets the metre dial: where regularity becomes verse.
- **The operator's library** — the records already extracted — is the prose baseline; the same records
the macro grade reads give the sonic reading its reference bands, so a work can be read on both ears.
- **Bands, not verdicts.** As with the forces, a sonic reading is an instrument for a declared scene and
target profile, never a cosmic judgment of beauty. Genre and voice legitimately live outside the bands.
## 6. Dependencies and honesty about English
Stress and phonemes require a pronunciation source. The candidate is the CMU Pronouncing Dictionary
(ARPAbet with stress marks) with a rule-based syllabifier fallback for out-of-vocabulary words and names —
and names are frequent in fiction, so the fallback's accuracy is load-bearing. This is **English-only**
at first; other languages need their own lexicon and stress rules, and the ontology's vowel map is
language-specific. No dependency exists in the repository today; none is to be added by this spec.
## 7. What is deliberately open
1. **Sixth reading or finer grain?** Whether sonic quantities are reported as a reading beside the five
forces (a *Score* panel) or folded into each force's per-scene account is undecided. Nothing here
makes them a force; they are not deltas and have no realisation ratio.
2. **Per-beat force snapshots.** Sonic reads per beat naturally; macro reads per scene. Whether the force
snapshot should also be computed per beat (giving the activity curve intra-scene resolution) is a
separate macro question this spec raises but does not decide.
3. **Targets by fn alone, or by fn × mechanism?** A `dialogue` `turn` and a `narration` `turn` plausibly
want different sound.
4. **Who hears?** A reading assumes a reader's inner voice; dialect and reading speed change stress and
tempo. The first cut assumes one standard voice and says so.
## 8. The honest ledger
| Element | Status |
|---|---|
| Plan / beat hierarchy (`BeatFn`, `BeatMechanism`, `BeatProseMap`, `WORDS_PER_BEAT`, `SCENE_UNIT_WORDS`) | shipped |
| Sentence tokenization, paragraph grouping, word counts | shipped |
| Qualitative rhythm guidance (`ProseProfile.sentenceRhythm`, prose prompts) | shipped, not measured |
| Syllable / stress / phoneme extraction | unbuilt; no dependency present |
| Metre, tempo, dynamics, contour, timbre, motif, cadence, form readings (§3) | unbuilt; candidate formulas only |
| Target profiles per `BeatFn` and the revision loop (§4) | unbuilt |
| Calibration on lyrics / verse / library (§5) | unbuilt |
| Any surface (Score panel, Formula-modal tab) | unbuilt; this spec proposes none yet |
## 9. Sources
- Founder notes, 2026-09-18 (macro/micro; sheet music as the parallel; lyrics as corpus; authors as textual
musicians; scene ≈ 500 words as a composition; crescendos, structures, repeating patterns; music theory +
syllables + prose + plans + beats as the foundation).
- [Pentad spec](../pentad/README.md) — the macro measures this spec sits beneath.
- [Positioning: delivery truth](../../knowledge/product/positioning/delivery-and-worldview.md) — grain
paragraph; direction-not-capability rule.
- `src/lib/core/forces/domain-utils.ts` — Legendre spectrum and turnover τ, reused here at sentence grain.
Open on GitHubRaw Markdown source