Mercurial > code > home > repos > light9
annotate bin/effecteval @ 1181:c677bf37a1b4
effect list has button to add to current song
Ignore-this: 336da00ee802890c5b75af5b0d2ab255
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Sun, 15 Jun 2014 15:47:15 +0000 |
parents | 6c4981f61bf8 |
children | 102a456be7db |
rev | line source |
---|---|
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
1 #!bin/python |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
2 from __future__ import division |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
3 from run_local import log |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
4 from twisted.internet import reactor |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
5 from twisted.internet.defer import inlineCallbacks, returnValue |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
6 import cyclone.web, cyclone.websocket, cyclone.httpclient |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
7 import sys, optparse, logging, subprocess, json, time, traceback, itertools |
1051
be016cd5e5c5
effecteval names its new curve after the sub you drop on it
Drew Perttula <drewp@bigasterisk.com>
parents:
1044
diff
changeset
|
8 from rdflib import URIRef, Literal |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
9 |
1116
2a89050c140b
another sys.path for raspi dirs
Drew Perttula <drewp@bigasterisk.com>
parents:
1115
diff
changeset
|
10 sys.path.append('/usr/lib/pymodules/python2.7/') # for numpy, on rpi |
1115
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
11 sys.path.append('/usr/lib/python2.7/dist-packages') # For numpy |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
12 from light9 import networking, showconfig, Submaster, dmxclient |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
13 from light9.curvecalc import musicaccess |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
14 from light9.curvecalc.curve import CurveResource |
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
15 from light9.effecteval.effect import EffectNode |
1115
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
16 from light9.effecteval.effectloop import makeEffectLoop |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
17 from light9.greplin_cyclone import StatsForCyclone |
1052
b370618ce723
split EffectNode out of effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1051
diff
changeset
|
18 from light9.namespaces import L9, RDF, RDFS |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
19 from light9.rdfdb.patch import Patch |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
20 from light9.rdfdb.syncedgraph import SyncedGraph |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
21 from greplin import scales |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
22 |
1060
473db8bebb8f
install a copy of cycloneerr.py
Drew Perttula <drewp@bigasterisk.com>
parents:
1055
diff
changeset
|
23 from lib.cycloneerr import PrettyErrorHandler |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
24 |
1054
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
25 class EffectEdit(PrettyErrorHandler, cyclone.web.RequestHandler): |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
26 def get(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
27 self.write(open("light9/effecteval/effect.html").read()) |
1054
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
28 def delete(self): |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
29 graph = self.settings.graph |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
30 uri = URIRef(self.get_argument('uri')) |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
31 with graph.currentState(tripleFilter=(None, L9['effect'], uri)) as g: |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
32 song = ctx = list(g.subjects(L9['effect'], uri))[0] |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
33 self.settings.graph.patch(Patch(delQuads=[ |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
34 (song, L9['effect'], uri, ctx), |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
35 ])) |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
36 |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
37 def clamp(x, lo, hi): |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
38 return max(lo, min(hi, x)) |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
39 |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
40 @inlineCallbacks |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
41 def getMusicStatus(): |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
42 returnValue(json.loads((yield cyclone.httpclient.fetch( |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
43 networking.musicPlayer.path('time'), timeout=.5)).body)) |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
44 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
45 @inlineCallbacks |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
46 def newEnvelopeCurve(graph, ctx, uri, label): |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
47 """this does its own patch to the graph""" |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
48 |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
49 musicStatus = yield getMusicStatus() |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
50 songTime=musicStatus['t'] |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
51 songDuration=musicStatus['duration'] |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
52 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
53 cr = CurveResource(graph, uri) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
54 cr.newCurve(ctx, label=Literal(label)) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
55 fade = 2 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
56 t1 = clamp(songTime - fade, .1, songDuration - .1 * 2) + fade |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
57 t2 = clamp(songTime + 20, t1 + .1, songDuration) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
58 print vars() |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
59 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
60 cr.curve.insert_pt((t1 - fade, 0)) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
61 cr.curve.insert_pt((t1, 1)) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
62 cr.curve.insert_pt((t2, 1)) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
63 cr.curve.insert_pt((t2 + fade, 0)) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
64 cr.saveCurve() |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
65 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
66 def newEffect(graph, song, ctx): |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
67 effect = graph.sequentialUri(song + "/effect-") |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
68 quads = [ |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
69 (song, L9['effect'], effect, ctx), |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
70 (effect, RDF.type, L9['Effect'], ctx), |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
71 ] |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
72 return effect, quads |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
73 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
74 def musicCurveForSong(uri): |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
75 return URIRef(uri + 'music') |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
76 |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
77 @inlineCallbacks |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
78 def currentSong(): |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
79 s = (yield getMusicStatus())['song'] |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
80 if s is None: |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
81 raise ValueError("no current song") |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
82 returnValue(URIRef(s)) |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
83 |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
84 class SongEffects(PrettyErrorHandler, cyclone.web.RequestHandler): |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
85 def wideOpenCors(self): |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
86 self.set_header('Access-Control-Allow-Origin', '*') |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
87 self.set_header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS') |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
88 self.set_header('Access-Control-Max-Age', '1000') |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
89 self.set_header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With') |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
90 |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
91 def options(self): |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
92 self.wideOpenCors() |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
93 self.write('') |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
94 |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
95 @inlineCallbacks |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
96 def post(self): |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
97 self.wideOpenCors() |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
98 dropped = URIRef(self.get_argument('drop')) |
1181
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
99 |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
100 try: |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
101 song = URIRef(self.get_argument('uri')) |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
102 except Exception: # which? |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
103 song = yield currentSong() |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
104 |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
105 log.info("adding to %s", song) |
c677bf37a1b4
effect list has button to add to current song
Drew Perttula <drewp@bigasterisk.com>
parents:
1180
diff
changeset
|
106 |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
107 ctx = song |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
108 graph = self.settings.graph |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
109 |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
110 with graph.currentState( |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
111 tripleFilter=(dropped, None, None)) as g: |
1139
d8b25edf6c74
fix dropping of subs onto effecteval
drewp@bigasterisk.com
parents:
1123
diff
changeset
|
112 droppedTypes = list(g.objects(dropped, RDF.type)) |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
113 droppedLabel = g.label(dropped) |
1139
d8b25edf6c74
fix dropping of subs onto effecteval
drewp@bigasterisk.com
parents:
1123
diff
changeset
|
114 droppedCodes = list(g.objects(dropped, L9['code'])) |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
115 |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
116 quads = [] |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
117 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
118 effect, q = newEffect(graph, song, ctx) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
119 quads.extend(q) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
120 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
121 curve = graph.sequentialUri(song + "/curve-") |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
122 yield newEnvelopeCurve(graph, ctx, curve, droppedLabel) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
123 quads.extend([ |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
124 (song, L9['curve'], curve, ctx), |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
125 (effect, RDFS.label, droppedLabel, ctx), |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
126 (effect, L9['code'], Literal('env = %s' % curve.n3()), ctx), |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
127 ]) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
128 |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
129 if L9['EffectClass'] in droppedTypes: |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
130 quads.extend([ |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
131 (effect, RDF.type, dropped, ctx), |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
132 ] + [(effect, L9['code'], c, ctx) for c in droppedCodes]) |
1139
d8b25edf6c74
fix dropping of subs onto effecteval
drewp@bigasterisk.com
parents:
1123
diff
changeset
|
133 elif L9['Submaster'] in droppedTypes: |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
134 quads.extend([ |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
135 (effect, L9['code'], Literal('out = %s * env' % dropped.n3()), |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
136 ctx), |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
137 ]) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
138 else: |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
139 raise NotImplementedError( |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
140 "don't know how to add an effect from %r (types=%r)" % |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
141 (dropped, droppedTypes)) |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
142 |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
143 for spoc in quads: |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
144 if 'music' in spoc[2]: |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
145 quads.extend([ |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
146 (effect, L9['code'], |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
147 Literal('music = %s' % musicCurveForSong(song).n3()), ctx) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
148 ]) |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
149 break |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
150 |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
151 graph.patch(Patch(addQuads=quads)) |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
152 |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
153 class SongEffectsUpdates(cyclone.websocket.WebSocketHandler): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
154 def connectionMade(self, *args, **kwargs): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
155 self.graph = self.settings.graph |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
156 self.graph.addHandler(self.updateClient) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
157 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
158 def updateClient(self): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
159 # todo: abort if client is gone |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
160 playlist = self.graph.value(showconfig.showUri(), L9['playList']) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
161 songs = list(self.graph.items(playlist)) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
162 out = [] |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
163 for s in songs: |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
164 out.append({'uri': s, 'label': self.graph.label(s)}) |
1140
3f7de54de79e
on songeffects page, show effect labels
drewp@bigasterisk.com
parents:
1139
diff
changeset
|
165 out[-1]['effects'] = [{'uri': uri, 'label': self.graph.label(uri)} for uri in sorted(self.graph.objects(s, L9['effect']))] |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
166 self.sendMessage({'songs': out}) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
167 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
168 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
169 class EffectUpdates(cyclone.websocket.WebSocketHandler): |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
170 """ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
171 stays alive for the life of the effect page |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
172 """ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
173 def connectionMade(self, *args, **kwargs): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
174 log.info("websocket opened") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
175 self.uri = URIRef(self.get_argument('uri')) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
176 self.sendMessage({'hello': repr(self)}) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
177 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
178 self.graph = self.settings.graph |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
179 self.graph.addHandler(self.updateClient) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
180 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
181 def updateClient(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
182 # todo: if client has dropped, abort and don't get any more |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
183 # graph updates |
1108
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
184 |
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
185 # EffectNode knows how to put them in order. Somehow this is |
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
186 # not triggering an update when the order changes. |
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
187 en = EffectNode(self.graph, self.uri) |
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
188 codeLines = [c.code for c in en.codes] |
4b542d321c8f
effectnode runs multiple lines of code in dependency order
Drew Perttula <drewp@bigasterisk.com>
parents:
1107
diff
changeset
|
189 self.sendMessage({'codeLines': codeLines}) |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
190 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
191 def connectionLost(self, reason): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
192 log.info("websocket closed") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
193 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
194 def messageReceived(self, message): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
195 log.info("got message %s" % message) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
196 # write a patch back to the graph |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
197 |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
198 def replaceObjects(graph, c, s, p, newObjs): |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
199 patch = graph.getObjectPatch( |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
200 context=c, |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
201 subject=s, |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
202 predicate=p, |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
203 newObject=newObjs[0]) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
204 |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
205 moreAdds = [] |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
206 for line in newObjs[1:]: |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
207 moreAdds.append((s, p, line, c)) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
208 fullPatch = Patch(delQuads=patch.delQuads, |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
209 addQuads=patch.addQuads + moreAdds) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
210 graph.patch(fullPatch) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
211 |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
212 |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
213 class Code(PrettyErrorHandler, cyclone.web.RequestHandler): |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
214 def put(self): |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
215 effect = URIRef(self.get_argument('uri')) |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
216 codeLines = [] |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
217 for i in itertools.count(0): |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
218 k = 'codeLines[%s][text]' % i |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
219 v = self.get_argument(k, None) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
220 if v is not None: |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
221 codeLines.append(Literal(v)) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
222 else: |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
223 break |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
224 if not codeLines: |
1111 | 225 log.info("no codelines received on PUT /code") |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
226 return |
1103
771f50f19b4b
single-line effect code now evals by changing <uri> into a suitable python object
Drew Perttula <drewp@bigasterisk.com>
parents:
1101
diff
changeset
|
227 with self.settings.graph.currentState( |
771f50f19b4b
single-line effect code now evals by changing <uri> into a suitable python object
Drew Perttula <drewp@bigasterisk.com>
parents:
1101
diff
changeset
|
228 tripleFilter=(None, L9['effect'], effect)) as g: |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
229 song = g.subjects(L9['effect'], effect).next() |
1107
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
230 |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
231 replaceObjects(self.settings.graph, song, effect, L9['code'], codeLines) |
512381de45bd
effectclasss in subserver. multiline code suppport (except for evaulation). add some old effect funcs to the new evaluator
Drew Perttula <drewp@bigasterisk.com>
parents:
1103
diff
changeset
|
232 |
1103
771f50f19b4b
single-line effect code now evals by changing <uri> into a suitable python object
Drew Perttula <drewp@bigasterisk.com>
parents:
1101
diff
changeset
|
233 # right here we could tell if the code has a python error and return it |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
234 self.send_error(202) |
1019 | 235 |
236 class EffectEval(PrettyErrorHandler, cyclone.web.RequestHandler): | |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
237 @inlineCallbacks |
1019 | 238 def get(self): |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
239 # return dmx list for that effect |
1019 | 240 uri = URIRef(self.get_argument('uri')) |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
241 response = yield cyclone.httpclient.fetch( |
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
242 networking.musicPlayer.path('time')) |
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
243 songTime = json.loads(response.body)['t'] |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
244 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
245 node = EffectNode(self.settings.graph, uri) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
246 outSub = node.eval(songTime) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
247 self.write(json.dumps(outSub.get_dmx_list())) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
248 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
249 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
250 # Completely not sure where the effect background loop should |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
251 # go. Another process could own it, and get this request repeatedly: |
1019 | 252 class SongEffectsEval(PrettyErrorHandler, cyclone.web.RequestHandler): |
253 def get(self): | |
254 song = URIRef(self.get_argument('song')) | |
255 effects = effectsForSong(self.settings.graph, song) | |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
256 raise NotImplementedError |
1019 | 257 self.write(maxDict(effectDmxDict(e) for e in effects)) |
258 # return dmx dict for all effects in the song, already combined | |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
259 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
260 class App(object): |
1114
a38955ba6f40
rdfdb port is now in the config
Drew Perttula <drewp@bigasterisk.com>
parents:
1111
diff
changeset
|
261 def __init__(self, show, outputWhere): |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
262 self.show = show |
1114
a38955ba6f40
rdfdb port is now in the config
Drew Perttula <drewp@bigasterisk.com>
parents:
1111
diff
changeset
|
263 self.outputWhere = outputWhere |
a38955ba6f40
rdfdb port is now in the config
Drew Perttula <drewp@bigasterisk.com>
parents:
1111
diff
changeset
|
264 self.graph = SyncedGraph(networking.rdfdb.url, "effectEval") |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
265 self.graph.initiallySynced.addCallback(self.launch) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
266 |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
267 self.stats = scales.collection('/', |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
268 scales.PmfStat('sendLevels'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
269 scales.PmfStat('getMusic'), |
1122
17b24cb10202
gather more output loop timing
Drew Perttula <drewp@bigasterisk.com>
parents:
1116
diff
changeset
|
270 scales.PmfStat('evals'), |
1123 | 271 scales.PmfStat('sendOutput'), |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
272 scales.IntStat('errors'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
273 ) |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
274 |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
275 def launch(self, *args): |
1115
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
276 self.loop = makeEffectLoop(self.graph, self.stats, self.outputWhere) |
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
277 self.loop.startLoop() |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
278 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
279 SFH = cyclone.web.StaticFileHandler |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
280 self.cycloneApp = cyclone.web.Application(handlers=[ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
281 (r'/()', SFH, |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
282 {'path': 'light9/effecteval', 'default_filename': 'index.html'}), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
283 (r'/effect', EffectEdit), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
284 (r'/(websocket\.js)', SFH, {'path': 'light9/rdfdb/web/'}), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
285 (r'/effect\.js', StaticCoffee, {'src': 'light9/effecteval/effect.coffee'}), |
1041
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
286 (r'/index\.js', StaticCoffee, {'src': 'light9/effecteval/index.coffee'}), |
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
287 (r'/effectUpdates', EffectUpdates), |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
288 (r'/code', Code), |
1041
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
289 (r'/songEffectsUpdates', SongEffectsUpdates), |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
290 (r'/static/(.*)', SFH, {'path': 'static/'}), |
1019 | 291 (r'/effect/eval', EffectEval), |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
292 (r'/songEffects', SongEffects), |
1019 | 293 (r'/songEffects/eval', SongEffectsEval), |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
294 (r'/stats', StatsForCyclone), |
1180
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
295 ], |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
296 debug=True, |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
297 graph=self.graph, |
6c4981f61bf8
subserver inserts effects with envelope curves
Drew Perttula <drewp@bigasterisk.com>
parents:
1141
diff
changeset
|
298 stats=self.stats) |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
299 reactor.listenTCP(networking.effectEval.port, self.cycloneApp) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
300 log.info("listening on %s" % networking.effectEval.port) |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
301 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
302 class StaticCoffee(PrettyErrorHandler, cyclone.web.RequestHandler): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
303 def initialize(self, src): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
304 super(StaticCoffee, self).initialize() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
305 self.src = src |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
306 def get(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
307 self.set_header('Content-Type', 'application/javascript') |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
308 self.write(subprocess.check_output([ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
309 '/usr/bin/coffee', '--compile', '--print', self.src])) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
310 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
311 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
312 if __name__ == "__main__": |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
313 parser = optparse.OptionParser() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
314 parser.add_option('--show', |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
315 help='show URI, like http://light9.bigasterisk.com/show/dance2008', |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
316 default=showconfig.showUri()) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
317 parser.add_option("-v", "--verbose", action="store_true", |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
318 help="logging.DEBUG") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
319 parser.add_option("--twistedlog", action="store_true", |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
320 help="twisted logging") |
1115
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
321 parser.add_option("--output", metavar="WHERE", help="dmx or leds") |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
322 (options, args) = parser.parse_args() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
323 log.setLevel(logging.DEBUG if options.verbose else logging.INFO) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
324 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
325 if not options.show: |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
326 raise ValueError("missing --show http://...") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
327 |
1115
818275850003
effecteval screens for only the kinds of outputs that it can send, so i can run a second instance just for LEDs
Drew Perttula <drewp@bigasterisk.com>
parents:
1114
diff
changeset
|
328 app = App(URIRef(options.show), options.output) |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
329 if options.twistedlog: |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
330 from twisted.python import log as twlog |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
331 twlog.startLogging(sys.stderr) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
332 reactor.run() |