From aa613baf06c55f1f1963c35abdd9841e6ca61b60 Mon Sep 17 00:00:00 2001 From: chee Date: Sat, 23 Oct 2021 19:14:34 +0100 Subject: [PATCH] initial commit --- .fseventsd/no_log | 0 .metadata_never_index | 0 boot_out.txt | 1 + code.py | 158 ++++++++++++++++++ font5x8.bin | Bin 0 -> 1282 bytes lib/adafruit_bus_device/__init__.py | 0 lib/adafruit_bus_device/i2c_device.mpy | Bin 0 -> 1943 bytes lib/adafruit_bus_device/spi_device.mpy | Bin 0 -> 1274 bytes lib/adafruit_dotstar.mpy | Bin 0 -> 2473 bytes lib/adafruit_framebuf.mpy | Bin 0 -> 8786 bytes lib/adafruit_midi/__init__.mpy | Bin 0 -> 2735 bytes lib/adafruit_midi/channel_pressure.mpy | Bin 0 -> 1068 bytes lib/adafruit_midi/control_change.mpy | Bin 0 -> 1107 bytes lib/adafruit_midi/control_change_values.mpy | Bin 0 -> 523 bytes lib/adafruit_midi/midi_continue.mpy | Bin 0 -> 481 bytes lib/adafruit_midi/midi_message.mpy | Bin 0 -> 4103 bytes lib/adafruit_midi/mtc_quarter_frame.mpy | Bin 0 -> 1043 bytes lib/adafruit_midi/note_off.mpy | Bin 0 -> 1119 bytes lib/adafruit_midi/note_on.mpy | Bin 0 -> 1104 bytes lib/adafruit_midi/pitch_bend.mpy | Bin 0 -> 1054 bytes lib/adafruit_midi/polyphonic_key_pressure.mpy | Bin 0 -> 1254 bytes lib/adafruit_midi/program_change.mpy | Bin 0 -> 1036 bytes lib/adafruit_midi/start.mpy | Bin 0 -> 450 bytes lib/adafruit_midi/stop.mpy | Bin 0 -> 443 bytes lib/adafruit_midi/system_exclusive.mpy | Bin 0 -> 1063 bytes lib/adafruit_midi/timing_clock.mpy | Bin 0 -> 496 bytes lib/adafruit_ssd1306.mpy | Bin 0 -> 5600 bytes lib/font5x8.bin | Bin 0 -> 1282 bytes 28 files changed, 159 insertions(+) create mode 100644 .fseventsd/no_log create mode 100644 .metadata_never_index create mode 100644 boot_out.txt create mode 100644 code.py create mode 100644 font5x8.bin create mode 100644 lib/adafruit_bus_device/__init__.py create mode 100644 lib/adafruit_bus_device/i2c_device.mpy create mode 100644 lib/adafruit_bus_device/spi_device.mpy create mode 100644 lib/adafruit_dotstar.mpy create mode 100644 lib/adafruit_framebuf.mpy create mode 100644 lib/adafruit_midi/__init__.mpy create mode 100644 lib/adafruit_midi/channel_pressure.mpy create mode 100644 lib/adafruit_midi/control_change.mpy create mode 100644 lib/adafruit_midi/control_change_values.mpy create mode 100644 lib/adafruit_midi/midi_continue.mpy create mode 100644 lib/adafruit_midi/midi_message.mpy create mode 100644 lib/adafruit_midi/mtc_quarter_frame.mpy create mode 100644 lib/adafruit_midi/note_off.mpy create mode 100644 lib/adafruit_midi/note_on.mpy create mode 100644 lib/adafruit_midi/pitch_bend.mpy create mode 100644 lib/adafruit_midi/polyphonic_key_pressure.mpy create mode 100644 lib/adafruit_midi/program_change.mpy create mode 100644 lib/adafruit_midi/start.mpy create mode 100644 lib/adafruit_midi/stop.mpy create mode 100644 lib/adafruit_midi/system_exclusive.mpy create mode 100644 lib/adafruit_midi/timing_clock.mpy create mode 100644 lib/adafruit_ssd1306.mpy create mode 100644 lib/font5x8.bin diff --git a/.fseventsd/no_log b/.fseventsd/no_log new file mode 100644 index 0000000..e69de29 diff --git a/.metadata_never_index b/.metadata_never_index new file mode 100644 index 0000000..e69de29 diff --git a/boot_out.txt b/boot_out.txt new file mode 100644 index 0000000..1b756ac --- /dev/null +++ b/boot_out.txt @@ -0,0 +1 @@ +Adafruit CircuitPython 6.2.0-rc.0 on 2021-04-01; Raspberry Pi Pico with rp2040 diff --git a/code.py b/code.py new file mode 100644 index 0000000..049c3dc --- /dev/null +++ b/code.py @@ -0,0 +1,158 @@ +import time +import board +import busio + +import adafruit_ssd1306 + +from adafruit_bus_device.i2c_device import I2CDevice +import adafruit_dotstar + +import usb_midi +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 digitalio import DigitalInOut, Direction, Pull + +cs = DigitalInOut(board.GP17) +cs.direction = Direction.OUTPUT +cs.value = 0 + +p = DigitalInOut(board.GP6) +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 + + +# todo make Lfo class that keeps all this info together +# possibly extend from Pad class +num_lfos = 8 +lfo_states = [LFO_STATE.off] * num_lfos +lfo_values = [0.0] * num_lfos +lfo_dirs = [1] * num_lfos + + +def lfo_line(lfo_num, lfo_val): + line_height = oled_height // num_lfos + # TODO consider removing gap + oled.fill_rect( + 0, + lfo_num * line_height, + int(lfo_val * oled_width), + line_height - 1, + 1, + ) + + +held = [False] * 16 +mode = 0 +tick = 0 + + +lfo_incs = {LFO_STATE.off: 0, LFO_STATE.slow: 0.01, LFO_STATE.fast: 0.1} + + +bpm_mode = False +bpm = 128 + + +def read_butts(): + pressed = [0] * 16 + with keypad: + keypad.write(bytes([0x0])) + result = bytearray(2) + keypad.readinto(result) + b = result[0] | result[1] << 8 + + for i in range(0x0, len(pressed)): + if not (1 << i) & b: + pressed[i] = 1 + else: + pressed[i] = 0 + return pressed + + +def inc_lfo(idx, state): + val = lfo_values[idx] + inc = lfo_incs[state] + dire = lfo_dirs[idx] + lfo_values[idx] += inc * dire + if val >= 1.0: + lfo_dirs[idx] = -1 + elif val <= 0: + lfo_dirs[idx] = 1 + + +while True: + # todo use bpm + time.sleep(0.01) + 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 (hold F, disables LFO, lets you teach cc to machine) + # todo set limits mode (press A, press a control, press a number and then select start (0-A) and end (0-A)) + + for idx, state in enumerate(lfo_states): + inc_lfo(idx, state) + val = lfo_values[idx] + if val < 0: + val = 0 + if val > 1: + val = 1 + col_offset = int(128 * val) + if state == LFO_STATE.off: + lights[idx] = (0, 0, 0) + elif state == LFO_STATE.slow: + lights[idx] = (255, col_offset, 0) + elif state == LFO_STATE.fast: + lights[idx] = (0, col_offset, 255) + + if state != LFO_STATE.off: + midi.send(ControlChange(idx, int(val * 127))) + + lfo_line(idx, val) + + for idx, pressed in enumerate(read_butts()): + if pressed and not held[idx]: + if idx <= num_lfos: + if lfo_states[idx] == LFO_STATE.off: + lfo_states[idx] = LFO_STATE.slow + elif lfo_states[idx] == LFO_STATE.slow: + lfo_states[idx] = LFO_STATE.fast + elif lfo_states[idx] == LFO_STATE.fast: + lfo_states[idx] = LFO_STATE.off + pass + # todo initiate BPM mode (so this is holding B and typing a number) + held[idx] = True + elif pressed and held[idx]: + # todo BPM mode (take another number) + pass + elif not pressed and held[idx]: + # todo BPM mode (set bpm) + held[idx] = False + oled.show() + lights.show() diff --git a/font5x8.bin b/font5x8.bin new file mode 100644 index 0000000000000000000000000000000000000000..9a0563ba2dae1dc1d0b1b7ecb2e54e5113f3f540 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_bus_device/__init__.py b/lib/adafruit_bus_device/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_bus_device/i2c_device.mpy b/lib/adafruit_bus_device/i2c_device.mpy new file mode 100644 index 0000000000000000000000000000000000000000..b8fff5006213e685c23cfe281d661ead958d473a GIT binary patch literal 1943 zcmb7FO>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#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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_dotstar.mpy b/lib/adafruit_dotstar.mpy new file mode 100644 index 0000000000000000000000000000000000000000..696e977bb9ca8db3544dc81ddff7d8e265113a69 GIT binary patch literal 2473 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/__init__.mpy b/lib/adafruit_midi/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..141f9b214a4b841d442bf35991e8288bd50d962f GIT binary patch literal 2735 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/control_change_values.mpy b/lib/adafruit_midi/control_change_values.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a65081c88a765f1c33cf4f62449e0378cca8b811 GIT binary patch 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^ZI%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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/midi_message.mpy b/lib/adafruit_midi/midi_message.mpy new file mode 100644 index 0000000000000000000000000000000000000000..2317df829ffb3bc35a77a59bc9393cc6a5539dc2 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/mtc_quarter_frame.mpy b/lib/adafruit_midi/mtc_quarter_frame.mpy new file mode 100644 index 0000000000000000000000000000000000000000..17504cd79040f59166a6eabad1b2bee3bf44d9b6 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/note_off.mpy b/lib/adafruit_midi/note_off.mpy new file mode 100644 index 0000000000000000000000000000000000000000..1d8669c66188dce87bd4b816033967200138f9aa GIT binary patch literal 1119 zcmZ`%+fLg+5S_`TxzQF>2qN4PvbaD+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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/note_on.mpy b/lib/adafruit_midi/note_on.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7d5a5ee53eba3b21e159a7e9fa95e550a96d56df GIT binary patch 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^ literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/pitch_bend.mpy b/lib/adafruit_midi/pitch_bend.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4d651da4f1ff0ae0dceeee1857cf8dd531bedfe7 GIT binary patch literal 1054 zcmaJ=ZBN=z6g~$;-rS-KvJHGgDmtPt8GAQNn40Mn!vfnEKHS#!0!=7oZ871K#bxos z5`T)J+rRNQ7`K1mZo!UzSZLCm(|gW6=XsuUTJ(Ar4<^8Vre8t=g(dTTDMc?50Jptp z5=+=vMmdRG5_8cNHARQ`LA9p1*5flC0BiAzDG$8&2K>9x5h z_>D{BqcY4yH?Yzd0l66P$b}&O19*>w+$Hp@Bh=$`WFoW#g%T1XWGK5^k10aFc7*0I z!%xbULgjNgd}oV=^1-aQ(^*Ufi%-hqe z=N|J}?uFm97BY7mBu zX3dr9T;7^wQGk0Pn@&2plv!hZ=FXu%zlQz!4fba7=DN?AM9kA0+n)ciy-!{Vt0TF_ zG4Kr}b;jT{4sY)jj*fN@?QytpxmSR%FfepHj$P(JSz%6z4>1xTLSO{5X=3)`Qr5ezv0dwJN3vIT z_`(+^_)W;Fei}Z5@hjlnLva{L)}(2B?zy-B^ZWm^e&1Yv09x1RI>b<(cSb%W*x3xg zWg`;D2*E>NWdYSVk~pda3BhzEfn*UUfjq$ZBa9?*DvpYuh-VUKGgyN3SRwdQH!rOHxI6*GO0|M(i6rl)u>V$q?9w$pmgH!O3EIqA9jWGs<^r1mMUju z)v_7)lv2BHGDPb|#kNiBxg?cUyHYz&6%AeTkVqRIn@yD$1*5~dE!fc3U@6i6ez5J# z-6Y2F?7kC7B(}Z>*lSU|oLT@91HqmoV7xI;mTISy*vBc z2XFE_fnr6jR+%PFR;wZ@bcoX9y3H&~!$nQDES(81N~pvQy|Vy*Z3uz`2qRIE+Q#DY z;@X@fuuK#Dp`e>s!Jlp-h0~)L1$QnA0>`h?DWn~DW(8L>7taFDxbykqiO+eQUY~SC zIrV?}X~1!3SG#HUg!K)nH-rPNa0b1o4_Y;o@vBk2*{?TEP%f($qbIUfV~lfyQ^Vi@ zxIADnt#rNFJ3@tb1Sw|)f+|0wr8)?nKf z&r0vd;mw_mgM;n;mZjIF0kridf&e~%q4Soqv=G*G8!`7ZCTww?SX-KM>MQgZ+_$2e QGywREnl+?b@4fH*fe32&Ft(sbI$MoKT`|_mQKdNeJ1xHiSn}ZtdyoVvjF$q zcnV9{TtO{`QVMhNRg@%r4pJJIYZza{xfH5FNvvzQn8P~crmB$-hN-r7`f*8CG zLI|UlNyyWZSN&j6eE87g$m87%qYaJQl=+>B-LWVlf8Vrii@(ce8=Bp0UuG23$ogus zd0*Cn#uOp1)Ulfa##NIM`4^#qms4w)#G4nj{dD@!tWojrer^S%Bna1}G)#B*rFER{ zTG9qyOPe@bhN<{AR(cAclz@{eqaAtJzd)RnLy_~*YuZ($vK3)|w&;;)}QL4Gc#Q~hhmNXUV4zS(}O*uioB z?Cj{&HQj>%7!akx00F^p>oRN$hF-s$6wdXX>pg{i<_P(UBpG^O*MQ4FWoSx!Kq+hy zszButq&k#kurf5xb=WzA5os0&xiiPL!U;Qd`&XFvK;)#JBXS0^)OMP7-w$jefiTVB~+Y Q-Zr``ch~nf{aZr50dK>DH2?qr literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/stop.mpy b/lib/adafruit_midi/stop.mpy new file mode 100644 index 0000000000000000000000000000000000000000..1c6e4587903c6ea389a44d167aa63311a74ebaa8 GIT binary patch literal 443 zcmY+A?@Pi!7{~8PD@ln2H9{zL*X##uC_+#XNkxe*gxM=!JS}&+fpcrS1wv5!1L|L{ z(>btvanId-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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/system_exclusive.mpy b/lib/adafruit_midi/system_exclusive.mpy new file mode 100644 index 0000000000000000000000000000000000000000..049950d37afd58a20827b6f6ce8e81749f03647f GIT binary patch literal 1063 zcma)*-A)=o6vxj2tpc`cYHf;IMMj_)muN^$TGNzN+8T?YL6at23@bapCM?jMU0bdI zW7CT!K8k_%b@~!Mfj!GgCDg?3#qRlh?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! literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/timing_clock.mpy b/lib/adafruit_midi/timing_clock.mpy new file mode 100644 index 0000000000000000000000000000000000000000..3b3122318387597595795010bf3306d0f7167773 GIT binary patch literal 496 zcmaKo-%G+!6vyw$N@*GhW{_0sZnGb-kqALWAQmNQ2(G6dPHVfmOU|wRh|-qM*)Zx8l*smZf|`v*ofO z_k89q{zQM`FaYnu^nJ%WSCk?5&EQ4WZA)2DD9r^kD`@&!BHv9MMotuYS^^TBVq{o!F literal 0 HcmV?d00001 diff --git a/lib/adafruit_ssd1306.mpy b/lib/adafruit_ssd1306.mpy new file mode 100644 index 0000000000000000000000000000000000000000..46e53b3fb94a96910f25db65b2f0847856687073 GIT binary patch literal 5600 zcmb_g-E&jN72mZiBY%O7RY9<2%dnC^0NEBX&WFJkmar8pOGq+}W5|^(U7_pf3+c+# zlLzi4A?2lvNjuYrW?F~#y^{G#KVHa8|Ar3JcKXCjAKFeGnD#L}yZ1_0mIXDL%FN!~ zv%6<^&;HKuoW-ka=(}lY!U%pt6R00YEK>8_=+d!8uZ_3Cj}SsX>=(Z#{rHXxp>L(m z#8FI+V#&0D{5bI!By1qEfgF;FV3QU58xqH`KrkU#uwr7xj;S^Tb8MK{uxs2Tjdq98 zUnkln2M7nK&^?YNr)db2L3{|2VQiE!ISwTuC!n;ElTg};9dD8m{3RL1_sAGFO4Gyv zatk>HI3N!)G2<})~^BaeTGceJ6!PWns*zPyZBo^ILp&Er@hgRR zrPAt2WivU^oy%o%ot6FW8rI~nkB!+KtsJ+;=kh`(&2a{f%kkL^$F&9BA#TRE5DGYh zp?2DEFN8b+H|JYmT?@W|m-8%KGSDuUC+KHVuiMKxU9NySd!9AeY`=5X&01aM30yGb z41~CO&w`tc2)bvvfZOZzvzB-9eJv&1#ag2 zY)3`^%=`tIa7kG{;GUUt24>y+Y4@cWpOO>N%NlW(Q8pvw zqJTC(15p4N>xiXBKm1Z;*+o#M(H|7(W>!?LuXh%q|L*^quX7Z^K ztJQ6_4vef?_<<8c!zV6U-2-5mo(_BjmHLjLt@{t+I>-HzZ5lr)*_`-c$#xDuD%srl zamnVwC9@k(9FXXz_dGV4u@t|F93`_8-+ocD&Ek%dZ4L&x@WiCl^C`M7Z^v-S=AqnF zGJCKz0K%J8^d5|w#+&~xncoBH25Y?7rY(73yhZAylc0cMy%%sCmgt?QAE2JH)#@2v zpD%zRD?{|xg_xLVO7OzfgxJRaK;(1jNRnHNMw@edo)@{SkUo%&T;;h)EC!OikiM$* zXtj>~bwP|KI5ERz3Szb(>enL40)NQ;o-(SpNuyt8+*CI^vqzjr!zHx283F? z;B|7q0zfL7=kT(E<9ZjQS_vVxs+{a*^ZVxM{7X`6%wj2ov(uKoWVr8>mbK%@hld71 zDa5+XA_Y~Wv;l!p0yG)reu!~J0G|AfQJ#YsCqaax?aimBnn|+>gU9I~yGhE~Z%c9!zBV)NIf{EP;Y0KSz&ol%4Iru+r2~mRY^h{~`6SP0zhhS=#Hkq5Dd3IkNA07dWAR4#sHJQKJODAh zagkc%*Oq~!0~ZK^e}nXQlJS%apN>h=6Y9kBH(#qf@pQrqZu zz(3*Fu>^Ly^9QN*hSYNlOjk*jmT0PUIEajsrez%JFrCApPSXsnxp1f$MKpy9W11f| zK&Dh&u4HR#H+N(U5)^jNjBkj4vtWk>;Eq!Pd`BYYG zssX(m*LUVcEh#>g$*r#m{B?D}9;{ruG&q=&J196+qm&Ldyw`i1-iIj>wlgC9mt|-` ziS?*xz5=E#(T_Y(G!uNL6FKO&mjkc5LYd3edDhvvtlf7#tTBtQqRO;YRXyVqHbC_T z%A@jd3#Qc3#aRD8(*wgNPM#zmF4MiS93%y-Ig6$752R6+3>f9n(zfdRMVig_S2bkT z0AK*GPUF(^ZRIO(Ki>wJ6d@(1cwvWRhx5?G$zY*R`oi*uaZ*)$m!?JQhVQRD<7^R zr-({UjFya_{OwoB#N&`;iqqoi9!Lsap7m_@N|J&(J4kAW=NMKZg;*{k@{lYgBk(|j zCtV_v=WB0aPmEI>W zNfIjA68K@&h|2xfa0SY(1%-B_fn_^M=#@j`UHSfg#3m*b&)Z;_=PpXDk zR0&)S(foIUOa5Iyyd5ptBh>=`v%p*6QJS!TIV=D%OFAQ3)_Kvg!t-g1pk-U4#I(M|M?BtK@c7CRbQhvv?J?z6pE} g%-Tko_3k-kC%}i=PWGcGB}Rj<$8oRT%1%!CFDxU=!Tl*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 literal 0 HcmV?d00001