Files
@ af83aeef8b0a
Branch filter:
Location: light9/web/timeline/Project.coffee - annotation
af83aeef8b0a
3.2 KiB
text/coffeescript
fancier spectrograms
4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 | log = debug('timeline')
debug.enable('*')
Drawing = window.Drawing
ROW_COUNT = 7
class Project
constructor: (@graph) ->
makeEffect: (uri) ->
U = (x) => @graph.Uri(x)
effect = U(uri.value + '/effect')
quad = (s, p, o) => @graph.Quad(s, p, o, effect)
quads = [
quad(effect, U('rdf:type'), U(':Effect')),
quad(effect, U(':copiedFrom'), uri),
quad(effect, U('rdfs:label'), @graph.Literal(uri.replace(/.*capture\//, ''))),
quad(effect, U(':publishAttr'), U(':strength')),
]
fromSettings = @graph.objects(uri, U(':setting'))
toSettings = @graph.nextNumberedResources(effect + '_set', fromSettings.length)
for fs in fromSettings
ts = toSettings.pop()
# full copies of these since I may have to delete captures
quads.push(quad(effect, U(':setting'), ts))
quads.push(quad(ts, U(':device'), @graph.uriValue(fs, U(':device'))))
quads.push(quad(ts, U(':deviceAttr'), @graph.uriValue(fs, U(':deviceAttr'))))
try
quads.push(quad(ts, U(':value'), @graph.uriValue(fs, U(':value'))))
catch
quads.push(quad(ts, U(':scaledValue'), @graph.uriValue(fs, U(':scaledValue'))))
@graph.applyAndSendPatch({delQuads: [], addQuads: quads})
return effect
makeNewNote: (song, effect, dropTime, desiredWidthT) ->
U = (x) => @graph.Uri(x)
quad = (s, p, o) => @graph.Quad(s, p, o, song)
newNote = @graph.nextNumberedResource("#{song.value}/n")
newCurve = @graph.nextNumberedResource("#{newNote.value}c")
points = @graph.nextNumberedResources("#{newCurve.value}p", 4)
curveQuads = [
quad(song, U(':note'), newNote)
quad(newNote, U('rdf:type'), U(':Note'))
quad(newNote, U(':originTime'), @graph.LiteralRoundedFloat(dropTime))
quad(newNote, U(':effectClass'), effect)
quad(newNote, U(':curve'), newCurve)
quad(newCurve, U('rdf:type'), U(':Curve'))
# todo: maybe shoudl be :effectAttr?
quad(newCurve, U(':attr'), U(':strength'))
]
pointQuads = []
for i in [0...4]
pt = points[i]
pointQuads.push(quad(newCurve, U(':point'), pt))
pointQuads.push(quad(pt, U(':time'), @graph.LiteralRoundedFloat(i/3 * desiredWidthT)))
pointQuads.push(quad(pt, U(':value'), @graph.LiteralRoundedFloat(i == 1 or i == 2)))
patch = {
delQuads: []
addQuads: curveQuads.concat(pointQuads)
}
@graph.applyAndSendPatch(patch)
getCurvePoints: (curve, xOffset) ->
worldPts = []
uris = @graph.objects(curve, @graph.Uri(':point'))
for pt in uris
tm = @graph.floatValue(pt, @graph.Uri(':time'))
val = @graph.floatValue(pt, @graph.Uri(':value'))
v = $V([xOffset + tm, val])
v.uri = pt
worldPts.push(v)
worldPts.sort((a,b) -> a.e(1) - b.e(1))
return [uris, worldPts]
curveWidth: (worldPts) ->
tMin = @graph.floatValue(worldPts[0].uri, @graph.Uri(':time'))
tMax = @graph.floatValue(worldPts[3].uri, @graph.Uri(':time'))
tMax - tMin
deleteNote: (song, note, selection) ->
patch = {delQuads: [@graph.Quad(song, graph.Uri(':note'), note, song)], addQuads: []}
@graph.applyAndSendPatch(patch)
if note in selection.selected()
selection.selected(_.without(selection.selected(), note))
|