-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfalling.lua
166 lines (142 loc) · 2.93 KB
/
falling.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
engine.name = 'Ack'
local ack = require 'ack/lib/ack'
local g = grid.connect()
local BeatClock = require 'beatclock'
local clk = BeatClock.new()
local state = {
notes = {},
emitters = {},
selectedEmitter = nil,
playing = true
}
function init()
-- BeatClock
clk.on_step = tick
clk.on_select_internal = function() clk:start() end
clk:add_clock_params()
clk:start()
-- Ack setup
ack.add_params()
params:read()
params:bang()
end
function tick()
for index, emitter in pairs(state.emitters) do
if emitter.clock >= emitter.speed then
addNote(emitter.x, emitter.y)
emitter.clock = 0
else
emitter.clock = emitter.clock + 1
end
end
for index, note in pairs(state.notes) do
if note.x == 16 then
engine.trig(note.y - 1)
state.notes[index] = nil
else
note.x = note.x + 1
end
end
grid_redraw()
end
----------------
-- INPUTS
----------------
function enc(num, direction)
if num == 2 then
changeSpeed(direction)
end
redraw()
end
function key(num, state)
if num == 2 and state == 0 then
togglePlaying()
end
if num == 3 and state == 0 then
removeEmitter()
end
end
function g.key(x, y, z)
if z == 0 then
removeSelectedEmitter()
end
if z == 1 then
addEmitter(x, y)
setSelectedEmitter(x, y)
end
end
-------------------
-- DRAWING
-------------------
function redraw()
screen.clear()
if state.selectedEmitter then
screen.move(10,10)
screen.text('speed' .. state.selectedEmitter.speed)
end
screen.update()
end
function grid_redraw()
g:all(0)
for index, note in pairs(state.notes) do
g:led(note.x, note.y, 5)
end
for index, emitter in pairs(state.emitters) do
g:led(emitter.x, emitter.y, 10)
end
g:refresh()
end
----------------
-- ACTIONS
----------------
function removeSelectedEmitter()
state.selectedEmitter = nil
redraw()
end
function setSelectedEmitter(x, y)
for _, emitter in pairs(state.emitters) do
if x == emitter.x and emitter.y == y then
state.selectedEmitter = emitter
end
end
redraw()
end
function changeSpeed(x)
local emitter = state.selectedEmitter
if emitter then
emitter.speed = emitter.speed + x
if emitter.speed <= 0 then
emitter.speed = 0
end
end
grid_redraw()
redraw()
end
function removeEmitter()
local emitter = state.selectedEmitter
for key, value in pairs(state.emitters) do
if emitter.x == value.x and emitter.y == value.y then
state.emitters[key] = nil
state.selectedEmitters = nil
end
end
end
function addEmitter(x, y)
for _, emitter in pairs(state.emitters)do
if emitter.x == x and emitter.y == y then
return
end
end
table.insert(state.emitters, {x = x, y=y, speed = 4, clock = 4})
end
function togglePlaying()
if state.playing then
clk:stop()
else
clk:start()
end
state.playing = state.playing == false
end
function addNote(x, y)
table.insert(state.notes, {x = x, y = y})
end