114 lines
3.4 KiB
Lua
114 lines
3.4 KiB
Lua
|
-- example script for light effects on IIDX TT stab movement
|
||
|
-- create a folder called "script" next to spice and put me in there
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
-- settings
|
||
|
tt_duration = 0.25
|
||
|
zero_duration = 0.3141592
|
||
|
loop_delta = 1 / 240
|
||
|
curve_pow = 1 / 4
|
||
|
col_r = 1.0
|
||
|
col_g = 0.0
|
||
|
col_b = 0.0
|
||
|
light_p1_r = "Side Panel Left Avg R"
|
||
|
light_p1_g = "Side Panel Left Avg G"
|
||
|
light_p1_b = "Side Panel Left Avg B"
|
||
|
light_p2_r = "Side Panel Right Avg R"
|
||
|
light_p2_g = "Side Panel Right Avg G"
|
||
|
light_p2_b = "Side Panel Right Avg B"
|
||
|
|
||
|
-- wait for game
|
||
|
while not analogs.read()["Turntable P1"] do yield() end
|
||
|
|
||
|
-- initial state
|
||
|
tt1_last = tonumber(analogs.read()["Turntable P1"].state)
|
||
|
tt2_last = tonumber(analogs.read()["Turntable P2"].state)
|
||
|
tt1_diff_last = 0
|
||
|
tt2_diff_last = 0
|
||
|
tt1_trigger = 0
|
||
|
tt2_trigger = 0
|
||
|
tt1_zero_elapsed = 0
|
||
|
tt2_zero_elapsed = 0
|
||
|
|
||
|
-- main loop
|
||
|
while true do
|
||
|
|
||
|
-- read state
|
||
|
tt1 = tonumber(analogs.read()["Turntable P1"].state)
|
||
|
tt2 = tonumber(analogs.read()["Turntable P2"].state)
|
||
|
time_cur = time()
|
||
|
|
||
|
-- calculate difference
|
||
|
tt1_diff = tt1 - tt1_last
|
||
|
tt2_diff = tt2 - tt2_last
|
||
|
|
||
|
-- fix wrap around
|
||
|
if math.abs(tt1_diff) > 0.5 then tt1_diff = 0 end
|
||
|
if math.abs(tt2_diff) > 0.5 then tt2_diff = 0 end
|
||
|
|
||
|
-- trigger on movement start and direction changes
|
||
|
if (tt1_diff_last == 0 and tt1_diff ~= 0)
|
||
|
or (tt1_diff_last > 0 and tt1_diff < 0)
|
||
|
or (tt1_diff_last < 0 and tt1_diff > 0) then
|
||
|
tt1_trigger = time_cur
|
||
|
end
|
||
|
if (tt2_diff_last == 0 and tt2_diff ~= 0)
|
||
|
or (tt2_diff_last > 0 and tt2_diff < 0)
|
||
|
or (tt2_diff_last < 0 and tt2_diff > 0) then
|
||
|
tt2_trigger = time_cur
|
||
|
end
|
||
|
|
||
|
-- light effects when last trigger is still active
|
||
|
if time_cur - tt1_trigger < tt_duration then
|
||
|
brightness = 1 - ((time_cur - tt1_trigger) / tt_duration) ^ curve_pow
|
||
|
lights.write({[light_p1_r]={state=brightness*col_r}})
|
||
|
lights.write({[light_p1_g]={state=brightness*col_g}})
|
||
|
lights.write({[light_p1_b]={state=brightness*col_b}})
|
||
|
else
|
||
|
lights.write_reset(light_p1_r)
|
||
|
lights.write_reset(light_p1_g)
|
||
|
lights.write_reset(light_p1_b)
|
||
|
end
|
||
|
if time_cur - tt2_trigger < tt_duration then
|
||
|
brightness = 1 - ((time_cur - tt2_trigger) / tt_duration) ^ curve_pow
|
||
|
lights.write({[light_p2_r]={state=brightness*col_r}})
|
||
|
lights.write({[light_p2_g]={state=brightness*col_g}})
|
||
|
lights.write({[light_p2_b]={state=brightness*col_b}})
|
||
|
else
|
||
|
lights.write_reset(light_p2_r)
|
||
|
lights.write_reset(light_p2_g)
|
||
|
lights.write_reset(light_p2_b)
|
||
|
end
|
||
|
|
||
|
-- flush HID light output
|
||
|
lights.update()
|
||
|
|
||
|
-- turntable movement detection
|
||
|
-- doesn't set the diff back to zero unless enough time has passed
|
||
|
if tt1_diff == 0 then
|
||
|
tt1_zero_elapsed = tt1_zero_elapsed + loop_delta
|
||
|
if tt1_zero_elapsed >= zero_duration then
|
||
|
tt1_diff_last = tt1_diff
|
||
|
end
|
||
|
else
|
||
|
tt1_zero_elapsed = 0
|
||
|
tt1_diff_last = tt1_diff
|
||
|
end
|
||
|
if tt2_diff == 0 then
|
||
|
tt2_zero_elapsed = tt2_zero_elapsed + loop_delta
|
||
|
if tt2_zero_elapsed >= zero_duration then
|
||
|
tt2_diff_last = tt2_diff
|
||
|
end
|
||
|
else
|
||
|
tt2_zero_elapsed = 0
|
||
|
tt2_diff_last = tt2_diff
|
||
|
end
|
||
|
|
||
|
-- remember state
|
||
|
tt1_last = tt1
|
||
|
tt2_last = tt2
|
||
|
|
||
|
-- loop end
|
||
|
sleep(loop_delta)
|
||
|
end
|