aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEddy Pedroni <eddy@0xf7.com>2022-01-03 15:45:32 +0100
committerEddy Pedroni <eddy@0xf7.com>2022-01-03 15:45:32 +0100
commit3472fa7854b575d0d08b4baa23a672cccd1ccaab (patch)
tree34014edd506970595fe904c8ddc13b8a7371c0a8
parente2d0e84992c539d0aa249483cad3ceca96bb03d9 (diff)
Added LED feedback for start/pause/stop, implementation is hacky but passes test
-rw-r--r--diagram.drawio2
-rw-r--r--known-issues.md2
-rw-r--r--midi_controller_launchpad_mini.py10
-rw-r--r--midi_launchpad_mini_integrationtest.py20
4 files changed, 27 insertions, 7 deletions
diff --git a/diagram.drawio b/diagram.drawio
index 9b04ef2..9c2adf7 100644
--- a/diagram.drawio
+++ b/diagram.drawio
@@ -1 +1 @@
-<mxfile host="Electron" modified="2021-12-31T17:40:45.116Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/16.0.2 Chrome/96.0.4664.55 Electron/16.0.5 Safari/537.36" etag="sPgYuBUoq8Zz1AG5Rgi6" version="16.0.2" type="device" pages="3"><diagram id="g-wcGVps3MkI6_XAwNEs" name="Core">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</diagram><diagram id="yK3rgzEW7m2RTtpwjvJ6" name="MIDI">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</diagram><diagram id="PyNSc7ezSt42GBdjTBvd" name="Launchpad">5ZxNc6M4EIZ/jY+7RUt8SMdJJjN7mL1sDlO7N2Jkm1lsuTCOnf31i21wsFquYqpiN81cUtDCEN5W0U83oifycbn/WqbrxZ82M8VEBNl+Ij9PhFBxXP89GN5OhigRJ8O8zLOTCd4Nz/l/pjEGjXWbZ2ZzcWBlbVHl60vj1K5WZlpd2NKytLvLw2a2uLzqOp0bZHiepgW2fs+zatHclkje7X+YfL5orwyxPo0s0/bg5k42izSzu45JPk3kY2ltddpa7h9NcdCu1eWf6sfMPMntbvbX5sti9X327e9vv51O9uVnfnK+hdKsqo89tWxu9jUttuZ8a3FRX+bhpay35oetV1tslwbbQfweTUTUyFO9tZqXdrvKzOG6UB+1W+SVeV6n08Porp5ktW1RLYtmuHZ8leYrU9b7Qb0/y4vi0Ra2PJ5LZpFRWVjbN1Vp/zWdESVeZD075UNPeRoZX01ZmX1ncjRyfTV2aaryrT6kGQ0bxzczP2l2d51p1JgWnRnU2tJm4s7P5313Tr3R+OcnfNX+Ox1fQYydslmbWnpkjoJbe2o2M/F06vNUluiXILifpyBKiF0FyFVSfKz4d5JShBGxlAJJGSqWUsp2CpBJKZGUcchSyhA0sZQhkrK9FjMpoyAmljJCUmpfWKvs+rbhS02NP3y9qCiM7ukSHRK7JMakAQL7ZF2kb4cr4YF0uzE39dZwsDBWQOsthZ9F0J/hxZgJHuSwEF7hZx0kvRE+HjPCu64iZ3iFH4JS8gjxrpbkEK8SpGWoeWpJTvFKIS3jD34q3EtLcoxXuPzVRnNuWpJzvMblKZ0w1ZIawDWuHwEwDT7kfKxx2cOTy1zjY5mMusZ9frsxEELWnmRG9SbkZMyE7LqKnJA1zmYkk3qiqyU5IWucbURMCoquluSErHG20b7F5qYlOSFrnG0owVNLekLG2YZm8ioLaUlNyBB43oYD0+hDjsgQCBzK+zPy7dcWEBKyhGERMgQ4nzlEiZ6IrMaMyK6vyBEZApzPSCbVOldMckaGACccEZNynSsmOSRDgDOOmEm9zhWTnJIhwCmHYlKvc8Ukx2QIcM7RojM7Mek5GScdAEwjED0nAy7Mh/05OR77eumBkTLgrMa3vP0KKesxk7LrK3pSBpzWSCZVO1dMelIGnHZEgqeY9KQMOO2ImdTtXDHpSRlw2qGYlO1cMelJGXDacS6MslOTHJUB5x3n6cpNTXpUbmvc3RDUH5WTUYOyHhgoC5zW+NaQXwHl4yNnvKSsh0bKAqc1kknlzhWTnpQFTjsiJpU7V0x6UhY47YiZVO5cMelJWeC0Q33wU/ZeYtKTsvB80hZ4QtyP7XKNrZWtf/rpV4lw9CQuPHkNMA1xAyBx/ArA84HtNRJX414AHamBsbjEedNhvy+Lw5hZ3HUWPYtLT6cPJrVBV0x6Fm/5tcviTGqDrpj0LC5xYtM+27iJSc/i0tPvg0ll0BWTnsUlTmyOC1BRF4nSvOZ2u8Ejnx5uG+HoWoEgb5GzuPQ1A/F8knXdWxu7mv8q/qKnfYnfYnhaTFxt6Xf7Wi4h7MfJ0GAfp2a+hffXYF+MGfZdZ9HDvqcDY+vAoVOAKyY97Ht6JEZMypuumPSw7+mSmDBZGe+KSQ/7nj6Jiknx0RWTHvY9nRKPXzC5sWxl9tXdQX9AKEIP+p5GjOD7sMzvqZtD/oB8dUPIr3ffO4ofxzpt2eXT/w==</diagram></mxfile> \ No newline at end of file
+<mxfile host="app.diagrams.net" modified="2022-01-02T18:11:26.905Z" agent="5.0 (X11)" etag="ZRZDn0ylDtk9jY6zPyr3" version="16.1.2" type="device" pages="3"><diagram id="g-wcGVps3MkI6_XAwNEs" name="Core">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</diagram><diagram id="yK3rgzEW7m2RTtpwjvJ6" name="MIDI">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</diagram><diagram id="PyNSc7ezSt42GBdjTBvd" name="Launchpad">5ZxRk6I4EMc/jY93RScQksfd2dm9h72Xm4etuzdGorKHxkIcnfv0hwqOpmOVWzXaNPM00EEY/p2if92EHsmH+fZblS1nf7rcliMR5duR/DISAmIRNX92lteDRRtxMEyrIm8PejM8Ff/Z1tj+broucrs6O7B2rqyL5blx7BYLO67PbFlVuc35YRNXnl91mU0tMjyNsxJbfxR5PWvvQqRv9j9sMZ11VwZlDiPzrDu4vZPVLMvd5sQkH0fyoXKuPmzNtw+23InX6fJP/XNiH+V6M/lr9XW2+DH5/vf33w4n+/orPzneQmUX9fueWrY3+5KVa3u8NVU2l/n8XDVb093WiyvXc4vtIH5PRiJp5alfO80rt17kdnddaI7azIraPi2z8W5008yyxjar52U73Di+zoqFrZr9qNmfFGX54EpX7c8l88TqPG7sq7py/9qTES2epVLNyJXytDK+2Kq225PJ0cr1zbq5ravX5pB2NG4d3878tN3dnEyj1jQ7mUGdLWsn7vR43jfnNButf37BV92/c+IrUNgpq6VtpEfmJLq1pyYTq8bjkKfy1DxH0f08BUlK7CpArpLifcW/k5QiToilFEjKWLOUUnZTgExKiaRUMUspYzDEUsZIyu5azKRMIkUsZYKkNKGwVrvlbcOXHttw+HrWSZzc0yUmJnaJwqQBAvtkWWavuyvhgWy9sh8ENpQGWm9p/CyC6xleDJngQfYL4TV+1kF6NcKrISO87ypyhtf4ISgljxDva0kO8TpFWsaGp5bkFK810lK981PhXlqSY7zG5a8umnPTkpzjDS5PmZSpltQAbnD9CIBp8CHnY4PLHoFc5hIfy3TQNe7j242eELIJJDP6akJOh0zIvqvICdngbEYyqSf6WpITssHZRsKkoOhrSU7IBmcbSvHUkpyQDc42tOCpJT0h42zDMHmVhbSkJmSIAm/DgWn0IUdkiAQO5dcz8u3XFhASsoR+ETJEOJ/ZRYkrEVkPGZF9X5EjMkQ4n5FMqnW+mOSMDBFOOBIm5TpfTHJIhghnHIpJvc4Xk5ySIcIph2ZSr/PFJMdkiHDO0aEzOzHpORknHQBMIxA9JwMuzMfXc7Ia+nrpnpEy4KwmtLz9AimbIZOy7yt6Ugac1kgmVTtfTHpSBpx2JIKnmPSkDDjtUEzqdr6Y9KQMOO3QTMp2vpj0pAw47TgWRtmpSY7KgPOO43TlpiY9Knc17tMQdD0qp4MGZdMzUBY4rQmtIb8AyvtHznBJ2fSNlAVOaySTyp0vJj0pC5x2JEwqd76Y9KQscNqhmFTufDHpSVngtEO/81P2XmLSk7IIfNIWBULcz/V8ia21a3766aNEOHoSF4G8BpiGuB6QOH4FEPjA9hKJ62EvgE50z1hc4rxpt38ti8OQWdx3Fj2Ly0CnDya1QV9Mehbv+PWUxZnUBn0x6Vlc4sSme7ZxE5OexWWg3weTyqAvJj2LS5zY7Begoi4SlX0p3HqFRz59vm2Eo2sFgrxFzuIy1Awk8EnWZW+t3GL6UfxFT/sSv8UItJi42NLv9rVcQthXad9gH6dmoYX3l2BfDBn2fWfRw36gA2PnwL5TgC8mPewHeiQmTMqbvpj0sB/okpgyWRnvi0kP+4E+iZpJ8dEXkx72A50S918w+bFsYbf13UG/RyhCD/qBRowQ+rAs7KmbQ36PfHVDyG923zqK78dO+rLLx/8B</diagram></mxfile> \ No newline at end of file
diff --git a/known-issues.md b/known-issues.md
index 0307e4c..86e83c7 100644
--- a/known-issues.md
+++ b/known-issues.md
@@ -8,7 +8,6 @@
* automatically play next song when current song ends
* playback doesn't stop when jumping to next/previous song
* should this be the default anyway?
-* Add buttons to write current playback position to A or B limit sliders
# Closed Issues
@@ -17,6 +16,7 @@
* Songs are displayed as full path, should be file name or ideally title from metadata
* When switching between songs, AB limit selection is not reset, this means that if the song has only one limit, it is not possible to load it anymore
* No GUI to control playback speed
+* Add buttons to write current playback position to A or B limit sliders
# Use Cases
diff --git a/midi_controller_launchpad_mini.py b/midi_controller_launchpad_mini.py
index 1f430c2..ec69509 100644
--- a/midi_controller_launchpad_mini.py
+++ b/midi_controller_launchpad_mini.py
@@ -20,7 +20,7 @@ class MidiController:
def _registerHandlers(self):
self._handlers = {
- 96 : self._soloTool.stop,
+ 96 : self._stop,
112 : self._playPause,
101 : self._soloTool.jumpToA,
102 : self._soloTool.previousStoredAbLimits,
@@ -52,8 +52,14 @@ class MidiController:
def _playPause(self):
if self._soloTool.isPlaying():
self._soloTool.pause()
+ self._setButtonLED(7, 0, MidiController.LED_YELLOW)
else:
self._soloTool.play()
+ self._setButtonLED(7, 0, MidiController.LED_GREEN)
+
+ def _stop(self):
+ self._soloTool.stop()
+ self._setButtonLED(7, 0, MidiController.LED_YELLOW)
def _createSetPlaybackRateCallback(self, rate):
def f():
@@ -86,7 +92,7 @@ class MidiController:
# playback control
self._setButtonLED(6, 0, MidiController.LED_RED)
- self._setButtonLED(7, 0, MidiController.LED_GREEN)
+ self._setButtonLED(7, 0, MidiController.LED_YELLOW)
# AB control
self._setButtonLED(6, 5, MidiController.LED_YELLOW)
diff --git a/midi_launchpad_mini_integrationtest.py b/midi_launchpad_mini_integrationtest.py
index 13b18e7..e5b757c 100644
--- a/midi_launchpad_mini_integrationtest.py
+++ b/midi_launchpad_mini_integrationtest.py
@@ -10,6 +10,7 @@ class MidiWrapperMock:
self.callback = None
self.connectedDevice = None
self.sentMessages = SimpleQueue()
+ self.latestMessage = None
def setCallback(self, callback):
self.callback = callback
@@ -18,7 +19,8 @@ class MidiWrapperMock:
self.connectedDevice = deviceName
def sendMessage(self, note, velocity, channel):
- self.sentMessages.put((note, velocity, channel))
+ self.latestMessage = (note, velocity, channel)
+ self.sentMessages.put(self.latestMessage)
def simulateInput(self, note, velocity=127, channel=0):
if self.callback is not None:
@@ -26,6 +28,9 @@ class MidiWrapperMock:
msg = Message("note_on", note=note, velocity=velocity, channel=channel)
self.callback(msg)
+ def getLatestMessage(self):
+ return self.latestMessage
+
@pytest.fixture
def playerMock():
return PlayerMock()
@@ -54,21 +59,30 @@ def test_startStopAndPauseButtons(uut, midiWrapperMock, playerMock):
uut.connect()
assert playerMock.state == PlayerMock.STOPPED
-
+
midiWrapperMock.simulateInput(playPauseButton)
assert playerMock.state == PlayerMock.PLAYING
+ msg = midiWrapperMock.getLatestMessage()
+ assert msg == (playPauseButton, MidiController.LED_GREEN, 0)
midiWrapperMock.simulateInput(stopButton)
assert playerMock.state == PlayerMock.STOPPED
+ assert midiWrapperMock.getLatestMessage() == (playPauseButton, MidiController.LED_YELLOW, 0)
midiWrapperMock.simulateInput(playPauseButton)
+ assert midiWrapperMock.getLatestMessage() == (playPauseButton, MidiController.LED_GREEN, 0)
+
midiWrapperMock.simulateInput(playPauseButton)
+ assert midiWrapperMock.getLatestMessage() == (playPauseButton, MidiController.LED_YELLOW, 0)
assert playerMock.state == PlayerMock.PAUSED
midiWrapperMock.simulateInput(playPauseButton)
+ assert midiWrapperMock.getLatestMessage() == (playPauseButton, MidiController.LED_GREEN, 0)
assert playerMock.state == PlayerMock.PLAYING
midiWrapperMock.simulateInput(playPauseButton)
+ assert midiWrapperMock.getLatestMessage() == (playPauseButton, MidiController.LED_YELLOW, 0)
+
midiWrapperMock.simulateInput(stopButton)
assert playerMock.state == PlayerMock.STOPPED
@@ -209,7 +223,7 @@ def test_initializationMessages(uut, midiWrapperMock):
(101, yellow, 0),
(102, red, 0),
(103, green, 0),
- (112, green, 0),
+ (112, yellow, 0),
(118, red, 0),
(119, green, 0)
]