midiMessageReceived method

void midiMessageReceived(
  1. MidiMessage message
)

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: () {},
  );
}