13namespace tracktion {
inline namespace engine
16namespace MidiNodeHelpers
18 inline void createMessagesForTime (MidiMessageArray& destBuffer,
21 LiveClipLevel& clipLevel,
22 bool useMPEChannelMode, MidiMessageArray::MPESourceID midiSourceID,
25 if (useMPEChannelMode)
31 for (
int i = channelNumbers.
getStart(); i < channelNumbers.
getEnd(); ++i)
34 for (
auto& m : controllerMessagesScratchBuffer)
35 destBuffer.addMidiMessage (m, 0.0001, midiSourceID);
42 for (
int i = channelNumbers.
getStart(); i < channelNumbers.
getEnd(); ++i)
45 for (
auto& m : controllerMessagesScratchBuffer)
46 destBuffer.addMidiMessage (m, 0.0001, midiSourceID);
49 if (! clipLevel.isMute())
51 auto volScale = clipLevel.getGain();
57 if (meh->noteOffObject !=
nullptr
58 && meh->message.isNoteOn())
60 if (meh->message.getTimeStamp() >= time)
64 if (meh->noteOffObject->message.getTimeStamp() > time + 0.0001)
67 m.multiplyVelocity (volScale);
70 destBuffer.addMidiMessage (m, 0.0001, midiSourceID);
80 MidiMessageArray::MPESourceID midiSourceID,
81 double time,
double midiTimeOffset,
bool isPlaying)
83 int activeChannels = 0;
89 if (meh->message.isNoteOn())
91 activeChannels |= (1 << meh->message.getChannel());
93 if (meh->message.getTimeStamp() <
time
94 && meh->noteOffObject !=
nullptr
95 && meh->noteOffObject->message.getTimeStamp() >=
time)
96 destination.addMidiMessage (meh->noteOffObject->message, midiTimeOffset, midiSourceID);
105 for (
int i = 1; i <= 16; ++i)
107 if ((activeChannels & (1 << i)) != 0)
123 for (
const auto& m : midi)
129 MidiMessageArray::MPESourceID midiSourceID,
130 double midiTimeOffset,
bool isPlaying)
132 int activeChannels = 0;
135 activeNoteList.iterate ([&] (
int channel,
int noteNumber)
137 activeChannels |= (1 << channel);
140 activeNoteList.reset();
143 for (
int i = 1; i <= 16; ++i)
145 if ((activeChannels & (1 << i)) != 0)
void createControllerUpdatesForTime(int channelNumber, double time, Array< MidiMessage > &resultMessages)
int getNextIndexAtTime(double timeStamp) const noexcept
MidiEventHolder * getEventPointer(int index) const noexcept
int getNumEvents() const noexcept
static MidiMessage allNotesOff(int channel) noexcept
static MidiMessage controllerEvent(int channel, int controllerType, int value) noexcept
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
constexpr ValueType getStart() const noexcept
constexpr ValueType getEnd() const noexcept
static void reconstructExpression(juce::Array< juce::MidiMessage > &mpeMessagesToAddAtStart, const juce::MidiMessageSequence &data, int trimIndex, int channel)
Reconstruct note expression for a particular channel.
void sanityCheckMidiBuffer(const MidiMessageArray &midi, double maxTimeStamp)
Asserts if any MIDI messages are timestamped outside the given range.