Files
ableton-osc/ableton_osc/groove.py
T

61 lines
1.8 KiB
Python
Raw Normal View History

"""Handles /live/groove/* OSC addresses."""
import logging
from typing import Optional
from .handler import AbletonOSCHandler
logger = logging.getLogger(__name__)
class GrooveHandler(AbletonOSCHandler):
def init_api(self) -> None:
self.clear_listeners()
self._add("/live/groove/get/grooves", self._get_grooves)
self._add("/live/groove/get/amount", self._get_groove_amount)
self._add("/live/groove/set/amount", self._set_groove_amount)
def _pool(self):
try:
return self.song.groove_pool
except Exception:
return None
def _get_grooves(self, params: tuple) -> Optional[tuple]:
pool = self._pool()
if pool is None:
return None
try:
return tuple(g.name for g in pool.grooves)
except Exception as e:
logger.warning("get grooves: %s", e)
return None
def _get_groove_amount(self, params: tuple) -> Optional[tuple]:
"""params: groove_name"""
pool = self._pool()
if pool is None or not params:
return None
name = str(params[0])
try:
for g in pool.grooves:
if g.name == name:
return (name, float(g.amount))
except Exception as e:
logger.warning("get groove amount: %s", e)
return None
def _set_groove_amount(self, params: tuple) -> None:
"""params: groove_name, amount"""
pool = self._pool()
if pool is None or len(params) < 2:
return None
name = str(params[0])
amount = float(params[1])
try:
for g in pool.grooves:
if g.name == name:
g.amount = amount
break
except Exception as e:
logger.warning("set groove amount: %s", e)
return None