Move EMIDI message handling

This commit is contained in:
ceski 2023-05-12 21:48:19 -07:00
parent 2a6bcdca72
commit e2bf6fb0d8

View File

@ -633,12 +633,151 @@ static void CheckFFLoop(const midi_event_t *event)
} }
} }
static boolean AddToBuffer(unsigned int delta_time, const midi_event_t *event, static void SendEMIDI(unsigned int delta_time, const midi_event_t *event,
win_midi_track_t *track) win_midi_track_t *track, const midi_fallback_t *fallback)
{ {
unsigned int i; unsigned int i;
unsigned int flag; unsigned int flag;
int count; int count;
switch ((int)event->event_type)
{
case EMIDI_CONTROLLER_TRACK_DESIGNATION:
if (track->elapsed_time < timediv)
{
flag = event->data.channel.param2;
if (flag == EMIDI_DEVICE_ALL)
{
track->emidi_device_flags = UINT_MAX;
track->emidi_designated = true;
}
else if (flag <= EMIDI_DEVICE_ULTRASOUND)
{
track->emidi_device_flags |= 1 << flag;
track->emidi_designated = true;
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_TRACK_EXCLUSION:
if (song.rpg_loop)
{
SetLoopPoint();
}
else if (track->elapsed_time < timediv)
{
flag = event->data.channel.param2;
if (!track->emidi_designated)
{
track->emidi_device_flags = UINT_MAX;
track->emidi_designated = true;
}
if (flag <= EMIDI_DEVICE_ULTRASOUND)
{
track->emidi_device_flags &= ~(1 << flag);
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_PROGRAM_CHANGE:
if (track->emidi_program || track->elapsed_time < timediv)
{
track->emidi_program = true;
SendProgramMsg(delta_time, event->data.channel.channel,
event->data.channel.param2, fallback);
}
else
{
SendNOPMsg(delta_time);
}
break;
case EMIDI_CONTROLLER_VOLUME:
if (track->emidi_volume || track->elapsed_time < timediv)
{
track->emidi_volume = true;
SendVolumeMsg(delta_time, event);
}
else
{
SendNOPMsg(delta_time);
}
break;
case EMIDI_CONTROLLER_LOOP_BEGIN:
count = event->data.channel.param2;
count = (count == 0) ? (-1) : count;
track->emidi_loop_count = count;
MIDI_SetLoopPoint(track->iter);
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_LOOP_END:
if (event->data.channel.param2 == EMIDI_LOOP_FLAG)
{
if (track->emidi_loop_count != 0)
{
MIDI_RestartAtLoopPoint(track->iter);
}
if (track->emidi_loop_count > 0)
{
track->emidi_loop_count--;
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_GLOBAL_LOOP_BEGIN:
count = event->data.channel.param2;
count = (count == 0) ? (-1) : count;
for (i = 0; i < song.num_tracks; ++i)
{
song.tracks[i].emidi_loop_count = count;
MIDI_SetLoopPoint(song.tracks[i].iter);
song.tracks[i].saved_end_of_track = song.tracks[i].end_of_track;
song.tracks[i].saved_elapsed_time = song.tracks[i].elapsed_time;
}
song.saved_elapsed_time = song.elapsed_time;
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_GLOBAL_LOOP_END:
if (event->data.channel.param2 == EMIDI_LOOP_FLAG)
{
for (i = 0; i < song.num_tracks; ++i)
{
if (song.tracks[i].emidi_loop_count != 0)
{
MIDI_RestartAtLoopPoint(song.tracks[i].iter);
song.tracks[i].end_of_track = song.tracks[i].saved_end_of_track;
song.tracks[i].elapsed_time = song.tracks[i].saved_elapsed_time;
song.elapsed_time = song.saved_elapsed_time;
}
if (song.tracks[i].emidi_loop_count > 0)
{
song.tracks[i].emidi_loop_count--;
}
}
}
SendNOPMsg(delta_time);
break;
default:
SendNOPMsg(delta_time);
break;
}
}
static boolean AddToBuffer(unsigned int delta_time, const midi_event_t *event,
win_midi_track_t *track)
{
midi_fallback_t fallback = {FALLBACK_NONE, 0}; midi_fallback_t fallback = {FALLBACK_NONE, 0};
if (use_fallback) if (use_fallback)
@ -736,130 +875,14 @@ static boolean AddToBuffer(unsigned int delta_time, const midi_event_t *event,
break; break;
case EMIDI_CONTROLLER_TRACK_DESIGNATION: case EMIDI_CONTROLLER_TRACK_DESIGNATION:
if (track->elapsed_time < timediv)
{
flag = event->data.channel.param2;
if (flag == EMIDI_DEVICE_ALL)
{
track->emidi_device_flags = UINT_MAX;
track->emidi_designated = true;
}
else if (flag <= EMIDI_DEVICE_ULTRASOUND)
{
track->emidi_device_flags |= 1 << flag;
track->emidi_designated = true;
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_TRACK_EXCLUSION: case EMIDI_CONTROLLER_TRACK_EXCLUSION:
if (song.rpg_loop)
{
SetLoopPoint();
}
else if (track->elapsed_time < timediv)
{
flag = event->data.channel.param2;
if (!track->emidi_designated)
{
track->emidi_device_flags = UINT_MAX;
track->emidi_designated = true;
}
if (flag <= EMIDI_DEVICE_ULTRASOUND)
{
track->emidi_device_flags &= ~(1 << flag);
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_PROGRAM_CHANGE: case EMIDI_CONTROLLER_PROGRAM_CHANGE:
if (track->emidi_program || track->elapsed_time < timediv)
{
track->emidi_program = true;
SendProgramMsg(delta_time, event->data.channel.channel,
event->data.channel.param2, &fallback);
}
else
{
SendNOPMsg(delta_time);
}
break;
case EMIDI_CONTROLLER_VOLUME: case EMIDI_CONTROLLER_VOLUME:
if (track->emidi_volume || track->elapsed_time < timediv)
{
track->emidi_volume = true;
SendVolumeMsg(delta_time, event);
}
else
{
SendNOPMsg(delta_time);
}
break;
case EMIDI_CONTROLLER_LOOP_BEGIN: case EMIDI_CONTROLLER_LOOP_BEGIN:
count = event->data.channel.param2;
count = (count == 0) ? (-1) : count;
track->emidi_loop_count = count;
MIDI_SetLoopPoint(track->iter);
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_LOOP_END: case EMIDI_CONTROLLER_LOOP_END:
if (event->data.channel.param2 == EMIDI_LOOP_FLAG)
{
if (track->emidi_loop_count != 0)
{
MIDI_RestartAtLoopPoint(track->iter);
}
if (track->emidi_loop_count > 0)
{
track->emidi_loop_count--;
}
}
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_GLOBAL_LOOP_BEGIN: case EMIDI_CONTROLLER_GLOBAL_LOOP_BEGIN:
count = event->data.channel.param2;
count = (count == 0) ? (-1) : count;
for (i = 0; i < song.num_tracks; ++i)
{
song.tracks[i].emidi_loop_count = count;
MIDI_SetLoopPoint(song.tracks[i].iter);
song.tracks[i].saved_end_of_track = song.tracks[i].end_of_track;
song.tracks[i].saved_elapsed_time = song.tracks[i].elapsed_time;
}
song.saved_elapsed_time = song.elapsed_time;
SendNOPMsg(delta_time);
break;
case EMIDI_CONTROLLER_GLOBAL_LOOP_END: case EMIDI_CONTROLLER_GLOBAL_LOOP_END:
if (event->data.channel.param2 == EMIDI_LOOP_FLAG) SendEMIDI(delta_time, event, track, &fallback);
{
for (i = 0; i < song.num_tracks; ++i)
{
if (song.tracks[i].emidi_loop_count != 0)
{
MIDI_RestartAtLoopPoint(song.tracks[i].iter);
song.tracks[i].end_of_track = song.tracks[i].saved_end_of_track;
song.tracks[i].elapsed_time = song.tracks[i].saved_elapsed_time;
song.elapsed_time = song.saved_elapsed_time;
}
if (song.tracks[i].emidi_loop_count > 0)
{
song.tracks[i].emidi_loop_count--;
}
}
}
SendNOPMsg(delta_time);
break; break;
case MIDI_CONTROLLER_RESET_ALL_CTRLS: case MIDI_CONTROLLER_RESET_ALL_CTRLS: