mirror of
https://github.com/LDDestroier/CC/
synced 2024-11-09 11:29:59 +00:00
84 lines
1.7 KiB
Lua
84 lines
1.7 KiB
Lua
|
-- CC:Tweaked piano
|
||
|
|
||
|
local spamMode = true
|
||
|
|
||
|
local notes = {
|
||
|
[0] = keys.a, -- F#2
|
||
|
[1] = keys.z, -- G2
|
||
|
[2] = keys.s, -- G#2
|
||
|
[3] = keys.x, -- A2
|
||
|
[4] = keys.d, -- A#2
|
||
|
[5] = keys.c, -- B2
|
||
|
[6] = keys.v, -- C3
|
||
|
[7] = keys.g, -- C#3
|
||
|
[8] = keys.b, -- D3
|
||
|
[9] = keys.h, -- D#3
|
||
|
[10] = keys.n, -- E3
|
||
|
[11] = keys.m, -- F3
|
||
|
[12] = keys.k, -- F#3
|
||
|
[13] = keys.comma, -- G3
|
||
|
[14] = keys.l, -- G#3
|
||
|
[15] = keys.period, -- A3
|
||
|
[16] = keys.semiColon, -- A#3
|
||
|
[17] = keys.slash, -- B3
|
||
|
[18] = keys.q, -- C4
|
||
|
[19] = keys.two, -- C#4
|
||
|
[20] = keys.w, -- D4
|
||
|
[21] = keys.three, -- D#4
|
||
|
[22] = keys.e, -- E4
|
||
|
[23] = keys.r, -- F4
|
||
|
[24] = keys.five, -- F#4
|
||
|
}
|
||
|
|
||
|
local kNotes = {}
|
||
|
local notesDown = {}
|
||
|
for k,v in pairs(notes) do
|
||
|
kNotes[v] = k
|
||
|
notesDown[k] = false
|
||
|
end
|
||
|
|
||
|
local speaker = peripheral.find("speaker")
|
||
|
|
||
|
local between = function(n, min, max)
|
||
|
return math.min(math.max(n, min), max)
|
||
|
end
|
||
|
|
||
|
local playNote = function(note, instrument, volume)
|
||
|
speaker.playNote(instrument or "harp", volume or 1, between(note, 0, 24))
|
||
|
end
|
||
|
|
||
|
local drawPiano = function()
|
||
|
-- add render function later
|
||
|
end
|
||
|
|
||
|
local evt
|
||
|
local tID = os.startTimer(0)
|
||
|
drawPiano()
|
||
|
while true do
|
||
|
evt = {os.pullEventRaw()}
|
||
|
if evt[1] == "key" then
|
||
|
if kNotes[evt[2]] and not evt[3] then
|
||
|
playNote(kNotes[evt[2]])
|
||
|
notesDown[kNotes[evt[2]]] = 1
|
||
|
drawPiano()
|
||
|
end
|
||
|
elseif evt[1] == "key_up" then
|
||
|
if kNotes[evt[2]] then
|
||
|
notesDown[kNotes[evt[2]]] = false
|
||
|
drawPiano()
|
||
|
end
|
||
|
elseif evt[1] == "timer" and evt[2] == tID then
|
||
|
tID = os.startTimer(0)
|
||
|
if spamMode then
|
||
|
for k,v in pairs(notesDown) do
|
||
|
if v then
|
||
|
playNote(k, nil, v)
|
||
|
notesDown[k] = math.max(0, v - 0.03)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
elseif evt[1] == "terminate" then
|
||
|
return
|
||
|
end
|
||
|
end
|