first commit neocontroller
This commit is contained in:
parent
3507cc9d70
commit
70b92f2b9c
1 changed files with 96 additions and 0 deletions
96
NeoController/code.py
Normal file
96
NeoController/code.py
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
# 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
|
||||
Loading…
Reference in a new issue