No Description

Benjamin Harris 3aad94dc6c STIPA analyser 1 month ago
.claude 1405d22685 STIPA modulation 1 month ago
src 3aad94dc6c STIPA analyser 1 month ago
.dockerignore 49e6c08d27 Docker FIx 1 month ago
.gitignore 1405d22685 STIPA modulation 1 month ago
CLAUDE.md 1405d22685 STIPA modulation 1 month ago
Dockerfile eec3798a1a Docker Fix 1 month ago
README.md e10dac2a24 First Build 1 month ago
church-acoustic-suite.jsx e10dac2a24 First Build 1 month ago
docker-compose.yml e10dac2a24 First Build 1 month ago
index.html e10dac2a24 First Build 1 month ago
nginx.conf e10dac2a24 First Build 1 month ago
package.json e10dac2a24 First Build 1 month ago
vite.config.js e10dac2a24 First Build 1 month ago

README.md

Church Acoustic Suite

A purpose-built acoustic analysis tool for PBCC Universal Hall distributed speaker systems. Models the MS6 ceiling speaker layout, Haas window compliance, and off-axis coverage — then connects to Room EQ Wizard (REW) for live measurement analysis via a local LLM (Ollama) or Claude API.

What it does

  • Hall geometry engine — models the dished floor (bowl), flat ceiling, and all seating rows including corner zones; computes floor rise, ear-to-ceiling clearance, and absolute heights per row
  • Coverage analysis — slant distance, propagation delay, Haas window status, off-axis angle, and estimated SPL at ear for every speaker ring × seating row combination
  • Flutter echo analysis — calculates flutter fundamental frequencies and harmonics across the hall; flags speech-band risk zones
  • REW integration — connects to REW's local API (port 4735) to fetch frequency response and measurement data
  • AI analysis — sends geometry + coverage + REW data to Ollama (local) or Anthropic Claude for actionable acoustic recommendations tuned to this hall type

Prerequisites

  • Room EQ Wizard with API server enabled (REW API docs)
  • Ollama (recommended) or an Anthropic API key
  • Docker (recommended) — or Node.js ≥ 18 for local development

Docker (recommended)

The easiest way to run the app. Docker handles the Node.js build inside the container — no local Node.js required.

# Build and start (runs tests during build)
docker compose up --build

# Open in browser
# http://localhost:3000

REW (port 4735) and Ollama (port 11434) are called from your browser, not the container, so they reach your local machine as normal localhost addresses.

To stop:

docker compose down

Local development (Node.js)

npm install

# Development server with hot reload
npm run dev

# Run tests
npm test

# Run tests once (CI)
npm run test:run

# Test coverage report
npm run test:coverage

# Production build
npm run build

REW setup

  1. Open REW → Preferences → API and enable the API server (default port 4735)
  2. Alternatively launch REW with the -api flag
  3. The app connects to http://127.0.0.1:4735 by default — change in Settings if needed
  4. REW's API is localhost-only by design; the app and REW must run on the same machine

Ollama setup

Ollama requires CORS to be enabled for the browser to reach it:

OLLAMA_ORIGINS=* ollama serve

Pull a model before starting (examples):

ollama pull llama3.2
ollama pull mistral
ollama pull qwen2.5

The Settings tab lets you configure the host, port, and fetch available models dynamically.

Hall geometry

The geometry engine models the confirmed PBCC Universal Hall (8-row) dimensions:

Parameter Value Source
Seating plan 20,914 × 20,914 mm SK-303 drawing
Row 1 front edge 2,210 mm from centre SK-303
Row pitch (FFL–FFL) 883 mm SK-303
Row 8 back face 8,411 mm SK-303
Back aisle 2,046 mm Derived: 10,457 − 8,411
Corner rows 4 rows, 883 mm pitch Site survey
Ceiling FLAT at 4,300 mm above centre datum Survey
Floor at centre 0 mm (lowest point, communion table) Survey
Floor at row 8 back +700 mm (dish rise) Survey: 4,300 − 3,600 = 700
Floor-to-ceiling at row 8 3,600 mm Confirmed survey
Corner zone ceiling 2,950 mm floor-to-ceiling (structural drop) Survey

Key rule: The ceiling is a single flat horizontal plane. The floor rises (dished bowl) from 0 mm at the communion table zone outward to 700 mm at row 8. Floor-to-ceiling clearance therefore decreases toward the perimeter.

Speaker layout

All speakers are flush-mounted in the 600 mm × 600 mm acoustic ceiling tile grid (no drop rods). Power settings per Dudley Wilkin's 2010 Aberdeen 8-row hall proposal:

Ring Count Radius Power Coverage target
Centre 1 0 mm 6 W Rows 1–3
Inner ring 8 5,720 mm 8 W Rows 4–7
Outer ring 8 8,600 mm 4 W Row 8 + back aisle
Corner 8 (2 per corner) 10,310 mm 4 W Corner seating

MS6 speaker

The MS6 is a two-driver ceiling speaker designed by Dudley Wilkin for this hall type:

  • LF driver: Visaton FRS8M — 8 Ω, 30 W, 88 dB/1 W/1 m, response 100 Hz–20 kHz
  • HF driver: Visaton G20SC — 8 Ω, 20 mm soft dome, 88 dB/1 W/1 m, response 1,200 Hz–30 kHz
  • Crossover: MIDAS MR12 active crossover — LF cut at 2,792 Hz, HF starts at 3,225 Hz
  • Gap: 433 Hz gap centred at 3 kHz (less than 1/5 octave — inaudible)
  • Purpose of gap: Eliminates horizontal interference lobes that conventional crossovers produce at the 2–5 kHz consonant frequencies (P, T, F, S) critical for speech intelligibility
  • Coverage: 55° off-axis — near-perfect circular polar response at both 30° and 55°

Signal chain: Mono mix → MIDAS MR12 Ch1 (TEQ room EQ) → Bus 1/2 → AUX1 LF amp + AUX2 HF amp → 100 V line → transformers → speakers

Anti-phasing

Adjacent speaker segments are wired in anti-phase. This creates acoustic null lines along aisle centrelines, so each listener receives sound from only one speaker. This is the primary intelligibility mechanism — it dramatically improves gain-before-feedback and removes inter-speaker comb filtering.

Measurement note: When setting EQ, select the main ring with anti-phase enabled and disconnect the centre speaker. A microphone placed under any main ring speaker will then pick up only that speaker. (Dudley Wilkin — GEQ setup method, September 2014)

EQ setup procedure (summary)

Full method: Dudley Wilkin, September 2014

  1. Only one speaker active — main ring with anti-phase, centre disconnected
  2. Mic at 1,000 mm on-axis below the speaker
  3. Set all tone controls and EQ to flat
  4. Coarse: pink noise through system, TrueRTA at 1/3-octave, adjust EQ to flat
  5. Fine: frequency scan in TrueRTA at 1/24-octave, remove peaks, fill troughs
  6. Save and photograph all settings — never adjust EQ by ear
  7. Adjust tone controls by voice: reduce treble to tame "S" sibilance, minimal bass for natural sound

Measurement protocol

Only impulse-based measurement is valid for this speaker system. Continuous sound (pink noise, SLM readings) is invalid because:

  • Each speaker covers only one zone (anti-phase nulls elsewhere)
  • A standard SLM picks up all speakers simultaneously — the result is meaningless
  • RT60 is only valid when measured through the live system with all speakers operating

Use REW or ARTA with an impulse window. The minimum measurement window required is 10 ms — this requires sufficient ceiling clearance (at minimum 2,000 mm microphone distance from the speaker).

Reference: Dudley Wilkin — "Loudspeaker Positions and Continuous Sound"

Haas window

Status Delay beyond primary Meaning
Primary 0 ms Nearest speaker to this row
OK 0–10 ms Acceptable — fused with primary
Warn 10–30 ms Colouration risk
Danger > 30 ms Distinct echo — intelligibility impact

Project structure

church-acoustic-suite/
├── src/
│   ├── main.jsx               # React entry point
│   ├── App.jsx                # All tabs and UI components
│   ├── geometry.js            # Pure acoustic geometry functions (testable)
│   ├── constants.js           # Hall defaults, speaker defaults, settings defaults
│   ├── palette.js             # Dark-theme colour constants
│   └── __tests__/
│       └── geometry.test.js   # 35+ unit and integration tests
├── documents/                 # Reference documents (Dudley Wilkin)
├── church-acoustic-suite.jsx  # Original monolithic prototype (reference)
├── index.html
├── vite.config.js
├── package.json
└── CLAUDE.md                  # Codebase reference for AI assistants

Background

This tool is informed by 40+ years of acoustic engineering documentation for the PBCC Universal Hall format by Dudley Wilkin, covering:

  • Speaker system evolution (1970s corner columns → 1982 ceiling ring → 1986 anti-phasing → 2010 MS6 layout)
  • The MS6 crossover innovation eliminating horizontal interference lobes
  • The Perth UK trial confirming the centre speaker alone covers rows 1–6
  • The case against continuous-sound measurement methods for this hall type