Skip to content

Commit 70b92f2

Browse files
committed
first commit neocontroller
1 parent 3507cc9 commit 70b92f2

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

NeoController/code.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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

0 commit comments

Comments
 (0)