diff options
Diffstat (limited to 'solo-tool-project/src')
| -rw-r--r-- | solo-tool-project/src/solo_tool/handlers.py | 21 | ||||
| -rw-r--r-- | solo-tool-project/src/solo_tool/midi_controller_launchpad_mini.py | 67 | ||||
| -rw-r--r-- | solo-tool-project/src/solo_tool/solo_tool.py | 29 | 
3 files changed, 50 insertions, 67 deletions
| diff --git a/solo-tool-project/src/solo_tool/handlers.py b/solo-tool-project/src/solo_tool/handlers.py new file mode 100644 index 0000000..13e982b --- /dev/null +++ b/solo-tool-project/src/solo_tool/handlers.py @@ -0,0 +1,21 @@ +from collections.abc import Callable + +from solo_tool.solo_tool import SoloTool + +def changeSong(st: SoloTool, delta: int) -> Callable[[], None]: +    def f(): +        if st.song is None: +            st.song = 0 +        else: +            st.song += delta +    return f + +def seekRelative(st: SoloTool, delta: float) -> Callable[[], None]: +    def f(): +        st.position += delta +    return f + +def positionToKeyPoint(st: SoloTool) -> Callable[[], None]: +    def f(): +        st.keyPoint = st.position +    return f diff --git a/solo-tool-project/src/solo_tool/midi_controller_launchpad_mini.py b/solo-tool-project/src/solo_tool/midi_controller_launchpad_mini.py index 4fde8fc..3dc8ec6 100644 --- a/solo-tool-project/src/solo_tool/midi_controller_launchpad_mini.py +++ b/solo-tool-project/src/solo_tool/midi_controller_launchpad_mini.py @@ -1,5 +1,5 @@  from .midi_wrapper_mido import MidiWrapper -from .solo_tool_controller import SoloToolController +from . import handlers  class MidiController:      DEVICE_NAME = "Launchpad Mini MIDI 1" @@ -20,7 +20,6 @@ class MidiController:      def __init__(self, soloTool, midiWrapperOverride=None):          self._soloTool = soloTool -        self._soloToolController = SoloToolController(soloTool)          if midiWrapperOverride is not None:              self._midiWrapper = midiWrapperOverride          else: @@ -28,31 +27,25 @@ class MidiController:          self._registerHandlers()          self._soloTool.registerPlayingStateCallback(self._updatePlayPauseButton) -        self._soloTool.registerPlaybackVolumeCallback(self._updateVolumeRow) -        self._soloTool.registerPlaybackRateCallback(self._updateRateRow) -        self._soloTool.registerAbLimitEnabledCallback(self._updateToggleAbLimitEnableButton) - -        self._aLimit = 0.0 -        self._bLimit = 0.0 +        self._soloTool.registerVolumeCallback(self._updateVolumeRow) +        self._soloTool.registerRateCallback(self._updateRateRow)      def _registerHandlers(self):          self._handlers = {              96  : self._soloTool.stop, -            114 : self._soloTool.jumpToA, +            114 : self._soloTool.jump,              112 : self._playPause, -            98  : self._toggleAbLimitEnable, -            118 : self._soloTool.previousStoredAbLimits, -            119 : self._soloTool.nextStoredAbLimits, -            116 : self._setALimit, -            117 : self._setBLimit, -            48  : self._soloToolController.previousSong, -            49  : self._createSeekHandler(-0.25), -            50  : self._createSeekHandler(-0.05), -            51  : self._createSeekHandler(-0.01), -            52  : self._createSeekHandler(0.01), -            53  : self._createSeekHandler(0.05), -            54  : self._createSeekHandler(0.25), -            55  : self._soloToolController.nextSong, +            #118 : self._soloTool.previousStoredAbLimits, +            #119 : self._soloTool.nextStoredAbLimits, +            117 : handlers.positionToKeyPoint(self._soloTool), +            48  : handlers.changeSong(self._soloTool, -1),  +            49  : handlers.seekRelative(self._soloTool, -0.25), +            50  : handlers.seekRelative(self._soloTool, -0.05), +            51  : handlers.seekRelative(self._soloTool, -0.01), +            52  : handlers.seekRelative(self._soloTool, 0.01), +            53  : handlers.seekRelative(self._soloTool, 0.05), +            54  : handlers.seekRelative(self._soloTool, 0.25), +            55  : handlers.changeSong(self._soloTool, 1),           }          for i in range(0, 8): @@ -84,24 +77,6 @@ class MidiController:          else:              self._soloTool.play() -    def _createSeekHandler(self, delta): -        def f(): -            newPosition = self._soloTool.getPlaybackPosition() + delta -            newPosition = min(1.0, max(0.0, newPosition)) -            self._soloTool.setPlaybackPosition(newPosition) -        return f  - -    def _setALimit(self): -        self._aLimit = self._soloTool.getPlaybackPosition() -        self._soloTool.setAbLimits(self._aLimit, self._bLimit) - -    def _setBLimit(self): -        self._bLimit = self._soloTool.getPlaybackPosition() -        self._soloTool.setAbLimits(self._aLimit, self._bLimit) -     -    def _toggleAbLimitEnable(self): -        self._soloTool.setAbLimitEnable(not self._soloTool.isAbLimitEnabled()) -      def _updatePlayPauseButton(self, playing):          if playing:              self._setButtonLED(7, 0, MidiController.LED_GREEN) @@ -128,12 +103,12 @@ class MidiController:      def _createSetPlaybackRateCallback(self, rate):          def f(): -            self._soloTool.setPlaybackRate(rate) +            self._soloTool.rate = rate          return f      def _createSetPlaybackVolumeCallback(self, volume):          def f(): -            self._soloTool.setPlaybackVolume(volume) +            self._soloTool.volume = volume          return f      def _setButtonLED(self, row, col, colour): @@ -153,23 +128,19 @@ class MidiController:          self._allLEDsOff()          # volume buttons -        self._updateVolumeRow(self._soloTool.getPlaybackVolume()) +        self._updateVolumeRow(self._soloTool.volume)          # playback rate buttons -        self._updateRateRow(self._soloTool.getPlaybackRate()) +        self._updateRateRow(self._soloTool.rate)          # playback control          self._setButtonLED(6, 0, MidiController.LED_RED)          self._updatePlayPauseButton(self._soloTool.isPlaying()) -        # AB repeat toggle -        self._updateToggleAbLimitEnableButton(self._soloTool.isAbLimitEnabled()) -          # AB control          self._setButtonLED(7, 2, MidiController.LED_YELLOW)          self._setButtonLED(7, 6, MidiController.LED_RED)          self._setButtonLED(7, 7, MidiController.LED_GREEN) -        self._setButtonLED(7, 4, MidiController.LED_YELLOW)          self._setButtonLED(7, 5, MidiController.LED_YELLOW)          # Song control diff --git a/solo-tool-project/src/solo_tool/solo_tool.py b/solo-tool-project/src/solo_tool/solo_tool.py index 884721b..97c3495 100644 --- a/solo-tool-project/src/solo_tool/solo_tool.py +++ b/solo-tool-project/src/solo_tool/solo_tool.py @@ -40,9 +40,10 @@ class SoloTool:      @song.setter      def song(self, new: int) -> None: -        if new is None or new < 0 or new >= len(self._songs): -            raise ValueError() -        if new != self._song: +        if new is not None \ +           and new >= 0 \ +           and new < len(self._songs) \ +           and new != self._song:              self._updateSong(new)      @property @@ -53,9 +54,7 @@ class SoloTool:      @keyPoints.setter      def keyPoints(self, new: list[float]) -> None: -        if new is None: -            raise ValueError() -        if self._song is not None: +        if new is not None and self._song is not None:              sanitized = sorted(list(set([p for p in new if SoloTool._keyPointValid(p)])))              self._keyPoints[self._song] = sanitized @@ -65,9 +64,7 @@ class SoloTool:      @keyPoint.setter      def keyPoint(self, new: float) -> None: -        if not SoloTool._keyPointValid(new): -            raise ValueError() -        if self._song is not None and new != self._keyPoint: +        if self._song is not None and SoloTool._keyPointValid(new) and new != self._keyPoint:              self._keyPoint = new              self._notifier.notify(Notifier.CURRENT_KEY_POINT_EVENT, new) @@ -92,9 +89,7 @@ class SoloTool:      @rate.setter      def rate(self, new: float) -> None: -        if new is None or new <= 0.0: -            raise ValueError() -        if new != self._player.getPlaybackRate(): +        if new is not None and new >= 0.0 and new != self._player.getPlaybackRate():              self._player.setPlaybackRate(new)              self._notifier.notify(Notifier.PLAYBACK_RATE_EVENT, new) @@ -104,9 +99,7 @@ class SoloTool:      @volume.setter      def volume(self, new: float) -> None: -        if new is None or new < 0.0: -            raise ValueError() -        if new != self._player.getPlaybackVolume(): +        if new is not None and new >= 0.0 and new != self._player.getPlaybackVolume():              self._player.setPlaybackVolume(new)              self._notifier.notify(Notifier.PLAYBACK_VOLUME_EVENT, new) @@ -116,11 +109,9 @@ class SoloTool:      @position.setter      def position(self, new: float) -> None: -        if new is None or new < 0.0 or new >= 1.0: -            raise ValueError()          # TODO stop playback before changing position? -        if new != self._player.getPlaybackPosition(): -            self._player.setPlaybackPosition(new) +        if new is not None and new != self._player.getPlaybackPosition(): +            self._player.setPlaybackPosition(min(max(0.0, new), 1.0))      def registerPlayingStateCallback(self, callback):          self._notifier.registerCallback(Notifier.PLAYING_STATE_EVENT, callback) | 
