diff options
Diffstat (limited to 'interface/interface.py')
-rw-r--r-- | interface/interface.py | 72 |
1 files changed, 67 insertions, 5 deletions
diff --git a/interface/interface.py b/interface/interface.py index 32fca84..f9c868e 100644 --- a/interface/interface.py +++ b/interface/interface.py @@ -2,6 +2,7 @@ import curses import os import datetime as dt import threading +import traceback as tb import blc2 @@ -526,7 +527,54 @@ class Interface: self.channel_bank.audio = self.primitive def _render_callback(self, t, values): - pass + if not self.rendering: + return + with self.w_lock: + self.channel_bank.set_values(values) + self.channel_bank.title = "LIVE: %7.2fs" % t + + for d, cv in zip(self.renderer._data, self.chaser_views): + cv.selected = d.steps[-1].index if d.steps else None + + def base_run(self): + if not self.chaser_views: + return "No chasers loaded" + + self.channel_bank.set_scope(self._channels) + self.channel_bank.title = "LIVE: %7.2fs" % 0 + self.channel_bank.highlight = True + + self.rendering = True + self.renderer.set_functions(*((cv.chaser, cv.chaser.get_data()) for cv in self.chaser_views)) + self.renderer.start() + + self.input.context = self.context_run + + return "Started running" + + def run_exit(self): + with self.w_lock: + self.rendering = False + self.renderer.stop() + + self.channel_bank.title = "Channels" + self.channel_bank.highlight = False + self.channel_bank.set_scope(()) + + self.input.context = self.context_base + + for cv in self.chaser_views: + cv.selected = None + + def run_jump(self, n, p, index): + if not index: + n = [j for j, i in enumerate(self.chaser_views) if i.chaser.id == n] + if not n: + return "No such chaser loaded" + n = n[0] + if n >= len(self.chaser_views) or n < 0: + return "Index out of range" + self.renderer.advance((n, p)) def __init__(self, path, output): ## Have to do most of the actual initialization in the main method, as curses isn't @@ -562,11 +610,13 @@ class Interface: ("new audio $quoted_string", lambda n: self.base_new(n, Audio)), ("add $num", self.base_add), - ("remove $letter", lambda n: self.base_remove(n, True)), - ("remove $num", lambda n: self.base_remove(n, False)), + ("subtract $letter", lambda n: self.base_remove(n, True)), + ("subtract $num", lambda n: self.base_remove(n, False)), + + ("run", self.base_run), - ("save", self.base_save), - ("save $quoted_string", self.base_save), + ("write", self.base_save), + ("write $quoted_string", self.base_save), ("list fixtures", self.list_fixtures), ("list scenes", lambda: self.list_functions(SCENE)), @@ -680,6 +730,18 @@ class Interface: ("quit", self.audio_exit), )) + self.context_run = Input.parse_context(( + ("quit", self.run_exit), + + ("jump $letter to $num", lambda n, p: self.run_jump(n, p, True)), + ("jump $num to $num", lambda n, p: self.run_jump(n, p, False)), + + ("advance $letter", lambda n: self.run_jump(n, None, True)), + ("advance $num", lambda n: self.run_jump(n, None, False)), + )) + self.output = output self.renderer = Renderer(self.w, self.w_lock, self.output, self._render_callback) self.rendering = False + + self._channels = sum((tuple(f.channels) for f in sorted(self.w.fixtures.values(), key=lambda i: i.id)), ()) |