main.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import time
  2. from machine import UART
  3. from machine import ADC
  4. import uos
  5. from midi.midiout import MidiOut
  6. from midi import constants_min
  7. from midipins import StatePin, PitchWheel
  8. import midipins
  9. DEBUG = 0
  10. midiout = None
  11. def main():
  12. global DEBUG
  13. global midiout
  14. led = machine.Pin(2 , machine.Pin.OUT)
  15. adc_pin = 0
  16. adc = ADC(adc_pin)
  17. but = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)
  18. # wheel = PitchWheel(adc, size=128)
  19. pins = [
  20. machine.Pin(12, machine.Pin.OUT),
  21. machine.Pin(14, machine.Pin.OUT),
  22. machine.Pin(4 , machine.Pin.OUT),
  23. machine.Pin(5 , machine.Pin.OUT),
  24. ]
  25. volume = PitchWheel(adc.read, size=128)
  26. volume.pins = pins
  27. volume.values = [1,0,0,0]
  28. modeswitch = PitchWheel(adc.read, size=6)
  29. modeswitch.pins = pins
  30. modeswitch.values = [0,0,0,0]
  31. reset_midi()
  32. print("\nWaiting for Interrupt....")
  33. time.sleep(3)
  34. if but.value() == 1:
  35. DEBUG = 0
  36. else:
  37. DEBUG = 1
  38. midipins.DEBUG = DEBUG
  39. if not DEBUG:
  40. print("\nDetaching Terminal for MIDI....")
  41. uos.dupterm(None, 1)
  42. uart = UART(0, baudrate=115200)
  43. midiout = MidiOut(uart)
  44. midiout.all_notes_off()
  45. midiout.all_sound_off()
  46. # midiout.reset_all_controllers()
  47. midiout.program_change(0) # Acoustic Piano per General MIDI standard
  48. # midiout.control_change(constants_min.LEGATO_ONOFF, 0)
  49. # midiout.control_change(constants_min.LEGATO_ONOFF, 127)
  50. # # Send all sound off to prevent hanging notes
  51. TNULL = time.ticks_ms()
  52. TONE = None
  53. while True:
  54. time.sleep_ms(1)
  55. led.value(0 if DEBUG else 1)
  56. modeswitch.poll(set_mode)
  57. volume.poll(lambda v:midiout.volume(v))
  58. if DEBUG:
  59. TONE = time.ticks_ms()
  60. print("Poll done:", TONE - TNULL)
  61. TNULL = TONE
  62. # wheel.poll(lambda v:midiout.channel_message(constants_min.PROGRAM_CHANGE,(v+1)))
  63. # wheel.poll(midiout.pitch_bend)
  64. def set_mode(val):
  65. global DEBUG
  66. global midiout
  67. if val == 4:
  68. import uos
  69. uos.dupterm(None, 1)
  70. DEBUG = 0
  71. elif val == 5:
  72. import machine
  73. import uos
  74. uart = machine.UART(0, 115200)
  75. uos.dupterm(uart, 1)
  76. DEBUG = 1
  77. if val < 5:
  78. midiout.program_change(val)
  79. midipins.DEBUG = DEBUG
  80. def midi_note(midiout, val, note=64, led = None):
  81. if led:
  82. led.value(val)
  83. if val == 0:
  84. midiout.note_on(note, velocity=100)
  85. else:
  86. midiout.note_off(note)
  87. def reset_midi():
  88. import machine
  89. import uos
  90. uos.dupterm(None, 1)
  91. uart = machine.UART(0, 115200)
  92. mdo = MidiOut(uart)
  93. mdo.all_notes_off()
  94. mdo.all_sound_off()
  95. # mdo.reset_all_controllers()
  96. uart = machine.UART(0, 115200)
  97. uos.dupterm(uart, 1)
  98. if __name__ == "__main__":
  99. try:
  100. main()
  101. except Exception as ex:
  102. reset_midi()
  103. raise ex