summaryrefslogtreecommitdiff
path: root/interface/interface.py
diff options
context:
space:
mode:
Diffstat (limited to 'interface/interface.py')
-rw-r--r--interface/interface.py72
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)), ())