EMF_Camp_Badge/soundsarecool/main.py

97 lines
2.4 KiB
Python

'''
A small N channel music player a la 8088 MPH
(Demo is only two channels)
By Molive^SLP
'''
___name___ = "Arp Music Player"
___title___ = "Arp Music Player"
___license___ = "WTFPL"
___dependencies___ = ["ugfx_helper", "speaker"]
___categories___ = ["Demo","Sound"]
import speaker
import utime
from app import restart_to_default
from tilda import Buttons
channels = [ #Supports up to n simultaneous channels.
#Each channel will loop it's data independently from the others
[ #and channels do not need the same length of data in them.
('F4',2), #No. of channels is decided on startup, and all channels are running at any one time.
('D#4',2),
('D4',2),
('C#4',1),
('D#4',1),
],
##[
##('A#3',4),
##],
##[
##('C4',4),
##],
[
('F5',0.125),
('G#5',0.25),
('F5',0.125),
('A#5',0.25),
('F5',0.125),
('C6',0.25),
('F5',0.125),
('A#5',0.25),
('F5',0.25),
('G#5',0.25),
],
]
def prt(s):
ugfx.clear()
ugfx.text(5,5,str(s),0)
import ugfx
ugfx.init()
prt("RUNNING SOUND TEST")
utime.sleep(1)
prt("Use menu to reboot")
speaker.enabled(True)
channel_waits = [ #Add more of these to increase the max channel count
[-1,utime.ticks_ms()],
[-1,utime.ticks_ms()],
[-1,utime.ticks_ms()],
[-1,utime.ticks_ms()],
]
current_channel = 0
while True: #Main awesome loop which handles all music channels. Can handle and arbitrary amount, but lags at high numbers.
for channel in channels:
##print(channel_waits[current_channel][1]) #Uncomment some of these for more debug info :P
if channel_waits[current_channel][1] == 0 or channel_waits[current_channel][1] <= utime.ticks_ms():
print("CHANGING CHANNEL "+str(current_channel))
channel_waits[current_channel][0] += 1
if channel_waits[current_channel][0] == len(channel):
channel_waits[current_channel][0] = 0
channel_waits[current_channel][1] += (channels[current_channel][channel_waits[current_channel][0]][1]*1000.0)
speaker.note(channel[channel_waits[current_channel][0]][0])
##print(channel[channel_waits[current_channel][0]])
if Buttons.is_pressed(Buttons.BTN_Menu):
print("BAIL BAIL BAIL")
restart_to_default()
current_channel += 1
if current_channel == len(channels):
current_channel = 0
##print(current_channel)
utime.sleep(0.03) #Decrease this for more accurate but weirder arps. Comment it out for insane madness
restart_to_default()