diff options
| author | s-ol <s+removethis@s-ol.nu> | 2022-12-13 14:52:55 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2022-12-13 15:38:48 +0000 |
| commit | 820e9e5f165059c363df7414c10c1f51d60fab3d (patch) | |
| tree | 2143fc17e0d82da9bf1a3411755466beba3f21bf /examples | |
| parent | implement session_state (diff) | |
| download | lua-abletonlink-820e9e5f165059c363df7414c10c1f51d60fab3d.tar.gz lua-abletonlink-820e9e5f165059c363df7414c10c1f51d60fab3d.zip | |
add Lua linkhut examplev1.0.0
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/linkhut.lua | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/examples/linkhut.lua b/examples/linkhut.lua new file mode 100644 index 0000000..8987bd9 --- /dev/null +++ b/examples/linkhut.lua @@ -0,0 +1,117 @@ +local al = require 'abletonlink' +local termio = require 'posix.termio' +local poll = require 'posix.poll' + +function print_help() + print([[ + < L I N K H U T > + +usage: + enable / disable Link: a + start / stop: space + decrease / increase tempo: w / e + decrease / increase quantum: r / t + enable / disable start stop sync: s + quit: q]]) +end + +function set_buffered_input(enable) + local t = termio.tcgetattr(0) + if enable then + t.lflag = t.lflag | termio.ICANON + else + t.lflag = t.lflag & (~termio.ICANON) + end + termio.tcsetattr(0, termio.TCSANOW, t) +end + +function wait_for_input() + return poll.rpoll(0, 50) > 0 +end + +function clear_line() + io.stdout:write(' \r') + io.stdout:flush() +end + +function print_state_header() + print("\nenabled | num peers | quantum | start stop sync | tempo | beats | metro") +end + +function print_state() + link:capture_app_session_state(session_state) + + local time = link:clock_micros() + local enabled = link:is_enabled() and "yes" or "no" + local num_peers = link:num_peers() + local start_stop = link:is_start_stop_sync_enabled() and "yes" or " no" + local tempo = session_state:tempo() + local playing = session_state:is_playing() and "[playing]" or "[stopped]" + local beats = session_state:beat_at_time(time, quantum) + local phase = session_state:phase_at_time(time, quantum) + + local bts = '' + for i = 0, math.ceil(quantum) do + bts = bts .. (i < phase and 'X' or 'O') + end + + io.stdout:write(string.format( + "%7s | %9d | %7.f | %3s %11s | %7.2f | %7.2f | %s", + enabled, num_peers, quantum, start_stop, playing, tempo, beats, bts + )) +end + +function input() + char = io.read(1) + + local time = link:clock_micros() + local enabled = link:is_enabled() + local start_stop = link:is_start_stop_sync_enabled() + local tempo = session_state:tempo() + + link:capture_app_session_state(session_state) + + if char == 'q' then + running = false + clear_line() + elseif char == 'a' then + link:enable(not enabled) + elseif char == 'w' then + session_state:set_tempo(tempo - 1, time) + elseif char == 'e' then + session_state:set_tempo(tempo + 1, time) + elseif char == 'r' then + quantum = quantum - 1 + elseif char == 't' then + quantum = quantum + 1 + elseif char == 's' then + link:enable_start_stop_sync(not start_stop) + elseif char == ' ' then + if session_state:is_playing() then + session_state:set_is_playing(false, time) + else + session_state:set_is_playing_and_request_beat_at_time(true, time, 0, quantum) + end + end + + link:commit_app_session_state(session_state) +end + +link = al.create(120) +session_state = al.create_session_state() +running = true +quantum = 4 + +print_help() +print_state_header() +set_buffered_input(false) + +while running do + clear_line() + if wait_for_input() then + input() + else + print_state() + end +end +set_buffered_input(true) |
