-bool MidiModel::control_to_midi_event(MIDI::Event& ev,
- const MidiControlIterator& iter) const
-{
- assert(iter.automation_list.get() != 0);
-
- switch (iter.automation_list->parameter().type()) {
- case MidiCCAutomation:
- if (ev.size() < 3) {
- ev.set_buffer((Byte*)malloc(3), true);
- }
-
- assert(iter.automation_list);
- assert(iter.automation_list->parameter().channel() < 16);
- assert(iter.automation_list->parameter().id() <= INT8_MAX);
- assert(iter.y <= INT8_MAX);
- ev.buffer()[0] = MIDI_CMD_CONTROL + iter.automation_list->parameter().channel();
- ev.buffer()[1] = (Byte)iter.automation_list->parameter().id();
- ev.buffer()[2] = (Byte)iter.y;
- ev.time() = iter.x;
- ev.size() = 3;
- return true;
-
- case MidiPgmChangeAutomation:
- if (ev.size() < 2) {
- ev.set_buffer((Byte*)malloc(2), true);
- }
-
- assert(iter.automation_list);
- assert(iter.automation_list->parameter().channel() < 16);
- assert(iter.automation_list->parameter().id() == 0);
- assert(iter.y <= INT8_MAX);
- ev.buffer()[0] = MIDI_CMD_PGM_CHANGE + iter.automation_list->parameter().channel();
- ev.buffer()[1] = (Byte)iter.y;
- ev.time() = iter.x;
- ev.size() = 2;
- return true;
-
- case MidiPitchBenderAutomation:
- if (ev.size() < 3) {
- ev.set_buffer((Byte*)malloc(3), true);
- }
-
- assert(iter.automation_list);
- assert(iter.automation_list->parameter().channel() < 16);
- assert(iter.automation_list->parameter().id() == 0);
- assert(iter.y < (1<<14));
- ev.buffer()[0] = MIDI_CMD_BENDER + iter.automation_list->parameter().channel();
- ev.buffer()[1] = ((Byte)iter.y) & 0x7F; // LSB
- ev.buffer()[2] = (((Byte)iter.y) >> 7) & 0x7F; // MSB
- ev.time() = iter.x;
- ev.size() = 3;
- return true;
-
- case MidiChannelAftertouchAutomation:
- if (ev.size() < 2) {
- ev.set_buffer((Byte*)malloc(2), true);
- }