241 lines
4.6 KiB
Lua
241 lines
4.6 KiB
Lua
_G.requireInjector()
|
|
|
|
local Event = require('event')
|
|
local UI = require('ui')
|
|
|
|
local colors = _G.colors
|
|
local peripheral = _G.peripheral
|
|
|
|
local speaker = peripheral.find('speaker') or
|
|
error('Speaker must be attached')
|
|
|
|
UI:configure('Music', ...)
|
|
|
|
UI.Button.defaults.backgroundFocusColor = colors.gray
|
|
|
|
local songs = {
|
|
{ record = 'record.11', title = '11' },
|
|
{ record = 'record.13', title = '13' },
|
|
{ record = 'record.block', title = 'Block' },
|
|
{ record = 'record.cat', title = 'Cat' },
|
|
{ record = 'record.chirp', title = 'Chirp' },
|
|
{ record = 'record.far', title = 'Faf' },
|
|
{ record = 'record.mall', title = 'Mall' },
|
|
{ record = 'record.mellohi', title = 'Mellohi' },
|
|
{ record = 'record.stal', title = 'Stal' },
|
|
{ record = 'record.strad', title = 'Strad' },
|
|
{ record = 'record.wait', title = 'Wait' },
|
|
{ record = 'record.ward', title = 'Ward' },
|
|
}
|
|
local songNo = 1
|
|
|
|
local page = UI.Page({
|
|
volume = 15,
|
|
stationName = UI.Text({
|
|
y = 2,
|
|
x = 2,
|
|
ex = -14,
|
|
height = 3,
|
|
backgroundColor = colors.black,
|
|
}),
|
|
play = UI.Button({
|
|
y = -4,
|
|
x = 2,
|
|
height = 3,
|
|
event = 'play',
|
|
text = '> / ll',
|
|
}),
|
|
seek = UI.Button({
|
|
y = -4,
|
|
x = 12,
|
|
height = 3,
|
|
event = 'seek',
|
|
text = ' >> ',
|
|
}),
|
|
quiet = UI.Button({
|
|
y = -4,
|
|
x = -19,
|
|
event = 'quiet',
|
|
width = 3,
|
|
height = 3,
|
|
text = '-',
|
|
}),
|
|
louder = UI.Button({
|
|
y = -4,
|
|
x = -14,
|
|
width = 3,
|
|
height = 3,
|
|
event = 'louder',
|
|
text = '+',
|
|
}),
|
|
volumeDisplay = UI.Text({
|
|
y = 3,
|
|
x = -9,
|
|
width = 4,
|
|
}),
|
|
volume1 = UI.Window({
|
|
y = -2,
|
|
x = -9,
|
|
height = 1,
|
|
width = 1,
|
|
color = colors.white
|
|
}),
|
|
volume2 = UI.Window({
|
|
y = -3,
|
|
x = -8,
|
|
height = 2,
|
|
width = 1,
|
|
color = colors.white
|
|
}),
|
|
volume3 = UI.Window({
|
|
y = -4,
|
|
x = -7,
|
|
height = 3,
|
|
width = 1,
|
|
color = colors.yellow
|
|
}),
|
|
volume4 = UI.Window({
|
|
y = -5,
|
|
x = -6,
|
|
height = 4,
|
|
width = 1,
|
|
color = colors.yellow,
|
|
}),
|
|
volume5 = UI.Window({
|
|
y = -6,
|
|
x = -5,
|
|
height = 5,
|
|
width = 1,
|
|
color = colors.orange,
|
|
}),
|
|
volume6 = UI.Window({
|
|
y = -7,
|
|
x = -4,
|
|
height = 6,
|
|
width = 1,
|
|
color = colors.orange,
|
|
}),
|
|
volume7 = UI.Window({
|
|
y = -8,
|
|
x = -3,
|
|
height = 7,
|
|
width = 1,
|
|
color = colors.red,
|
|
}),
|
|
volume8 = UI.Window({
|
|
y = -9,
|
|
x = -2,
|
|
height = 8,
|
|
width = 1,
|
|
color = colors.red,
|
|
})
|
|
})
|
|
|
|
page.volumeControls = {
|
|
page.volume1, page.volume2,
|
|
page.volume3, page.volume4,
|
|
page.volume5, page.volume6,
|
|
page.volume7, page.volume8,
|
|
}
|
|
|
|
function page:eventHandler(event)
|
|
if event.type == 'play' then
|
|
self:play(not self.playing)
|
|
elseif event.type == 'seek' then
|
|
self:seek()
|
|
self:play(true)
|
|
elseif event.type == 'louder' then
|
|
if self.playing then
|
|
self:setVolume(self.volume + 1)
|
|
end
|
|
elseif event.type == 'quiet' then
|
|
if self.playing then
|
|
self:setVolume(self.volume - 1)
|
|
end
|
|
end
|
|
end
|
|
|
|
function page:setVolume(volume)
|
|
volume = math.min(volume, 15)
|
|
volume = math.max(volume, 1)
|
|
self.volume = volume
|
|
volume = math.ceil(volume / 2)
|
|
|
|
for i = 1, volume do
|
|
self.volumeControls[i].backgroundColor =
|
|
self.volumeControls[i].color
|
|
end
|
|
for i = volume + 1, #self.volumeControls do
|
|
self.volumeControls[i].backgroundColor = colors.black
|
|
end
|
|
for i = 1, #self.volumeControls do
|
|
self.volumeControls[i]:clear()
|
|
end
|
|
local percent = math.ceil(self.volume / 15 * 100)
|
|
self.volumeDisplay.value = percent .. '%'
|
|
self.volumeDisplay:draw()
|
|
end
|
|
|
|
function page:seek()
|
|
songNo = songNo + 1
|
|
if songNo > #songs then
|
|
songNo = 1
|
|
end
|
|
self:updateStationName()
|
|
end
|
|
|
|
function page:play(onOff)
|
|
self.playing = onOff
|
|
if self.playing then
|
|
self:updateStationName()
|
|
speaker.playSound(songs[songNo])
|
|
|
|
Event.addNamedTimer('songTimer', 180, false, function()
|
|
if self.playing then
|
|
self:seek()
|
|
self:play(true)
|
|
self:sync()
|
|
end
|
|
end)
|
|
|
|
else
|
|
--radio.stopAudio()
|
|
end
|
|
end
|
|
|
|
function page.stationName:draw()
|
|
self:clear()
|
|
self:centeredWrite(2, self.value)
|
|
end
|
|
|
|
function page:updateStationName()
|
|
local title = songs[songNo].title
|
|
|
|
if title then
|
|
self.stationName.value = title
|
|
self.stationName:draw()
|
|
end
|
|
end
|
|
|
|
Event.onInterval(1, function()
|
|
if not page.playing then
|
|
if page.stationName.value == '' then
|
|
page:updateStationName()
|
|
else
|
|
page.stationName.value = ''
|
|
page.stationName:draw()
|
|
end
|
|
page:sync()
|
|
end
|
|
end)
|
|
|
|
page:play(true)
|
|
page:setVolume(page.volume, true)
|
|
|
|
UI:setPage(page)
|
|
|
|
UI:pullEvents()
|
|
page:play(false)
|
|
|
|
UI.term:reset()
|