Grilled Cheese is a drum-bus compressor built with JUCE 8 and CMake, intended for drum buses. The signal path is a custom compressor, oversampled soft saturation, a high-shelf air band, and a parallel mix with latency compensation. The default settings are usable without adjustment.
It builds as AU, VST3 and a standalone application on macOS, and as VST3 and a standalone application on Windows.
input trim -> dry capture -> compressor -> oversampled saturation -> air shelf -> parallel mix -> output -> safety clip
- Input trim. Level into the processor.
- Dry capture. The trimmed input is copied for the parallel mix.
- Compressor. A custom design rather than
juce::dsp::Compressor. A per-channel high-pass runs on the detection signal only, so kick and low-frequency energy do not over-trigger it. Level detection blends peak and RMS and is stereo-linked. The gain computer uses a quadratic soft knee, and attack and release are smoothed separately on the gain reduction in decibels. The audible low end is left untouched. - Oversampled saturation. A drive control feeds a
tanhsoft saturator running insidejuce::dsp::Oversamplingat 2x with an FIR half-band filter, so the added harmonics do not alias. Small signals stay at unity gain, and 0 per cent drive is clean. - Air shelf. A high-shelf filter (
juce::dsp::IIR) at 9 kHz. - Parallel mix. A blend of the processed signal with the dry input. The dry path is delayed to match the oversampling latency so the two stay aligned.
- Output. Output gain followed by an optional safety soft-clip.
An optional auto-makeup stage compensates for the level the compressor removes on the wet path. It adds roughly half the reduction a 0 dBFS signal would see under the current threshold, ratio and knee.
The plugin reports its oversampling latency to the host with setLatencySamples, so a host that compensates for latency keeps it aligned with the rest of the session.
| Parameter | Range | Default | Notes |
|---|---|---|---|
| Input Trim | -24 to +24 dB | 0 dB | |
| Threshold | -60 to 0 dB | -18 dB | |
| Ratio | 1 to 20 :1 | 4 :1 | |
| Attack | 0.1 to 200 ms | 10 ms | |
| Release | 5 to 1000 ms | 80 ms | |
| Knee | 0 to 24 dB | 6 dB | soft knee |
| Det HPF | 20 to 500 Hz | 90 Hz | detection path only |
| Drive | 0 to 100 % | 25 % | oversampled tanh saturation |
| Air | -6 to +12 dB | +2.5 dB | high shelf at 9 kHz |
| Mix | 0 to 100 % wet | 80 % wet | parallel blend |
| Output | -24 to +24 dB | 0 dB | |
| Auto Makeup | on / off | on | compensates the wet path |
| Safety Clip | on / off | on | soft-clip on the output |
Ratio, attack, release and the detector high-pass use skewed ranges, so the musically useful part of each control has more resolution. All parameters use juce::AudioProcessorValueTreeState, are automatable, and are saved and restored with the host session.
The preset menu is at the bottom-left of the interface. Selecting a preset sets every control and notifies the host. "Random" sets each control to a value within a usable range and can be selected again to re-roll.
| Preset | Description |
|---|---|
| Cheddar Classic | the default state |
| Sharp Cheddar | brighter and faster, more drive and air |
| Ham Sandwich | slower, heavier mids, lighter mix |
| Grilled Cheese | more saturation, longer release |
| Melty Mozzarella | low ratio, gentle |
| Swiss | light compression, airy, more dry signal |
| Club Sandwich | high ratio, fast, output trimmed |
| Random | randomises every control within range |
Presets are defined in source/Presets.h. Add more by appending to the table.
- CMake 3.22 or newer and a C++17 compiler.
- macOS: Xcode or the Command Line Tools (
xcode-select --install). - Windows: Visual Studio 2022 with the Desktop C++ workload.
- An internet connection on the first configure. CMake fetches JUCE 8.0.13 with
FetchContent, so the Projucer is not needed.
Ninja is optional.
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build -jcmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config ReleaseTo build a single format, pass its target, for example --target GrilledCheese_VST3 (or GrilledCheese_AU, or GrilledCheese_Standalone).
Builds appear under build/GrilledCheese_artefacts/<config>/:
Standalone/Grilled Cheese.appon macOS,Standalone/Grilled Cheese.exeon WindowsVST3/Grilled Cheese.vst3AU/Grilled Cheese.componenton macOS only
COPY_PLUGIN_AFTER_BUILD is on, so the VST3 and AU are also copied to the user plugin folders:
- macOS VST3:
~/Library/Audio/Plug-Ins/VST3/ - macOS AU:
~/Library/Audio/Plug-Ins/Components/ - Windows VST3:
%COMMONPROGRAMFILES%\VST3\
Set COPY_PLUGIN_AFTER_BUILD FALSE in CMakeLists.txt to turn that off.
On Apple Silicon the build targets the host architecture (arm64) by default. For a universal binary, configure with -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64".
Grilled Cheese is an effect, so it belongs on a bus or mixer track rather than an instrument channel. After building on macOS the VST3 and AU are installed for you.
In FL Studio, open Options then Manage plugins, run the plugin scan, and add Grilled Cheese to a mixer insert slot. FL Studio hosts VST3 but not AU, so use the VST3 there. A host keeps a loaded plugin in memory, so after a rebuild, remove and re-add the instance or restart the host to load the new binary.
With pluginval installed, the plugin can be checked across sample rates and block sizes, including NaN and Inf checks and parameter and thread-safety tests:
/Applications/pluginval.app/Contents/MacOS/pluginval \
--strictness-level 8 \
--validate "$HOME/Library/Audio/Plug-Ins/VST3/Grilled Cheese.vst3"The build passes pluginval at strictness level 8.
juce::ScopedNoDenormalswrapsprocessBlock.- The output stage replaces any non-finite sample with zero, so the plugin cannot emit NaN or Inf regardless of upstream state.
- The compressor, filters and oversampling hold state across blocks and are reset in
prepareToPlay. - Processing is in place and supports mono or stereo, with matching input and output layouts.
CMakeLists.txt JUCE via FetchContent, juce_add_plugin, embedded artwork
resources/
grilled-cheese-drip.png UI artwork, embedded with juce_add_binary_data
source/
Parameters.h APVTS layout and parameter IDs (defaults live here)
Presets.h presets and the Random roll
PluginProcessor.{h,cpp} DSP chain, latency, state
PluginEditor.{h,cpp} custom rotary look and feel, GR meter, cheese banner, preset menu
dsp/
Compressor.h detector high-pass and peak/RMS compressor
Saturation.h tanh saturator and safety soft-clip
- Saturation oversampling factor:
osFactorLog2insource/PluginProcessor.h(1 is 2x, 2 is 4x). - Cheese banner height:
cheeseBandHindrawCheese()insource/PluginEditor.cpp. - Colours and knob styling: the
kCheddar,kTangand related colours, andCheeseLookAndFeel, at the top ofsource/PluginEditor.cpp. - Presets:
source/Presets.h.
The Grilled Cheese source in this repository is released under the MIT licence. See LICENSE.
This project builds against JUCE, which has its own licence (GPLv3 or a commercial JUCE licence). The MIT licence here covers this repository's source only. Any binary you build and distribute must also comply with the JUCE licence you build under. See https://juce.com/get-juce for the current terms.
The dripping-cheese image in resources/ is part of the user interface. If you fork or redistribute the project, make sure you have the right to use that image, or replace it with one of your own.