Hi,
Hi I noticed that there is a problem here :
std::unique_ptr<tracktion::graph::Node> createNodeForMidiClip (MidiClip& clip, const TrackMuteState& trackMuteState, const CreateNodeParams& params)
{
CRASH_TRACER
const bool generateMPE = clip.getMPEMode();
const auto timeBase = clip.canUseProxy() ? MidiList::TimeBase::seconds
: MidiList::TimeBase::beatsRaw;
const auto channels = generateMPE ? juce::Range<int> (2, 15)
: juce::Range<int>::withStartAndLength (clip.getMidiChannel().getChannelNumber(), 1);
if (timeBase == MidiList::TimeBase::beatsRaw)
{
std::vector<juce::MidiMessageSequence> sequences;
sequences.emplace_back (clip.getSequence().exportToPlaybackMidiSequence (clip, timeBase, generateMPE));
return graph::makeNode<LoopingMidiNode> (std::move (sequences),
channels,
generateMPE,
BeatRange (clip.getStartBeat(), clip.getEndBeat()),
BeatRange (clip.getLoopStartBeats(), clip.getLoopLengthBeats()),
clip.getOffsetInBeats(),
clip.getLiveClipLevel(),
params.processState,
clip.itemID,
clip.getQuantisation(),
clip.edit.engine.getGrooveTemplateManager().getTemplateByName (clip.getGrooveTemplate()),
clip.getGrooveStrength(),
[&trackMuteState]
{
if (! trackMuteState.shouldTrackBeAudible())
return ! trackMuteState.shouldTrackMidiBeProcessed();
return false;
});
}
// Use looped sequence in seconds time base
const auto clipTimeRange = clip.getEditTimeRange();
const juce::Range<double> editTimeRange { clipTimeRange.getStart().inSeconds(), clipTimeRange.getEnd().inSeconds() };
std::vector<juce::MidiMessageSequence> sequences;
sequences.emplace_back (clip.getSequenceLooped().exportToPlaybackMidiSequence (clip, timeBase, generateMPE));
return graph::makeNode<MidiNode> (std::move (sequences),
timeBase,
channels,
generateMPE,
editTimeRange,
clip.getLiveClipLevel(),
params.processState,
clip.itemID,
[&trackMuteState]
{
if (! trackMuteState.shouldTrackBeAudible())
return ! trackMuteState.shouldTrackMidiBeProcessed();
return false;
});
}
When at a midi clip I set the channel to 16 , in single channel mode
const auto channels = generateMPE ? juce::Range<int> (2, 15)
: juce::Range<int>::withStartAndLength (clip.getMidiChannel().getChannelNumber(), 1);
The value of channels would be [16,17] .
So when a MidiNode is created an assert is reached :
MidiNode::MidiNode (std::vector<juce::MidiMessageSequence> sequences,
MidiList::TimeBase tb,
juce::Range<int> midiChannelNumbers,
bool useMPE,
juce::Range<double> editTimeRange,
LiveClipLevel liveClipLevel,
ProcessState& processStateToUse,
EditItemID editItemIDToUse,
std::function<bool()> shouldBeMuted)
: TracktionEngineNode (processStateToUse),
ms (std::move (sequences)),
timeBase (tb),
channelNumbers (midiChannelNumbers),
useMPEChannelMode (useMPE),
editRange (editTimeRange),
clipLevel (liveClipLevel),
editItemID (editItemIDToUse),
shouldBeMutedDelegate (std::move (shouldBeMuted)),
wasMute (liveClipLevel.isMute())
{
jassert (channelNumbers.getStart() > 0 && channelNumbers.getEnd() <= 16);
...
...
}
How can i set the midi channel to 16 avoiding reaching this issue ?