# MIDI Cable # Black - Data # White - VCC 3.3v # Brown - GND import time import board import busio import adafruit_midi from adafruit_midi.control_change import ControlChange from adafruit_midi.note_off import NoteOff from adafruit_midi.note_on import NoteOn def init(): print("init") global midi uart = busio.UART(board.TX, board.RX, baudrate=31250, timeout=0.001) # init UART midi_in_channel = 2 midi_out_channel = 1 midi = adafruit_midi.MIDI( midi_in=uart, midi_out=uart, in_channel=(midi_in_channel - 1), out_channel=(midi_out_channel - 1), debug=False, ) print("Default output channel:", midi.out_channel + 1) def trig(note_nr): # print("trig: " + str(note_nr)) midi.send(NoteOn(note_nr, 127)) midi.send(NoteOff(note_nr, 0)) def subdiv(clk_bar, clk_bar_old, div, note_nr): div_ns = div_to_ns(div) clk_sub1_old = clk_bar_old % div_ns clk_sub1 = clk_bar % div_ns clk_sub1_diff = clk_sub1 - clk_sub1_old if clk_sub1_diff < 0: trig(note_nr) # note_buffer_on.append(NoteOn(note_nr, 127)) # note_buffer_off.append(NoteOff(note_nr, 127)) def div_to_ns(div) -> int: # trig(note_nr) clk_pulse_per_second = 1000000000 beat_per_bar = 4 bar_ns = beat_per_bar / bpm * 60 * clk_pulse_per_second return bar_ns / div def md_note(nr): '''1-16''' md_notes = [ 36,38,40,41,43,45,47,48,50,52,53,55,57,59,60,62 ] nr = min(nr,16) nr = max(nr,1) return md_notes[nr-1] def md_selftest(): for i in range(1,16 + 1): trig(md_note(i)) time.sleep(0.2) def main(): print("main") bar_ns = div_to_ns(1) clk_bar = time.monotonic_ns() % bar_ns while True: clk_bar_old = clk_bar clk_bar = time.monotonic_ns() % bar_ns # md_selftest() # for i in range(1,16+1): # subdiv(clk_bar, clk_bar_old, i, md_note(i)) subdiv(clk_bar, clk_bar_old, 1, md_note(1)) subdiv(clk_bar, clk_bar_old, 8, md_note(2)) # for i in note_buffer_on: # midi.send(i) # # for i in note_buffer_off: # midi.send(i) # # note_buffer_on.clear() # note_buffer_off.clear() bpm = 120 note_buffer_on = [] note_buffer_off = [] init() main()