diff --git a/piano.lua b/piano.lua new file mode 100644 index 0000000..eca062b --- /dev/null +++ b/piano.lua @@ -0,0 +1,83 @@ +-- 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