internal protected void ReallocateMidiChannels(MidiDriver midi)
{
Part part, hipart;
byte hipri, lopri;
while (true)
{
hipri = 0;
hipart = null;
for (var i = 0; i < 32; i++)
{
part = _parts[i];
if (part.Player != null && part.Player.MidiDriver == midi &&
!part.Percussion && part.On &&
part.MidiChannel == null && part.PriorityEffective >= hipri)
{
hipri = (byte)part.PriorityEffective;
hipart = part;
}
}
if (hipart == null)
return;
if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
{
lopri = 255;
Part lopart = null;
for (var i = 0; i < 32; i++)
{
part = _parts[i];
if (part.MidiChannel != null && part.MidiChannel.Device == midi && part.PriorityEffective <= lopri)
{
lopri = (byte)part.PriorityEffective;
lopart = part;
}
}
if (lopart == null || lopri >= hipri)
return;
lopart.Off();
if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
return;
}
hipart.SendAll();
}
}