/ 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