Adafruit_Learning_System_Gu.../NeoController/code.py
2021-12-09 16:23:42 -08:00

96 lines
3.2 KiB
Python

# SPDX-FileCopyrightText: 2021 john park for Adafruit Industries
# SPDX-License-Identifier: MIT
# NeoController: NeoSlider(x4) + NeoKey MIDI input device
import board
import busio
from adafruit_simplemath import map_range
import usb_midi
import adafruit_midi
from adafruit_midi.control_change import ControlChange
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
from adafruit_seesaw.seesaw import Seesaw
from adafruit_seesaw import neopixel
from adafruit_seesaw.analoginput import AnalogInput
from adafruit_neokey.neokey1x4 import NeoKey1x4
i2c = busio.I2C(board.SCL, board.SDA) # for QT Py RP2040, use SCL1/SDA1
# --- NeoSlider object setup
addresses = (0x30, 0x31, 0x32, 0x33) # cut jumpers to proper addreses (none, A0, A1, A0+A1)
neosliders = [] # list to hold neoslider objects
for address in addresses: # create each neoslider w proper address
temp_neosliders = Seesaw(i2c, address)
neosliders.append(temp_neosliders) # append to the list
# --- NeoSlider analog read setup
analogin_pin = 18 # slider is on this analog pin
analog_pins = (0, 1)
analog_inputs = []
for n in range(len(neosliders)):
temp_analog_in = AnalogInput(neosliders[n], analogin_pin)
analog_inputs.append(temp_analog_in)
# --- Slider NeoPixels Setup
PIX_PIN = 14
PIX_NUM = 4
pixels = []
for p in range(len(neosliders)):
temp_pix = neopixel.NeoPixel(neosliders[p], PIX_PIN, PIX_NUM)
pixels.append(temp_pix)
pixels[p].brightness = 1.0
pixels[p].fill((20, 20, 0))
pixels[p].show()
# --- NeoKey 1x4 Setup --- #
neokey = NeoKey1x4(i2c, addr=0x38)
amber = 0x300800
blue = 0x002040
red = 0x900000
neokey.pixels.fill(amber)
keys = [ # neokey (adjust if multiple sets), key number, keypress color, MIDI note
(neokey, 0, blue, 40),
(neokey, 1, red, 42),
(neokey, 2, blue, 43),
(neokey, 3, red, 46),
]
# states for key presses
key_states = [False, False, False, False]
# --- MIDI setup
midi = adafruit_midi.MIDI(
midi_in=usb_midi.ports[0],
in_channel=(0),
midi_out=usb_midi.ports[1],
out_channel=0
)
cc_numbers = [48, 49, 50, 51] # pick the CC number for each slider to send over
last_sliders = [0] * len(neosliders) # list to hold state variables
while True:
# check NeoKeys
for k in range(len(keys)):
neokey, key_number, color, midi_note = keys[k]
if neokey[key_number] and not key_states[key_number]:
midi.send(NoteOn(midi_note, 127))
key_states[key_number] = True
neokey.pixels[key_number] = color
if not neokey[key_number] and key_states[key_number]:
midi.send(NoteOff(midi_note, 0))
neokey.pixels[key_number] = amber
key_states[key_number] = False
# check sliders
for i in range(len(neosliders)):
slider = analog_inputs[i].value
if abs(slider - last_sliders[i]) > 1:
cc_val = int(map_range(slider, 0, 1023, 0, 127))
midi.send(ControlChange(cc_numbers[i], cc_val))
color_val = int(map_range(slider, 0, 1023, 5, 255))
pixels[i].fill((color_val, color_val, 0))
last_sliders[i] = slider