251 |
<< "This is a bug, please report it!\n" << std::flush; |
<< "This is a bug, please report it!\n" << std::flush; |
252 |
return; |
return; |
253 |
} |
} |
254 |
|
std::vector<int> maps = MidiInstrumentMapper::Maps(); |
255 |
|
if (maps.empty()) return; |
256 |
|
|
257 |
const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); |
const MidiChannelMap_t& midiChannelMap = MidiChannelMapReader.Lock(); |
258 |
// dispatch event for engines listening to the same MIDI channel |
// dispatch event for engines listening to the same MIDI channel |
259 |
{ |
{ |
261 |
std::set<EngineChannel*>::iterator end = midiChannelMap[MidiChannel].end(); |
std::set<EngineChannel*>::iterator end = midiChannelMap[MidiChannel].end(); |
262 |
for (; engineiter != end; engineiter++) { |
for (; engineiter != end; engineiter++) { |
263 |
(*engineiter)->SetMidiProgram(Program); |
(*engineiter)->SetMidiProgram(Program); |
264 |
// is there a mapping for this MIDI bank&prog pair? |
if ((*engineiter)->UsesNoMidiInstrumentMap()) continue; |
265 |
|
// retrieve the MIDI instrument map this engine channel is assigned to |
266 |
|
int iMapID = ((*engineiter)->UsesDefaultMidiInstrumentMap()) |
267 |
|
? maps[0] /*default*/ : (*engineiter)->GetMidiInstrumentMap(); |
268 |
|
// is there an entry for this MIDI bank&prog pair in that map? |
269 |
midi_prog_index_t midiIndex; |
midi_prog_index_t midiIndex; |
270 |
midiIndex.midi_bank_msb = (*engineiter)->GetMidiBankMsb(); |
midiIndex.midi_bank_msb = (*engineiter)->GetMidiBankMsb(); |
271 |
midiIndex.midi_bank_lsb = (*engineiter)->GetMidiBankLsb(); |
midiIndex.midi_bank_lsb = (*engineiter)->GetMidiBankLsb(); |
272 |
midiIndex.midi_prog = (*engineiter)->GetMidiProgram(); |
midiIndex.midi_prog = (*engineiter)->GetMidiProgram(); |
273 |
optional<MidiInstrumentMapper::entry_t> mapping = |
optional<MidiInstrumentMapper::entry_t> mapping = |
274 |
MidiInstrumentMapper::GetEntry(midiIndex); |
MidiInstrumentMapper::GetEntry(iMapID, midiIndex); |
275 |
if (mapping) { // if mapping exists ... |
if (mapping) { // if mapping exists ... |
276 |
InstrumentManager::instrument_id_t id; |
InstrumentManager::instrument_id_t id; |
277 |
id.FileName = mapping->InstrumentFile; |
id.FileName = mapping->InstrumentFile; |
288 |
std::set<EngineChannel*>::iterator end = midiChannelMap[midi_chan_all].end(); |
std::set<EngineChannel*>::iterator end = midiChannelMap[midi_chan_all].end(); |
289 |
for (; engineiter != end; engineiter++) { |
for (; engineiter != end; engineiter++) { |
290 |
(*engineiter)->SetMidiProgram(Program); |
(*engineiter)->SetMidiProgram(Program); |
291 |
// is there a mapping for this MIDI bank&prog pair? |
if ((*engineiter)->UsesNoMidiInstrumentMap()) continue; |
292 |
|
// retrieve the MIDI instrument map this engine channel is assigned to |
293 |
|
int iMapID = ((*engineiter)->UsesDefaultMidiInstrumentMap()) |
294 |
|
? maps[0] /*default*/ : (*engineiter)->GetMidiInstrumentMap(); |
295 |
|
// is there an entry for this MIDI bank&prog pair in that map? |
296 |
midi_prog_index_t midiIndex; |
midi_prog_index_t midiIndex; |
297 |
midiIndex.midi_bank_msb = (*engineiter)->GetMidiBankMsb(); |
midiIndex.midi_bank_msb = (*engineiter)->GetMidiBankMsb(); |
298 |
midiIndex.midi_bank_lsb = (*engineiter)->GetMidiBankLsb(); |
midiIndex.midi_bank_lsb = (*engineiter)->GetMidiBankLsb(); |
299 |
midiIndex.midi_prog = (*engineiter)->GetMidiProgram(); |
midiIndex.midi_prog = (*engineiter)->GetMidiProgram(); |
300 |
optional<MidiInstrumentMapper::entry_t> mapping = |
optional<MidiInstrumentMapper::entry_t> mapping = |
301 |
MidiInstrumentMapper::GetEntry(midiIndex); |
MidiInstrumentMapper::GetEntry(iMapID, midiIndex); |
302 |
if (mapping) { // if mapping exists ... |
if (mapping) { // if mapping exists ... |
303 |
InstrumentManager::instrument_id_t id; |
InstrumentManager::instrument_id_t id; |
304 |
id.FileName = mapping->InstrumentFile; |
id.FileName = mapping->InstrumentFile; |