Vital
Loading...
Searching...
No Matches
midi_manager.h
Go to the documentation of this file.
1#pragma once
2
3#include "JuceHeader.h"
4#include "common.h"
5
6#include <string>
7#include <map>
8
9#if !defined(JUCE_AUDIO_DEVICES_H_INCLUDED)
10// Stubs for JUCE classes if JUCE_AUDIO_DEVICES is not included.
11
12class MidiInput { };
13
15public:
16 virtual ~MidiInputCallback() { }
17 virtual void handleIncomingMidiMessage(MidiInput *source, const MidiMessage &midi_message) { }
18};
19
21public:
22 void reset(int sample_rate) { }
23 void removeNextBlockOfMessages(MidiBuffer& buffer, int num_samples) { }
24 void addMessageToQueue(const MidiMessage &midi_message) { }
25};
26#endif
27
28class SynthBase;
29
30namespace vital {
31 class SoundEngine;
32 struct ValueDetails;
33}
34
45public:
52 typedef std::map<int, std::map<std::string, const vital::ValueDetails*>> midi_map;
53
58 kNoteOff = 0x80,
59 kNoteOn = 0x90,
60 kAftertouch = 0xa0,
61 kController = 0xb0,
64 kPitchWheel = 0xe0,
65 };
66
84
91 class Listener {
92 public:
93 virtual ~Listener() { }
100 virtual void valueChangedThroughMidi(const std::string& name, vital::mono_float value) = 0;
101
108
114 virtual void modWheelMidiChanged(vital::mono_float value) = 0;
115
121 virtual void presetChangedThroughMidi(File preset) = 0;
122 };
123
132 MidiManager(SynthBase* synth, MidiKeyboardState* keyboard_state,
133 std::map<std::string, String>* gui_state, Listener* listener = nullptr);
134
138 virtual ~MidiManager();
139
147 void armMidiLearn(std::string name);
148
152 void cancelMidiLearn();
153
159 void clearMidiLearn(const std::string& name);
160
170 void midiInput(int control, vital::mono_float value);
171
180 void processMidiMessage(const MidiMessage &midi_message, int sample_position = 0);
181
188 bool isMidiMapped(const std::string& name) const;
189
195 void setSampleRate(double sample_rate);
196
205 void removeNextBlockOfMessages(MidiBuffer& buffer, int num_samples);
206
215 void replaceKeyboardMessages(MidiBuffer& buffer, int num_samples);
216
224 void processAllNotesOff(const MidiMessage& midi_message, int sample_position, int channel);
225
229 void processAllSoundsOff();
230
238 void processSustain(const MidiMessage& midi_message, int sample_position, int channel);
239
247 void processSostenuto(const MidiMessage& midi_message, int sample_position, int channel);
248
256 void processPitchBend(const MidiMessage& midi_message, int sample_position, int channel);
257
265 void processPressure(const MidiMessage& midi_message, int sample_position, int channel);
266
274 void processSlide(const MidiMessage& midi_message, int sample_position, int channel);
275
282 bool isMpeChannelMasterLowerZone(int channel);
283
290 bool isMpeChannelMasterUpperZone(int channel);
291
293 force_inline int lowerZoneStartChannel() { return mpe_zone_layout_.getLowerZone().getFirstMemberChannel() - 1; }
295 force_inline int upperZoneStartChannel() { return mpe_zone_layout_.getUpperZone().getLastMemberChannel() - 1; }
297 force_inline int lowerZoneEndChannel() { return mpe_zone_layout_.getLowerZone().getLastMemberChannel() - 1; }
299 force_inline int upperZoneEndChannel() { return mpe_zone_layout_.getUpperZone().getFirstMemberChannel() - 1; }
301 force_inline int lowerMasterChannel() { return mpe_zone_layout_.getLowerZone().getMasterChannel() - 1; }
303 force_inline int upperMasterChannel() { return mpe_zone_layout_.getUpperZone().getMasterChannel() - 1; }
304
310 void setMpeEnabled(bool enabled) { mpe_enabled_ = enabled; }
311
318
324 void setMidiLearnMap(const midi_map& midi_learn_map) { midi_learn_map_ = midi_learn_map; }
325
334 void handleIncomingMidiMessage(MidiInput *source, const MidiMessage &midi_message) override;
335
341 struct PresetLoadedCallback : public CallbackMessage {
348 PresetLoadedCallback(Listener* lis, File pre) : listener(lis), preset(std::move(pre)) { }
349
353 void messageCallback() override {
354 if (listener)
356 }
357
359 File preset;
360 };
361
362protected:
368 void readMpeMessage(const MidiMessage& message);
369
372 MidiKeyboardState* keyboard_state_;
374 std::map<std::string, String>* gui_state_;
379
382
387
389 MPEZoneLayout mpe_zone_layout_;
390 MidiRPNDetector rpn_detector_;
391
392 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MidiManager)
393};
Definition midi_manager.h:14
virtual void handleIncomingMidiMessage(MidiInput *source, const MidiMessage &midi_message)
Definition midi_manager.h:17
virtual ~MidiInputCallback()
Definition midi_manager.h:16
Definition midi_manager.h:12
An interface for classes that listen to MIDI-driven parameter changes.
Definition midi_manager.h:91
virtual ~Listener()
Definition midi_manager.h:93
virtual void modWheelMidiChanged(vital::mono_float value)=0
Called when the mod wheel changes.
virtual void valueChangedThroughMidi(const std::string &name, vital::mono_float value)=0
Called when a parameter value changes due to a MIDI control message.
virtual void presetChangedThroughMidi(File preset)=0
Called when a preset change is triggered via MIDI.
virtual void pitchWheelMidiChanged(vital::mono_float value)=0
Called when the pitch wheel changes.
The MidiManager class handles all incoming MIDI messages and directs them to the synthesizer engine.
Definition midi_manager.h:44
MidiSecondaryType
Enum representing secondary MIDI controller values (MIDI CC numbers).
Definition midi_manager.h:70
@ kAllNotesOff
Definition midi_manager.h:82
@ kBankSelect
Definition midi_manager.h:71
@ kAllControllersOff
Definition midi_manager.h:81
@ kLsbSlide
Definition midi_manager.h:79
@ kAllSoundsOff
Definition midi_manager.h:80
@ kModWheel
Definition midi_manager.h:72
@ kSostenutoPedal
Definition midi_manager.h:75
@ kSlide
Definition midi_manager.h:77
@ kSustainPedal
Definition midi_manager.h:74
@ kSoftPedalOn
Definition midi_manager.h:76
@ kFolderSelect
Definition midi_manager.h:73
@ kLsbPressure
Definition midi_manager.h:78
const vital::ValueDetails * armed_value_
Parameter armed for MIDI learn.
Definition midi_manager.h:380
int current_bank_
Tracks the current bank for preset selection.
Definition midi_manager.h:376
void setSampleRate(double sample_rate)
Sets the audio sample rate for MIDI message timing.
Definition midi_manager.cpp:101
midi_map getMidiLearnMap()
Returns the current MIDI learn map.
Definition midi_manager.h:317
void readMpeMessage(const MidiMessage &message)
Parses and processes an MPE-related MIDI message.
Definition midi_manager.cpp:109
void midiInput(int control, vital::mono_float value)
Handles a direct MIDI input value and applies MIDI learn if armed.
Definition midi_manager.cpp:69
void processSlide(const MidiMessage &midi_message, int sample_position, int channel)
Processes slide messages (MPE CC events) translating them to appropriate modulation.
Definition midi_manager.cpp:202
bool isMpeChannelMasterLowerZone(int channel)
Checks if the given channel is the MPE master channel for the lower zone.
Definition midi_manager.cpp:212
MidiMessageCollector midi_collector_
Collects incoming MIDI messages.
Definition midi_manager.h:373
std::map< std::string, String > * gui_state_
Holds GUI-related state info.
Definition midi_manager.h:374
MidiMainType
Enum representing main categories of MIDI events (status bytes).
Definition midi_manager.h:57
@ kProgramChange
MIDI Program Change.
Definition midi_manager.h:62
@ kChannelPressure
MIDI Channel Pressure (monophonic aftertouch)
Definition midi_manager.h:63
@ kPitchWheel
MIDI Pitch Wheel event.
Definition midi_manager.h:64
@ kController
MIDI Control Change event.
Definition midi_manager.h:61
@ kNoteOn
MIDI Note On event.
Definition midi_manager.h:59
@ kAftertouch
MIDI Polyphonic Aftertouch.
Definition midi_manager.h:60
@ kNoteOff
MIDI Note Off event.
Definition midi_manager.h:58
void setMidiLearnMap(const midi_map &midi_learn_map)
Sets the current MIDI learn map, overriding existing mappings.
Definition midi_manager.h:324
std::map< int, std::map< std::string, const vital::ValueDetails * > > midi_map
A nested type defining a map from MIDI controls to a map of parameter names and their ValueDetails.
Definition midi_manager.h:52
Listener * listener_
Listener for MIDI-driven parameter changes and preset loads.
Definition midi_manager.h:375
void setMpeEnabled(bool enabled)
Enables or disables MPE mode for MIDI processing.
Definition midi_manager.h:310
void processPressure(const MidiMessage &midi_message, int sample_position, int channel)
Processes channel pressure (aftertouch) MIDI messages.
Definition midi_manager.cpp:192
bool isMpeChannelMasterUpperZone(int channel)
Checks if the given channel is the MPE master channel for the upper zone.
Definition midi_manager.cpp:216
int lsb_pressure_values_[vital::kNumMidiChannels]
LSB values for channel pressure.
Definition midi_manager.h:384
void handleIncomingMidiMessage(MidiInput *source, const MidiMessage &midi_message) override
Handles incoming MIDI messages from a MidiInput source (MidiInputCallback interface).
Definition midi_manager.cpp:310
bool isMidiMapped(const std::string &name) const
Checks if a parameter is already mapped to a MIDI control.
Definition midi_manager.cpp:93
void processAllSoundsOff()
Processes an 'All Sounds Off' MIDI message, turning off all voices immediately.
Definition midi_manager.cpp:122
void processAllNotesOff(const MidiMessage &midi_message, int sample_position, int channel)
Processes an 'All Notes Off' MIDI message.
Definition midi_manager.cpp:113
int lsb_slide_values_[vital::kNumMidiChannels]
LSB values for slide control.
Definition midi_manager.h:386
force_inline int upperMasterChannel()
Returns the master channel index (0-based) of the MPE upper zone.
Definition midi_manager.h:303
MidiManager(SynthBase *synth, MidiKeyboardState *keyboard_state, std::map< std::string, String > *gui_state, Listener *listener=nullptr)
Constructs a MidiManager to handle MIDI events for a given SynthBase instance.
Definition midi_manager.cpp:27
int current_preset_
Tracks the current preset within a folder.
Definition midi_manager.h:378
void replaceKeyboardMessages(MidiBuffer &buffer, int num_samples)
Replaces keyboard messages in the given MIDI buffer.
Definition midi_manager.cpp:314
void processSostenuto(const MidiMessage &midi_message, int sample_position, int channel)
Processes a sostenuto pedal MIDI message.
Definition midi_manager.cpp:148
void processPitchBend(const MidiMessage &midi_message, int sample_position, int channel)
Processes a pitch bend MIDI message.
Definition midi_manager.cpp:170
void armMidiLearn(std::string name)
Arms the MIDI learn functionality for a given parameter.
Definition midi_manager.cpp:49
void removeNextBlockOfMessages(MidiBuffer &buffer, int num_samples)
Removes the next block of MIDI messages, filling a MidiBuffer.
Definition midi_manager.cpp:105
int current_folder_
Tracks the current folder for preset selection.
Definition midi_manager.h:377
force_inline int lowerZoneEndChannel()
Returns the end channel index (0-based) of the MPE lower zone.
Definition midi_manager.h:297
int msb_pressure_values_[vital::kNumMidiChannels]
MSB values for channel pressure.
Definition midi_manager.h:383
MPEZoneLayout mpe_zone_layout_
MPE zone layout object.
Definition midi_manager.h:389
midi_map midi_learn_map_
Mapping of MIDI controls to synth parameters.
Definition midi_manager.h:381
force_inline int lowerZoneStartChannel()
Returns the start channel index (0-based) of the MPE lower zone.
Definition midi_manager.h:293
vital::SoundEngine * engine_
The sound engine for handling audio events.
Definition midi_manager.h:371
SynthBase * synth_
Associated synthesizer base instance.
Definition midi_manager.h:370
void processSustain(const MidiMessage &midi_message, int sample_position, int channel)
Processes a sustain pedal MIDI message.
Definition midi_manager.cpp:126
MidiKeyboardState * keyboard_state_
The keyboard state for on-screen keyboard integration.
Definition midi_manager.h:372
bool mpe_enabled_
True if MPE mode is enabled.
Definition midi_manager.h:388
virtual ~MidiManager()
Destructor.
Definition midi_manager.cpp:46
void clearMidiLearn(const std::string &name)
Clears an existing MIDI mapping for a given parameter.
Definition midi_manager.cpp:60
force_inline int upperZoneStartChannel()
Returns the start channel index (0-based) of the MPE upper zone.
Definition midi_manager.h:295
int msb_slide_values_[vital::kNumMidiChannels]
MSB values for slide control.
Definition midi_manager.h:385
void processMidiMessage(const MidiMessage &midi_message, int sample_position=0)
Processes a given MIDI message and forwards it to the synth engine.
Definition midi_manager.cpp:220
force_inline int upperZoneEndChannel()
Returns the end channel index (0-based) of the MPE upper zone.
Definition midi_manager.h:299
MidiRPNDetector rpn_detector_
Detects and processes MIDI RPN/NRPN messages.
Definition midi_manager.h:390
void cancelMidiLearn()
Cancels the MIDI learn operation without assigning any mapping.
Definition midi_manager.cpp:56
force_inline int lowerMasterChannel()
Returns the master channel index (0-based) of the MPE lower zone.
Definition midi_manager.h:301
Definition midi_manager.h:20
void removeNextBlockOfMessages(MidiBuffer &buffer, int num_samples)
Definition midi_manager.h:23
void reset(int sample_rate)
Definition midi_manager.h:22
void addMessageToQueue(const MidiMessage &midi_message)
Definition midi_manager.h:24
A base class providing foundational functionality for the Vital synthesizer’s engine,...
Definition synth_base.h:42
Core class responsible for handling note events, oversampling, and the main effects chain.
Definition sound_engine.h:33
#define force_inline
Definition common.h:23
Contains classes and functions used within the Vital synthesizer framework.
constexpr int kNumMidiChannels
MIDI channels available per device.
Definition common.h:57
float mono_float
Definition common.h:33
A callback message class that notifies listeners of preset changes through MIDI.
Definition midi_manager.h:341
Listener * listener
The listener to notify.
Definition midi_manager.h:358
File preset
The preset file that was loaded.
Definition midi_manager.h:359
void messageCallback() override
The callback invoked when the message is delivered.
Definition midi_manager.h:353
PresetLoadedCallback(Listener *lis, File pre)
Constructs a PresetLoadedCallback.
Definition midi_manager.h:348
Holds metadata about a single parameter (control) in the Vital synthesizer.
Definition synth_parameters.h:23