# Chosen choir recordings: credits and processing

The parent approved auditions **01, 02, 04, 06, 08 and 07**. These six recordings now sing in
Pocket Choir lessons, cues, full songs and round celebrations. Original audition numbers stay unchanged.
01 belongs to Pip/Cleo, 02 to Fern/Comet, 04 to Miso, 06 to Luna, 08 to Mochi, and 07 to Ziggy only.
The listening page retains just these six choices. Quiz instruments, stars and saved progress are unchanged.

## Recordings used

| Audition | Recording and creator | Source and license |
|---|---|---|
| 01 Small hello, repaired | Meow / Silas — Dan Crosby / Dcrosby | [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Meow.ogg), [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) |
| 02 Meow 8 | Cat Meow 8 FX — SOUND_GARAGE | [Pixabay 306184](https://pixabay.com/sound-effects/nature-cat-meow-8-fx-306184/) |
| 04 Meow 1 | Cat Meow 1 FX — SOUND_GARAGE | [Pixabay 306178](https://pixabay.com/sound-effects/nature-cat-meow-1-fx-306178/) |
| 06 Dragon Studio | Cat Meowing — DRAGON-STUDIO | [Pixabay 401730](https://pixabay.com/sound-effects/nature-cat-meowing-401730/) |
| 07 Little conversations | meow — freesound_community | [Pixabay 74193](https://pixabay.com/sound-effects/nature-meow-74193/) |
| 08 Alex’s recording | Cat Meow — Alex_Jauk | [Pixabay 195613](https://pixabay.com/sound-effects/nature-cat-meow-195613/) |

The five selected Pixabay sources use the [Pixabay Content License](https://pixabay.com/service/license-summary/).
The page contains musical adaptations, with source credits and links to the originals on their own pages.
Original Pixabay files remain in ignored preparation cache, outside the distributed page/assets.
`audio/hello-*.wav` and `../choir-audio/hello/*.wav` are adaptations of Dan Crosby’s Meow, distributed under **CC BY-SA 3.0**. Changes:
trimming, rumble/DC removal, pitch transposition, formant preservation, vowel timing, fades and level matching.
Other selected scale and choir assets retain their Pixabay Content License; they are not CC0 or relicensed as CC BY-SA.

`source-catalog.json` records all thirteen supplied links, public download URLs, creators and SHA-256 hashes.
`audio-manifest.json` identifies the sources actually used, precise source passages, measured roots and time maps.

## Duplicates and choices

- 306178 and 323465 are byte-identical downloads, so they are one audition.
- 306180 and 306193 are also byte-identical. Their broad pitch movement was less useful in this round.
- 98721’s first call repeats 297927 (normalized waveform correlation 0.9995). Its later calls were tested,
  but their falling pitch did not adapt reliably enough to the scale; they were omitted rather than
  presenting a systematically flat voice as a new choice.
- 306186 was examined; its larger unpitched/noisy passage was less suitable for this focused set.
- 74193 supplies separate short, regular and held calls from the same collection. The final clear passage
  of 369910 was auditioned in round two but is not part of the chosen six.

## What changed after round one

The old pitch tracker accepted the first moderately good periodicity dip. In Silas’s closing vowel it
mistook a roughly 615 Hz fundamental for a 923 Hz harmonic-related peak. The old pitch-synchronous grains
then changed abruptly at that same moment in every note. Their short windows also left gaps on low notes.
DC removal after the fades reintroduced nonzero boundaries.

Round two replaces that grain renderer with **Rubber Band 4.0.0, R3/finer engine, with formant preservation**.
It uses a corrected, fixed musical pitch center for each chosen passage; frame-by-frame pitch estimates
no longer cut/rebuild the waveform. Small natural meow glides remain, so these are expressive voices,
not perfectly steady piano tones. Ear-question instruments in the game remain unchanged.

Each voice has three separately prepared articulations:

- **Short:** 0.26-second mews, spaced at 180 notes/minute.
- **Regular:** 0.56-second notes, spaced at 90 notes/minute.
- **Held:** 1.15-second vowels, spaced at 45 notes/minute.

The time maps preserve opening/closing gestures and compress or extend the middle vowel. Held notes do
not slow down the entire meow or loop its ending. The scale/register pitches remain the same across voices.
Gentle final fades happen after DC removal and level matching keeps active-note RMS near 0.035 with
conservative peaks. Export is mono 24 kHz PCM WAV; all 54 scales play through shared `RM.audio.playBuffer`.

Rubber Band R3’s explicit `0 0` time-map entry caused a NaN stretch warning and silently suppressed pitch
transposition despite exit code zero. The builder omits that redundant origin (it is implicit), rejects
warnings/invalid output, and caches only validated renders keyed by source, pitch, duration and map.
Regressions inspect actual pitch, distinct scale notes, boundaries and gaps; asset counts alone were insufficient.
The pitch check allows each reliable-frame note median up to 125 cents from the target, and each
voice/articulation aggregate up to 75 cents, to allow natural glides while rejecting wrong roots. The selected Meow 1 short recording still has an expressive falling glide; these adaptations are not
perfectly steady piano tones. Signal checks cannot establish subjective cuteness or realism.

## Production choir bank

`../choir-voices.json` is the canonical mapping and root list. `_prepare.py` builds 348 individual notes
under `../choir-audio/` plus 54 comparison scales. Each note has a short, regular or held articulation.
Meow 1 starts at C4 because lower rendered roots had unreliable periodicity; lower song notes use its
nearest clean root with modest playback-rate transposition. Other voices include C3 through C6 roots.

The shared recorded-voice renderer chooses the nearest prepared root and note length. Shortening removes
part of the middle and crossfades into the recorded closure. Longer holds sustain a phase-matched vowel
loop, then crossfade into the original closing gesture. Everything uses the shared AudioContext, volume,
source tracking and microphone suppression; sequence Stop cancels the prefix, loop and queued tail.
Each score preloads its required notes before choosing the common audio origin. Cancelled loading cannot
start stale music or a celebration chime after returning to the game. No original Pixabay file is bundled.

## Rebuild and check

Preparation requires Python with **numpy, scipy and soundfile**, plus the free
[Rubber Band 4 command-line utility](https://breakfastquay.com/rubberband/index.html).
Only the resulting audio is distributed; the Rubber Band executable/library is not bundled with the website.
For example, from the checkout root:

```powershell
python 05_meow_echo/voice-lab/_prepare.py --rubberband PATH/TO/rubberband.exe
python 05_meow_echo/voice-lab/_test_audio.py
$env:READ_MUSIC_BASE_URL='http://127.0.0.1:YOUR_TASK_PORT'
python 05_meow_echo/voice-lab/_test.py --shots _shots/YOUR-AGENT-ID/voice-studio
```

The page itself has no Python, remote audio, CDN, third-party runtime library or new AudioContext.
Sound taste and realism still need the parent’s listening comparison; signal and pitch tests cannot establish those.
