e↗entertrainment
← All project stories
Creative tools / PROJECT STORY

SonicReassurance

An exploration of audiovisual expression and sensory experience. The profile separates implemented software from the ideas that motivate it.

Research concept / prototype8 MIN READDEVELOPMENT ARCHIVE · OCT 2026
PROJECT REVIEW · 18 October 2026

Inside the project

Prepared with the project’s development agent from source and retained evidence. This is a project-owner assessment, not an independent customer review. Dated checks were not rerun for this website.

A calm, real-time sound-to-light surface: it turns nearby sound into a consistent, time-locked dot field so unpredictable ambient sound reads as anticipated rather than startling. Strongest working capability is the fully on-device pipeline (low-latency mic tap, hand-written FFT, envelope/onset analysis, 60fps SwiftUI dot field) with four arousal profiles, live sensitivity and zero networking. Now one codebase across iPhone, iPad and Mac. Limits: single visual mode, settings not persisted, no automated tests, not runtime-verified on device or released.

What stands out

  • End-to-end on-device DSP->visual pipeline at 60fps
  • Dependency-free: Apple frameworks + custom radix-2 FFT (no Accelerate, no SPM/third-party)
  • Strong privacy posture: no networking, clean PrivacyInfo.xcprivacy
  • Consistent, predictable sound->visual mapping (the core accessibility idea)
  • Four sensory profiles + live sensitivity/movement for sensitivity tuning
  • Single multiplatform target building green on iOS and macOS

Current limits

  • Only one visual mode (dot field) ships
  • VisualSettings is in-memory; resets on relaunch (no persistence code)
  • No automated tests or test target
  • Not verified running on a physical device; no public release
  • Not zero-latency (hardware/OS buffers; mitigated by 5ms IO + 256-frame tap)
  • Stereo direction needs >=2 input channels, else centred
  • README still documents iOS/iPad only despite macOS target

Features & evidence

Dot-field sound surface

source

23x31 dot field rendered in a 60fps SwiftUI Canvas; combines broad Gaussian pressure, mid-energy clustering, high-energy shimmer and an expanding transient ring

Recorded evidence

SonicDotFieldView.swift; built via xcodebuild iOS+macOS 2026-07-13; on-device runtime unverified

Audio feature extraction

source

RMS->dB level, fast/slow envelope onset, transient decay, 1024-pt Hann FFT into 3 bands, stability, stereo direction

Recorded evidence

AudioFeatureExtractor.swift; compiles in built target; no unit tests

Custom radix-2 FFT

source

Hand-written iterative radix-2 FFT with bit-reversal + precomputed tables, no Accelerate

Recorded evidence

Radix2FFT.swift; no unit tests

Sensory profiles

source

Still/Soft/Responsive/Expressive presets tuning opacity, radius, motion, spectral and transient gain

Recorded evidence

SensoryProfile.swift

Live settings

source

Sensitivity 0.35-1.8, surface movement 0-1.5, toggles for direction/status/auto-start

Recorded evidence

VisualSettings.swift + SettingsView.swift; in-memory only, not persisted

Interaction + status

source

Tap to pause/resume, long-press 0.45s for settings, LIVE/PAUSED pill, scenePhase start/stop

Recorded evidence

RootView.swift

Cross-platform build

source

Single multiplatform SwiftUI target for iOS 17+, iPadOS and native macOS 14+ (non-Catalyst); macOS entitlements app-sandbox + audio-input

Recorded evidence

project.yml, SonicReassurance.entitlements; BUILD SUCCEEDED both platforms 2026-07-13

On-device privacy

source

All analysis local; no networking; privacy manifest declares no tracking/collection

Recorded evidence

PrivacyInfo.xcprivacy; absence of any networking code

Review updates & corrections
  • No source changes since the 2026-10-17 biography; code state identical and no edits were made.
  • Build evidence unchanged: iOS + macOS BUILD SUCCEEDED 2026-07-13, not re-run today.
  • This packet reframes the verified state as an owner review with a feature-state table and a demo plan.

Workflow walkthrough

A guide to the native workflow. These steps describe the app; only the recordings and images embedded on this page are available as website demonstrations.

  1. Open the app and grant microphone access; the dot field wakes
  2. Stay quiet to see the settled, low-arousal resting field
  3. Clap once to fire a single expanding pressure ring
  4. Play a low bass sound to see the broad central swell
  5. Long-press to open settings and switch Still -> Expressive to show the motion/contrast range
Planned captures · not yet available
  • At rest: a quiet, settled surface (Soft profile)
  • One sound, one calm ring (onset)
  • Bass broadens the field (low-frequency swell)
  • Settings: pick a profile, tune sensitivity
  • Still vs Expressive side by side
  • 10-20s screen recording of speech driving the field
  • Optional web re-creation of the dot field (browser prototype explored in-session; no committed asset)

Development biography · earlier archive

Development profile compiled from project source and retained records in October 2026. Dates and test results describe those records; they do not imply a new build, live acceptance test or public release.

_Source-backed, read-only. Scope: the project archive Delivered inline ._

Biography

Sonic Reassurance (product name "MAUMAU") is a small, sharply-focused SwiftUI application that listens to the microphone and renders nearby sound as a restrained halftone field of dots. It is deliberately not a music visualizer in the usual sense — its design intent is the opposite of spectacle. Where a visualizer adds richness and surprise, this adds legibility: it gives a live sound a second, time-locked, predictable sensory channel, so the event can be coded as one benign thing rather than an ambient surprise to scan for. The README bounds the claim honestly — "an accessibility-oriented interface prototype, not a diagnostic or medical device" — which is the right posture for something aimed at people who find unpredictable soundscapes disorienting (for example some autistic or sensory-sensitive users).

The mapping from sound to image is intentionally simple and consistent, because predictability is the therapeutic idea. Loudness drives local dot size and a broad "surface pressure"; a sound onset fires a single expanding pressure ring; low frequencies cause broad swelling, mid frequencies clustered movement, high frequencies a fine shimmer; stereo balance shifts the field's centre to approximate horizontal direction; a stability measure settles the motion when a soundscape is steady; and everything decays gently back to equilibrium when sound stops . The same sound feature always maps to the same visual feature — that fixed grammar is what makes the surface reassuring rather than agitating.

Under the hood it is a clean, dependency-free DSP + SwiftUI pipeline across 13 Swift files (~900 LOC). MicrophoneAudioAnalyzer installs an AVAudioEngine input tap (256-frame buffer, 5 ms preferred I/O buffer on iOS) on a userInteractive queue and streams buffers to AudioFeatureExtractor. The extractor downmixes to mono, computes an RMS→dB→normalised level, runs fast/slow envelope followers (0.52 / 0.055 coefficients) whose difference yields onset detection, tracks transient strength and age with exponential decay, and applies an asymmetric attack envelope (0.40 rising / 0.085 falling). Every half-window it runs a 1024-point Hann-windowed FFT, split into three dB-normalised bands (low 40–250 Hz, mid 250 Hz–4 kHz, high 4 kHz–min(12 kHz, Nyquist·0.48)). Stability is 1 − 4.5·stddev over the last ~70 levels; direction is (R−L)/(R+L) from per-channel RMS. The FFT itself, Radix2FFT, is a hand-written iterative radix-2 transform with bit-reversal and precomputed sin/cos tables — notably with no Accelerate dependency, keeping the app self-contained and portable. Each cycle emits a SonicVisualFrame, a small Sendable/Equatable value type carrying level, transient, transientPhase, low/mid/highEnergy, direction and stability.

Rendering is a single SwiftUI Canvas inside a 60 fps TimelineView. SonicDotFieldView lays out a 23×31 dot grid and, per frame, superposes a broad Gaussian "pressure" (centred and nudged by direction plus idle drift), a clustered mid-energy sinusoid, a high-energy shimmer, and a Gaussian transient ring at an expanding radius — then maps the combined pressure to each dot's radius (0.9 up to the profile maximum) and opacity (capped at the profile maximum). Behaviour is shaped by four SensoryProfile presets — Still / Soft (default) / Responsive / Expressive — each a tuple of idleDrift, maximumOpacity, maximumRadius, transientGain, spectralGain, motionRate and responseGain. Still removes almost all idle motion; Expressive raises contrast and motion for creative use. VisualSettings exposes live sensitivity (0.35–1.8), surface movement (0–1.5), and toggles for direction, status text and auto-start.

Interaction is minimal by design: tap the surface to pause/resume listening, long-press (0.45 s) for settings, with a small LIVE/PAUSED pill top-right. The app auto-starts on launch and when returning to the foreground, and stops when backgrounded, returning the field to rest via a .silent frame. Privacy is a first-class property: PrivacyInfo.xcprivacy declares no tracking, no collected data types and no accessed-API reasons, and there is no networking code anywhere in the project — microphone audio is analysed entirely on-device and never leaves it. Originally an iPhone/iPad app, it was ported to a native (non-Catalyst) macOS build via one multiplatform target, so the same calm surface now runs on the Mac as a resizable window.

User journey: open the app → grant mic access → the field wakes and breathes with the room → tap to pause when wanted → long-press to pick a calmer (Still) or livelier (Expressive) profile and tune sensitivity → background the app and it quietly stops.

Modules / features (what a visitor can see, hear, try)

Authored functionality:

  • Live dot-field "sound surface" (23×31 grid, 60 fps) — the main thing you see; reacts to level, onset, bands, direction, stability, decay. (SonicDotFieldView)
  • Four sensory profiles Still/Soft/Responsive/Expressive — visibly change motion, contrast, dot size. (SensoryProfile)
  • Settings sheet — profile segmented picker; sensitivity slider (0.35–1.8); surface-movement slider (0–1.5); toggles for show-direction, show-status-text, auto-start. (SettingsView, VisualSettings)
  • Tap-to-pause/resume, long-press-for-settings, LIVE/PAUSED status pill. (RootView)
  • Accessibility value on the surface (quiet / moderate / strong). (SonicDotFieldView)
  • On-device feature extraction + hand-written FFT. (AudioFeatureExtractor, Radix2FFT)

Nothing audible is produced — it is sound-in, light-out (no audio playback feature). Dependencies: Apple frameworks only (SwiftUI, AVFoundation, CoreGraphics, Foundation). No third-party runtime libraries.

Technical foundations & local packages

  • Language/UI: Swift 5.0, SwiftUI (Canvas + TimelineView), CoreGraphics drawing.
  • Audio: AVFoundation (AVAudioEngine tap; AVCaptureDevice permission, unified across iOS/macOS; AVAudioSession on iOS only, guarded by #if os(iOS)).
  • DSP: first-party — envelope-follower onset detection, windowed-FFT band energies, custom Radix2FFT (no Accelerate).
  • Local/third-party packages: NONE. No Swift Package Manager dependencies, no CocoaPods/Carthage. The only external tool is XcodeGen (project.yml is the source of truth; supportedDestinations: [iOS, macOS], SDKROOT=auto).
  • Signing/privacy: macOS SonicReassurance.entitlements (app-sandbox + audio-input) via CODE_SIGN_ENTITLEMENTS[sdk=macosx*]; NSMicrophoneUsageDescription set; PrivacyInfo.xcprivacy clean.

Maturity by feature (dated evidence)

  • Source implemented: YES — 13 Swift files (~900 LOC); core authored ~2026-07-13 (file dates + merged export 2026-07-13T23:36).
  • macOS multiplatform port: YES — present on disk in project.yml/App (supportedDestinations, entitlements), dated 2026-07-13.
  • Tests passed: NONE — no test target or test files exist in the project.
  • Built: YES (prior agent session, 2026-07-13) — xcodebuild succeeded for both platform=macOS and generic/platform=iOS (BUILD SUCCEEDED). NOT re-run in this read-only pass.
  • Installed / runtime-on-device verified: UNKNOWN — no evidence the app was launched/run; README notes mic testing needs a physical device.
  • Released / deployed (App Store / public): UNKNOWN / none found — no release notes, CHANGELOG, TestFlight or store link in the repo. MARKETING_VERSION 1.0 in build settings only.

Roadmap, limitations, FAQs

Roadmap (planned, not built): additional visual modes beyond the dot field (e.g. brush-swell, ping-pong); persist VisualSettings across launches; a reduce-motion / high-contrast accessibility profile; update README to document macOS; capture real screenshots/demos.

Limitations: not zero-latency ; direction only meaningful with ≥2 input channels, else centred ; one visual mode only; settings not persisted; not a medical/diagnostic device ; no app icon/asset catalog; README still says iOS/iPad-only despite the macOS target.

FAQs:

  • Does my audio leave the device? No — all on-device; no networking code; PrivacyInfo.xcprivacy declares no collection/tracking.
  • Is it a medical or therapy tool? No — an accessibility-oriented interface prototype .
  • Which devices? iPhone, iPad (iOS 17+) and Mac (macOS 14+), one multiplatform build.
  • Do I need a special microphone? No; any built-in mic. Stereo direction needs ≥2 channels.
  • Can I make it calmer or livelier? Yes — choose a profile (Still→Expressive) and adjust sensitivity / surface movement.

Explore the connections.

Browse all project stories ↗