From 3ed2f301c9284d3fb34158c05fce4607ab97063d Mon Sep 17 00:00:00 2001 From: chee Date: Sun, 24 Oct 2021 20:34:41 +0100 Subject: [PATCH] use a sine wave SIN WAVE SIN WACE --- boot_out.txt | 3 +- code.py | 310 +++++++++++------- font5x8.bin | Bin 1282 -> 0 bytes lib/adafruit_bus_device/i2c_device.mpy | Bin 1943 -> 960 bytes lib/adafruit_bus_device/spi_device.mpy | Bin 1274 -> 649 bytes lib/adafruit_dotstar.mpy | Bin 2473 -> 1358 bytes lib/adafruit_framebuf.mpy | Bin 8786 -> 0 bytes lib/adafruit_midi/__init__.mpy | Bin 2735 -> 1384 bytes lib/adafruit_midi/channel_pressure.mpy | Bin 1068 -> 547 bytes lib/adafruit_midi/control_change.mpy | Bin 1107 -> 583 bytes lib/adafruit_midi/control_change_values.mpy | Bin 523 -> 464 bytes lib/adafruit_midi/midi_continue.mpy | Bin 481 -> 295 bytes lib/adafruit_midi/midi_message.mpy | Bin 4103 -> 2103 bytes lib/adafruit_midi/mtc_quarter_frame.mpy | Bin 1043 -> 559 bytes lib/adafruit_midi/note_off.mpy | Bin 1119 -> 609 bytes lib/adafruit_midi/note_on.mpy | Bin 1104 -> 596 bytes lib/adafruit_midi/pitch_bend.mpy | Bin 1054 -> 564 bytes lib/adafruit_midi/polyphonic_key_pressure.mpy | Bin 1254 -> 622 bytes lib/adafruit_midi/program_change.mpy | Bin 1036 -> 540 bytes lib/adafruit_midi/start.mpy | Bin 450 -> 284 bytes lib/adafruit_midi/stop.mpy | Bin 443 -> 282 bytes lib/adafruit_midi/system_exclusive.mpy | Bin 1063 -> 546 bytes lib/adafruit_midi/timing_clock.mpy | Bin 496 -> 299 bytes lib/adafruit_ssd1306.mpy | Bin 5600 -> 0 bytes lib/font5x8.bin | Bin 1282 -> 0 bytes pyrightconfig.json | 7 + 26 files changed, 197 insertions(+), 123 deletions(-) delete mode 100644 font5x8.bin delete mode 100644 lib/adafruit_framebuf.mpy delete mode 100644 lib/adafruit_ssd1306.mpy delete mode 100644 lib/font5x8.bin create mode 100644 pyrightconfig.json diff --git a/boot_out.txt b/boot_out.txt index 1b756ac..6581951 100644 --- a/boot_out.txt +++ b/boot_out.txt @@ -1 +1,2 @@ -Adafruit CircuitPython 6.2.0-rc.0 on 2021-04-01; Raspberry Pi Pico with rp2040 +Adafruit CircuitPython 7.0.0 on 2021-09-20; Raspberry Pi Pico with rp2040 +Board ID:raspberry_pi_pico diff --git a/code.py b/code.py index ab18ebf..17f06d9 100644 --- a/code.py +++ b/code.py @@ -1,9 +1,7 @@ -import time +from adafruit_midi.midi_message import MIDIMessage import board import busio -import adafruit_ssd1306 - from adafruit_bus_device.i2c_device import I2CDevice import adafruit_dotstar @@ -11,8 +9,8 @@ import adafruit_midi from adafruit_midi.control_change import ControlChange -from adafruit_midi.note_off import NoteOff -from adafruit_midi.note_on import NoteOn + +from ulab import numpy as math from digitalio import DigitalInOut, Direction, Pull @@ -24,175 +22,243 @@ p.direction = Direction.OUTPUT p.value = 1 -num_butts = 0x10 - -lights = adafruit_dotstar.DotStar( - board.GP18, board.GP19, num_butts, brightness=0.1, auto_write=True -) - i2c = busio.I2C(board.GP5, board.GP4) keypad = I2CDevice(i2c, 0x20) midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0) -oled_height = 32 -oled_width = 128 -# oled = adafruit_ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) -# oled.fill(0) -# oled.show() - -class LFO_STATE: - off = 0 - slow = 1 - fast = 2 +class Butts: + length = 0x10 + held = [False] * length + pressed = [False] * length + def read(self): + with keypad: + keypad.write(bytes([0x0])) + result = bytearray(2) + keypad.readinto(result) + b = result[0] | result[1] << 8 -num_lfos = 8 + for i in range(0x0, Butts.length): + p = not (1 << i) & b + if p: + if self.held[i]: + self.pressed[i] = False + else: + self.pressed[i] = True + self.held[i] = True + else: + self.pressed[i] = False + self.held[i] = False + return self.pressed -def read_butts(): - pressed = [0] * 16 - with keypad: - keypad.write(bytes([0x0])) - result = bytearray(2) - keypad.readinto(result) - b = result[0] | result[1] << 8 +lights = adafruit_dotstar.DotStar(board.GP18, + board.GP19, + Butts.length, + brightness=1, + auto_write=True) - for i in range(0x0, len(pressed)): - if not (1 << i) & b: - pressed[i] = 1 - else: - pressed[i] = 0 - return pressed +butts = Butts() -class Lfo: - OFF = "off" - SLOW = "slow" - FAST = "fast" - state = OFF +class Control: idx = 0 - value = 0.0 - direction = +1 - held = False - incs = {OFF: 0, SLOW: 0.01, FAST: 0.1} - start = 0.0 - end = 1.0 def __init__(self, idx): self.idx = idx - def draw(self): - line_height = oled_height // num_lfos - # TODO consider removing gap - # oled.fill_rect( - # 0, self.idx * line_height, int(self.value * oled_width), line_height - 1, 1 - # ) + def light(self, color): + lights[self.idx] = color - def pressed(self, butts): - return butts[self.idx] - def step(self): - inc = self.incs[self.state] - self.value += inc * self.direction - if self.value <= self.start: - self.value = self.start - self.direction = 1 - elif self.value >= self.end: - self.value = self.end - self.direction = -1 - color_offset = lfo.int(128) - if lfo.off: - self.light((0, 0, 0)) - elif lfo.slow: - self.light((255, color_offset, 0)) - elif lfo.fast: - self.light((0, color_offset, 255)) +class Lfo(Control): + length = 0x8 + idx = 0 + direction = +1 + tick = 1 + start = 0x0 + end = 0xA + speed = 0x5 + on = False - def light(self, color): - lights[self.idx] = color + def __init__(self, idx): + self.idx = idx - def int(self, mul): - return int(self.value * mul) + def step(self): + self.tick += 1 - def send(self): - midi.send(ControlChange(self.idx, self.int(127))) + def update_lights(self): + if self.tick % 3: + return + i = lfo.int(255) + redness = (math.sin(2**math.pi / self.tick) + 1) * 64 + if lfo.on: + self.light((redness, i // (self.speed + 1), i)) + else: + self.light((0, 0, 0)) @property - def off(self): - return self.state == Lfo.OFF + def sin(self): + speed = 2**(12 - self.speed) + period = (2 * math.pi) / speed + amp = (self.start - self.end) / 10 + offset = self.start / 10 + sin = math.sin(period * self.tick) + return (amp * sin) + offset @property - def slow(self): - return self.state == Lfo.SLOW + def value(self): + return (self.sin + 1) / 2 - @property - def fast(self): - return self.state == Lfo.FAST + def int(self, mul): + return int(self.value * mul) - def press(self): - if self.held: - return - elif self.off: - self.state = Lfo.SLOW - elif self.slow: - self.state = Lfo.FAST - elif self.fast: - self.state = Lfo.OFF - self.held = True + def send(self): + midi.send(ControlChange(self.idx, self.int(127))) - def release(self): - self.held = False + def press(self, pressed_buttons): + if pressed_buttons[self.idx]: + self.on = not self.on + self.light((0, 0, 0)) bpm_mode = False bpm = 128 -lfos = [Lfo(0)] * num_lfos - -for idx in range(num_lfos): - lfos[idx] = Lfo(idx) +lfos = [Lfo(x) for x in range(Lfo.length)] class Mode: NORMAL = "normal" TEACHING = "teaching" - SET_BPM = "bpm" + SET_SPEED_CHOOSE_LFO = "speed lfo" + SET_SPEED = "speed set" + SET_LIMIT_CHOOSE_LFO = "limit lfo" SET_LIMIT_START = "limit start" SET_LIMIT_END = "limit end" SET_CHANNEL = "channel" current = NORMAL + @property + def normal(self): + return self.current == Mode.NORMAL + + @property + def teaching(self): + return self.current == Mode.TEACHING + + def become_normal(self): + self.current = Mode.NORMAL + mode = Mode() -while True: - # todo use bpm - time.sleep(0.1) - # oled.fill(0) - # todo set bpm mode (press B then type a number then press F to select. press B again to cancel) - # todo set channel mode (press C, type number to set midi channel, then F to select. press B to cancel) - # in bpm and channel mode: numbers should be white, B should be red and F should be green - # todo teaching mode (press F, disables LFO, press a button to send the CC for that lfo once) - # todo set limits mode (press A, press a control, press a number and then select start (0-A) and end (0-A)) +# for the type +setting_lfo = Lfo(-1) - if mode.current == mode.TEACHING: - continue +pmode = None - butts = read_butts() +while True: + # todo set channel mode (press C, type number to set midi channel, then F to select. press B to cancel) + # todo set cc number mode (press C, then C, then select an lfo, type number to set cc, then F to select. press B to cancel) + butts.read() + if pmode != mode.current: + for idx in range(Butts.length): + lights[idx] = (0, 0, 0) + if mode.current == mode.NORMAL: + lights[0xA] = (10, 20, 40) + lights[0xB] = (50, 30, 10) + lights[0xF] = (50, 20, 20) + pmode = mode.current for lfo in lfos: - lfo.step() - - if not lfo.off: + if lfo.on and not mode.teaching: + lfo.step() lfo.send() - lfo.draw() - - if lfo.pressed(butts): - lfo.press() - else: - lfo.release() + if mode.normal: + lfo.press(butts.pressed) + lfo.update_lights() + + # todo deal with repetition + if mode.teaching: + lights[0xF] = (255, 0, 0) + for idx in range(Lfo.length): + lights[idx] = (250, 250, 255) + if butts.pressed[idx]: + lfos[idx].send() + mode.become_normal() + + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.current == mode.SET_SPEED_CHOOSE_LFO: + lights[0xF] = (255, 0, 0) + for idx in range(Lfo.length): + lights[idx] = (255, 255, 240) + if butts.pressed[idx]: + setting_lfo = lfos[idx] + mode.become(mode.SET_SPEED) + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.current == mode.SET_SPEED: + lights[0xF] = (255, 0, 0) + for idx in range(0xB): + if idx == setting_lfo.speed: + lights[idx] = (40, 240, 40) + else: + lights[idx] = (40, 140, 250) + if butts.pressed[idx]: + setting_lfo.speed = idx + mode.become_normal() + + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.current == mode.SET_LIMIT_CHOOSE_LFO: + lights[0xF] = (255, 0, 0) + for idx in range(Lfo.length): + lights[idx] = (250, 250, 255) + if butts.pressed[idx]: + setting_lfo = lfos[idx] + mode.become(mode.SET_LIMIT_START) + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.current == mode.SET_LIMIT_START: + lights[0xF] = (255, 0, 0) + for idx in range(0xB): + if idx == setting_lfo.start: + lights[idx] = (40, 240, 40) + else: + lights[idx] = (255, 200, 30) + if butts.pressed[idx]: + setting_lfo.start = idx + mode.become(mode.SET_LIMIT_END) + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.current == mode.SET_LIMIT_END: + lights[0xF] = (255, 0, 0) + for idx in range(setting_lfo.start, 0xB): + if idx == setting_lfo.end: + lights[idx] = (40, 240, 40) + else: + lights[idx] = (40, 230, 180) + if butts.pressed[idx]: + setting_lfo.end = idx + mode.become_normal() + if butts.pressed[0xF]: + mode.become_normal() + + elif mode.normal: + if butts.pressed[0xA]: + mode.current = mode.SET_LIMIT_CHOOSE_LFO + if butts.pressed[0xF]: + mode.current = mode.TEACHING + if butts.pressed[0xB]: + mode.current = mode.SET_SPEED_CHOOSE_LFO - # oled.show() lights.show() diff --git a/font5x8.bin b/font5x8.bin deleted file mode 100644 index 9a0563ba2dae1dc1d0b1b7ecb2e54e5113f3f540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1282 zcmXw3F>l*e5I$10{Ai>OqY^L;uo9&xs-z5NTtlD*ih5KiLlo?$F36^GP|Jyf4E0jD zLuHrZ%h+xn(jh<#Btfzi{RKsb0$utax^(lZ!Ki^k0DC8(cjWQCyLaDxJf5_~fW&+B z;F0H@JUH=8FY!#nObZw6zn4 zjUs@K#rYN*rdNEO1Pkd*mPTsc^S>BBnV1y6d{|k5ZDVrxgKR8=zjT7sOycL8lr6GBq8Oxc(z-zxK-+Mhj)*4rXS~& ziIRIf3is{<)s(5DfD56>lB^Iqhuks)D~cvu)Pulrf*`1)sS78HA_G{e%EsHbKTZTw zlnDe=j{JBBgjNr*o!F)XYfKV~Qm!*Ms#SyTIr-QCQL2j44XQ5ZR$?MQ)8#gIgE}JY zUR+!x!P96r0M^3K1K;57w-^vT*{$8Kxy9G79~at~dya(SQ8|v!{0h?Tm1E>=Me!NG zQT+6@upP(oXdA1Iw&N)J9H5{0Aor&|kopOq;s=<{>UZk1B#Qg=zDbmK zdviD#*lpi0pSOG5n!r!5UQIi_Ua!-^E_K{$R;>=w@cy&A8}p63ncDcr`u)39%^}no zG7qM{Js1o(9nLG~aK5r~I(={b-n7R#eXjlxWKa*xLD)u7-ocauKs%Vu#rfD;6hTA#%t}%>Prt4SAT-VpMl7?3aqa{k4 zVLqUXoV3*lk5&uG7F(QN1fXMU0CVMvP}T_ViUQXNMRL7Zt?B>6U*QUAP+Ey<&~IRl z27O3ULqd9nM;1YJW+XEbeBx1r&Tf+6&^W<-I2>-JvYgM$De7??`o|b>6`oo}i=6Vy zcbD&8n$56j?w(4gyY_Hz&$b7Xf&JT)gPo3tpAk|?lF}wg5R8L>?+*jcgW*2MVp8t! r=UA7qlM~h|w5qNAP4y=Jc^C##(KN7mCP`3|q#~?;uvP#Ug;>IW4$UpB diff --git a/lib/adafruit_bus_device/i2c_device.mpy b/lib/adafruit_bus_device/i2c_device.mpy index b8fff5006213e685c23cfe281d661ead958d473a..e5b81a2580b22d169889dad6227fdef477b1203d 100644 GIT binary patch literal 960 zcmZ{j!Ee%V6vto77_tE?ZLM=m*Mtq?G65N)*$D@WbBAR(6N7R2K}(Tl8zpVQ5f}Yo zc3_Dnx~tb6b}Ve}ZZ!S}UOebO;lZQ77B)4}CT-sD{oe2MzVE$Xvu=7yZ1ao&p2bqR zRM8u%iKK>s%1Tp}mAIOe2WG6^DvHHSL;+^xX6!~RAqWUH72Qy^8bVQX}=2%4*Hj zl0yRcl5PR~$zfp{p}MX~3aV)Opm%v0JZhLqvODeQ|x;W+<|#Ims2O;H~$&cjdGaw@vE zjciR8=k1dEd!+p1^d3FH4NHv*9Kh;1?$C>u{)O}M0jJRafxI^5W$xV@+{sJ^M{yAg zk!a*@6i)t-_389%(MwUEEpC*b9YBBg&lXH}x;-Xz%!E#u(0e9yn(nv;f_Zx&M07>b zSu%vaHA1Z&5Eodu6{anY`kA7X6$&=& nH*W`DB(vYh%QP9j1jf}>O(g%4*uN!W$rJ|{WkF2r%Y}j6uoc!oiE}vIF)gNQ;+S+O>N7qYgDS%p@}LMK&4u2g7iH0ydfi;8S`c) zjZqO}sf)7cf`7nIaFWtJ0`Uu2!=FHG;l7zM4#Aa;7t!_eefOSw&OI+5g`{_PLLffN z4cI11w%sf+fWJ~XB3~mLAj>4%CaFA8B{@%$2l0DHrt0+A{cS~6H16m&?Kl=y*|FYb z6}{FC!g7BQsh6weJBySaGj8doL1~;)&iW>$i4SWJ_q;2Uh!CrJXxn}3Zl&_MZXY_G za@RbnjN4Rp$Ne7ayo-Gw59~uM`hjElmCAT&7z=x|r1NB(yj*cNzm0Qug}ZM(bIYvB zvN+f~*FfF|97ry}+GBE60XYps*}a!cggCM`Er7ttNk zQbKZ-w8Qc$v?KBww4-tfX_|~RnvX-3zYigULy)~fK9Z_@dSM;+rr={P&-QhU&6F%cXqy{LE48KxIQVy^X)(EPi0Gq+Rt zI-4s#`|7^~Hrw!E9Xv?>l5P-9s_oSuxz$V$esA1&YY)F@ECg-?~9!@S#iG0*^ZBal`rG{%di-HVBbq6Dp%VRsnl#>#GXXDdB1 ztq~#7e}ec2tV;DC5dQ%WlIWF_S7SUfEjGU7y}Z1<_x*e`Qyw0ePPa6y!$`^Aw6}uD z<;00XvdJ1QWx3FI|Fv1axv{ZP%rL-X%h_Amo4QU&g9V}M?GQ2xIwmAwzDLMf9^r{c zmHSptVrf7}s}!NISmWFe@8)vbF0VySmU_=~ePnK>&n~+Gl^!ZhUX!||D7;X~%A@uj z;~E-$gGFZg^_5p+kb<&h4F{D2P0RSJXc;*UddP@IBPQmkCR z2ov7N#wGba$FVWqk@-pHXPF;jL#H*@Cn2jd%0I@2603ujB4QP3>F|ZiX^n7?coFv_ zj^XHGp$%1u0XS5KM-&Fb1M>TkNTtL;<*^{T= i%fI%j(g4yD(aweAYNbcVY?l(=^x5TZBY!E;8#w3F&&Znq literal 1274 zcma)*Pfrs;7{=$NEw+GRsiY=ofx>pT|7@|QG%*J8&p{6)jSv&VVY=PU(v79N?#=?e z$d)Ma!gpB}`~>1x(1TY_UWr$o*%n(g2IesH>||%&eSYt=D}kYzTmbQLwTu#=RIAGp zLFiX(9>h7gjzke=s}M^tst;Nx?Stp3Ix= zP$|EVUmV4Fi&(a9v@i~1Y!TDIII>!K`q)3xR{-{MgHqGJTPSSkwBgk9sqdXkxwpc^CU-?pn$w!FUAYE~G)DV;H}3lxFvh za7}UQmO@F`G@6Q~({{*gC^i`*JJeFJ+BDRcHoH%6F}^s0F=ntVxAv3G*JxPX-o|J||Ps+fNCuQN2C*|OSC#ArPr=UFU@@4uK#NrUu_E3?v z^{m##HUq55m-_xuwV|8XCQYK!|7pSA)~VXS)WC*AO^1fIl%~T17-Z)(UTW~nl*XuDR5Sol~ z=g;I+T9)LjD3>zKe$P+zkDna4-^%yhn{QC34xcAGyN9mq#dGlP^w?j1y5Gw|_o#Dn zeB_qK-Gwhcu@W3=Q0$!CzVmhQ$8M2fVn`Pm(xSjK)D7pwbOvn<>aL}8e?g?yrbMwU nrG0Mu+yiG2+Gf8I;cD1vap*lLVX~uQ+BV4*E?ByT{f*jhoH3Uz diff --git a/lib/adafruit_dotstar.mpy b/lib/adafruit_dotstar.mpy index 696e977bb9ca8db3544dc81ddff7d8e265113a69..7ded4938159e669e2a53cd29ad7d53008a3fa9f0 100644 GIT binary patch literal 1358 zcmZWpO>Em_7=FK`X_7999LMvzcA}wK)3CKoNTQ%2RIP4Gf5vEF zvn>)*zjREj(+(3tAP@(H5aPfg>B`UG0z(`&?r=fcX=h-n5I1<8bS(l|{`|Z@dHjCQ z_c*f-+eq;GE8p3s!5NlHQdw`PrdX<*hAHV&T9Z1dE3y#Ehw_>5TqztpxYmHK3=b3= zhFa$dLbjx?tEN=7!i6JNarA&rQ?Dx3Vx!EHr5LRGA^b2sP7A#*Ry?TMmyYgNJ+y!X zhx2I7e>D-fxP&(|5TAN>D#r7ocv;bLjG8EhfM-NeSG2k)zR8c~@-x}IxG*=9p3924 z#aHJTS0*dW^ZmG3a9%(-FCd)HBE-dlLKdNrMJQyk7Z(f8V-}ZuoG`w0-OQmp{!oC) zSX&bs<)oc=tjL5I(-qUyjOU|KRHM=;PRaF4(I-MgXPyW=tLiceooSjCoO_>d3V(7f zAB>XdttgGjYa`df*9R0ux#?8a0Q_)_$L-m97|KmR2pF!YtLqiBrWi&s%WzV|tczE4 z)l`apFT-~Q6YF|O(Tk(4y|;m3ic+JbOIU9|O$ZPExQ+Le6t$+Bab)$x`*`ri9Xt&C z8BMQiif%UJ{Yk>xYH=seil#2rj7!+;;!lVrWB*-EQ!&~yah2_O7;j~Me23mR8w39_ z`ubQX9-7EaPEN*R)svCZ;u5TM23?||sS62Ud)DFlbD6~*#&v!Uu+0nB!lkwxF<-hgBA$EIfD0_Avb-EwG0s(PA{&a(fvTarA$LdcyYclUl`;e#>g90mU_!xmAs z?$Lb3B)(u0UoxJGBH>AW!}w5TwW{dfrf!k~8VbMx+XJ#CgsUW(Qo`#!6DpFww}Quq z&LrrqU}Sv!{3&R2uCiLK(iABmG%EEgDJZl9(X^MgQA{^R0*CN4XYUq5-RFu70NWF8 zA9%d_c*Y0A zZu%iGw%3@xi694+IB6$Iiacg)7az+&VB4JWaW7O=!^Dq6o3@%yLt8xOf$v#(uahKE zPWWTf8pe_KGh=r8(HgL@fh64lTai)r(2aKb>G;dg4h*M#-L1kW9TY)u(Kh!VmsKMt5FTvqr+d8ae*pBqj5h!P literal 2473 zcmaJ?O>7%Q6rLB`iJgQrNuzC>*lvEdjtTj3-MS`Km6AW4w4^bP0|ghxYwx&OVtdVc z-PRIP)}=*I2~=@GLgK)Q6OtXuPvJy4wVaR;y&(0}BcO_kYk0G^>;Aa4H9POk%=?-5 zzV~Lu(z3r4Y6XJ7;UF1;Qk!A-dY61BN7h$7i?V0%!9PyOj?uF*4B{~0JObhfpG6Qw z7#IfE0dRT17`l8r*kR!MD2QGN959Y|66Cy`TL=h-Zy-+Y1fMhf^&^V`FlL1@5TA!V zM0^1*iQ^zlf;a(!55y@D{2(3#;V_7YKsW+o0E8Do48mX>glQP?g6k;A7I7MSV)kPh zRW792%x+1RQd&XLsjTXGUD76VMN7Vz=fjpLw9? zN@>qpbT$&DON+A$ixIlE{N|!H9GMGQa3B$yv*56XLyT4K`hRgOazr|c3Ro?>0&ur*=E`M}t3L~>oNK7Wx%v3#`Q?vEB&MR6H;~OsO z8)}x;6i=eado~UwvTquO;1i$WOUC!V@44L07`xKO5JF^UV3>$Q1al{P$lf)whX}_Z z+AF*S(SaZcvk>ho-T#yba}X^j0mOb1ZxJI9w}{;&ZWVh;+$MU-z+WWZDuXx!@iy@c z#O)%5a;$!hMyMP4$8ct)45PH2(ke_St)K6t^xcA#uI(o@X|z>loN!QzxM7-^Kz4!eR5Qs}a+;cBnqGvggX)@; z&1V$7i^}<`jYLsrd9bG}2Pb`{;y$q3tfar67v<)G5&y_|bYfz{=gWv*dHDnevZvyi zhvSEda|GNAuq`aYH>r!j7X!qoxaPtAGNefG{+3CH07Lpi>LT$k1lA3obCWpFlW@zO zV94-0MQ|^pGzu?4mD%RZ3C_4)0oMvtTub0N`7nQi^W7B}&Mq*k_}bO`H?Lj&&-gQF zHLjQL-gI6f&T)|877}|LGF<=nS7$f$lgj>na!vSve2lrVHMwbWj-;ARDQ62BdyuW&r&JwlvRd3s zHVd=;H7Q+SCfR5MoeS00u$)~j=vFzWWS_Q|d}PnDplB?~yGHBkdNjNqt;^O{8(N+` zS<_TIY2~c#9QVz^ks)cCRD7}*H1=%y0)p#7^vn$ttL;q@-MYaf1aceVP)Rcl2#i_t zES<6?%>c@hElw9}jv*M_0xWsAcyW7%A|V-BARjzl_kt z7l2Rh2ww>FA+uCt$_S|Ha!;&QQcZD?QqpN_enUOq$bRj(8Sy&JgIJ>pG4I#gVmj&Q z=7seccQ4kc*=D9{a{F45AjHwjCiM#T?t!V5^D7 zWF%QaN^W}48ivy0<<`DHYr<&|-T?P+Bo1X6QgBa*!989p_())DX=WN?E#rgMcT^<{ zZxJvrFFLAfr%~-kT@0UHPkY;*JA2w zpW)g55_|iO^LK*2#o(crveAGoX_l>p@*qAEn1zlrT=J{YQ#_a)6kSzNybTpZOTccF z-P9y|Fhlir+3cbX2-wVK{a8z_S#8DVI>ofp9j5VJlpFur;~DpQeds_XG=GTPFao0C z`(?YYME>TG#Lm{s0f}>WZQd^ZbE9@n%Y-BvK_oYDq4^t02p0p+zDIt)S|?TqxK=qjAWZhrw??eGp=M%=~Exl|37B| zEF{F1I*B23_nfom`v3p;-;OWnb%&Kk1HoUjowQJwQ$AoB?VJ(e=YFf_ts`&s{C)jf z7YO-7T^ki!X+04|D%Z@kQ?VW27Ajh(EOt;u?4(O#7hM*+>5s)8DmZCfFLmq0UMTA7 zPGa#S6!mqduy_iJhPn|fjzG~^cMXfzplGVQK^x(NUc5nTCd$6y54z`k(u)UNZkH!C z=Z!c#A(vm8ob&X}E*J;;hWc!k4#%rfDC`Xe9F8)FBP7iR9S&VE4F8$Jk!M12`A zeE-{*PMf|rcG_yQmW^E+a-6?#>9p|zKCyLpc({^P&ILn$SERU%Lv!tgaupxOKNM9e z&*45#&v`sjNL#Kr?Tz?dv*&_=h^APj={=zBUi5*Q!lz~;k=gKxqerK`k(s&4zNw)9 zXpS^TznP=a8E!mI9?XHoV2pj%MHd{hb@p-5U?@t~3qNM2nJq^y`Olc{};&bJoyNGf~(|$upvKdEJs8 zWD@@fDa#R@&eH|sRL~a;9o<8So{%al?!X2+DB8dp+rS-MFW!>)LU}k*o}(rN4J zLW(5$rjmS9NxrFdW~`3M{oG6mc{7#HEo%vFi<5o%shst zO_X8-$%J3$2x9Ud<=UU^|C>od$61oJRENF499TlX#vw_lV=vSth|L1ReYMJ zz+?7Fte*j$Mgz7QCVgHA9;QM;pRe2l9y@bp4PoyOBtt}+j~Kmv*R(|UhAZ)-b$+;S z(i>1}0DvZ3lZORMJc`n~_UZ>UuqsmM>ZgkD zyL@xfXebm6l{<1gq{I-Ge9V(JYByB@nh!RFftk9OaJ4t^s>|nf3%t1w{9Z~(#VER; z|0V#bSDMb!iM$Y$JbYnc(EhkEIwmktC7b0z5964uEG=I&{MH7P4U&4m&s7RsWR%Tq zyX53m-4JeRzAN={Swy`wkL|UxrsV{U z!6)c5N|!Yw)aIys-*!ljV*gKVd*v8Z%K<)3C+Mekom?{!2Ryw1(*g0UK)jeoKfx+T zuoCwe;LKbXlss=i&;cvkbKi7|l zt*xz=wm$V|fz%TGff&S<-MjL-vY~9IXJyx|+h7eRpaDi< z!=`zgL}j<`LwLvFeLH1u5|8e>={gh=F(_^ zvhqT?uYoyk0^FCXGZ0R z(t40ZV$D}^!YRSh+A-Q8wyLkT*0%0TNO7=XU?SIFjTGzoDU^QocLM?Yd;{q$Gne;^q*j2k6aboc%xcI!PQ z`#AMD`>!9o2T#!a-SP+N`*u-|zt8Ipa(wkZ#QQkDd6xdu2l15z1UV`6m#nLc*llOc zdL1aq0)j80qe{BGe#sY%;aP|>Xa#q-`LhsgXzmEK9V%Ef!obd(Sp?$XY0YveFz1&- zu85@0<_@{8JEmq_Ar`u*ykTB+V7ic_E-cErEe(PA0wfN(qE>Z<~K) z?C5tpI(i1tJ4RUr|Lg<>34W4Y@z}B3YmhfVc{Jn250En26sC0%x^3ri3iGCOU3w{m zI~R3@eslSL5U7IJ-84U$7Jhyi0&crW|#Z7)J-wxlWCjOYUZM@1@wZoPUdBFB-tkgTZznL|FwMVA7imU z4+;N2a-hlhsBkKZnGA4!BI)6}NfR|aJwzLTX`?hYnht2jG9GK{>Y4^$(B;-<`Sa^) z^{QUgs9yhcxM3WFV8K5ZjtG;I;0*}4Qvr6`7d}+_+dyCVSn-!IToMUx2$ceOj~5nP zVWn_gz`BMRk9vYx z49s^pb>boPQ)R}f7R#G4*^>aU6U2aqT5 z(7M+EOsL?@7TSD>*8LD#K|{Sxmps&?y8@qlp#S`I>A(_z&qp6;&F!@LM>Oi8KWW*v zSMoqMnnh5Z#oHLOkNi7;Y0&&Rsn}1dRrP%uJwA z)rBUxDng}$7qWAKS=ZDx-RaZ38T>JqTcgvo+Dy|7H@XJABP@!m_k8CPv%1FFkT(!{ z;X7~_?C}M!vo_W87d8^!Kc3GS1R?^sVbTd9eCSMY&gT{aL2LMx`IqCG!r6 zV!{*!FrD?#!Bb|UO6(gsiB(Wy<(AE})>;s^Ac$MJJb2C~QzmjNO@5dY@~~U08Mqh) z`;llKrm-}b=XeGlsZ`QqRIdjMdDtKFJZv6rC24{FxJI~CNeoNUHGMFomBwPBrCOOS zl0>c47E&oHtqo{@(b!hzZihWmNcGS$p?DYqX3%dH$AQAXtVEWA1yhL!PRaz=7^M#a zm$I6J8FPi$)dcKtlcxaM#@c diff --git a/lib/adafruit_midi/__init__.mpy b/lib/adafruit_midi/__init__.mpy index 141f9b214a4b841d442bf35991e8288bd50d962f..5714439aab5ff24661961a8b079ee551a9d1d8a9 100644 GIT binary patch literal 1384 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 A!T>gc>8nguT)BS2q(Y(cO(OdM z3alY+OGL1qo4i0t+-R1YRwFkVa_ft^R&KnzL=TUv^|#H##x|VF$$2LO(rbrV5D+LO z0i`f*j|1XktU$FCGdOI84v3fX?`y{P)1W+J`Fwt7Q->c>I{B~MpHUiSDfpg;=rJg= z^lNttEf%Tb*@v4q63ekKHwQ8HzExRc9EI6`uqm-i@+r(l)5!BU54?cOXBb_@g%rwuo{g)xl*KA!XUf4>nl86g`Z^)WQq^cF z7SR-05i5GbGIW(x>QbXdGtG9SaJY9^pr$F+=%gD$w83KdV0a$b&g^7%B7|H}!&LMJ zAwfb6+SCcTpC4q;_mdA_8a)|Z%^9?&m=-m>mxP(DFlVR~60(~zZtYQ)`AK9EB?0w_t8@73~umXG%m~FfOvz;w| z4QD$|{xN>$*YRNyW}=%|>Qw;w7@Q#=hJ~+i=97`Xf?j!4`8aQxF%3zhgoFthl;f^P zlZ1S1N$MbqBgIm#^u8Fm9SgbQ(Y@pSleeV<&aGF2sw|_@V6`M6LeAS3H3^ASRLL|o z%JAiI)zG!U0r+bn2u>hO#aKIa(&_YeLS*#c9bp51I6@p3r!fXjA_ffjXSEAi+lg=B z*3R{F&YrbDT|f2NPqMr7HrtNh-G0W|&Qj*K)jUn(?BH&jFK{8LEgCReO=|oF@(4$R z=7=FFCMEqF)G%~|=(+)b>k}qbtE0hQ3X#SY$z5N0sCwgs{O@T1e?>Jznpqokz#kl9R=NNH diff --git a/lib/adafruit_midi/control_change_values.mpy b/lib/adafruit_midi/control_change_values.mpy index a65081c88a765f1c33cf4f62449e0378cca8b811..5d45b6121104e602212586838aad9150d0071af3 100644 GIT binary patch literal 464 zcmYk3-%H~_5XYmSf*c}JMk#WZD1DLy!3WV7*JN_dx!H}Itv{ZI8mkRxQ_@r@zU+x0 z-2KzHidE-fU_N|jhM8}$Fu&D$*>w(_CEmN~-By#LribFD@bhw5SLHqBgWmA2PmjI( zNq_8(re@u&v~lM>+F#+UF7J8!-aY`)W4{^~<&bFGfmNcaKPrj-z*-_hy67PCXV^SZ z$aIGSDYTOO1%5_S>RHKAy~2-k$-4>ug~gPKf6&0oRAH9IQn= zxN^-YG(rs6)rW?|#(8|An3iOd9g;wE20~1A$2HiAv^Tua0lY*kkty$@`9@tkWaTt46{~rR?h>`#R literal 523 zcmYk&?`zXQ7zgm2Lz&$=rw;c{Q6H=GN3zYTpd#LqCpPYK7nAF>_~M~!;~Hq2lBR>= zn^gos|7g7hihEvsxbNL@9N%!|(w)T(W}VONSJqv&*go56AXL-%KbH0P)_n%|*tP}0 z7Vv=mfCl>s57{qx#D2pL`vZ^J*4cY_V&w4D_yL|7TVNYMf>XI`JcK=?fPG^K&y5nA z#yPw&eutOr`q$OBqr5*Grtccve)n53%Ssw${mkj*;!4D2 z4ZlP&CP|=VJ!vPJ2a+Q6xTr-c);vV1)utZ^jWL;fN^GgDadBdLsurWP zL~dqEW_&J$FT*Ux7%9MIsAr;QA|@6eUzS=_oSB~&AFs?HCJ-NAlvZI%5b3Hgn)3bes40at)3P|Y3!rLae+ z3WXQQmLaErm7ubgA%6;eQr&q@UOJu?4cS%Rw9I}Gae)rExIVtH=edHr5!3up%4ps+ z4HkyxfTbr*XZl!fEaSC`R?})J#CH~i+;b6=hyn9G2^zDx%lyUX0_+BCz(c_ToUKAJ z@)|dJHi=0h!QT?LP@gd#>p)#7)F$rb|xKh;NZOoDw#$)2(-( TI;mMT>Ydj5!|mf;_nweHFyoKf diff --git a/lib/adafruit_midi/midi_message.mpy b/lib/adafruit_midi/midi_message.mpy index 2317df829ffb3bc35a77a59bc9393cc6a5539dc2..fc4c8052be773cbde3e1ff5bdc78002634982dbd 100644 GIT binary patch literal 2103 zcmZuy-BTOa6~DXEBES?@yYfn;q*+VC!2$$UHiV>}sgYL1U>hSNP2zOOvXU;K8hy;} z$~F%juAHHbi6?QV?PQWkGWio$5(w-#$vD`6^EuN#B&L(356yFCaQ}dwm7sOg?!(SK zANQR5JNI|ajWF~R;w$#S0CGI1rqx-km@$-WCY>3ueo7YWx;lr0g~b_>xQ=3RVfoOq z=e6%%XA#?aJSYVvK~R)SSkp84oTB)Uz$%J{3wcHP^PAUSzww7Z_BsS%;#@qcoEsgT zipE2f(3P53b2+@A%w`r0tc7Sn$mI>J6jV*eT0CT9g|lPw*x5#Ei594M$j*wEE|I&K z%U{k#FX5cwv`IF>77sD3$1;W0bVJQp>R5_m^k2>!MnQjWU|=p|%omfvR6aX!fN@~t z0Bj_qr2zEgqA?E;tWZJlzsiO@Ej&3g)93H=BMzx$4!tbVvYnXa2dReq?!Npj$j|s_ z4!y~t_sS9_QF{`F;RvXGAFAg7vR=R`{fV($Dz9lcWr)UN0gJPFO?=d0*)`JF;UIl8 zC%t{WJ)zJsZ=gF6okr#z$ZJ9x$opHup^K(OUHw{ahUGIp$cj01*(3=UdVdH>l$VS= z{Df3q`1S56Lw>g#rpZeeA}y9L%R;e4tLCtWY?`G6OZy(k3@L4fJ4jtjTH?}X7=i!G zW{E@3RsmHkNGBxf`ad~$C9zlCyHf^;%~l+};~=61CaW6DCp=;I&#uda^~0C`%}g{a zt~jzYE6x@7O7F_patm@Iw*Yjp3Fxty(5_6yN8*X87|^M)Iy*9TIwrK8iB3EpKlO$n zL{5!NOhnH#)Le8zZn!zopF#ju2q>DG(Xnz#T_|F#X?ab_=e1rW1Qp#-jiRpR(pgo% zs2F)AwV>+yR3D15N0Lub0&+Upf|f5}%~%Z45Xq16y(t>KSSlI7O*1 z6~&6u0)8kFOQF^?&F%aVGL5WD2jq30>22qVhM1ofH8nSf=ihpjkdrKOQY77t%BF`^ z_UQ#{C&WPL8g-(Dr5KW#K_<`CHKk!M$1tSutPhoA-~ClSOh~ywo;UW%VU6Dp7i`k-Xh)FCC_8)&*1U66PbNCfk>=#Z4xilm8J=O0W55R#haz4IOqV8}U z&K0v*Qw_{9Jk(A({Wuz=KiM>SUzH?EiErcN@)~aGr z`}`L4!};xSD_Jf5aCdcWH?q4_i`dCJG#2M^>4I2)7;W=ZAY8h`w6I~x%Psh4Ajtnn22TJ9pI z%UxdM2P)OoA!g9F`T70Z5t>ZygdL=^#xr}H2i1FfX|1-takCm|0z93aZnyi@6IJe| zUN^Z<9LKz2uUAa^{C+8Ube=dgZ;!7(aBlFj2yGj|;^>@z)Ver0N$KGxxqJQ|*&^Gq zop2kem44V-+b>tGx+}Mma;;J3e=JSjt5v^&!4!iFScO8GuFi68y*gwcY`XvHXP46C1p(BGF%t_n;Sm`WzYx(BI3C zk*~(u5%*s&KqJ)061@|Pebv)3Jx-zN4`hMdmfOfjGVrO3tZ!Moa*=R5;r{1gxg}9M zwbI_U2g5p(d(p{0&EIgIgc^lSzP}fyF!-Wt!yJnewi`b` ziA)KB<`4&DY4mf+(|owY@s5`?%jnS|xFq;Y5n1ENOd-nXh5lu3^mn65+0)h-VH|oJ z+W9bY4xu{t5d(c}g*(i=6C$lY4d-|yTxr;}b5_7#1*}F4S0t+JX-=z#%Au<;+RL6U Wd?keohV_ga_=@rWa&>V3_W2j^shIiz literal 4103 zcmbVPTW=f36`tWm5=p@(1?vKflu2quU81{1GO>$BvP550Tb3cEtwp!XC3h*Y;jOz% z$9mE*fNMax)hLPreaJ(9fI(6chf%Wy?plUOknm%WPwX2g*Y3H#brUXBvZ1$ra4i9_N5CG7cP|+)V8hk`76m+ld0E| zf$Kt2t~yvxt@*eIP|kma;=YG7bKCNE^d{gG5+K=p87Om%fUCPu*J=|y<~ ze4=ajgZ)JSUx&~U4|d_KE7Z&MGJv^#6XorHM7+*#Ai4aLpwe#yjFtXhgZ9@@v(8?R z?M*n(V;=AF_!r8>q$G36h@g)pWlh&8XVP)O{6j9D5dxx^67`ZS8sx>a zfKhE3^?DV3DJ?{#6Bm+^lqd=j*-6cu(Uj=a8f5!T2w{X;x~ZGJp;3453*E!RJ?@^4 zp1@DQ;oJjoF$W%ji%Z1*Im+?)^)LJ;LOlfsuVMRBlq0UTRvbka`W;F%NK3}*59caSZpjk4-!LZBzPgut?9 zmMv)o#Jnb$>sj{a87^M3sbyzo$7Wxdv6SzZ#%6v{b1^V=ZuY!o{QTI|RNx|gWC~18 zlnm>E?Q$%V5Fi5iMpoovlE7Z4EEg!t*;GnwW~og^;*xxVlU`-z6dQ?ilBCieHW*8S zZn1S~F$KpeFRCNzy+#sbkR!EgQKpw)DGKv32?kZMV`;ExEgD!!;KaxRE2I+TooI&} zSzrN-mbJ2iMMG4Cnd*3W5m;nmS>+B$YW8AQ43z<7ZUqH`%jBogNyCvw9k7FHN@bj? zAESos7)kY)GqN)kb&6baUT_#t9mdFf9Fk3z?|^sZbDmQe{yJ%fP~okTx`izP~Ta?ApFHw2U+rIj#k8(PJt``1( zp6qi^_Rw?t9NCAk<3-TG2ln6Xwa<+^&{f@s8#%{Gyh2=A*O#EIg$KiMdG*Bm_odRL zwhvG~=NQJ+Y+9F_)ZWF{eqoGcv1S{vwxv9E#r1|eEW zClJy{;t~ru)*#e4N^!j9KEp&Ny8`a^$*u{&(z779XJx z$QOP)$+eB*{F=ju3oENp<5m5}Cy(#@bi}&tttAC&wY#Ab?6*s6#r3=ItxVT|oK%vq z>Zly%tSRHl;$Oa10RMR^DBC>8+j0nyUvFvFAw5C^(-h>#q_*3A#_e{7+Zkpg>{%eS zqPwfTuV;F2(FuupTyUP9XU>+Q60poZ+aM1c9+6G5W!v`FlVbMi=31F9#g!eundFNl zn*C$R`lz__rN55YfPkw&q#T@UzPP>;HC(NE{L#ms{AsJ<)BFA(k>C4f$jct|UfUf6 z!%)XW@%CK@C@JWZh1flqb_%@i(+O`683a|gXVA3nZ*Y2_jard?jxGwbKHzoR69Jp; zv#z6KUQEW`2XVXauP1--gF4vB`X*J0W5j!e*n{{UkGG52-7WgeyL5M*?yo}HseYvN zxGGaYlbBQq{Z?74KGtLz(<~%XrBvNln;)q6OXqE(9~?^RGpj{vEa`xQr8&b4iRrd& zlpfnHMAh&Lh-vV760Po+QCU`1oN@+fgry-PneWi0Tj|m{9tAayR$o)yv@~BzTxJ^SkWsVUWCMkxc;*4`XAsvad@mWNeH<|rh?#H@v6 z?f@kFI8y!fmEhPn{l7pl0-tvVgeGwz8!~TEJl(=T# iIhixS=dpN1xDgT3GW}wfg&XpBL1qG_D-p@GH{m}{fjwsc diff --git a/lib/adafruit_midi/mtc_quarter_frame.mpy b/lib/adafruit_midi/mtc_quarter_frame.mpy index 17504cd79040f59166a6eabad1b2bee3bf44d9b6..021639b024a747774d365d11fd8531e1835ce64c 100644 GIT binary patch literal 559 zcmY*V%Wl&^6upiK=23#3rb9#{nzkeoDY7B5K!Ocv(n1A6t&#`@kZxUfnpmoFI(8~$ z#Uv`KDj~XO(M7(%hQH}g@c078m@e2Hjn18W9=D!OEfgnez5q(Y+O_uB&LwwGhm`q__W^Mkh>FPQz(Z_TCG}1-u(uM+_1ICnYRW{`q+Es3p5wB01weyaLRXHUah@;-hL4lK_Z}4C6Yzl z83oiw)L^ZeG6mfUZICD1;iWui*ZG4|>HfkBe2emM_Fcd<3tvkR&4DJm@Msp!-n=_s zPxIsR)f9i*ZOrkQoF?RHLe>=? zF{dc}@pADlWMMU&y%7qZqn`q&zgI*^TWp-XuVkPj^Jfr7 literal 1043 zcma)4TTdE66g~$;6iiDSr3r{iJ8r!+i&9(DOPZS6i?JAu_KBp&l^tLc*2S5{gr_cz zjSo%qpBQNWjX$E7UtnhiDzz`n!_4kEXXbpDlM4nW*9X8~v1Lf3G3CWJHGVP+aN)%n zZelr$7DL7`8`qFc;~il4acURiGniy(2AMi%aAFaQkiC^3dTu*rt-@d2HB6%@YL-j3 zWm*~AEzm*D5H1%~6o$?9YCW1;TV2a>DUA|O{8O&`cgSw1ddqshLyP*7z7!=o%TuPjketT*d!SwZp{>Z*Ptcq#Gi8BF6z(u--@>T&qXkP2QT?*dDMQj=*g z+BjgdINJEc=I}F{$L1a&OTaF&2qeG4Zoou#2F?6+%zcQhwAoim5JiaE7X2^N2>BjW z+I3;t-dWlCupRB3xs~np!S}B>-tN3pZ&~}wSsEtVtGiqhMGF-}N}DUzW~3+_yPbgG z$1s4JuNw(9T#be4=?9bZiuAXZ7RT=`ErsJTOh9Wg0cw1_Rw|AQOXp8Q-tqaPfcG%F zJm#rjsuMhI2Oo#M)`Z@fw=R@EBpC3G3>_Mk8V|`@m5aYTdNN}q3`=slEaO5rf*eNx z;M{=Zm15YIrK@M=LMj0;67k6`-r3 wpa-4O(nm2d2oL}mKJ)v&R85<$M*8TN+D?C%fqahveKZ3I7AkUB5o>$)2eiIOhX4Qo diff --git a/lib/adafruit_midi/note_off.mpy b/lib/adafruit_midi/note_off.mpy index 1d8669c66188dce87bd4b816033967200138f9aa..4d5176b579af3c773763f6d842c5dde752e8a2c1 100644 GIT binary patch literal 609 zcmZut?`qmm6hARI>s)RAw70e^)aok3m4r$tqx({;ZkAQIqG8y6xQ*#m18TCHSP%xg zTK1u^?E&@_$+idBbMzfXUtzK0w|zKpIOliH?@uWj*-lTj)E2}F#+A{bBg?}B>&jAx zwnwnt=_tJpldJWb6G@nF8(iXv`SE#dLL zqA40e7+(|WTJ{j*EFb}6N*o*GW`Pru^^omdrz0jb9`Pc#nx~{|xgMd5ci0;{%8zqaHp`G_*uNQL8bSoi#T1{tp@#_X#%H_%* zFOR;&0Yq3wp&}l^W@Z8?i5tygQ*UG@PN;g`*NTm|H|WV}rT(T_WqEE7&V;1dGloOb zZ~HsIArK23k}z(MJ>p_4LZuMV!m;j~z~4Oo^Nq2iO%Rt^E}!1r-&R4|_^EM0YH1eY zuOKCb@$_xe^2QSU*o9yXL?Q9}U{~N7#9*yw3hJEyY-{n#a_z zT!OES{)iAtZHjH1K12rqQMio?3!?aBZwIZcFeRH-o`D3%zP#qkF<(ZdYO!9goX%X| z|Mlf%Ulw2R8fS(dZa*C+K~J!k;0F^unCe12V7f2I@3m2qN4PvbaD+3@Mb}R5b!rP)SOa^a15zW8!sU$&Q2VAmynJ zRn><|d2@-Px!fnbDO9@cB~wJts8PnV{fJ; zSyIfFYExa6Rk2~%j2eoPX|`ke{hj?hvn;8`V*PkiGA(9~xP?@|P7D_f--jLyKMt;E zHZmJAN>7<-sYZj+Fr_AI8kB|#eD()L8J_FKymP{2HPy12>CLBhyU7r(S9RNNS}#Sh zrrPz^ai(hMqQ^|kc@(!*v&yL+w(U9}?ZVCQ`lDc9;73cC!t*I7EC@R%mA79bJbE>~ z03-!mLn6R<2govxcba4czmO;B9AXj1;v$y1RX~z}3X&*He}{@sMsfk&vIqNakvaQ@ zq%%sRlnyp>Bg6=$CoM@EPj zC?=pcp8!tsmvRPKr#HKbYa5p@Le9AJ`Et|eJk4%RIy}5~JNzu<^yb#D-R2>?TZmzk z1YGk(xJ5Lhs@mHA3Klkt*QxXN~*=^sid_SGfl&!hG7EWO2A^8(ytDCExjID zzIp_>A9ZEOq>~xqitr7(v&-0>75SgVKfk-2beA*y=$Em4BktW~f_?eDm3hNr+k3e} zVfVmY-7W9{eUL&Jzy}byaN#`XP`bTNs&|&+^7ounAB=qFD-Uh*ZVdmM3gEA5Rz$aI H10Vbagr8NP diff --git a/lib/adafruit_midi/note_on.mpy b/lib/adafruit_midi/note_on.mpy index 7d5a5ee53eba3b21e159a7e9fa95e550a96d56df..2a26f7195db7f0fb6a4896cf7183367dc5270bb2 100644 GIT binary patch literal 596 zcmZvY(QXn!6o${TS!tz^UA9iCHkN|r0+qG6=|#OM1+`s!X~i0nOR6k zOdRM{6ZHXnie2>qe2%_@=_|ODaAz`;OwRo0{Qq~VQfxar(=%HTe_>vlpXkW;@zB1s zHOKV{cAb(pxybTVr$D|xhN+AiC$*CXVa)6i8Qp0-lQKe!u}7JCA093~w_g|= z5(M_D@B1D*(6pZI_eb55AvXeb^;Vz7BEdatz|uq3Td@BFXjZPt literal 1104 zcmZ{iTTc@~6vxl$#oh>k2t~`abXWmH7fO|QiLn79L|QSe52g>(r8{jm*-PEslJvo}i6*-!Yoj!RjrL1wxfeyJI9OJ%Pf zNU~HjTZ&CJMOH-Juo*S!po!D;9xXqbU$)o^m1?~ zolR$Bl%6xwQVgBaFr_AI8kF8E@Y3(}(XxZkV3{>pU9oIt4vSN}-DHT?i-v7Ct>>ax zSL{aXEL}A;aY!ZRhIspmS>>3gZM(tidRo&wzZ~qDdw(61c=^x?3&Md_Sz)hv^k#k) zND{bzM1Yyj6xqO;PLpin7xEZqoX@9Ngz315rEV3FB%p#M3iIEf;**hFLAN~6J=S54 zu1gxDG)if|8@Db@Q2MDQsr};+EtYbn55?GE&F6}5@0}bL-jt3))rO?&Oyy50I`1Kk zPC!|8v+PeYEov^|)!p|G(ojE+aZ z8=LSsQ;n)(w}V!z$;?}{A?w|wS!zm(#pt=Dwiq)_!=#2`0^nxAVruPf^6&|fcO3zu zQO|;{l!yNnx{DjwT@?AhgTH@uIc}G;z4yyl{_E;kj9}09VXKCPV*5wALgDblYuQ~X z06l#|7{CV*x$>0kav@!}lXNeV+;-PV_N2%czVb)|$13<=O#pvYwIZ5T?|1(X(#KG^ diff --git a/lib/adafruit_midi/pitch_bend.mpy b/lib/adafruit_midi/pitch_bend.mpy index 4d651da4f1ff0ae0dceeee1857cf8dd531bedfe7..f6c87629adba383b54f7e02439c63c54e7d5ee4f 100644 GIT binary patch delta 491 zcmXw!UvJW26o*fF#jc91fAAF@iNG9DG$bPp@xnxbp<5hegf<4fcnjSd)&wYNamlXw zw#LjQ#+%)F;b&;oJHN?p`~(a73A9MO`<;`M=lq^8Yu~S=n#si7d?03Xz}L=yq7Bc; zv-ClUeky=3;`ZLoUYok^U_{H@Ms{KyT4b`Ca|m;N@!EDpt*96ia!ei9vZsV>0u~8z z=*%WWt8$`zV9m{=2Av*Cf{HMbxJ=ohBg>sr=Rb_hPiC|R{jPb=aZkPANxp#AKi)Qs zQfbFF-U|Q{+`=&!VYpND4V)%Dt*+_4qCbnDuX4NId-)Eh_FJ77+HUU=bj7rJG?-55 zco-Id!yr{TEE6(3nNyb#30l>J8n5-x1Qg_cd|>QZ2BaIzySKId7`{f?%xqbm4CC%H zeBOfSCP*UxtrkF^MGAWL=HmGpE3!Y{MI*sp_nSP6GG*cnESHkw!T2quj$=E-ww-@& z0FZ<;l=QU+SP)owGhew6GBiSEJyiHm!Oh)zr_n;*yhW&Rr@xosAyPRr pW}Nw{stCHk)B=Q2pr8JVeEm}7Bc{igg&Hicu9{<4p17lx?O$PjjgbHV literal 1054 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 Q-Zr``ch~nf{aZr50dK>DH2?qr diff --git a/lib/adafruit_midi/stop.mpy b/lib/adafruit_midi/stop.mpy index 1c6e4587903c6ea389a44d167aa63311a74ebaa8..102bb2595967d666eb3bf1300e422e964625c4a1 100644 GIT binary patch delta 229 zcmdnZJd3H`nUzUip-DhOhJjrxF(omrs5G-AJ~uNZQ@^+*zd)~`GC`q%FF-A|kAtC6 zK+MbtvanId-AHMf_zFKPSpqnQ1wR1+QU{t=gdougU5b_(9B{r?PwbJ;JO&V4 zSe$#oxvGwBZiTPP&~?-VRBb23H?}_%cU#E)}iMf5jd5mT-XRrub!mSqu9xkhM} zh$yH`3eg8WfiT}SK#1vD*VTfCZabnAXa)@uCF^R=Z)cfuJvz}d6 Qt*v)A9`By+`wxWt0c!++SO5S3 diff --git a/lib/adafruit_midi/system_exclusive.mpy b/lib/adafruit_midi/system_exclusive.mpy index 049950d37afd58a20827b6f6ce8e81749f03647f..2fa2444ff9a83505d08cf722cc3159d95511573f 100644 GIT binary patch literal 546 zcmXv}&2G~`82mP-q~WKv-Lj-ml_(`ql?q#pEU173X%nD=RHsYEA%eyJ~ z6gw)1N{9#GDQtKho}y2{Iw6Psv@^T&&CKCa;aO!Wmp7q!U=Qr`aO`p7djn5r5#!V+ z^qX@rX5JOmg6K;nUg_28&l)5$?jE&|x|A{7r4977oNI_b$D0yHr}Di$&Cm>t3Av&n z^G271Yy*}F3287Q#B3sYt3Na8EIgEwAz?{D>y41Qp70MBD+!MR`Vvl09E8}LA?E>m zt?RDGhvPHN8TtAmyxv;0IP^kCwCP2BD7^Eyn)pB6m$#+W9~*J0UVr}HefNDCK!L|t zB$F^asU`tlA$_xDTK#G=5$WgmZma)kf**YD9DguBR+Fz-?Hsq~PiX}Z2BnFxO2}En zDI-LIPP1SL+DaXelKu3K3d+NHr_lfv4t^UbD{uMs<@nro_&5|by@BBWh?s4H?77z#_O(!1*XHgi-S{`bP2TCYE4pHb1#z)HS;*UWHUmEt$4% zaYNVigltMn7+icUR&A-D2&K^sWcGIVGD1qVET)_yZn(~HV%Q$vRFXhLHRxc+8Rx&3<|(g*Jj-}}-ByKa(p)oV0b?&JKpX$i@BpjcI239$Gberni@Y#>>`981B)84N;iISB4G8XRzUhvR*K zX+y2qCADbTCJj>8+~}C5TI#s88^ZjH41n=5DXOK>CH>;(go*(7{SNKM%KDn~BM@bG zDTW_W!|u`sUUruhyzB?p`@zfnjSl|{Jka@83YY#yZ&J`9-XSSHB;|zzw;jt8TCWpo s|K6TycYB@FPo7Zkv_)^tlPCYo@z1XP+5FH@?q&q=7OT={$g(@eKO{{}lK=n! diff --git a/lib/adafruit_midi/timing_clock.mpy b/lib/adafruit_midi/timing_clock.mpy index 3b3122318387597595795010bf3306d0f7167773..01f94a869fc715f57eff2ecb5cef8d81801a5a8d 100644 GIT binary patch delta 222 zcmeysyqbx}nUzUip-DtSj)C23Vzg|1fGgDadBdLsurWP zL~dqEW_&J$FT*Ux7%9MIsAr;QA|@6eUzS=_oSB~&AFs?HCJ-NAlv|-qM*)Zx8l*smZf|`v*ofO z_k89q{zQM`FaYnu^nJ%WSCk?5&EQ4WZA)2DD9r^kD`@&!BHv9MMotuYS^^TBVq{o!F diff --git a/lib/adafruit_ssd1306.mpy b/lib/adafruit_ssd1306.mpy deleted file mode 100644 index 46e53b3fb94a96910f25db65b2f0847856687073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5600 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 diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 0000000..5a78d48 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,7 @@ +{ + "stubPath": "./stubs", + "include": [ + "./code.py", + "./lib/*" + ] +}