Files
@ 9b101d8bd7ea
Branch filter:
Location: light9/web/light9-timeline-audio.ts - annotation
9b101d8bd7ea
2.9 KiB
video/MP2T
discover annotated lights in blender; send their color to the graph (temporary stmt)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 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 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 4556eebe5d73 | import { debug } from "debug";
import { html, LitElement, PropertyValues } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { NamedNode } from "n3";
import { getTopGraph } from "./RdfdbSyncedGraph";
import { SyncedGraph } from "./SyncedGraph";
const log = debug("audio");
export interface Zoom {
duration: number | null;
t1: number;
t2: number;
}
function nodeHasChanged(newVal?: NamedNode, oldVal?: NamedNode): boolean {
if (newVal === undefined && oldVal === undefined) {
return false;
}
if (newVal === undefined || oldVal === undefined) {
return true;
}
return !newVal.equals(oldVal);
}
// (potentially-zoomed) spectrogram view
@customElement("light9-timeline-audio")
export class Light9TimelineAudio extends LitElement {
graph!: SyncedGraph;
render() {
return html`
<style>
:host {
display: block;
/* shouldn't be seen, but black is correct for 'no
audio'. Maybe loading stripes would be better */
background: #202322;
}
div {
width: 100%;
height: 100%;
overflow: hidden;
}
img {
height: 100%;
position: relative;
transition: left 0.1s linear;
}
</style>
<div>
<img src=${this.imgSrc} style="width: ${this.imgWidth}; left: ${this.imgLeft}" />
</div>
`;
}
@property({ hasChanged: nodeHasChanged }) show!: NamedNode;
@property({ hasChanged: nodeHasChanged }) song!: NamedNode;
@property() zoom: Zoom = { duration: null, t1: 0, t2: 1 };
@state() imgSrc: string = "#";
@state() imgWidth: string = "0"; // css
@state() imgLeft: string = "0"; // css
constructor() {
super();
getTopGraph().then((g) => {
this.graph = g;
});
}
updated(changedProperties: PropertyValues) {
if (changedProperties.has("song") || changedProperties.has("show")) {
if (this.song && this.show) {
this.graph.runHandler(this.setImgSrc.bind(this), "timeline-audio " + this.song);
}
}
if (changedProperties.has("zoom")) {
this.imgWidth = this._imgWidth(this.zoom);
this.imgLeft = this._imgLeft(this.zoom);
}
}
setImgSrc() {
try {
var root = this.graph.stringValue(this.show, this.graph.Uri(":spectrogramUrlRoot"));
} catch (e) {
return;
}
try {
var filename = this.graph.stringValue(this.song, this.graph.Uri(":songFilename"));
} catch (e) {
return;
}
this.imgSrc = root + "/" + filename.replace(".wav", ".png").replace(".ogg", ".png");
log(`imgSrc ${this.imgSrc}`);
}
_imgWidth(zoom: Zoom): string {
if (!zoom.duration) {
return "100%";
}
return 100 / ((zoom.t2 - zoom.t1) / zoom.duration) + "%";
}
_imgLeft(zoom: Zoom): string {
if (!zoom.duration) {
return "0";
}
var percentPerSec = 100 / (zoom.t2 - zoom.t1);
return -percentPerSec * zoom.t1 + "%";
}
}
|