Fix loading, recording & saving MIDI with PolyKeyPressure events.
GUI still does not handle this (neither automation lane, nor List Editor), but the file loads, plays and exports correctly.
This commit is contained in:
parent
9bf4f339b9
commit
2f30d763ed
@ -115,7 +115,7 @@ EventTypeMap::interpolation_of(const Evoral::Parameter& param)
|
|||||||
break;
|
break;
|
||||||
case MidiPgmChangeAutomation: return Evoral::ControlList::Discrete; break;
|
case MidiPgmChangeAutomation: return Evoral::ControlList::Discrete; break;
|
||||||
case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break;
|
case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break;
|
||||||
case MidiNotePressureAutomation: return Evoral::ControlList::Linear; break;
|
case MidiNotePressureAutomation: return Evoral::ControlList::Linear; break;
|
||||||
case MidiPitchBenderAutomation: return Evoral::ControlList::Linear; break;
|
case MidiPitchBenderAutomation: return Evoral::ControlList::Linear; break;
|
||||||
default: assert(false);
|
default: assert(false);
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ EventTypeMap::to_symbol(const Evoral::Parameter& param) const
|
|||||||
return string_compose("midi-pitch-bender-%1", int(param.channel()));
|
return string_compose("midi-pitch-bender-%1", int(param.channel()));
|
||||||
} else if (t == MidiChannelPressureAutomation) {
|
} else if (t == MidiChannelPressureAutomation) {
|
||||||
return string_compose("midi-channel-pressure-%1", int(param.channel()));
|
return string_compose("midi-channel-pressure-%1", int(param.channel()));
|
||||||
} else if (t == MidiChannelPressureAutomation) {
|
} else if (t == MidiNotePressureAutomation) {
|
||||||
return string_compose("midi-note-pressure-%1-%2", int(param.channel()), param.id());
|
return string_compose("midi-note-pressure-%1-%2", int(param.channel()), param.id());
|
||||||
} else {
|
} else {
|
||||||
PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
|
PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
|
||||||
|
@ -337,6 +337,7 @@ Sequence<Time>::const_iterator::operator++()
|
|||||||
|| ev.is_pgm_change()
|
|| ev.is_pgm_change()
|
||||||
|| ev.is_pitch_bender()
|
|| ev.is_pitch_bender()
|
||||||
|| ev.is_channel_pressure()
|
|| ev.is_channel_pressure()
|
||||||
|
|| ev.is_poly_pressure()
|
||||||
|| ev.is_sysex()) ) {
|
|| ev.is_sysex()) ) {
|
||||||
cerr << "WARNING: Unknown event (type " << _type << "): " << hex
|
cerr << "WARNING: Unknown event (type " << _type << "): " << hex
|
||||||
<< int(ev.buffer()[0]) << int(ev.buffer()[1]) << int(ev.buffer()[2]) << endl;
|
<< int(ev.buffer()[0]) << int(ev.buffer()[1]) << int(ev.buffer()[2]) << endl;
|
||||||
@ -573,6 +574,19 @@ Sequence<Time>::control_to_midi_event(
|
|||||||
ev->buffer()[2] = (uint16_t(iter.y) >> 7) & 0x7F; // MSB
|
ev->buffer()[2] = (uint16_t(iter.y) >> 7) & 0x7F; // MSB
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MIDI_CMD_NOTE_PRESSURE:
|
||||||
|
assert(iter.list.get());
|
||||||
|
assert(iter.list->parameter().channel() < 16);
|
||||||
|
assert(iter.list->parameter().id() <= INT8_MAX);
|
||||||
|
assert(iter.y <= INT8_MAX);
|
||||||
|
|
||||||
|
ev->set_time(Time(iter.x));
|
||||||
|
ev->realloc(3);
|
||||||
|
ev->buffer()[0] = MIDI_CMD_NOTE_PRESSURE + iter.list->parameter().channel();
|
||||||
|
ev->buffer()[1] = (uint8_t)iter.list->parameter().id();
|
||||||
|
ev->buffer()[2] = (uint8_t)iter.y;
|
||||||
|
break;
|
||||||
|
|
||||||
case MIDI_CMD_CHANNEL_PRESSURE:
|
case MIDI_CMD_CHANNEL_PRESSURE:
|
||||||
assert(iter.list.get());
|
assert(iter.list.get());
|
||||||
assert(iter.list->parameter().channel() < 16);
|
assert(iter.list->parameter().channel() < 16);
|
||||||
|
Loading…
Reference in New Issue
Block a user