diff --git a/code.py b/code.py index b227bd4..8531f99 100644 --- a/code.py +++ b/code.py @@ -8,10 +8,11 @@ import board import busio import adafruit_midi -from adafruit_midi.control_change import ControlChange +# from adafruit_midi.control_change import ControlChange from adafruit_midi.note_off import NoteOff from adafruit_midi.note_on import NoteOn +bpm = 120 def init(): @@ -33,71 +34,84 @@ def init(): 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)) + # MD doesnt need note off + # midi.send(NoteOff(note_nr, 0)) -def div_to_ns(div) -> int: - # trig(note_nr) +def div_to_ns(div): + # trig(note_nr) clk_pulse_per_second = 1000000000 beat_per_bar = 4 - bar_ns = beat_per_bar / bpm * 60 * clk_pulse_per_second + bar_ns = 60 / bpm * beat_per_bar * 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] + 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): + for i in range(1, 16 + 1): trig(md_note(i)) - time.sleep(0.2) + time.sleep(0.01) +# NEW +# Summing up time deltas is SHIT because of the drift caused by rounding errors, +# TOGETHER with the worse part, the INTERFERENCE errors sum up as well +# no load - 0.0223318ms / 44779.1Hz +# 1 subdiv(1) - 0.041875ms / 23880.6Hz +# 4 subdiv(1-8) - 0.112662ms / 8876.11Hz +# 8 subdiv(1-8) - 0.159569ms / 6266.89Hz +# 16 subdiv(1-16) - 27.792ms / 35.9816Hz + 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 + nr_tracks = 8 + + clk_now = time.monotonic_ns() + + clk_last = [] + clk_next = [] + clk_inc = [] + + for i in range(0, nr_tracks): + clk_inc.append(div_to_ns(i+1)) + clk_last.append(clk_now) + clk_next.append(clk_now + clk_inc[i] ) + + clk_inc[0] = div_to_ns(1) + clk_inc[1] = div_to_ns(2) + clk_inc[2] = div_to_ns(3) + clk_inc[3] = div_to_ns(4) + clk_inc[4] = div_to_ns(5) + clk_inc[5] = div_to_ns(6) + clk_inc[6] = div_to_ns(7) + clk_inc[7] = div_to_ns(8) + + clk_start = time.monotonic_ns() + loop_count = 0 + loop_amt = 10000000 + # while True: + while loop_count < loop_amt: + clk_now = time.monotonic_ns() + + for i in range(0, nr_tracks): + if clk_now >= clk_next[i]: + trig(md_note(i+1)) + clk_last[i] = clk_now + clk_next[i] = clk_now + clk_inc[i] + + loop_count += 1 + + clk_end = time.monotonic_ns() + ms_per_loop = (clk_end - clk_start) / loop_amt / 1000 / 1000 + print("{}ms / {}Hz".format(ms_per_loop, 1000 / ms_per_loop)) - # 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()