Resynthesis (teaching)
ambiscape resynth recreates a session's soundscape from layers of
basic synthesis models and renders the result as one self-contained
Web Audio page — no samples, no external resources, one HTML file you
can open anywhere or hand to students.
ambiscape resynth SESSION/ # writes SESSION/resynthesis/index.html
Needs a prior analyze run; it also reads whatever module JSONs exist
(tonality, modulation, spatial, summary) and degrades gracefully
when one is missing.
Why
The page is teaching material: a real place, decomposed into the four canonical building blocks of a synthesis course, with every starting value measured from the recording. Students toggle layers to hear how a soundscape is assembled, then drag sliders to exaggerate or delete each ingredient. Comparing two sessions' pages (say, a station and a train carriage) shows how few parameters carry a place's identity.
The four layers
| Layer | Synthesis model | Measured parameters |
|---|---|---|
| Bed | subtractive: white noise → per-octave peaking filters | 10th-percentile octave spectrum (the keynote as a filter curve) |
| Machine | additive: detuned oscillator pair per tonal line, shared AM LFO | tonal-track frequencies and prominences; micro-modulation rate and depth |
| Events | stochastic: Poisson-scheduled band-passed noise bursts; occasional pass-by swell | events/min, median event duration, spectral centroid, pass-by count/duration |
| Space | per-source panning + two cross-fed delays | diffuseness ψ (diffusion wet), azimuthal concentration R (panning spread) |
Recipe
The mapping lives in resynthesis/recipe.json (also embedded in the
page), produced by resynth.build_recipe(sess, F, analysis_dir). The
recipe is deliberately small and human-readable — it is the lesson:
a place, reduced to a couple of dozen numbers, remains recognizable.
from ambiscape import features, resynth
import ambiscape as asc
sess = asc.open_session("2026-07-28-Antwerpen-train-station")
F = features.load_features(features.extract_session(sess, "analysis/features"))
doc = resynth.run_session(sess, F, "2026-07-28-Antwerpen-train-station/analysis")