← Home / Imperator EQ

Imperator EQ

Taps the sound your Mac sends to its current output, runs it through a 10-band equaliser and volume/balance controls, and plays the result back on that same output.

LiveMIT Licensev1.1.1Updated 2026-09-26

README.md

// Overview

A system-wide 10-band parametric equaliser for macOS, living in the menu bar. macOS has no built-in EQ for system output, so Imperator EQ adds one: it takes the sound apps send to your current output, runs it through an equaliser, and plays the result on that same output. No driver, no per-app setup.

10 EQ bands from 32 Hz to 16 kHz at plus or minus 12 dB each, volume boost up to 200%, left/right balance, and named presets you can save, rename, reorder and delete. The output picker is the same list as the Sound menu, and sound effects move along with it. No Dock icon, and it can open at login.

Requires macOS 14.2 or later, Apple silicon or Intel. Built and tested on macOS 27 only — older versions are expected to work but have not been verified.

Install at your own risk. The app is not notarized and carries no Apple Developer signature, so macOS cannot vouch for it. It is provided as is, with no warranty, under the MIT license.

// Install

Download the zip from Releases, unzip, and move Imperator EQ.app to /Applications.

The app is ad-hoc signed, with no Apple Developer ID, so Gatekeeper blocks the first launch. Right-click the app and choose Open, then confirm. If macOS still refuses, clear the quarantine flag:

xattr -dr com.apple.quarantine "/Applications/Imperator EQ.app"

The app installs nothing else and never asks for an administrator password.

// Permissions

System audio recording. To process what your Mac plays, the app has to read it first, and macOS asks before it lets any app do that. The prompt appears the first time the switch in the panel is turned on. The app records nothing and keeps no audio: the sound goes through the equaliser and straight back out, and it never opens the microphone.

While the switch is on, macOS shows its recording indicator for the app in the menu bar and lists it in Control Center, because reading what the Mac plays counts as recording system audio. Turn the switch off and the indicator goes away. Denying the permission leaves the panel saying it is waiting, with a button straight to System Settings > Privacy & Security > Screen & System Audio Recording.

// Use

Click the waveform icon in the menu bar to open the panel. The switch in the header turns processing on and off. Drag the band sliders to shape the sound, or pick a preset; the sound changes while you drag. Reset returns every band to flat. The output list sets the Mac's sound output, the same setting as the Sound menu, and the EQ follows it. Open at Login starts the app with the Mac.

The panel is drawn by the app, not by NSPopover. macOS 27 draws its own menu bar panels as plain rounded rectangles with no arrow and no open or close animation, and NSPopover draws neither that shape nor that corner and offers no way to set one.

// How it works

The app uses a Core Audio process tap, the API macOS 14.2 added for reading other apps' audio. The tap sits on the current output device and takes everything apps send to it, except the app's own sound. The app reads the tap through a private aggregate device whose only other member is that same output, runs each block through Apple's AUNBandEQ Audio Unit, applies volume and balance, and writes the result back to the output.

The system output never changes: volume keys and the Sound menu work on the real device, exactly as without the app. Apps are muted only while the app reads the tap, so quitting it, turning the switch off, or a crash all return apps to playing directly at once, with nothing left behind. When the default output changes, for example when headphones connect, the app rebuilds the tap on the new device, retrying if it refuses at first. The app adds about 16 ms of latency between an app and the speaker.

// Build

bash build.sh

Runs a universal release build, assembles Imperator EQ.app, signs it, and copies it to /Applications. Signing is not optional: Gatekeeper blocks an unsigned bundle.

The build stamps the binary with the current SDK while keeping the deployment target at macOS 14.2, because AppKit picks which generation of controls to draw from that stamp rather than from the macOS actually running it. Signing uses the stable Imperator Dev certificate rather than ad-hoc, since an ad-hoc signature's designated requirement changes on every build and would drop the system audio recording permission on each update.

// Release

Bumps Info.plist, builds, zips, commits, tags and publishes a GitHub release with the zip attached. Tags are plain semver; the release title carries the app name.

// Known limits

The EQ runs on the first two channels; an output with more passes the rest through at the same volume without EQ. Some outputs, like another aggregate device, cannot join an aggregate device at all, and on those the EQ does not run and the panel says so. Headsets, Bluetooth outputs, sleep and wake have not been tested yet. The output device keeps running while the switch is on even when nothing plays, which costs some battery.

// Third-party

None. The app uses Apple frameworks only.