from math import sin, cos from random import random, randint from ti_graphics import setColor, fillRect, hsv_to_rgb, drawImage from ti_system import escape from ti_hub import send from time import sleep, monotonic #function to send the micro:bit Python code to run def send_microbit(cmd): send("\x04") send(cmd) send("\x05") send_microbit("import music") screen_w, screen_h, screen_y0 = 320, 210, 30 def fill_rect(x, y, w, h, c): setColor(c) fillRect(x, y + screen_y0, w, h) def draw_point(x, y, r, c): fill_rect(x - r, y - r, 2 * r, 2 * r, c) i_melody = 0; next_monotonic = 0; def resume_melody_on_microbit(mus, durat_bytes=2): global next_monotonic, i_melody if monotonic() >= next_monotonic and i_melody < len(mus): r = 2 ** (1 / 12) note = mus[i_melody] i_melody += note < 0x80 durat = mus[i_melody] & ((note ^ 0x80) | 0x7F) i_melody += 1 if durat_bytes > 1: durat |= int.from_bytes(mus[i_melody:i_melody + durat_bytes - 1],'little') << (8 - (note >= 0x80)) i_melody += durat_bytes - 1 durat = max(1, durat) / 1000 send_microbit("music.pitch("+str(round((note < 0x80) and 440 * r**(note - 57)))+", "+str(int(durat*1000))+", wait=False)") next_monotonic = monotonic() + durat melody = ( b">x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05>x\x00>r\x01>x\x00C\xa1\x01C\xa1\x01E\xa1\x01E\xa1\x01J\x9b\x02G\xf5\x00Cr\x01Cx\x00Gr\x01Cx\x00@\xa1\x01Hk\x03Er\x01Bx\x00Ck\x03Cr\x01Ex\x00G\xa1\x01G\xa1\x01G\xa1\x01Hr\x01Gx\x00G\xa1\x01E\xa1\x01Er\x01Gx\x00H\xa1\x01H\xa1\x01H\xa1\x01Jr\x01Hx\x00Gk\x03Jr\x01Jx\x00J\xa1\x01Gr\x01Cx\x00J\xa1\x01Gr\x01Cx\x00>Z\x05>x\x00>r\x01Bx\x00Ek\x03H\xa1\x01Er\x01Bx\x00Ck\x03Ak\x03@\xa1\x01Cr\x01Cx\x00C\xa1\x01Br\x01Cx\x00Ek\x03E\xf5\x00F\x9b\x02F\xf5\x00Er\x01Fx\x00Hr\x01Jx\x00E_\x05Fr\x01Ex\x00C\xa1\x01C\xa1\x01C\xf5\x00F\xf5\x00E\xf5\x00C\xf5\x00C\xa1\x01B\xa1\x01J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05J\xf5\x00JZ\x05Jx\x00Gr\x01Ex\x00E_\x05>\xa1\x01C_\x05E\xa1\x01G_\x05Hk\x03J\xa1\x01L\xa1\x01E\xe8\x03B\xa1\x01L\xf5\x00JZ\x05Gx\x00Hr\x01Ex\x00C_\x05" ) la = [40 * k for k in range(5)] n = len(la) lx = [cos(v) for v in la] ly = [sin(v) for v in la] while not escape(): a = 33 x = randint(a, screen_w - a) v = 2 + 3.4*random()**2 w = 4*random() - 2 h = hsv_to_rgb(360 * random(), 1, 1) drawImage("MARSEILL", 0, 30) resume_melody_on_microbit(melody) while v>0: draw_point(x, screen_h - a, 2, (127, 127, 127)) resume_melody_on_microbit(melody) a += v x += w v -= .1 draw_point(x, screen_h - a, 3, h) resume_melody_on_microbit(melody) s = a * random() for r in range(0, s + 1, 4): for o in range(1, n): rep = r * ly[o] draw_point(x + r*lx[o], screen_h - a + .1*r**1.4 - rep, 1, h) resume_melody_on_microbit(melody) if rep: draw_point(x + r*lx[o], screen_h - a + .1*r**1.4 + rep, 1, h) resume_melody_on_microbit(melody)