|
|
@@ -1,110 +1,77 @@
|
|
|
|
|
|
import time
|
|
|
-from midi.midiout import MidiOut
|
|
|
-from midi import constants_min
|
|
|
from machine import UART
|
|
|
from machine import ADC
|
|
|
import uos
|
|
|
|
|
|
+from midi.midiout import MidiOut
|
|
|
+from midi import constants_min
|
|
|
+
|
|
|
+from midipins import StatePin, PitchWheel
|
|
|
+import midipins
|
|
|
+
|
|
|
DEBUG = 0
|
|
|
|
|
|
def main():
|
|
|
global DEBUG
|
|
|
|
|
|
+
|
|
|
led = machine.Pin(2 , machine.Pin.OUT)
|
|
|
led.value(1)
|
|
|
adc_pin = 0
|
|
|
adc = ADC(adc_pin)
|
|
|
|
|
|
- # multi_pins = [machine.Pin(16 , machine.Pin.OUT)]
|
|
|
- wheel = PitchWheel(adc)
|
|
|
- but = StatePin(0, machine.Pin.IN, machine.Pin.PULL_UP)
|
|
|
+ # wheel = PitchWheel(adc, size=128)
|
|
|
+ wheel = PitchWheel(adc.read, size=6)
|
|
|
+ but = StatePin(machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP).value)
|
|
|
+ buts = [
|
|
|
+ StatePin(machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP).value),
|
|
|
+ StatePin(machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP).value),
|
|
|
+ StatePin(machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP).value),
|
|
|
+ but,
|
|
|
+ ]
|
|
|
|
|
|
reset_midi()
|
|
|
-
|
|
|
print("\nWaiting for Interrupt....")
|
|
|
- time.sleep(5)
|
|
|
- print("\nDetaching Terminal for MIDI....")
|
|
|
+ time.sleep(3)
|
|
|
|
|
|
|
|
|
- if but.value() == 1:
|
|
|
+ if but.pin() == 1:
|
|
|
DEBUG = 0
|
|
|
else:
|
|
|
DEBUG = 1
|
|
|
|
|
|
+ midipins.DEBUG = DEBUG
|
|
|
+
|
|
|
if not DEBUG:
|
|
|
+ print("\nDetaching Terminal for MIDI....")
|
|
|
uos.dupterm(None, 1)
|
|
|
- uart = UART(DEBUG, baudrate=115200)
|
|
|
- midiout = MidiOut(uart)
|
|
|
-
|
|
|
+ uart = UART(DEBUG, baudrate=115200)
|
|
|
+ midiout = MidiOut(uart)
|
|
|
+ midiout.all_notes_off()
|
|
|
+ midiout.all_sound_off()
|
|
|
+ # midiout.reset_all_controllers()
|
|
|
+ midiout.program_change(0) # Acoustic Piano per General MIDI standard
|
|
|
+ # midiout.control_change(constants_min.LEGATO_ONOFF, 0)
|
|
|
+ # midiout.control_change(constants_min.LEGATO_ONOFF, 127)
|
|
|
+
|
|
|
+
|
|
|
+ buts_cb = [
|
|
|
+ lambda v: midi_note(midiout, v, note=48),
|
|
|
+ lambda v: midi_note(midiout, v, note=50),
|
|
|
+ lambda v: midi_note(midiout, v, note=52),
|
|
|
+ lambda v: midi_note(midiout, v, note=53, led = led),
|
|
|
+ ]
|
|
|
|
|
|
# # Send all sound off to prevent hanging notes
|
|
|
- midiout.control_change(0x78, 0)
|
|
|
-
|
|
|
- midiout.program_change(0) # Acoustic Piano per General MIDI standard
|
|
|
- midiout.control_change(constants_min.LEGATO_ONOFF, 0)
|
|
|
- midiout.control_change(constants_min.LEGATO_ONOFF, 127)
|
|
|
-
|
|
|
while True:
|
|
|
time.sleep_ms(5)
|
|
|
- but.poll(lambda v: midi_note(midiout, v, led = led))
|
|
|
- wheel.poll(midiout.pitch_bend)
|
|
|
-
|
|
|
-class PitchWheel():
|
|
|
- _value = 0
|
|
|
- _min = 24
|
|
|
- _max = 1000
|
|
|
- size = 16368
|
|
|
- pins = []
|
|
|
- values = []
|
|
|
- adc = None
|
|
|
-
|
|
|
- def __init__(self, adc, pins = [], values = [], size = 16368):
|
|
|
- self.pins = pins
|
|
|
- self.values = values
|
|
|
- self.size = size
|
|
|
- self.adc = adc
|
|
|
-
|
|
|
- def value(self):
|
|
|
- for pin,value in zip(self.pins, self.values):
|
|
|
- pin.value(value)
|
|
|
- if len(self.pins) != 0:
|
|
|
- time.sleep_ms(1)
|
|
|
- val = self.adc.read()
|
|
|
- if self._value != val:
|
|
|
- self._value = val
|
|
|
- if self._min > val:
|
|
|
- self._min = val
|
|
|
- if self._max < val:
|
|
|
- self._max = val
|
|
|
- return val
|
|
|
- return None
|
|
|
-
|
|
|
- def calibrate(self, val):
|
|
|
- val_float = (val/(self._max - self._min))
|
|
|
- return int(min(max((self.size * val_float), 0), self.size))
|
|
|
-
|
|
|
- def poll(self, cb=None):
|
|
|
- val = self.value()
|
|
|
- if val != None:
|
|
|
- if DEBUG == 1:
|
|
|
- print("Wheel:", self.values, [self._min, self._max],val,self.calibrate(val))
|
|
|
- elif cb != None:
|
|
|
- cb(self.calibrate(val))
|
|
|
-
|
|
|
-class StatePin(machine.Pin):
|
|
|
- state = 1
|
|
|
-
|
|
|
- def poll(self, cb=None):
|
|
|
-
|
|
|
- val = self.value()
|
|
|
- if val != self.state:
|
|
|
- self.state = val
|
|
|
- if DEBUG == 1:
|
|
|
- print(self, val)
|
|
|
- else:
|
|
|
- if cb != None:
|
|
|
- cb(val)
|
|
|
+ for but,cb in zip(buts, buts_cb):
|
|
|
+ but.poll(cb)
|
|
|
+ # wheel.poll(lambda v:midiout.volume(v))
|
|
|
+ wheel.poll(lambda v:midiout.program_change(v))
|
|
|
+ # wheel.poll(lambda v:midiout.channel_message(constants_min.PROGRAM_CHANGE,(v+1)))
|
|
|
+ # wheel.poll(midiout.pitch_bend)
|
|
|
|
|
|
def midi_note(midiout, val, note=64, led = None):
|
|
|
if led:
|
|
|
@@ -115,25 +82,23 @@ def midi_note(midiout, val, note=64, led = None):
|
|
|
midiout.note_off(note)
|
|
|
|
|
|
def reset_midi():
|
|
|
+ import machine
|
|
|
+ import uos
|
|
|
uos.dupterm(None, 1)
|
|
|
uart = machine.UART(0, 115200)
|
|
|
mdo = MidiOut(uart)
|
|
|
- mdo.control_change(0x78, 0)
|
|
|
+ mdo.all_notes_off()
|
|
|
+ mdo.all_sound_off()
|
|
|
+ # mdo.reset_all_controllers()
|
|
|
|
|
|
uart = machine.UART(0, 115200)
|
|
|
uos.dupterm(uart, 1)
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
if __name__ == "__main__":
|
|
|
try:
|
|
|
main()
|
|
|
except Exception as ex:
|
|
|
reset_midi()
|
|
|
raise ex
|
|
|
-#
|
|
|
-# def bend_note():
|
|
|
-# val = adc.read()
|
|
|
-# return 60+int(val/64)
|
|
|
-#
|