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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
8842f0c7a641 refactor effectloop
Drew Perttula <drewp@bigasterisk.com>
parents: 1108
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
235
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
236 class EffectEval(PrettyErrorHandler, cyclone.web.RequestHandler):
1027
a38414bd3929 hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents: 1019
diff changeset
237 @inlineCallbacks
1019
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
252 class SongEffectsEval(PrettyErrorHandler, cyclone.web.RequestHandler):
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
253 def get(self):
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
254 song = URIRef(self.get_argument('song'))
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
257 self.write(maxDict(effectDmxDict(e) for e in effects))
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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
9f4d68612d56 spelling
Drew Perttula <drewp@bigasterisk.com>
parents: 1122
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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
5939fce98fad notes for next step
drewp@bigasterisk.com
parents: 1018
diff changeset
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()