import time 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 midiout = None def main(): global DEBUG global midiout led = machine.Pin(2 , machine.Pin.OUT) adc_pin = 0 adc = ADC(adc_pin) but = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP) # wheel = PitchWheel(adc, size=128) pins = [ machine.Pin(12, machine.Pin.OUT), machine.Pin(14, machine.Pin.OUT), machine.Pin(4 , machine.Pin.OUT), machine.Pin(5 , machine.Pin.OUT), ] volume = PitchWheel(adc.read, size=128) volume.pins = pins volume.values = [1,0,0,0] modeswitch = PitchWheel(adc.read, size=6) modeswitch.pins = pins modeswitch.values = [0,0,0,0] reset_midi() print("\nWaiting for Interrupt....") time.sleep(3) if but.value() == 1: DEBUG = 0 else: DEBUG = 1 midipins.DEBUG = DEBUG if not DEBUG: print("\nDetaching Terminal for MIDI....") uos.dupterm(None, 1) uart = UART(0, 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) # # Send all sound off to prevent hanging notes TNULL = time.ticks_ms() TONE = None while True: time.sleep_ms(1) led.value(0 if DEBUG else 1) modeswitch.poll(set_mode) volume.poll(lambda v:midiout.volume(v)) if DEBUG: TONE = time.ticks_ms() print("Poll done:", TONE - TNULL) TNULL = TONE # wheel.poll(lambda v:midiout.channel_message(constants_min.PROGRAM_CHANGE,(v+1))) # wheel.poll(midiout.pitch_bend) def set_mode(val): global DEBUG global midiout if val == 4: import uos uos.dupterm(None, 1) DEBUG = 0 elif val == 5: import machine import uos uart = machine.UART(0, 115200) uos.dupterm(uart, 1) DEBUG = 1 if val < 5: midiout.program_change(val) midipins.DEBUG = DEBUG def midi_note(midiout, val, note=64, led = None): if led: led.value(val) if val == 0: midiout.note_on(note, velocity=100) else: midiout.note_off(note) def reset_midi(): import machine import uos uos.dupterm(None, 1) uart = machine.UART(0, 115200) mdo = MidiOut(uart) 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