Browse Source

Summing up time deltas is SHIT

master
heck 3 years ago
parent
commit
8312b7a299
  1. 110
      code.py

110
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()

Loading…
Cancel
Save