97 lines
2.4 KiB
Python
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()
|