Files
@ 4556eebe5d73
Branch filter:
Location: light9/web/timeline/Project.coffee - annotation
4556eebe5d73
3.2 KiB
text/coffeescript
topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
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))
|