MidiHarmonixBridge is an Unreal Engine plugin that moves live MIDI note data from gameplay code into Harmonix MetaSound graphs. It provides simple Blueprint helpers for sending note events and a MetaSound node that plays them back in time on the audio thread.
- Thread-safe queue that carries note-on, note-off, and all-notes-off messages.
- Blueprint function library for triggering MIDI events from gameplay systems or hardware callbacks.
- MetaSound node that starts and stops listening on demand and outputs a ready-to-use
FMidiStream. - Support for multiple logical streams so different instruments can listen to their own MIDI data.
- Unreal Engine 5 (tested on 5.5).
- Copy the
Plugins/MidiHarmonixBridgedirectory into your Unreal project or clone this repository directly intoYourProject/Plugins. - Regenerate project files if you are using C++.
- Build or launch the editor so the
MidiHarmonixBridgemodule compiles. - Enable
MidiHarmonixBridgeinside Edit → Plugins if it is not enabled automatically.
Use the Blueprint nodes from Midi Harmonix Bridge category or call the subsystem directly in C++.
Midi Bridge Note OnMidi Bridge Note OffMidi Bridge All Notes Off
Each function accepts:
MidiNote(0-127)Velocity(0-127)MidiChannel(0-15, optional)VoiceId(optional; leave at 0 to auto-generate)StreamId(non-negative, defaults to 0)
#include "MidiHarmonixBridgeSubsystem.h"
if (UMidiHarmonixBridgeSubsystem* Bridge = UMidiHarmonixBridgeSubsystem::Get())
{
Bridge->BridgeNoteOn(60 /* Middle C */, 100, 0, 0, 0);
}- Open your MetaSound graph and add the MIDI Bridge node.
- Connect the
Start Listentrigger (for example,On Begin Play) and theStop Listentrigger (for example,On End Play). - Choose the same
Stream Idvalue that the gameplay side uses. - Connect the
MIDI Streamoutput to Harmonix operators such asFusionSampler.
The node keeps its own listener handle and drains the queue every audio block, so multiple MetaSound graphs can listen to different streams safely.
Set a unique Stream Id per instrument or MetaSound graph. Gameplay code pushes MIDI events into the matching stream, and only MetaSound nodes that listen to that stream will receive them.
Improvements are welcome. Please open an issue or pull request with a clear description and steps to reproduce or test your change.