|
1 |
| -# SPDX-FileCopyrightText: 2021 John Park for Adafruit Industries |
| 1 | +# SPDX-FileCopyrightText: 2023 John Park for Adafruit Industries |
2 | 2 | # SPDX-License-Identifier: MIT
|
3 | 3 |
|
4 | 4 | # Grand Central MIDI Knobs
|
5 |
| -# for USB MIDI |
| 5 | +# for USB MIDI and optional UART MIDI |
6 | 6 | # Reads analog inputs, sends out MIDI CC values
|
7 | 7 | # with Kattni Rembor and Jan Goolsbey for range and hysteresis code
|
8 | 8 |
|
|
16 | 16 | import adafruit_midi # MIDI protocol encoder/decoder library
|
17 | 17 | from adafruit_midi.control_change import ControlChange
|
18 | 18 |
|
19 |
| - |
20 |
| -USB_MIDI_channel = 1 # pick your USB MIDI out channel here, 1-16 |
| 19 | +# pick your USB MIDI out channel here, 1-16 |
| 20 | +MIDI_USB_channel = 1 |
21 | 21 | # pick your classic MIDI channel for sending over UART serial TX/RX
|
22 | 22 | CLASSIC_MIDI_channel = 2
|
23 | 23 |
|
24 |
| -usb_midi = adafruit_midi.MIDI( |
25 |
| - midi_out=usb_midi.ports[1], out_channel=USB_MIDI_channel - 1 |
| 24 | +midi_usb = adafruit_midi.MIDI( |
| 25 | + midi_out=usb_midi.ports[1], out_channel=MIDI_USB_channel - 1 |
26 | 26 | )
|
27 | 27 | # use DIN-5 or TRS MIDI jack on TX/RX for classic MIDI
|
28 |
| -uart = busio.UART(board.TX, board.RX, baudrate=31250, timeout=0.001) # initialize UART |
| 28 | +midi_uart = busio.UART(board.TX, board.RX, baudrate=31250, timeout=0.001) # initialize UART |
29 | 29 | classic_midi = adafruit_midi.MIDI(
|
30 |
| - midi_out=uart, midi_in=uart, out_channel=CLASSIC_MIDI_channel - 1, debug=False |
| 30 | + midi_out=midi_uart, midi_in=midi_uart, out_channel=CLASSIC_MIDI_channel - 1, debug=False |
31 | 31 | )
|
32 | 32 |
|
33 | 33 | led = DigitalInOut(board.D13) # activity indicator
|
|
45 | 45 |
|
46 | 46 | # assignment of knobs to cc numbers
|
47 | 47 | cc_number = [
|
48 |
| - 1, # knob 0, mod wheel |
49 |
| - 2, # knob 1, breath control |
50 |
| - 7, # knob 2, volume |
51 |
| - 10, # knob 3 pan |
52 |
| - 11, # knob 4, expression |
53 |
| - 53, # knob 5 |
54 |
| - 54, # knob 6 |
55 |
| - 74, # knob 7 |
56 |
| - 74, # knob 8, Filter frequency cutoff |
57 |
| - 71, # knob 9, Filter resonance |
58 |
| - 58, # knob 10 |
59 |
| - 59, # knob 11 |
60 |
| - 60, # knob 12 |
61 |
| - 61, # knob 13 |
62 |
| - 62, # knob 14 |
63 |
| - 63, # knob 15 |
| 48 | + 1, # knob 1, mod wheel |
| 49 | + 2, # knob 2, breath control |
| 50 | + 7, # knob 3, volume |
| 51 | + 10, # knob 4 pan |
| 52 | + 11, # knob 5, expression |
| 53 | + 53, # knob 6 |
| 54 | + 54, # knob 7 |
| 55 | + 73, # knob 8 |
| 56 | + 74, # knob 9, Filter frequency cutoff |
| 57 | + 71, # knob 10, Filter resonance |
| 58 | + 58, # knob 11 |
| 59 | + 59, # knob 12 |
| 60 | + 60, # knob 13 |
| 61 | + 61, # knob 14 |
| 62 | + 62, # knob 15 |
| 63 | + 63, # knob 16 |
64 | 64 | ]
|
65 | 65 |
|
66 | 66 | # CC range list defines the characteristics of the potentiometers
|
|
70 | 70 | # 36 (C2) min, 84 (B5) max: 49-note keyboard
|
71 | 71 | # 21 (A0) min, 108 (C8) max: 88-note grand piano
|
72 | 72 | cc_range = [
|
73 |
| - (36, 84), # knob 0: C2 to B5: 49-note keyboard |
74 |
| - (36, 84), # knob 1 |
75 |
| - (36, 84), # knob 2 |
76 |
| - (36, 84), # knob 3 |
77 |
| - (36, 84), # knob 4 |
78 |
| - (36, 84), # knob 5 |
79 |
| - (36, 84), # knob 6 |
80 |
| - (36, 84), # knob 7 |
81 |
| - (0, 127), # knob 8: 0 to 127: full range MIDI CC/control voltage for VCV Rack |
| 73 | + (0, 127), # knob 0: C2 to B5: 49-note keyboard |
| 74 | + (0, 127), # knob 1 |
| 75 | + (0, 127), # knob 2 |
| 76 | + (0, 127), # knob 3 |
| 77 | + (0, 127), # knob 4 |
| 78 | + (0, 127), # knob 5 |
| 79 | + (0, 127), # knob 6 |
| 80 | + (0, 127), # knob 7 |
| 81 | + (0, 127), # knob 8 |
82 | 82 | (0, 127), # knob 9
|
83 | 83 | (0, 127), # knob 10
|
84 | 84 | (0, 127), # knob 11
|
|
89 | 89 | ]
|
90 | 90 |
|
91 | 91 | print("---Grand Central MIDI Knobs---")
|
92 |
| -print(" USB MIDI channel: {}".format(USB_MIDI_channel)) |
| 92 | +print(" USB MIDI channel: {}".format(MIDI_USB_channel)) |
93 | 93 | print(" TRS MIDI channel: {}".format(CLASSIC_MIDI_channel))
|
94 | 94 |
|
95 | 95 | # Initialize cc_value list with current value and offset placeholders
|
@@ -134,7 +134,7 @@ def sign(x): # determine the sign of x
|
134 | 134 | )
|
135 | 135 | if cc_value[i] != last_cc_value[i]: # only send if it changed
|
136 | 136 | # Form a MIDI CC message and send it:
|
137 |
| - usb_midi.send(ControlChange(cc_number[i], cc_value[i][0] + cc_range[i][0])) |
| 137 | + midi_usb.send(ControlChange(cc_number[i], cc_value[i][0] + cc_range[i][0])) |
138 | 138 | classic_midi.send(
|
139 | 139 | ControlChange(cc_number[i], cc_value[i][0] + cc_range[i][0])
|
140 | 140 | )
|
|
0 commit comments