Skip to main content

Recreating the Kilohearts Formant Filter in Max for Live: Complete DSP Guide

Posted by: Darren
March 3, 2026

Ever wondered how professional audio plugins achieve their sound? This deep-dive tutorial reveals how to recreate the Kilohearts Formant Filter completely in Max for Live using biquad filters and filter coefficients. Learn DSP fundamentals while building a production-ready effect with dual peak filters, low/high cut modes, and an intuitive XY pad interface. Perfect for producers wanting to understand audio processing at a fundamental level or create custom Max for Live devices that rival commercial plugins.

Understanding how professional audio plugins work transforms you from a consumer to a creator. When you can analyze a commercial effect and rebuild it from scratch, you gain insights into DSP fundamentals that elevate every aspect of your production. This tutorial demonstrates exactly that process by recreating the Kilohearts Formant Filter entirely in Max for Live.

The Kilohearts Formant Filter is a dual filter effect featuring two resonant peak filters controlled via an XY pad, with switchable low-cut and high-cut modes. While seemingly simple, the device employs sophisticated signal processing techniques that make it a powerful tool for sound design and mixing. By building it yourself in Max for Live, you’ll master biquad filter implementation, coefficient calculation, and interface design principles applicable to countless other effects.

Whether you’re a Max for Live developer looking to expand your DSP knowledge or a producer curious about what’s happening under the hood of your favorite plugins, this guide provides practical, hands-on education in audio programming.

Analyzing the Original Plugin

Before recreating any device, you need to understand precisely what it does. The Kilohearts Formant Filter presents several controls that determine its behavior.

The primary interface consists of an XY pad controlling two filter cutoff frequencies. The X axis controls one filter’s frequency from 200 Hz to 900 Hz, while the Y axis controls the second filter from 500 Hz to 2500 Hz. Both axes use linear scaling rather than the logarithmic scaling typical of frequency parameters.

A Q or resonance control adjusts both filters simultaneously, ranging from 2 to 16. Higher Q values create sharper, more resonant peaks. Interestingly, the Q value also affects the gain of the peak filters—higher resonance produces higher amplitude at the resonant frequency.

Two switches labeled Low and High transform the peak filters into cut filters. The Low switch converts one peak filter to a low-cut (high-pass) filter, while the High switch converts the other to a high-cut (low-pass) filter.

One clever feature: the plugin automatically ensures the lower frequency always routes to the low-cut filter and the higher frequency to the high-cut filter, regardless of which XY pad parameter controls which filter. This prevents user confusion and ensures musically useful results.

Using EQ Curve Analyzer for Visual Analysis

To verify the filter behavior precisely, using a spectrum analyzer proves invaluable. The Bertom EQ Curve Analyzer works excellently for this purpose—it sends an audio impulse through the device and displays the frequency response of the processed signal.

Routing the Formant Filter through this analyzer reveals exactly what’s happening. Moving the XY pad shows two resonant peak filters whose cutoff frequencies track the pad position. Adjusting the Q control demonstrates how resonance affects both peak sharpness and amplitude. Enabling the Low and High switches confirms the transformation from peak to cut filters.

This visual analysis provides the blueprint for recreation. You now know the target: two biquad filters in series, each capable of operating as either a peak/notch filter or a cut filter, with frequency, Q, and gain parameters appropriately controlled.

Building the Audio Path

Max for Live device creation begins with audio input and output. The plugout~ objects handle this, receiving audio from Ableton and sending processed audio back.

The signal chain requires two biquad filters in series, one for each formant. Since we’re processing stereo audio, you need two biquad~ objects for the first filter and two more for the second filter, maintaining left and right channels separately throughout.

The biquad~ object is Max’s implementation of a second-order IIR (infinite impulse response) filter. It’s called “biquad” because it uses two quadratic transfer functions—one for poles and one for zeros—to create its filter response. The object accepts five coefficient inputs that determine its exact behavior.

Connecting the audio path is straightforward: plugin~ feeds the first pair of biquad~ objects (left and right), which feed the second pair, which feed plugout~. The complexity lies in generating the correct filter coefficients.

Understanding Biquad Filters

Opening the biquad~ help file reveals the mathematical structure. A biquad filter processes each input sample through a network of multipliers and single-sample delays (represented mathematically as z^-1). The transfer function combines the current input sample with delayed versions of both input and output samples, each scaled by specific coefficients.

The five coefficients (a0, a1, a2, b1, b2) determine whether the filter acts as lowpass, highpass, bandpass, notch, or peak, and control parameters like cutoff frequency, resonance, and gain. Calculating these coefficients manually involves complex mathematical formulas derived from analog filter theory and the bilinear transform.

Fortunately, Max provides the filtergraph~ object to handle coefficient calculation. Despite its name, this object doesn’t graph anything—it simply converts intuitive parameters (filter type, frequency, Q, gain) into the five coefficients required by biquad~.

Implementing Filter Coefficients

Each biquad~ object needs its own filtergraph~ to generate coefficients. Since we have four biquad~ objects (two filters in stereo), we need two filtergraph~ objects—one per filter, with both left and right channels of each filter sharing the same coefficients.

The filtergraph~ object has three inlets: frequency, gain, and Q. For the first filter, create a filtergraph~ and connect its five outlets to the corresponding inlets of both left and right biquad~ objects. Repeat this for the second filter.

Now you need to route control values to these filtergraph~ objects. The frequency parameter for the first filter comes from the X axis control. The second filter’s frequency comes from the Y axis. Both filters share the same Q parameter.

The gain parameter requires attention. In peak/notch mode, the Q value affects gain—higher resonance produces higher peak amplitude. The filtergraph~ object expects gain as a separate parameter, but for cut filters, gain is irrelevant. This works in our favor: we can simply route the Q value to both the Q inlet and the gain inlet, and the filter type determines whether gain matters.

Ensuring Correct Frequency Routing

The Formant Filter’s behavior of always assigning the lower frequency to the low-cut filter and higher frequency to the high-cut filter requires implementing minimum and maximum logic.

Insert a min object before the first filter’s frequency input. Connect both X and Y frequency values to this min object. It outputs whichever value is lower, ensuring the first filter always operates at the lower frequency.

Insert a max object before the second filter’s frequency input. Connect both X and Y values to this max object. It outputs whichever value is higher, ensuring the second filter always operates at the higher frequency.

This simple addition makes the device intuitive regardless of how users manipulate the XY pad.

Implementing Filter Mode Switching

The Low and High switches need to change each filter’s type between peak/notch and cut modes. The filtergraph~ object accepts messages specifying filter type: “peaknotch” for peak filters, “highpass” for low-cut filters, and “lowpass” for high-cut filters.

Use a selector object to route the appropriate message based on switch state. The live.text object (used for the Low switch) outputs 0 when disabled and 1 when enabled. Connect this output to a selector with two inlets.

When selector receives 0, it outputs a “peaknotch” message to the first filtergraph~. When it receives 1, it outputs a “highpass” message. This implements the Low switch functionality.

Repeat this for the second filter using the High switch. When disabled (0), send “peaknotch”. When enabled (1), send “lowpass”.

Now the filters switch modes correctly, transforming from resonant peaks to cut filters based on switch state.

Creating the User Interface

A functional effect means nothing without an intuitive interface. Max for Live’s presentation mode allows you to design how users interact with your device.

For the XY pad, use the pictslider object. This provides X and Y outputs ranging from 0 to 127. Scale these outputs to match the actual frequency ranges: 200-900 Hz for X, 500-2500 Hz for Y.

The scale~ object handles this conversion, but you need to ensure it outputs floating-point values rather than integers. Set the decimal point parameter appropriately, or the pad will only output whole-number frequencies.

For bidirectional control (pad affects number boxes, number boxes affect pad), you need careful message routing. The live.numbox objects for X and Y frequency should both control the filtergraph~ objects and update the pictslider position.

The live.numbox has a second outlet that outputs values scaled from 0 to 1 regardless of the displayed range. Multiply this by 127 and send it to the pictslider to update the pad position when number boxes change.

In the opposite direction, use prepend set to send pictslider outputs to the number boxes. The “set” message updates the display without triggering the number box’s output, preventing feedback loops.

Configuring Control Ranges

Each interface element needs proper range configuration to match the original plugin.

For the X frequency live.numbox, set the range from 200 to 900 with an initial value of 550. Set the exponent to 1 for linear scaling and enable frequency mode for Hz display.

For the Y frequency live.numbox, set the range from 500 to 2500 with an initial value of 1500. Same exponent and frequency mode settings.

For the Q live.dial, set the range from 2 to 16 with an initial value of 4. Ensure it outputs floating-point values for smooth control.

For the Low and High live.text objects, configure them to use icons representing the filter curves. Max includes lowcut.svg and highcut.svg files perfect for this purpose. Set these as the text display, and the switches will show visual filter curve representations.

Presentation Mode Design

Switch to presentation mode to design the user-facing interface. Add all control objects to presentation mode and arrange them logically.

The XY pad should be prominent and square. A dimension of 169×169 pixels works well—169 is the default height of Ableton Live devices, creating visual consistency.

Position the X and Y frequency number boxes near their respective axes of the pad. Add live.comment objects to label these “X” and “Y” or “Freq X” and “Freq Y”.

Place the Q control below or beside the pad where it’s easily accessible. Add a label for clarity.

Position the Low and High switches near the pad, clearly labeled so users understand their function.

Set the overall device width to approximately 300 pixels—wide enough for comfortable control but not so large it dominates the device chain. Set height to 169 pixels to match standard device dimensions.

Color and Theme Integration

Ableton Live 11 introduced dynamic color, allowing Max for Live devices to match Live’s theme automatically. For the XY pad, set both the LCD Element Color and LCD Background Color to use the accent color.

This ensures the pad appears red (or whatever color the user’s theme specifies) and updates automatically when users switch themes. This level of polish makes custom devices feel professional and integrated rather than like third-party add-ons.

Apply similar color considerations to other UI elements. Use standard Live UI colors for backgrounds and text to maintain visual consistency.

Final Configuration

In the patcher inspector, ensure “Open in Presentation” is enabled. This makes the device open in presentation mode by default rather than showing the patching window, which would confuse end users.

Set the device width and height in the patcher inspector to match your presentation mode layout. This ensures the device appears consistently sized in Live’s device chain.

Test all parameters thoroughly. Move the XY pad and verify both filters respond correctly. Adjust Q and confirm resonance changes. Toggle Low and High switches and verify mode changes. Check that frequency routing (min/max logic) works as expected.

Advanced Considerations

This implementation faithfully recreates the Formant Filter’s core functionality, but several enhancements could extend it further.

You could add separate Q controls for each filter, allowing asymmetric resonance settings. This wasn’t in the original but opens new sound design possibilities.

You could implement modulation inputs, allowing LFOs or envelopes to control filter parameters. This transforms a static filter into a dynamic modulation effect.

You could add oversampling to reduce aliasing when using high resonance values. The biquad~ filter can alias at extreme settings, particularly with high Q values near Nyquist frequency.

You could add preset management, allowing users to save and recall favorite settings. Max for Live’s pattrstorage system handles this elegantly.

Learning from the Process

Beyond creating a useful audio effect, this exercise teaches fundamental DSP and Max for Live development concepts applicable to countless projects.

You’ve learned how biquad filters work at a mathematical level, how filter coefficients determine frequency response, and how different coefficient sets create different filter types.

You’ve learned Max for Live patching techniques: audio routing, message flow, parameter mapping, and UI design. These skills transfer to any Max for Live device you might create.

You’ve learned analysis techniques for reverse-engineering plugins. The process of analyzing frequency response, identifying filter types, and recreating behavior applies to any effect you want to understand deeply.

Most importantly, you’ve learned that commercial plugins aren’t magic black boxes. They’re implemented using the same tools and techniques available to you. With knowledge and practice, you can create effects that rival or surpass commercial offerings.

Performance Considerations

The device you’ve built is computationally efficient. Biquad filters are among the most CPU-efficient filter implementations, requiring only a handful of multiplications and additions per sample.

Running two biquad filters in stereo (four total biquad~ objects) uses negligible CPU on modern systems. You could run dozens of instances without performance concerns.

The filtergraph~ object only recalculates coefficients when parameters change, not for every audio sample. This means parameter changes have minimal CPU impact.

The UI objects (pictslider, live.numbox, etc.) don’t affect audio processing performance at all—they only send messages to the audio objects when users interact with them.

Distribution and Sharing

Once you’ve created a working device, you can share it with others. Max for Live devices can be frozen (compiled) so users don’t need Max for Live to use them—they only need Ableton Live Suite or Standard with the free Max for Live runtime.

To freeze a device, choose “Freeze Device” from the file menu. This creates a .amxd file that works on any system with Live Suite or Standard, regardless of whether the user owns Max for Live.

You can share frozen devices for free or sell them on platforms like Gumroad, Isotonik Studios, or maxforlive.com. Many Max for Live developers build sustainable income creating and selling devices.

Expanding Your DSP Knowledge

This tutorial focused on a specific filter implementation, but the principles extend far beyond formant filters.

Understanding biquad filters allows you to create any second-order filter type: lowpass, highpass, bandpass, notch, peak, lowshelf, and highshelf. Different coefficient sets produce different responses, all using the same biquad~ object.

For higher-order filters (steeper slopes), cascade multiple biquad~ objects. A fourth-order lowpass is simply two second-order lowpasses in series. An eighth-order filter is four biquads.

The filtergraph~ object handles common filter types, but for exotic responses, you can calculate coefficients manually using the cookbook formulas from Robert Bristow-Johnson’s audio EQ cookbook.

Understanding signal flow, coefficient calculation, and parameter mapping prepares you to create any effect imaginable: distortion, compression, modulation effects, time-based effects, and beyond.

Conclusion

Recreating the Kilohearts Formant Filter in Max for Live demonstrates that professional plugin functionality is accessible to anyone willing to learn the fundamentals. The device you’ve built matches the original’s core features while teaching you transferable skills in DSP, Max patching, and interface design.

This isn’t just about replicating one specific plugin—it’s about understanding audio processing at a level that lets you create anything you can imagine. Every plugin you use becomes a learning opportunity. Analyze its behavior, identify the underlying techniques, and implement them yourself.

The Max for Live devices you create can become signature sounds in your productions, unique tools unavailable to other producers, or even commercial products you share with the world. The limiting factor isn’t access to expensive development tools—it’s knowledge and practice, both of which you’ve gained through this tutorial.

Continue exploring, experimenting, and creating. The next groundbreaking Max for Live device could be yours.

Continue Learning

Want to explore more advanced Max for Live and audio programming techniques? Check out these related tutorials:

Crafting Deep House with Live 12.2 – Discover generative tools and visual-audio mapping techniques for creating expressive arrangements

Signal Chain Stories: Staying Authentic Across Genres – Learn how professional producers maintain their artistic signature while exploring different styles

Exploring Generative Sequencing with Fors Dyad – Master modular-style sequencing in Ableton Live and Push 3 Standalone

    RELATED PRODUCTS

    Monomono’s Maya – Juno-Inspired MPE Synth for Ableton Live & Push 3 Standalone

    A lush, expressive Max for Live synth with Juno-style tones, MPE support, and Push 3 standalone compatibility — meet Monomono...

    Darren E Cowley (Admin)

    July 30, 2025
    MaxforLive Devices

    Introducing moon.hands.core – A New Way to Automate & Perform in Ableton Live

    Introducing moon.hands.core – A New Way to Automate & Perform in Ableton Live We’re excited to announce the release of mo...

    Darren E Cowley (Admin)

    July 21, 2025
    MaxforLive Devices