def __init__(self, ip, port, pd_ip, pd_port, d_rs, d_rw, d_e, d_d4, d_d5, d_d6, d_d7, r_clk, r_d, r_sw, button): """Constructor IP addresses and port numbers for OSC connection are needed. Prefix 'd' is for HD44780 compatible display connections connected to the pins of the RPi. Prefix 'r' is for KY040 compatible rotary encoder connections connected to the pins of the RPi. Pin numbers are BCM numbers! (see GPIO.setmode(GPIO.BCM)) Args: ip: IP Address of the OSC server of this menu port: port number of the OSC server of this menu pd_ip: IP Address of the OSC server of the Pd effects patch pd_port: port number of the OSC server of the Pd effects patch d_rs: HD44780 register select pin number d_rw: HD44780 read/write pin number d_e: HD44780 enable pin number d_d4: HD44780 data channel 4 pin number d_d5: HD44780 data channel 5 pin number d_d6: HD44780 data channel 6 pin number d_d7: HD44780 data channel 7 pin number r_clk: rotary encoder clock pin number r_d: rotary encoder data pin number r_sw: rotary encoder internal switch button pin number button: push button pin number """ self.ip = ip self.port = port self.pd_ip = pd_ip self.pd_port = pd_port self.pd_is_connected = False self.rotary_increment = 1 # menu level entry state self.level = 1 # current effect self.fx_nr = 0 # current parameter of the effect self.param_nr = 0 # define effects main = Effect(name="main", params={ 'on': 1, 'in_vol': 127, 'out_vol': 127 }) reverb = Effect(name="reverb", params={ 'on': 0, 'dry': 64, 'wet': 120, 'rev_in_lvl': 100, 'liveness': 80, 'fc': 40, 'hf_damp': 7 }) delay = Effect( "delay", { 'on': 0, 'dry': 64, 'wet': 127, 'delay_time': 64, 'feedback': 100, 'fc_lop': 120, 'fc_hip': 25, 'detune': 10, 'mod_freq': 5 }) lop = Effect("lop", {'on': 0, 'fc': 64}) hip = Effect("hip", {'on': 0, 'fc': 30}) # effects list self.fx = [main, reverb, delay, lop, hip] GPIO.setmode(GPIO.BCM) self.button = Button.Button(button, "falling", self.buttonPressed) # callbacks for encoder and OSC handlers must be defined self.r_encoder = KY040.KY040(r_clk, r_d, r_sw, self.rotaryChange, self.switchPressed) print("DBG: initialize display") # Compat mode is true because slow displays show garbage sometimes. self.lcd = CharLCD(numbering_mode=GPIO.BCM, cols=16, rows=2, pin_rs=d_rs, pin_rw=d_rw, pin_e=d_e, pins_data=[d_d4, d_d5, d_d6, d_d7], compat_mode=True) print("DBG: initialize OSC Server") self.server = OSC3.OSCServer((ip, port)) print("DBG: initialize OSC Client") self.client = OSC3.OSCClient() # first appearance of the menu self.printMenu()
# OSC message handlers def encoder_handler(addr, tags, data, client_address): txt1 = "%s of %s" % (addr, client_address) txt2 = str(data) d.message(d.LINE_1, txt1) d.message(d.LINE_2, txt2) def switch_handler(addr, tags, data, client_address): d.message(d.LINE_1, 16 * '*') d.message(d.LINE_2, 16 * '*') def rand_handler(addr, tags, data, client_address): d.message(d.LINE_1, "rand") d.message(d.LINE_2, "value: " + str(data)) d.message(d.LINE_1, "Starting OSC") d.message(d.LINE_2, "ip: " + ip) # listen on localhost, port 7110 s = OSC3.OSCServer((ip, port)) # call handler() for OSC messages received with the given address s.addMsgHandler('/rotary/encoder', encoder_handler) s.addMsgHandler('/rotary/switch', switch_handler) s.addMsgHandler('/rand', rand_handler) print("OSC Server listening...") s.serve_forever() GPIO.cleanup()