|
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