A small Unreal Engine 5 plugin lab that integrates JUCE as a custom audio/MIDI backend to explore ultra-low-latency device I/O (primarily via ASIO on Windows).
This is a technical code sample / experiment, not in any way a production-ready usable replacement for Unreal’s audio pipeline.
- Stack: Unreal Engine 5 plugin (C++), JUCE static library (external), CMake/Projucer build for JUCE
- Focus: real-time audio callbacks, buffer negotiation, MIDI event handling, clean ThirdParty linkage
Related music-tech demos (YouTube):
These clips show other parts of my broader UE/JUCE music framework that aren’t in this repo.
- Quartz-synchronized MetaSounds music system demo – beat-accurate playback + gameplay-driven transitions.
- Real-time MIDI input and Sample demo – low-latency MIDI capture and instrument routing.
- The JUCE device callback path is working and can achieve very low latency with ASIO.
- The Unreal integration layer and module linking are stable for Win64.
Known issue (important):
- When running audio through this backend over asio, Unreal’s native audio manager / sound class routing is currently disrupted.
In other words, ACO/JUCE output does not participate cleanly in Unreal’s normal SoundClass/SoundMix/AudioMixer control.
A proper solution will likely require a controlled bridge back into UE’s mixer or a hybrid routing approach.
- JUCE linkage & platform config:
UltraLowLatencyAudio.Build.cs - Unreal ↔ JUCE boundary / includes:
Private/JUCEPCH.h - Audio device + callback core:
Private/Audio/AudioEngine.* - MIDI handling:
Private/Audio/MidiCallback.*,Private/MIDIThread/* - Unreal integration entrypoint:
Private/Subsystem/*
JUCE is not included in this repo. Build it separately and place it in ThirdParty/.
Download and unpack JUCE from the official site:
https://juce.com
Using Projucer, create a static library containing the JUCE modules you need.
Modules expected by this plugin (see JUCEPCH.h):
juce_corejuce_eventsjuce_audio_basicsjuce_audio_devicesjuce_audio_processorsjuce_audio_utils
Expected layout:
JUCE/ Includes/ modules/ <-- JUCE module headers Libraries/ Release/ JUCEStaticLib.lib <-- your built static lib (Win64) If your library name/path differs, update UltraLowLatencyAudio.Build.cs accordingly.
To use ASIO:
- Install ASIO drivers on your system.
- In Projucer, enable ASIO support in
juce_audio_devicesbefore building the static library.
- RTTI and exceptions are enabled in
Build.csto match JUCE requirements. WITH_JUCE_BINDINGis used to guard compilation when JUCE is not present.
- Add the plugin to a UE5 project.
- Ensure JUCE is linked (setup above).
- Launch editor / PIE.
- The subsystem initializes JUCE audio + MIDI, and
AudioEnginedrives the callback/render path. - Use the Blueprint exposed functions from the subsystem to interact with JUCE