summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-08-21 00:23:55 +0200
committerRobin Gareus <robin@gareus.org>2016-08-21 00:24:23 +0200
commita0493283c41fa41a3382704e05e8ef45475187c5 (patch)
tree5b3ed2e549560c7abb98ffd2d318bcffd33e7af1 /scripts
parent7aa5ada0e07e13387ddac42b22d7da80a1c0b717 (diff)
showcase
Diffstat (limited to 'scripts')
-rw-r--r--scripts/_pong.lua156
1 files changed, 156 insertions, 0 deletions
diff --git a/scripts/_pong.lua b/scripts/_pong.lua
new file mode 100644
index 0000000000..3683209a2b
--- /dev/null
+++ b/scripts/_pong.lua
@@ -0,0 +1,156 @@
+ardour {
+ ["type"] = "dsp",
+ name = "a-Pong",
+ category = "Visualization",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[classic game of mixer pong]]
+}
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+ -- -1, -1 = any number of channels as long as input and output count matches
+ return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "Bar", min = 0, max = 1, default = 0.5 },
+ }
+end
+
+local gametime
+local fps
+local ball_x, ball_y
+local dx, dy
+local pingsound
+local lotsound
+local pingnote
+
+function dsp_init (rate)
+ self:shmem ():allocate (4)
+ self:shmem ():clear ()
+ fps = rate / 25
+ pingnote = 352 / rate
+ ball_x = 0.5
+ ball_y = 0
+ dx = 0.011
+ dy = 0.021
+end
+
+function dsp_configure (ins, outs)
+ gametime = fps
+ pingsound = fps
+ lostsound = 3 * fps
+end
+
+function dsp_run (ins, outs, n_samples)
+ local ctrl = CtrlPorts:array () -- get control port array (read/write)
+ local shmem = self:shmem ()
+ local state = shmem:to_float (0):array () -- "cast" into lua-table
+
+ local changed = false
+ gametime = gametime + n_samples
+
+ -- simple game engine
+ while gametime > fps do
+ changed = true
+ gametime = gametime - fps
+
+ ball_x = ball_x + dx
+ ball_y = ball_y + dy
+
+ if ball_x >= 1 or ball_x <= 0 then dx = -dx end
+ if ball_y <= 0 then dy = - dy end
+
+ if ball_y > 1 then
+ local bar = ctrl[1]
+ if math.abs (bar - ball_x) < 0.1 then
+ dy = - dy
+ ball_y = 1.0
+ dx = dx + 0.1 * (bar - ball_x)
+ -- queue sound (unless it's playing)
+ if (pingsound > fps) then
+ pingsound = 0
+ end
+ phase = 0
+ else
+ -- game over
+ lostsound = 0
+ ball_y = 0
+ dx = 0.011
+ end
+ end
+ end
+
+ -- simple synth -- TODO Optimize
+ if pingsound <= fps then
+ for s = 1, n_samples do
+ pingsound = pingsound + 1
+ if pingsound > fps then goto note_end end
+ phase = phase + pingnote
+ local snd = 0.7 * math.sin(6.283185307 * phase) * math.sin (3.141592 * pingsound / fps)
+ for c = 1,#outs do
+ -- don't copy this code, it's quick/dirty and not efficient
+ outs[c]:array()[s] = outs[c]:array()[s] + snd
+ end
+ ::note_end::
+ end
+ end
+
+ if lostsound <= 3 * fps then
+ for s = 1, n_samples do
+ lostsound = lostsound + 1
+ if lostsound > 3 * fps then goto noise_end end
+ local snd = 0.5 * (math.random () - 0.5)
+ for c = 1,#outs do
+ -- don't copy this code, it's quick/dirty and not efficient
+ outs[c]:array()[s] = outs[c]:array()[s] + snd
+ end
+ ::noise_end::
+ end
+ end
+
+ if changed then
+ state[1] = ball_x
+ state[2] = ball_y
+ self:queue_draw ()
+ end
+end
+
+
+function render_inline (ctx, w, max_h)
+ local ctrl = CtrlPorts:array () -- get control port array (read/write)
+ local shmem = self:shmem () -- get shared memory region
+ local state = shmem:to_float (0):array () -- "cast" into lua-table
+
+ if (w > max_h) then
+ h = max_h
+ else
+ h = w
+ end
+
+ -- clear background
+ ctx:rectangle (0, 0, w, h)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+
+ -- display bar
+ local bar_width = w * .1
+ local bar_space = w - bar_width
+
+ ctx:set_line_cap (Cairo.LineCap.Round)
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ ctx:set_line_width (3.0)
+ ctx:move_to (bar_space * ctrl[1], h - 3)
+ ctx:rel_line_to (bar_width, 0)
+ ctx:stroke ()
+
+ -- display ball
+ ctx:move_to (state[1] * w, state[2] * (h - 5))
+ ctx:close_path ()
+ ctx:stroke ()
+
+ return {w, h}
+end