#!/usr/bin/python3 # Import needed modules from osc4py3 from osc4py3.as_eventloop import * from osc4py3 import oscbuildparse from osc4py3.oscmethod import * import logging from pprint import pprint import argparse import colorsys logging.basicConfig(format='%(asctime)s - %(threadName)s ø %(name)s - ' '%(levelname)s - %(message)s') log = logging.getLogger("osc") log.setLevel(logging.INFO) clientname="ledserver" def hsv2rgb(h,s,v): return tuple(round(i*255) for i in colorsys.hsv_to_rgb(h,s,v)) def termrgb(rgb): return "\033[38;2;{};{};{}m".format(rgb[0],rgb[1],rgb[2]) def termendc(): return '\033[0m' def output_led_colour(rgb): return termrgb(rgb)+"█"+termendc() class LED: brightness=0 colour=[0,0,0] hue=0 state=True pin=None mode=["off","on"] def __init__(self,pin): self.pin=pin def set_brightness(self,value): if abs(self.brightness-value) > .005: self.brightness=value print("Setting brightness for LED on pin {} to {}".format(self.pin, self.brightness)) def set_colour(self,value): if abs(self.hue-value) > .01: self.colour=hsv2rgb(value,1,1) self.hue=value log.info("Setting colour for LED on pin {} to {} ({})".format(self.pin,self.colour,output_led_colour(self.colour))) def set_state(self,value): self.state=value log.info("Turning LED {} {}".format(self.pin, self.mode[self.state])) def toggle_state(self,value): if (value): self.state=not self.state log.info("Turning LED {} {}".format(self.pin, self.mode[self.state])) def led_colour(value): leds[0].set_colour(value) def led_brightness(value): leds[0].set_brightness(value) def led_state(addr,value): led=addr.split("/")[6] leds[int(led)-3].toggle_state(bool(value)) parser = argparse.ArgumentParser(description='OSC listener for LEDs') parser.add_argument('--listen',action='store',default='127.0.0.1:9000') parser.add_argument('--debug-osc',action='store_true',default=False) args=parser.parse_args() # Start the system. log.info("Starting OSC...") pprint(args) if args.debug_osc: osc_startup(logger=log) else: osc_startup() listen_address=args.listen.split(':')[0] listen_port=args.listen.split(':')[1] osc_udp_server(listen_address,listen_port, clientname) # Set up osc paths log.info("Binding targets...") osc_method("/track/2/fx/1/fxparam/1/value",led_colour) osc_method("/track/2/fx/1/fxparam/2/value",led_brightness) osc_method("/track/2/fx/1/fxparam/[!12]/value",led_state,argscheme=OSCARG_ADDRESS+OSCARG_DATAUNPACK) log.info("Creating LEDs...") # Create LEDs leds=[LED(i) for i in range(0,4)] finished=False log.info("Starting loop") while not finished: osc_process()