SOFTWARE • DSP • ARCHITECTURE
How LoudCheck is engineered.
A developer-level look at the architecture, signal-processing pipeline, measurement layer, validation engine and software principles behind LoudCheck.
CORE PRINCIPLE
Measure first. Interpret second.
LoudCheck is designed so that objective audio measurements are produced by deterministic algorithms before those measurements are interpreted by rules, findings and readiness logic.
ENGINEERING INDEX
Inside the system.
01
System architecture
How the PHP application, FastAPI service and analysis engine communicate.
02
Audio pipeline
The path from uploaded audio to a structured analysis result.
03
Measurement engine
Loudness, peak, dynamics, spectrum and channel analysis.
04
Rules & findings
How numerical measurements become explicit technical findings.
05
Testing
Reference signals, regression testing and edge-case validation.
06
Future architecture
Where ELTY Song Intelligence can extend the platform.
01 / ARCHITECTURE
System architecture
LoudCheck separates the web application from the computational audio-analysis service. The browser presents results; the analysis service is responsible for producing them.
PRESENTATION
LoudCheck Web UI
PHP • JavaScript • Tailwind
APPLICATION
PHP Application Layer
Authentication • upload handling • request forwarding
API
Python FastAPI Analysis Service
Audio processing • analysis orchestration • JSON response
Signal Analysis
PCM / channels
Measurement
LUFS / peaks / dynamics
Classification
content characteristics
DECISION
Validation & Readiness Engine
Findings • severity • readiness status
OUTPUT
Structured JSON
UI • reports • exports • future clients
DESIGN PRINCIPLE
The measurement layer should not depend on the presentation layer, and the presentation layer should not contain the logic that determines whether an audio signal passes a technical rule.
02 / PROCESSING PIPELINE
Audio processing pipeline
An uploaded file is processed through defined stages. Each stage has a specific responsibility instead of placing the entire analysis inside one monolithic function.
01
Decode
Convert source audio into an analysis-ready signal.
02
Validate
Check duration, sample rate, channels and signal validity.
03
Measure
Run independent signal-analysis modules.
04
Evaluate
Apply explicit rules to measured values.
05
Report
Serialize the result into structured JSON.
audio_file
│
▼
decode()
│
▼
validate_input()
│
▼
create_analysis_context()
│
├── loudness analysis
├── true-peak analysis
├── dynamic analysis
├── frequency analysis
└── channel / stereo analysis
│
▼
derive_metrics()
│
▼
classify_content()
│
▼
evaluate_rules()
│
▼
generate_findings()
│
▼
generate_readiness()
│
▼
serialize_json()
03 / MEASUREMENT ENGINE
Measurement engine
LoudCheck treats measurements as first-class software outputs. A measurement should have a defined input, algorithm, output and unit before it becomes part of a technical decision.
LOUDNESS
LUFS / loudness
Integrated and time-varying loudness measurements provide a quantitative description of programme loudness.
DYNAMICS
LRA / RMS / PLR
Multiple measurements describe loudness variation, signal energy and the relationship between peak level and perceived programme loudness.
PEAK
True peak
Peak analysis can account for inter-sample behaviour rather than relying exclusively on discrete sample peaks.
SPECTRUM
Frequency characteristics
Frequency-domain analysis provides measurable information about spectral distribution without requiring generative inference.
CHANNELS
Stereo / multichannel
Channel topology is retained where the analysis requires channel-aware processing.
CLASSIFICATION
Signal characteristics
Measured characteristics can be combined into deterministic content classes such as dense music or wide dynamic range.
MEASUREMENT ≠ INTERPRETATION
A value such as -12.4 LUFS is a measurement. A statement such as "the master may be too loud for the selected target" is an interpretation. LoudCheck keeps these concepts separate so the reasoning can be inspected.
04 / DETERMINISTIC DESIGN
Why the core measurement layer does not require AI.
Generative AI can be useful for explanation, assistance and higher-level interpretation. It is not necessary for calculating an objective numerical property of an audio signal when that property can be defined algorithmically.
SAME AUDIO INPUT
│
▼
┌─────────────────┐
│ Defined │
│ algorithm │
└────────┬────────┘
│
▼
NUMERIC RESULT
│
▼
┌─────────────────┐
│ Explicit rules │
└────────┬────────┘
│
▼
FINDING / STATUS
ENGINEERING PRINCIPLE
AI should not become the authority for an objective measurement.
If a result can be calculated from the signal using a defined mathematical or DSP procedure, that procedure should remain the authoritative measurement mechanism.
05 / MEASUREMENT CONTRACTS
Every measurement has a contract.
A useful engineering pattern is to treat every metric as a contract: defined input → defined algorithm → defined output → defined unit.
| Measurement | Input | Output | Unit | Deterministic |
|---|---|---|---|---|
| Integrated loudness | PCM samples / channel configuration | Programme loudness | LUFS | Yes |
| Short-term loudness | PCM signal blocks | Time-varying loudness | LUFS | Yes |
| Loudness range | Loudness blocks | Statistical range | LU | Yes |
| True peak | PCM samples | Estimated inter-sample peak | dBTP | Yes |
| RMS | PCM samples | Signal energy measure | dBFS | Yes |
| PLR | Loudness + peak | Peak/loudness relationship | dB | Yes |
| Frequency bands | PCM samples | Band characteristics | dB / relative | Yes |
| Stereo balance | Channel signals | Channel relationship | dB / ratio | Yes |
06 / MULTICHANNEL PROCESSING
Channel topology is part of the input.
Audio analysis cannot always treat a multichannel signal as if it were mono. Channel count and channel role can affect the measurement algorithm.
# Convenient, but not automatically equivalent to
# a channel-aware loudness measurement.
y_mono = np.mean(y, axis=0)
loudness = meter.integrated_loudness(y_mono)
PROBLEM
Transformation ≠ specification
Reducing channels to a mono average may be mathematically valid for a particular purpose, but it must not automatically be treated as equivalent to a channel-aware standards-based loudness measurement.
PRINCIPLE
Preserve channel information
When a measurement definition depends on channel configuration, LoudCheck should retain that information throughout the relevant analysis path.
For standards-based loudness work, the implementation and the applicable ITU-R BS.1770 revision should be explicitly identified. The current in-force recommendation is BS.1770-5.
View ITU-R BS.1770-5 →07 / RULES & FINDINGS
Rules are downstream from measurements.
A measurement should not directly become a user-facing warning. The rule engine evaluates the measurement against an explicit condition and creates a structured finding.
measurement
│
▼
┌─────────────────────────┐
│ Rule evaluation │
│ │
│ value < threshold ? │
│ value > threshold ? │
│ value within range ? │
└────────────┬────────────┘
│
▼
┌──────────────┐
│ Finding │
│ code │
│ severity │
│ message │
│ evidence │
└──────┬───────┘
│
▼
readiness engine
{
"code": "TRUE_PEAK_HIGH",
"severity": "high",
"metric": "true_peak_dbtp",
"value": -0.20,
"unit": "dBTP",
"rule_version": "1.0"
}
08 / READINESS ENGINE
Readiness is a derived decision.
Readiness should be generated from measurements and findings rather than calculated independently by the browser.
READY
No blocking findings
The analysed material satisfies the active technical rules without a blocking finding.
CONDITIONALLY READY
Review recommended
The material can proceed, but one or more findings require attention or review.
NOT READY
Blocking issue
One or more high-impact findings indicate that the material should be reviewed before release.
09 / JSON CONTRACT
Machine-readable output.
JSON provides the boundary between the analysis service and presentation clients. This allows the same analysis engine to support the current web interface and future clients without duplicating measurement logic.
{
"analysis": {
"engine": "LoudCheck",
"engine_version": "1.x.x",
"duration_seconds": 222.4,
"sample_rate": 48000,
"channels": 2
},
"measurements": {
"integrated_lufs": -14.2,
"lra_lu": 6.8,
"true_peak_dbtp": -1.1,
"rms_dbfs": -16.4,
"plr_db": 2.2
},
"classification": {
"content_type": "dense_music"
},
"findings": [],
"readiness": {
"status": "ready"
}
}
API BOUNDARY PRINCIPLE
The browser should consume analysis results. It should not need to know how LUFS, true peak or spectral measurements were calculated.
10 / TESTING & VALIDATION
Numerical output must be tested.
Audio analysis requires more than checking whether an HTTP endpoint returns status code 200. The numerical output itself must be validated.
UNIT TESTS
Test individual calculations.
Controlled signals and known mathematical relationships can validate individual measurement functions.
REFERENCE VECTORS
Compare against known material.
Reference audio with expected measurement ranges helps identify algorithmic regressions.
INTEGRATION
Test the complete path.
Verify the path from uploaded file through the FastAPI service to the final JSON response.
EDGE CASES
Test unusual inputs.
Silence, short files, mono, stereo, multichannel, high sample rates, clipping and unusual channel layouts should be deliberately tested.
def test_reference_loudness():
result = analyze("reference.wav")
assert result.integrated_lufs >= expected_min
assert result.integrated_lufs <= expected_max
REGRESSION PRINCIPLE
If a change to the analysis engine causes a known reference signal to produce a materially different result, that change should be treated as a measurement regression until the difference is understood.
11 / VERSIONING
Analysis must be traceable.
Audio measurements can depend on implementation details, dependencies and standards revisions. Analysis results should therefore identify the software and algorithm versions that generated them.
{
"engine": "LoudCheck",
"engine_version": "1.0.0",
"loudness_standard": "ITU-R BS.1770",
"loudness_revision": "BS.1770-5",
"ruleset_version": "1.0.0"
}
The version shown above is an architectural example. Production reports should contain the actual algorithm and dependency versions used by the deployed analysis engine.
12 / AI BOUNDARY
AI has a place. It is not the measurement layer.
LoudCheck does not need generative AI to calculate its core measurements. This is an architectural decision, not an omission.
AUTHORITATIVE
Deterministic layer
- DSP and mathematical calculations
- Standards-based measurement
- Thresholds and rules
- Findings and severity
- Readiness decisions
OPTIONAL
Intelligence layer
- Natural-language explanations
- Educational assistance
- Workflow assistance
- Higher-level interpretation
AUDIO
│
▼
┌───────────────────┐
│ DSP / MEASUREMENT │
└─────────┬─────────┘
│
AUTHORITATIVE
│
▼
┌───────────────────┐
│ RULES / FINDINGS │
└─────────┬─────────┘
│
▼
READINESS
│
├──────────────► REPORT
│
▼
OPTIONAL AI
EXPLANATION
13 / FUTURE ARCHITECTURE
ELTY Song Intelligence.
A future ELTY music product can extend this architecture without changing the authority of LoudCheck's measurement layer.
PRODUCT DIRECTION
Understand what is happening inside the song.
ELTY Song Intelligence could analyse tempo, key, structure, energy progression, spectral characteristics, instrumentation, arrangement density and other higher-level musical features.
INPUT
DAW / Audio File
ELTY SONG INTELLIGENCE
Feature Extraction & Analysis
Deterministic DSP
measurable features
Optional AI
explanation / interpretation
OUTPUT
Music Intelligence
The long-term principle is straightforward: use deterministic signal processing when the system needs to measure the audio, and use AI where probabilistic or natural-language reasoning provides additional value.
ENGINEERING POSITION
Make the result traceable.
The closer every user-facing conclusion remains to the signal, the measurement, the evidence and the rule that produced it, the easier the system becomes to test, explain and improve.
Signal → Measurement → Evidence → Finding → Decision