EMF_Camp_Badge/star_wars/main.py

924 lines
18 KiB
Python

"""
Will play music, maybe
"""
___title___ = "Star Wars 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)