midiMessageReceived method
Implementation
void midiMessageReceived(MidiMessage message) {
state.maybeWhen(
waitForMidi: (mappedParameterId) {
unawaited(
message.maybeMap(
controlChange: (message) async {
_log.info('Got MIDI: $message');
state = const MidiLearnState.savingMapping();
final channel = message.channel;
final control = message.control;
final similarMappings = mappingService.mappings.entries.map((e) {
_log.fine(e);
return e;
}).where(
(e) =>
(e.value.midiChannel == channel &&
e.value.ccNumber == control) ||
switch (e.value) {
MidiMappingToggle(:final parameterId) ||
MidiMappingParameter(:final parameterId) =>
parameterId,
MidiMappingButton() => null,
} ==
mappedParameterId,
);
// Need copy to prevent concurrent modification of the lazy iterator
final similarMappingsList =
List<MapEntry<MidiMappingId, MidiMapping>>.from(
similarMappings,
);
if (similarMappingsList.isNotEmpty) {
for (final mapping in similarMappingsList) {
_log.info('removing similar mapping: $mapping');
await mappingService.deleteMapping(id: mapping.key);
}
}
await mappingService.createMapping(
MidiMapping.parameter(
ccNumber: control,
midiChannel: channel,
parameterId: mappedParameterId,
),
);
state = MidiLearnState.idle(similarMappingsList);
},
orElse: () => null,
),
);
},
orElse: () {},
);
}