kfet_launchpad_controller/eos_midi/__main__.py

212 lines
7.1 KiB
Python

"""Main module."""
import argparse
from .eos import EOSConnection
from .pad import Pad, EventHandler
from .eos_object import FaderBank, Fader, Macro
from lpminimk3 import LaunchpadMiniMk3, find_launchpads, ButtonEvent, Mode
COLORS = [3, 21, 37, 45, 81, 95, 5, 9]
FOCUS_MACROS = [901, 902, 903, 906]
SELECT_MACROS = [304, 303, 305, 302, 301]
SELECT_COLORS = [78, 21, 13, 5, 3]
class AbstractColorEventHandler(EventHandler):
"""Abstract color event handler"""
def __init__(self, launchpad: LaunchpadMiniMk3, line: int, column: int):
super().__init__(f'{column}x{line}')
self._launchpad = launchpad
self._line = line
self._column = column
self._launchpad.panel.led(
self.button_name).color = COLORS[self._column]
def flash(self):
"""Flash only the current button on the line"""
for color in range(8):
self._launchpad.panel.led(
f'{color}x{self._line}').color = COLORS[color]
self._launchpad.panel.led(self.button_name).reset()
self._launchpad.panel.led(self.button_name,
mode='flash').color = COLORS[self._column]
class ColorBumpEventHandler(AbstractColorEventHandler):
"""Bump button Event handler"""
def __init__(self, fader_bank: FaderBank,
launchpad: LaunchpadMiniMk3, color_id: int):
super().__init__(launchpad, 5, color_id)
self._fader = fader_bank.fader(14, color_id + 1)
def on_press(self, _: ButtonEvent):
self._fader.fire(1.0)
def on_release(self, _: ButtonEvent):
self._fader.fire(0.0)
class ColorFxEventHandler(AbstractColorEventHandler):
"""FX button Event handler"""
def __init__(self, fader_bank: FaderBank,
launchpad: LaunchpadMiniMk3, color_id: int):
super().__init__(launchpad, 6, color_id)
self._fader = fader_bank.fader(17, color_id + 1)
def on_press(self, _: ButtonEvent):
self.flash()
self._fader.fire()
class ColorEventHandler(AbstractColorEventHandler):
"""Non-FX button Event handler"""
def __init__(self, fader_bank: FaderBank,
launchpad: LaunchpadMiniMk3, color_id: int):
super().__init__(launchpad, 7, color_id)
self._fader = fader_bank.fader(18, color_id + 1)
def on_press(self, _: ButtonEvent):
self.flash()
self._fader.fire()
class FocusEventHandler(EventHandler):
"""Focus event handler"""
def __init__(self, eos: EOSConnection,
launchpad: LaunchpadMiniMk3, column: int):
super().__init__(f'{column}x2')
self._macro = eos.macro(FOCUS_MACROS[column])
self._launchpad = launchpad
self._launchpad.panel.led(self.button_name).color = 5
def on_press(self, _: ButtonEvent):
for col in range(4):
self._launchpad.panel.led(f'{col}x2').color = 5
self._launchpad.panel.led(self.button_name).reset()
self._launchpad.panel.led(self.button_name,
mode='flash').color = 5
self._macro.fire()
class SimpleFaderEventHandler(EventHandler):
"""Simple fader Event handler"""
def __init__(self, fader: Fader,
launchpad: LaunchpadMiniMk3,
button: str, color: int):
super().__init__(button)
launchpad.panel.led(button).color = color
self._fader = fader
def on_press(self, _: ButtonEvent):
self._fader.fire(1.0)
def on_release(self, _: ButtonEvent):
self._fader.fire(0.0)
class SimpleMacroEventHandler(EventHandler):
"""Simple macro Event handler"""
def __init__(self, macro: Macro,
launchpad: LaunchpadMiniMk3,
button: str, color: int):
super().__init__(button)
launchpad.panel.led(button).color = color
self._macro = macro
def on_press(self, _: ButtonEvent):
self._macro.fire()
class SelectEventHandler(EventHandler):
"""Select Event handler"""
def __init__(self, eos: EOSConnection,
launchpad: LaunchpadMiniMk3,
select_id: int):
super().__init__(f'{select_id + 3}x0')
self._launchpad = launchpad
self._select_id = select_id
self._macro = eos.macro(SELECT_MACROS[self._select_id])
self._launchpad.panel.led(
self.button_name).color = SELECT_COLORS[self._select_id]
def on_press(self, _: ButtonEvent):
for i in range(3, 8):
self._launchpad.panel.led(
f'{i}x0').color = SELECT_COLORS[i - 3]
self._launchpad.panel.led(
self.button_name).reset()
self._launchpad.panel.led(
self.button_name,
mode='flash').color = SELECT_COLORS[self._select_id]
self._macro.fire()
def main():
"""main function"""
parser = argparse.ArgumentParser(
prog='EOS Launchpad Connector',
description='Connector to use launchpad for KFet Config')
parser.add_argument('ip')
parser.add_argument('-p', '--port', default=8000)
parser.add_argument('-l', '--launchpad', default=0)
args = parser.parse_args()
print(args)
launchpad = find_launchpads()[args.launchpad]
launchpad.open()
launchpad.mode = Mode.PROG
launchpad.panel.reset()
launchpad.clear_event_queue()
eos = EOSConnection(args.ip, args.port)
faderbank = eos.fader_bank()
pad = Pad(launchpad)
# 6è-7è-8è ligne
for i in range(8):
pad.add_event_handler(ColorBumpEventHandler(faderbank, launchpad, i))
pad.add_event_handler(ColorFxEventHandler(faderbank, launchpad, i))
pad.add_event_handler(ColorEventHandler(faderbank, launchpad, i))
# 3è ligne
for i in range(4):
pad.add_event_handler(FocusEventHandler(eos, launchpad, i))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(6, 7), launchpad, '4x2', 9))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(5, 2), launchpad, '6x2', 4))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(5, 4), launchpad, '7x2', 4))
# 2è ligne
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(5, 5), launchpad, '0x1', 21))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(5, 6), launchpad, '1x1', 88))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(7, 1), launchpad, '2x1', 78))
pad.add_event_handler(SimpleFaderEventHandler(
faderbank.fader(7, 2), launchpad, '3x1', 32))
pad.add_event_handler(SimpleMacroEventHandler(
eos.macro(401), launchpad, '5x1', 95))
pad.add_event_handler(SimpleMacroEventHandler(
eos.macro(402), launchpad, '6x1', 95))
pad.add_event_handler(SimpleMacroEventHandler(
eos.macro(403), launchpad, '7x1', 95))
# 1ère ligne
pad.add_event_handler(SimpleMacroEventHandler(
eos.macro(6), launchpad, '0x0', 3))
for i in range(5):
pad.add_event_handler(SelectEventHandler(
eos, launchpad, i))
pad.serve_forever()
if __name__ == '__main__':
main()