# Static outdoor audio and two-stroke verification Verified on Linux in Release mode, 2026-10-23. The target remains fluid-derived sound at 44.1 kHz. No synthetic bang, saturation, or combustion event is added by the audio renderer. Acoustic processing does not feed energy into the solver. ## Renderer `OutdoorAudio` replaces the active twin and two-stroke legacy reverb paths. Each intake/exhaust mass-flow derivative drives a compact monopole. Separate left/right paths use inverse distance and fractional-sample delays at 343 m/s. The listener and sources are static. Default listener position is (1.6, 1, 2) m; intake is (-0.2, .7, 0), exhaust (.55, .5, 0), ground y=0, wall x=-1.5. Ground and wall reflection coefficients are .35 and .65. These are configurable assumptions rather than measurements of a particular location. A second-order 6 kHz monitoring low-pass reduces sharp acquisition transients; it is linear and does not create afterfire. Early ground/wall reflections use image paths. Woodland uses six approximate scatterers. A stable four-line feedback-delay network supplies an empirical diffuse tail; it does not solve outdoor wave propagation or vegetation scattering. Scene changes smooth over 20 ms. The old `OutdoorExhaustReverb` remains for legacy tests but is inactive in both engine scenarios. Pipe-end radiation impedance, calibrated directivity, alias-free acquisition, and exhaust afterfire chemistry remain unresolved. PCM output is not calibrated speaker SPL. The monitoring filter cannot recover information lost to aliasing. ## Measured captures Four seconds at full pedal, wall environment, 44.1 kHz stereo. Each row's raw and rendered signals come from the same simulation run. Measurements are before PCM clipping; the raw signal includes direct spatial propagation. | Engine | Raw maximum adjacent-sample change | Rendered change | Rendered peak | Clipping samples | | --- | ---: | ---: | ---: | ---: | | Twin | .569144 | .0881295 | .119947 | 0 | | Two-stroke | .412956 | .138741 | .390789 | 0 | These measurements establish transient reduction, not a subjective judgment that limiter events sound like realistic bangs. Listening on the target audio device is still required. Reproduce from the repository root: ```sh cmake --build build-audit --target fluidsim_audio_capture -j 4 ./build-audit/fluidsim_audio_capture --scenario twin --out build/audio/twin-wall --seconds 4 --throttle 1 --scene wall ./build-audit/fluidsim_audio_capture --scenario two-stroke --out build/audio/two-stroke-wall --seconds 4 --throttle 1 --scene wall ``` Each produces `-rendered.wav`, `-dry.wav` (filtered direct paths) and `-unfiltered.wav` for comparison. Capture files are build artifacts. ## Two-stroke and regression checks The existing 125 cc geometry now uses the shared ECU and finite-response throttle, fuel dosing after the last scavenging port closes, 3000 RPM idle control with ignition trim, and a dynamic damped cantilever reed with contacts. Cylinder/crankcase geometry work uses adiabatic energy differences. An active charge finishes combustion when a fuel cut begins. Ignition event crossing handles wraparound without spuriously firing retarded ignition at zero degrees. Reed parameters, combustion, scavenging and controller calibrations have not been validated against a measured engine. Both desktop engines share `MotorcycleTest` for clutch/vehicle integration, common control dispatch and a common dashboard/dyno renderer. The two-stroke limiter is disabled explicitly in the ECU and cylinder; the twin limiter is unchanged. Idle and overrun controls remain enabled. The motorcycle and gearing reuse the existing twin test configuration, not a measured 125 cc motorcycle. The rolling peak dyno reports crank power and torque versus RPM. All five CTest suites passed: basic physics/control, fluid boundary validation, intake regression, outdoor audio, and two-stroke regression. Audio tests cover fractional direct arrival, image reflection arrival, stereo ordering, distance gain, linearity, filtering, causal decaying tails, and reed static compliance and seating. The two-stroke sequence idles for two seconds, holds .6 pedal for four, then releases for eight. It checks fuel stays enabled at open pedal above the old limit, reed opening/seating, positive states, finite audio and idle recovery, with no pipe positivity repairs. It then launches the motorcycle for six seconds and checks shifting, neutral and positive dyno power/torque. Latest Release results: free-rev maximum 22471.3 RPM, recovered idle 3236.08 RPM, free-rev audio peak .512784, motorcycle speed 51.3773 km/h after launch. The high unloaded RPM exposes the uncalibrated high-speed friction/combustion behavior; removing the limiter does not validate this as realistic engine performance. Unit checks also verify disabling an already latched limiter restores fueling. The earlier four-second capture table above predates limiter removal and is retained as an audio-renderer measurement, not a current engine baseline. Windows execution of the latest changes is pending. ## Reference basis - [Image source geometry](https://www.acs.psu.edu/noahparker/acs/img-src/img-src.html) - [Feedback delay networks](https://msp.ucsd.edu/techniques/latest/book-html/node111.html) - [Beam theory](https://mechanics.ju.se/SolidMechanics/BeamTheory.html), including uniform-load cantilever deflection used for reed compliance. The later YZ125 baseline changes these engine calibrations and measurements; see [YZ125 baseline verification](YZ125_BASELINE.md) for current results.