# SRC9 sound study assets

These deterministic synthetic sounds were created for the SRC9 website prototype.
They are original interface design studies, not excerpts from Amaç Erdem's compositions.
No recordings, sample libraries, external packages, participant data, model output,
or biological measurements were used. Do not describe them as empirical validation.

## Rebuild

Run `node scripts/build-sound-study.mjs` from the site directory. The script uses
only built-in Node.js APIs and writes this directory. It contains the explicit
musical score, deterministic additive mallet synthesis, PCM export, FFT analysis,
assertions, and checksum manifest. Repeated runs on the same Node/platform produce
identical bytes. No timestamp or random component is included in the assets.

## Playback contract

- study.wav: 7.4 seconds; the spectral visualization must refer to this file.
- context-a.wav and context-b.wav: 3.0 seconds each; C-major and A-minor lead-ins.
- target.wav: 1.4 seconds; a shared A4/E5 open fifth, exactly the same file in both
  conditions. Schedule each context at t = 0 and target at t = 3.08 seconds using
  one AudioContext clock. The 80 ms gap is a design choice, not a validated protocol.
- continuation-a/b/c.wav: 1.8 seconds each; three authored possible endings.
  These are examples, not model-generated continuations or ranked probabilities.
- Every WAV is mono, 24,000 Hz, 16-bit signed PCM. Start/end samples are zero.
- No automatic playback. Preserve a visible stop/mute control and a silent path.

The contexts differ in voicing, pitch content and implied tonal center. The
activity illustrates a question about listening in context; it is not a controlled
experiment, a guaranteed perceptual effect, or a claim that every listener hears a
difference. Do not collect or present responses as research observations by default.

## Spectral data

spectral.json is calculated from study.wav's actual exported 16-bit PCM bytes,
decoded with divisor 32768. It has 174 frames and 64 logarithmic
band centers from 80 to 8000 Hz. A centered 2048-sample symmetric Hann window and
1024-sample hop give an 85.333 ms window and 42.667 ms frame interval. Data outside
the file is zero padded; frame time is the window center.

FFT bins are scaled by 2 / sum(Hann window) to give coherent-gain-corrected
single-sided amplitude. Each display band uses its largest available bin amplitude.
Bands narrower than the 11.71875 Hz FFT bin spacing use the nearest bin, so some
low-frequency bands share bins. The JSON records those bins explicitly.

Values are normalized 0..1 from a fixed -60..0 dBFS range. Decode with:
`dBFS = value * 60 - 60`. Reference amplitude is 1.0 in normalized PCM (full-scale
sinusoidal peak amplitude). There is no per-frame normalization or invented energy.
Values below -60 dBFS are zero and values are rounded to four decimals. This is a
windowed estimate of acoustic frequency content, not a neural measurement.

The optional rmsEnvelope uses the same centered window, without Hann weighting,
and stores linear PCM RMS amplitude. Geometry may use these values as input, but
any additional rotation, extrusion, perspective or idle motion is artistic.

## Verification

The generator checks FFT amplitude against a known exact-bin sinusoid; WAV headers,
duration, nonzero content, zero endpoints, finite values and peak headroom; spectral
range, dimensions and frame limit. manifest.json records file byte lengths, SHA-256,
durations, peak and RMS. spectral.json includes the exact source WAV checksum.
Listening and browser/device QA are separate from these numeric assertions.
