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))