/ NeoController / code.py
code.py
1 # SPDX-FileCopyrightText: 2021 john park for Adafruit Industries 2 # SPDX-License-Identifier: MIT 3 # NeoController: NeoSlider(x4) + NeoKey MIDI input device 4 5 import board 6 import busio 7 from adafruit_simplemath import map_range 8 import usb_midi 9 import adafruit_midi 10 from adafruit_midi.control_change import ControlChange 11 from adafruit_midi.note_on import NoteOn 12 from adafruit_midi.note_off import NoteOff 13 from adafruit_seesaw.seesaw import Seesaw 14 from adafruit_seesaw import neopixel 15 from adafruit_seesaw.analoginput import AnalogInput 16 from adafruit_neokey.neokey1x4 import NeoKey1x4 17 18 i2c = busio.I2C(board.SCL, board.SDA) # for QT Py RP2040, use SCL1/SDA1 19 20 # --- NeoSlider object setup 21 addresses = (0x30, 0x31, 0x32, 0x33) # cut jumpers to proper addreses (none, A0, A1, A0+A1) 22 neosliders = [] # list to hold neoslider objects 23 for address in addresses: # create each neoslider w proper address 24 temp_neosliders = Seesaw(i2c, address) 25 neosliders.append(temp_neosliders) # append to the list 26 27 # --- NeoSlider analog read setup 28 analogin_pin = 18 # slider is on this analog pin 29 analog_pins = (0, 1) 30 analog_inputs = [] 31 for n in range(len(neosliders)): 32 temp_analog_in = AnalogInput(neosliders[n], analogin_pin) 33 analog_inputs.append(temp_analog_in) 34 35 # --- Slider NeoPixels Setup 36 PIX_PIN = 14 37 PIX_NUM = 4 38 pixels = [] 39 for p in range(len(neosliders)): 40 temp_pix = neopixel.NeoPixel(neosliders[p], PIX_PIN, PIX_NUM) 41 pixels.append(temp_pix) 42 pixels[p].brightness = 1.0 43 pixels[p].fill((20, 20, 0)) 44 pixels[p].show() 45 46 # --- NeoKey 1x4 Setup --- # 47 neokey = NeoKey1x4(i2c, addr=0x38) 48 amber = 0x300800 49 blue = 0x002040 50 red = 0x900000 51 neokey.pixels.fill(amber) 52 53 keys = [ # neokey (adjust if multiple sets), key number, keypress color, MIDI note 54 (neokey, 0, blue, 40), 55 (neokey, 1, red, 42), 56 (neokey, 2, blue, 43), 57 (neokey, 3, red, 46), 58 ] 59 60 # states for key presses 61 key_states = [False, False, False, False] 62 63 64 # --- MIDI setup 65 midi = adafruit_midi.MIDI( 66 midi_in=usb_midi.ports[0], 67 in_channel=(0), 68 midi_out=usb_midi.ports[1], 69 out_channel=0 70 ) 71 cc_numbers = [48, 49, 50, 51] # pick the CC number for each slider to send over 72 73 last_sliders = [0] * len(neosliders) # list to hold state variables 74 75 while True: 76 # check NeoKeys 77 for k in range(len(keys)): 78 neokey, key_number, color, midi_note = keys[k] 79 if neokey[key_number] and not key_states[key_number]: 80 midi.send(NoteOn(midi_note, 127)) 81 key_states[key_number] = True 82 neokey.pixels[key_number] = color 83 if not neokey[key_number] and key_states[key_number]: 84 midi.send(NoteOff(midi_note, 0)) 85 neokey.pixels[key_number] = amber 86 key_states[key_number] = False 87 88 # check sliders 89 for i in range(len(neosliders)): 90 slider = analog_inputs[i].value 91 if abs(slider - last_sliders[i]) > 1: 92 cc_val = int(map_range(slider, 0, 1023, 0, 127)) 93 midi.send(ControlChange(cc_numbers[i], cc_val)) 94 color_val = int(map_range(slider, 0, 1023, 5, 255)) 95 pixels[i].fill((color_val, color_val, 0)) 96 last_sliders[i] = slider