From 43dd73617109d1b14f7f3c26e083ccf52acb1b34 Mon Sep 17 00:00:00 2001 From: Diyan Date: Sun, 12 Mar 2023 23:33:28 +0200 Subject: [PATCH] adden preset hotkeys --- lib/UI/pages/hotkeysMainPage.dart | 2 +- lib/UI/pages/hotkeysSetup.dart | 21 +++++++ .../FlutterBluePlusController.dart | 8 +-- .../devices/presets/presetsStorage.dart | 63 +++++++++++++++++++ lib/midi/ControllerConstants.dart | 7 ++- lib/midi/controllers/ControllerHotkey.dart | 30 +++++++++ 6 files changed, 124 insertions(+), 7 deletions(-) diff --git a/lib/UI/pages/hotkeysMainPage.dart b/lib/UI/pages/hotkeysMainPage.dart index 9c1434b..46b5f7b 100644 --- a/lib/UI/pages/hotkeysMainPage.dart +++ b/lib/UI/pages/hotkeysMainPage.dart @@ -16,7 +16,7 @@ class HotkeysMainPage extends StatelessWidget { body: ListView( children: [ ListTile( - title: const Text("Channel Hotkeys"), + title: const Text("Channel/Preset Hotkeys"), trailing: const Icon(Icons.keyboard_arrow_right), onTap: () => Navigator.of(context).push(MaterialPageRoute( builder: (context) => HotkeysSetup( diff --git a/lib/UI/pages/hotkeysSetup.dart b/lib/UI/pages/hotkeysSetup.dart index f197801..a1e9e51 100644 --- a/lib/UI/pages/hotkeysSetup.dart +++ b/lib/UI/pages/hotkeysSetup.dart @@ -84,6 +84,27 @@ class _HotkeysSetupState extends State { widgets.add(buildWidget("Channel ${i + 1}", Icons.circle, colors[i], HotkeyControl.ChannelByIndex, i, 0, false)); } + + widgets.add(buildWidget("Previous Preset", Icons.keyboard_double_arrow_up, + null, HotkeyControl.PreviousPresetGlobal, 0, 0, false)); + widgets.add(buildWidget("Next Preset", Icons.keyboard_double_arrow_down, + null, HotkeyControl.NextPresetGlobal, 0, 0, false)); + widgets.add(buildWidget( + "Previous Preset in Category", + Icons.keyboard_arrow_up, + null, + HotkeyControl.PreviousPresetCategory, + 0, + 0, + false)); + widgets.add(buildWidget( + "Next Preset in Category", + Icons.keyboard_arrow_down, + null, + HotkeyControl.NextPresetCategory, + 0, + 0, + false)); return widgets; } diff --git a/lib/bluetooth/ble_controllers/FlutterBluePlusController.dart b/lib/bluetooth/ble_controllers/FlutterBluePlusController.dart index 10f35f4..49fd094 100644 --- a/lib/bluetooth/ble_controllers/FlutterBluePlusController.dart +++ b/lib/bluetooth/ble_controllers/FlutterBluePlusController.dart @@ -108,9 +108,9 @@ class FlutterBluePlusController extends BLEController { } @override - void stopScanning() { - if (bleState == BleState.off) return; - flutterBlue.stopScan(); + Future stopScanning() { + if (bleState == BleState.off) return Future.value(null); + return flutterBlue.stopScan(); } @override @@ -128,7 +128,7 @@ class FlutterBluePlusController extends BLEController { } _connectInProgress = true; - stopScanning(); + await stopScanning(); setMidiSetupStatus(MidiSetupStatus.deviceConnecting); try { await ownDevice.connect( diff --git a/lib/bluetooth/devices/presets/presetsStorage.dart b/lib/bluetooth/devices/presets/presetsStorage.dart index 62629f0..b5a597f 100644 --- a/lib/bluetooth/devices/presets/presetsStorage.dart +++ b/lib/bluetooth/devices/presets/presetsStorage.dart @@ -11,6 +11,8 @@ import 'package:uuid/uuid.dart'; import '../../../platform/platformUtils.dart'; +enum PresetChangeDirection { previous, next } + class PresetsStorage extends ChangeNotifier { static final PresetsStorage _storage = PresetsStorage._(); static const presetsFile = "presets.json"; @@ -150,6 +152,29 @@ class PresetsStorage extends ChangeNotifier { return null; } + dynamic findAdjacentPreset( + String uuid, bool acrossCategories, PresetChangeDirection direction) { + int catsCount = presetsData.length; + int catIndex = 0; + + if (uuid.isEmpty) { + return _getAdjacentPreset(0, -1, direction, acrossCategories); + } + for (catIndex = 0; catIndex < catsCount; catIndex++) { + int pIndex = 0; + var cat = presetsData[catIndex]; + var presets = cat["presets"]; + int pCount = presets.length; + for (pIndex = 0; pIndex < pCount; pIndex++) { + if (presets[pIndex]?["uuid"] == uuid) { + return _getAdjacentPreset( + catIndex, pIndex, direction, acrossCategories); + } + } + } + return _getAdjacentPreset(0, -1, direction, acrossCategories); + } + Map? findCategoryOfPreset(Map preset) { for (var cat in presetsData) { for (var pr in cat["presets"]) { @@ -410,6 +435,44 @@ class PresetsStorage extends ChangeNotifier { if (_name != null) savePreset(presetData, _name, category); } + dynamic _getAdjacentPreset(int catIndex, int pIndex, + PresetChangeDirection direction, bool acrossCategory) { + if (presetsData.length <= catIndex) return null; + var catLength = presetsData[catIndex]["presets"].length; + if (direction == PresetChangeDirection.previous) { + pIndex--; + } else { + pIndex++; + } + + if (pIndex < 0) { + if (!acrossCategory) { + pIndex = catLength - 1; + } else { + do { + catIndex--; + if (catIndex < 0) { + catIndex = presetsData.length - 1; + } + } while (presetsData[catIndex]["presets"].length == 0); + pIndex = presetsData[catIndex]["presets"].length - 1; + } + } else if (pIndex >= catLength) { + if (!acrossCategory) { + pIndex = 0; + } else { + do { + catIndex++; + if (catIndex >= presetsData.length) { + catIndex = 0; + } + } while (presetsData[catIndex]["presets"].length == 0); + pIndex = 0; + } + } + return presetsData[catIndex]["presets"][pIndex]; + } + String? _findFreeName(String name, String category) { for (int i = 1; i < 1000; i++) { RegExp regex = RegExp(r"\((\d+)\)$"); diff --git a/lib/midi/ControllerConstants.dart b/lib/midi/ControllerConstants.dart index f75045d..c5f8b6a 100644 --- a/lib/midi/ControllerConstants.dart +++ b/lib/midi/ControllerConstants.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class MidiConstants { static const NoteOn = 0x90; @@ -35,7 +34,11 @@ enum HotkeyControl { JamTracksNextTrack, JamTracksRewind, JamTracksFF, - JamTracksABRepeat; + JamTracksABRepeat, + PreviousPresetGlobal, + NextPresetGlobal, + PreviousPresetCategory, + NextPresetCategory } extension HotkeyLabel on HotkeyControl { diff --git a/lib/midi/controllers/ControllerHotkey.dart b/lib/midi/controllers/ControllerHotkey.dart index 9ef0607..e57a157 100644 --- a/lib/midi/controllers/ControllerHotkey.dart +++ b/lib/midi/controllers/ControllerHotkey.dart @@ -1,5 +1,6 @@ import 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart'; import 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart'; +import 'package:mighty_plug_manager/bluetooth/devices/presets/presetsStorage.dart'; import 'package:mighty_plug_manager/bluetooth/devices/utilities/DelayTapTimer.dart'; import '../../bluetooth/devices/NuxDevice.dart'; import '../../bluetooth/devices/effects/MidiControllerHandles.dart'; @@ -183,6 +184,18 @@ class ControllerHotkey { case HotkeyControl.JamTracksABRepeat: SetlistPlayerState.instance().toggleABRepeat(); break; + case HotkeyControl.PreviousPresetGlobal: + _changeToAdjacentPreset(device, true, PresetChangeDirection.previous); + break; + case HotkeyControl.NextPresetGlobal: + _changeToAdjacentPreset(device, true, PresetChangeDirection.next); + break; + case HotkeyControl.PreviousPresetCategory: + _changeToAdjacentPreset(device, false, PresetChangeDirection.previous); + break; + case HotkeyControl.NextPresetCategory: + _changeToAdjacentPreset(device, false, PresetChangeDirection.next); + break; default: onHotkeyReceived(control); } @@ -194,6 +207,23 @@ class ControllerHotkey { return (val / 127) * 100; } + void _changeToAdjacentPreset( + NuxDevice device, bool acrossCategories, PresetChangeDirection dir) { + var uuid = NuxDeviceControl.instance().presetUUID; + for (int i = 0; i < 200; i++) { + var preset = + PresetsStorage().findAdjacentPreset(uuid, acrossCategories, dir); + if (preset != null && + preset["uuid"] != uuid && + device.isPresetSupported(preset)) { + device.presetFromJson(preset, null); + break; + } else if (preset != null) { + uuid = preset["uuid"]; + } + } + } + void _modifyTempo(NuxDevice device, double amount) { double newTempo = device.drumsTempo + amount; device.setDrumsTempo(newTempo, true);