From 7226c3e98fddf2a451f3fc1c2a5920928d76488b Mon Sep 17 00:00:00 2001 From: Pez Cuckow Date: Sun, 2 Sep 2018 16:17:19 +0100 Subject: [PATCH] :tada: Star wars logo and plays music --- shared/sw.png | Bin 0 -> 28254 bytes star_wars/main.py | 924 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 924 insertions(+) create mode 100644 shared/sw.png create mode 100644 star_wars/main.py diff --git a/shared/sw.png b/shared/sw.png new file mode 100644 index 0000000000000000000000000000000000000000..02a5a87884c82370222da21f578fcdcf4318d954 GIT binary patch literal 28254 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 X)ySI|E+A)C00000NkvXXu0mjf1^*7C literal 0 HcmV?d00001 diff --git a/star_wars/main.py b/star_wars/main.py new file mode 100644 index 0000000..a5a4ade --- /dev/null +++ b/star_wars/main.py @@ -0,0 +1,924 @@ + +""" +Will play music, maybe +""" + +___name___ = "Play Music" +___license___ = "MIT" +___categories___ = ["Sound"] +___dependencies___ = ["speaker", "shared/sw.png", "buttons"] + +import random, ugfx, speaker, buttons, ugfx_helper +import time +import utime +from machine import Neopix +from tilda import LED +from homescreen import init, sleep_or_exit +from tilda import Buttons, Sensors + +ledColours = [ + 0xFF0000, + 0xFFFF00, + 0x00FF00, + 0x008000, + 0x00FFFF, + 0x0000FF, + 0xFF00FF, + 0xFA8072, +] +ledColourCount = len(ledColours) + +logo_path = "shared/sw.png" +logo_height = 121 +logo_width = 240 + +mute = False + +# Setup +init() +neopix = Neopix() +ugfx_helper.init() +speaker.enabled(True) + +#################### +#################### +#################### + +notes = [ + { + "name": "G3", + "midi": 55, + "time": 1.5, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "G3", + "midi": 55, + "time": 1.6666666666666665, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "G3", + "midi": 55, + "time": 1.833333333333333, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "G3", + "midi": 55, + "time": 9.5, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "G3", + "midi": 55, + "time": 9.833333333333334, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "G3", + "midi": 55, + "time": 17.5, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "G3", + "midi": 55, + "time": 17.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "A3", + "midi": 57, + "time": 18, + "velocity": 0.6299212598425197, + "duration": 0.7114583333333329 + }, + { + "name": "A3", + "midi": 57, + "time": 18.75, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "A3", + "midi": 57, + "time": 20.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "B3", + "midi": 59, + "time": 21, + "velocity": 0.6299212598425197, + "duration": 0.47395833333333215 + }, + { + "name": "G3", + "midi": 55, + "time": 21.5, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "G3", + "midi": 55, + "time": 21.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "A3", + "midi": 57, + "time": 22, + "velocity": 0.6299212598425197, + "duration": 0.7114583333333329 + }, + { + "name": "A3", + "midi": 57, + "time": 22.75, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "G3", + "midi": 55, + "time": 25.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "A3", + "midi": 57, + "time": 26, + "velocity": 0.6299212598425197, + "duration": 0.7114583333333329 + }, + { + "name": "A3", + "midi": 57, + "time": 26.75, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "A3", + "midi": 57, + "time": 28.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "B3", + "midi": 59, + "time": 29, + "velocity": 0.6299212598425197, + "duration": 0.47395833333333215 + }, + { + "name": "G3", + "midi": 55, + "time": 29.5, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "G3", + "midi": 55, + "time": 29.833333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 32.5, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 32.666666666666664, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 32.83333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 32.99999999999999, + "velocity": 0.6299212598425197, + "duration": 0.4739583333333357 + }, + { + "name": "G3", + "midi": 55, + "time": 33.49999999999999, + "velocity": 0.6299212598425197, + "duration": 0.23645833333333144 + }, + { + "name": "G3", + "midi": 55, + "time": 33.74999999999999, + "velocity": 0.6299212598425197, + "duration": 0.11770833333333286 + }, + { + "name": "G3", + "midi": 55, + "time": 33.87499999999999, + "velocity": 0.6299212598425197, + "duration": 0.11770833333333286 + }, + { + "name": "A3", + "midi": 57, + "time": 33.99999999999999, + "velocity": 0.6299212598425197, + "duration": 0.7114583333333329 + }, + { + "name": "C4", + "midi": 60, + "time": 34.74999999999999, + "velocity": 0.6299212598425197, + "duration": 0.23645833333333144 + }, + { + "name": "G3", + "midi": 55, + "time": 37.49999999999999, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 37.66666666666666, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 37.83333333333332, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 45.499999999999986, + "velocity": 0.6299212598425197, + "duration": 0.31562499999999716 + }, + { + "name": "G3", + "midi": 55, + "time": 45.833333333333314, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G3", + "midi": 55, + "time": 53.49999999999998, + "velocity": 0.6299212598425197, + "duration": 0.31562499999999716 + }, + { + "name": "G3", + "midi": 55, + "time": 53.83333333333331, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "C4", + "midi": 60, + "time": 2, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 3.0000000000000004, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333331 + }, + { + "name": "F4", + "midi": 65, + "time": 4, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "E4", + "midi": 64, + "time": 4.166666666666667, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "D4", + "midi": 62, + "time": 4.333333333333334, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "C5", + "midi": 72, + "time": 4.500000000000001, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 5.500000000000001, + "velocity": 0.6299212598425197, + "duration": 0.47395833333333304 + }, + { + "name": "F4", + "midi": 65, + "time": 6.000000000000001, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "E4", + "midi": 64, + "time": 6.166666666666668, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "D4", + "midi": 62, + "time": 6.333333333333335, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666666 + }, + { + "name": "C5", + "midi": 72, + "time": 6.500000000000002, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 7.500000000000002, + "velocity": 0.6299212598425197, + "duration": 0.47395833333333304 + }, + { + "name": "F4", + "midi": 65, + "time": 8.000000000000002, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "E4", + "midi": 64, + "time": 8.16666666666667, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "F4", + "midi": 65, + "time": 8.333333333333337, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "D4", + "midi": 62, + "time": 8.500000000000005, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "C4", + "midi": 60, + "time": 10.000000000000005, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 11.000000000000005, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "F4", + "midi": 65, + "time": 12.000000000000005, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "E4", + "midi": 64, + "time": 12.166666666666673, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "D4", + "midi": 62, + "time": 12.333333333333341, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "C5", + "midi": 72, + "time": 12.500000000000009, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 13.500000000000009, + "velocity": 0.6299212598425197, + "duration": 0.4739583333333339 + }, + { + "name": "F4", + "midi": 65, + "time": 14.000000000000009, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "E4", + "midi": 64, + "time": 14.166666666666677, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "D4", + "midi": 62, + "time": 14.333333333333345, + "velocity": 0.6299212598425197, + "duration": 0.1572916666666675 + }, + { + "name": "C5", + "midi": 72, + "time": 14.500000000000012, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "G4", + "midi": 67, + "time": 15.500000000000012, + "velocity": 0.6299212598425197, + "duration": 0.4739583333333339 + }, + { + "name": "F4", + "midi": 65, + "time": 16.000000000000014, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "E4", + "midi": 64, + "time": 16.16666666666668, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "F4", + "midi": 65, + "time": 16.333333333333343, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 16.500000000000007, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "F4", + "midi": 65, + "time": 19.000000000000007, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "E4", + "midi": 64, + "time": 19.250000000000007, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "D4", + "midi": 62, + "time": 19.500000000000007, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "C4", + "midi": 60, + "time": 19.750000000000007, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "C4", + "midi": 60, + "time": 20.000000000000007, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 20.16666666666667, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "E4", + "midi": 64, + "time": 20.333333333333336, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 20.5, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "F4", + "midi": 65, + "time": 23, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "E4", + "midi": 64, + "time": 23.25, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "D4", + "midi": 62, + "time": 23.5, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "C4", + "midi": 60, + "time": 23.75, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "G4", + "midi": 67, + "time": 24, + "velocity": 0.6299212598425197, + "duration": 0.47395833333333215 + }, + { + "name": "D4", + "midi": 62, + "time": 24.5, + "velocity": 0.6299212598425197, + "duration": 0.9489583333333336 + }, + { + "name": "F4", + "midi": 65, + "time": 27, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "E4", + "midi": 64, + "time": 27.25, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "D4", + "midi": 62, + "time": 27.5, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "C4", + "midi": 60, + "time": 27.75, + "velocity": 0.6299212598425197, + "duration": 0.236458333333335 + }, + { + "name": "C4", + "midi": 60, + "time": 28, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 28.166666666666664, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "E4", + "midi": 64, + "time": 28.33333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 28.499999999999993, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "C5", + "midi": 72, + "time": 29.999999999999993, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "A#4", + "midi": 70, + "time": 30.33333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G#4", + "midi": 68, + "time": 30.499999999999993, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "G4", + "midi": 67, + "time": 30.83333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "F4", + "midi": 65, + "time": 30.999999999999993, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "D#4", + "midi": 63, + "time": 31.33333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "D4", + "midi": 62, + "time": 31.499999999999993, + "velocity": 0.6299212598425197, + "duration": 0.3156250000000007 + }, + { + "name": "C4", + "midi": 60, + "time": 31.83333333333333, + "velocity": 0.6299212598425197, + "duration": 0.15729166666666572 + }, + { + "name": "G4", + "midi": 67, + "time": 31.999999999999993, + "velocity": 0.6299212598425197, + "duration": 0.4739583333333357 + }, + { + "name": "F4", + "midi": 65, + "time": 34.99999999999999, + "velocity": 0.6299212598425197, + "duration": 0.4739583333333357 + }, + { + "name": "D4", + "midi": 62, + "time": 35.49999999999999, + "velocity": 0.6299212598425197, + "duration": 1.8989583333333329 + }, +] + +noteCount = len(notes) +notes.sort(key=lambda x: x['time']) + +#################### +#################### +#################### + +def _random(): + return (utime.ticks_ms() % 100) / 100 + +def _randrange(start, stop=None): + """Return a randomly selected element from range(start, stop)""" + if stop is None: + stop = start + start = 0 + random = _random() + randomRange = round(start + (random * (stop - start))) + return randomRange + +def playMusic(stopTime = 99999): + global noteCount, notes + + index = 0 + startTime = utime.ticks_ms() + while True: + # Stop playing + if index >= noteCount or buttons.is_pressed(Buttons.BTN_A): + speaker.stop() + break + + # How long have we been playing for + currentTime = utime.ticks_ms() + timeDiff = currentTime - startTime + + # End early if told + if timeDiff > stopTime: + speaker.stop() + break + + # Play note + note = notes[index] + if timeDiff > (note['time'] * 1000): + if 'midi' in note: + freq = 27.5 * pow(2, (note['midi'] - 21) / 12) + speaker.frequency(round(freq)) + else: + speaker.stop() + + index += 1 + + sleep_or_exit(0.1) + +def doLights(): + # LED Flash + if _randrange(1, 10) <= 5: + LED(LED.RED).on() + else: + LED(LED.RED).off() + + if _randrange(1, 10) <= 5: + LED(LED.GREEN).on() + else: + LED(LED.GREEN).off() + + # NEO Pixels + colorNum1 = _randrange(0, ledColourCount - 1) + colorNum2 = _randrange(0, ledColourCount - 1) + neopix.display([ledColours[colorNum1], ledColours[colorNum2]]) + +maxHeight = ugfx.height() +yPos = maxHeight +logo = ugfx.Image(logo_path, True) +def doScroll(): + global yPos, maxHeight, logo + + # Blank previous logo location + ugfx.area(0, yPos, ugfx.width(), yPos + logo_height, 0) + + # Move up and wrap + yPos -= 20 + if (yPos <= -logo_height): + yPos = maxHeight + + # Draw logo + ugfx.display_image( + int((ugfx.width() - logo_width) / 2), + int(yPos), + logo + ) + +def blankScreen(): + ugfx.clear(ugfx.BLACK) + +def drawLogo(): + # Return to default + ugfx.display_image( + int((ugfx.width() - logo_width) / 2), + int((ugfx.height() - logo_height) / 2), + logo + ) + +def drawTutorial(): + ugfx.orientation(270) + + # Draw for user + blankScreen() + ugfx.text(5, 5, "Buttons: A = music, B = lights", ugfx.WHITE) + ugfx.text(5, 25, "JoyStick Click = scrolling", ugfx.WHITE) + + ugfx.text(5, ugfx.height() - 20, "By Pez (@Pezmc)", ugfx.WHITE) + +def boot(): + drawTutorial() + + ugfx.orientation(90) # Draw for others + drawLogo() + playMusic(9500) + blankScreen() + +############# +############# +############# +boot() + +enableLights = False +enableScroll = True +while True: + # Toggle lights + if buttons.is_triggered(Buttons.BTN_B): + enableLights = not enableLights + neopix.display([0, 0]) # Lights off + + # Play music + elif buttons.is_triggered(Buttons.BTN_A): + neopix.display([0, 0]) # Lights off + drawTutorial() + drawLogo() + playMusic() + + # Toggle scroll + elif buttons.is_triggered(Buttons.JOY_Center): + enableScroll = not enableScroll + if not enableScroll: + blankScreen() + drawLogo() + + else: + if enableLights: + doLights() + + if enableScroll: + doScroll() + + sleep_or_exit(0.1) \ No newline at end of file