mynameisdeleted 2420f6edb1 docs: Simplify README and highlight key improvements over upstream DSP chains
Refactored the README to provide a clearer overview of the custom PipeWire DSP graph for MacBook Pro 15,1 speakers. Removed detailed technical explanations and prior art discussions, focusing instead on concise documentation of the key improvements: warm voicing, multiband dynamics, FIR correction, and driver safety features. This makes the documentation more accessible while preserving essential information about the non-driver nature of the solution and its advantages over upstream configurations.
2026-08-29 09:54:18 -04:00

MacBook Pro 15,1 — Custom Speaker DSP Graph

A high-performance PipeWire filter-chain audio DSP graph for the built-in speakers of the MacBook Pro 15,1 (2018/2019 Intel T2) running Linux (t2linux).

Note

Not a kernel driver. This graph connects to WirePlumber's hidden alsa_output.platform-sound.RawSpeakers sink, delivering Apple-grade warm voicing, multiband dynamic control, driver crossover, FIR correction, and hard driver safety backstops.


⚡ Key Improvements Over Upstream

Upstream graphs (asahi-audio / t2-apple-audio-dsp) target a measurement-flat response that can sound thin, treble-heavy, and distort at high volumes due to missing driver limiters.

Issue in Upstream Solution in This Graph Result
Thin / Cold Sound +3 dB/octave equal-energy warm voicing curve Rich, warm, balanced audio at all volumes
Distortion at High Volume Post-FIR driver limiters (wlim & tlim) Clean output at 100% volume without amp clipping
Woofer Over-Excursion 60 Hz high-pass + 8-band multiband compressor Cone doesn't bottom out on heavy bass beats
No Deep Sub-Bass Psychoacoustic sub-bass (virtualbass via Bankstown) Extended perceived low-end without physical strain
Fixed EQ Isolated 8-band user_eq preference node Custom tone presets that survive git updates

🎛️ Signal Processing Chain

The signal flows through tone controls, dynamic management, ISO-226 loudness tracking, FIR driver correction, and physical driver protection limiters:

flowchart LR
    classDef input fill:#2d3748,stroke:#4a5568,color:#fff;
    classDef eq fill:#2b6cb0,stroke:#3182ce,color:#fff;
    classDef dynamics fill:#d69e2e,stroke:#d69e2e,color:#000;
    classDef fir fill:#805ad5,stroke:#9f7aea,color:#fff;
    classDef limiter fill:#c53030,stroke:#e53e3e,color:#fff;

    In["🔊 Audio Input"] :::input --> UserEQ["🎚️ user_eq<br/>(8-Band Prefs)"] :::eq
    UserEQ --> EQ["🎼 Voicing EQ<br/>(+3dB/oct Warmth & HPF @ 60Hz)"] :::eq
    EQ --> VB["🔊 virtualbass<br/>(Bankstown Sub-Harmonics)"] :::dynamics
    VB --> MBComp["📊 multiband_compressor<br/>(8-Band LSP Peak Control)"] :::dynamics
    MBComp --> Limiter["🛡️ limiter<br/>(Broadband Lookahead)"] :::limiter
    Limiter --> LoudComp["👂 ell / elr<br/>(ISO-226 Loudness Comp)"] :::dynamics

    LoudComp --> Copy["🔀 Split L/R"] :::input

    Copy --> ConvLT["🔊 Tweeter FIR L<br/>(convLT)"] :::fir
    Copy --> ConvRT["🔊 Tweeter FIR R<br/>(convRT)"] :::fir
    Copy --> ConvLW["🔊 Woofer FIR L<br/>(convLW)"] :::fir
    Copy --> ConvRW["🔊 Woofer FIR R<br/>(convRW)"] :::fir

    ConvLT --> TLim["🛡️ tlim (-1dB)<br/>(Tweeter Limiter)"] :::limiter
    ConvRT --> TLim
    ConvLW --> WLim["🛡️ wlim (-2dB)<br/>(Woofer Limiter)"] :::limiter
    ConvRW --> WLim

    TLim --> Out["🔈 RawSpeakers Sink"] :::input
    WLim --> Out

🚀 Quick Start

1. Install Dependencies

Installs required LSP & SWH plugins via your distro package manager (dnf, pacman, apt, zypper) and builds Bankstown from source:

./install-deps.sh

2. Apply Graph

Preflights FIR paths and plugin URIs, builds the effective graph, copies it to WirePlumber, and reloads:

./apply.sh

Tip

Ensure the "MacBook Pro 15,1 DSP Speakers" sink is selected in your desktop sound settings.


🎚️ Sound Profiles & User EQ

Customize tone settings without modifying calibrated internal DSP stages. user_eq sits at the front of the chain, meaning even aggressive boosts are safely governed by the multiband compressor and limiters.

Quick Preset Application

  1. Copy the example override file:
    cp user_eq.example.json user_eq.json
    
  2. Edit user_eq.json with desired linear gain values (g_0 through g_7) and apply:
    ./apply.sh
    
Preset 70 Hz (g_0) 110 Hz (g_1) 220 Hz (g_2) 450 Hz (g_3) 1 kHz (g_4) 2.5 kHz (g_5) 6 kHz (g_6) 10 kHz (g_7)
Reference (Flat) 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
Rock / Pop 1.00 1.26 1.00 0.94 1.00 1.12 1.19 1.12
Classical / Acoustic 1.00 1.00 1.06 1.00 1.00 1.00 1.12 1.12
Electronic / Hip-Hop 1.26 1.19 1.00 0.94 1.00 1.00 1.06 1.00
Movie (Dialogue Focus) 0.84 0.94 1.00 1.06 1.19 1.19 1.06 1.00
Movie (Action / Bass) 1.41 1.12 1.00 1.00 1.00 1.06 1.12 1.12
Late-Night (Low Level) 0.63 0.79 1.00 1.00 1.06 1.12 1.00 0.94

(Linear values: 1.0 = 0 dB, 1.41 ≈ +3 dB, 0.71 ≈ -3 dB)


🛠️ Quick Tuning Reference

If your physical hardware unit needs custom dynamic tuning:

  • Woofer Ceiling: Edit wlim.control.limit in graph.json (Default: -2 dB. Lower to -3 / -4 dB for stricter mechanical limiting).
  • Overall Bass Punch: Adjust equalizer.control (g_1 through g_5).
  • Sub-Bass Harmonics: Adjust virtualbass.control.amt (Default: 1.0).

📚 Documentation Index

  • 📖 INSTALL.md — Comprehensive installation guide, system prerequisites, package manager details, and troubleshooting.
  • 🎓 README.advanced.md — Complete electroacoustic design rationale, magnitude-vs-power analysis, gain staging equations, issue tracebacks, and exhaustive parameter tables.
  • 📊 mb-compressor-params.md — Port-by-port reference for the 8-band LSP multiband compressor.

🔄 Reverting to Stock

To return to the stock PipeWire graph provided by t2-apple-audio-dsp:

sudo cp /path/to/t2-apple-audio-dsp/configs/15_1/graph.json \
        /usr/share/t2-linux-audio/15_1/graph.json
systemctl --user restart wireplumber
Description
No description provided
Readme 882 KiB
Languages
Python 77.4%
Shell 22.6%