瀏覽代碼

split library

Tobias Simetsreiter 4 年之前
父節點
當前提交
4905a0e0d2
共有 4 個文件被更改,包括 118 次插入87 次删除
  1. 8 2
      Makefile
  2. 2 2
      connect.sh
  3. 48 83
      main.py
  4. 60 0
      midipins/__init__.py

+ 8 - 2
Makefile

@@ -1,10 +1,16 @@
 
 USB_TTY?=/dev/ttyUSB0
+TTY_BAUD?=115200
 MIDI_IN?=129:0
 MIDI_OUT=128:0
 
 update:
-	ampy -p ${USB_TTY} --baud 115200 put main.py
+	ampy -p ${USB_TTY} --baud ${TTY_BAUD} put main.py
+	ampy -p ${USB_TTY} --baud ${TTY_BAUD} rmdir midipins
+	ampy -p ${USB_TTY} --baud ${TTY_BAUD} put   midipins
 
 connect:
-	./connect.sh ${MIDI_IN} ${MIDI_OUT}
+	./connect.sh ${USB_TTY} ${MIDI_IN} ${MIDI_OUT}
+
+screen:
+	screen ${USB_TTY} ${TTY_BAUD}

+ 2 - 2
connect.sh

@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 set -m
 
-ttymidi -v -s /dev/ttyUSB0 -n "esp32" &
+ttymidi -v -s $1 -n "esp32" &
 TTYPID=$(jobs -p)
 
 connect_midi(){
@@ -9,7 +9,7 @@ connect_midi(){
     aconnect -i
     echo "Outputs:"
     aconnect -o
-    aconnect "$1" "$2"
+    aconnect "$2" "$3"
 }
 sleep 1 && connect_midi $@ || kill $TTYPID
 

+ 48 - 83
main.py

@@ -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)
-#

+ 60 - 0
midipins/__init__.py

@@ -0,0 +1,60 @@
+
+DEBUG = 0
+
+class PitchWheel():
+    state = None
+    _min = 1
+    _max = 1024
+    size = 1023
+    pins = []
+    values = []
+    adc = None
+
+    def __init__(self, adc, pins = [], values = [], size = 1023):
+        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()
+        self._min = min(self._min, val)
+        self._max = max(self._max, val)
+        val_cal = (val/(self._max - self._min))
+        val_cal = int(self.size * val_cal)
+        val_cal = min(max(val_cal, 0), self.size-1)
+        if self.state != val_cal:
+            self.state = val_cal
+            if DEBUG == 1:
+                print("Wheel:", self.values, self.size, [self._min, self._max], self.state, val)
+            return val_cal
+        return None
+
+    def poll(self, cb=None):
+        val = self.value()
+        if val != None:
+            if DEBUG != 1 and cb != None:
+                cb(val)
+
+class StatePin():
+    state = None
+    pin=None
+
+    def __init__(self, pin):
+        self.pin = pin
+
+    def poll(self, cb=None):
+
+        val = self.pin()
+        if val != self.state:
+            self.state = val
+            if DEBUG == 1:
+                print(self, val)
+            else:
+                if cb != None:
+                    cb(val)
+