186 lines
4.7 KiB
JavaScript
186 lines
4.7 KiB
JavaScript
|
var low = require("lowdb");
|
||
|
var db = low("db.json");
|
||
|
var sid = require("short-id");
|
||
|
sid.configure({length:12});
|
||
|
db.defaults({}).write();
|
||
|
|
||
|
var http = require("http").createServer();
|
||
|
|
||
|
var ioClient = require("socket.io-client")("http://localhost:5000");
|
||
|
var io = require("socket.io")(http);
|
||
|
|
||
|
var activeFile = undefined;
|
||
|
var toTrigger = [];
|
||
|
|
||
|
class FrameTime{
|
||
|
constructor(millis){
|
||
|
this.lframe = 0;
|
||
|
this.lseconds = 0;
|
||
|
this.lminutes = 0;
|
||
|
this.lhours = 0;
|
||
|
this.lmilliseconds = 0;
|
||
|
if(Number.isInteger(millis)){
|
||
|
this.milliseconds = millis;
|
||
|
} else if(typeof millis === "object"){
|
||
|
if(Number.isInteger(millis.frame) && Number.isInteger(millis.seconds) && Number.isInteger(millis.minutes) && Number.isInteger(millis.hours) ){
|
||
|
this.lframe = millis.frame; //use the local, because its mor performant
|
||
|
this.lseconds = milllis.seconds;
|
||
|
this.lminutes = millis.minutes;
|
||
|
this.lhours = millis.hours;
|
||
|
this.calcMillis();
|
||
|
} else if(Number.isInteger(millis.milliseconds)){
|
||
|
this.milliseconds = millis.milliseconds;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get milliseconds() {
|
||
|
return this.lmilliseconds;
|
||
|
}
|
||
|
|
||
|
set milliseconds(val) {
|
||
|
this.lmilliseconds = val;
|
||
|
millisToFrame();
|
||
|
}
|
||
|
|
||
|
get frame(){
|
||
|
return this.lframe;
|
||
|
}
|
||
|
|
||
|
set frame (val) {
|
||
|
this.lframe = val;
|
||
|
calcMillis();
|
||
|
}
|
||
|
|
||
|
get seconds() {
|
||
|
return this.lseconds;
|
||
|
}
|
||
|
|
||
|
set seconds(val){
|
||
|
this.lseconds = val;
|
||
|
calcMillis();
|
||
|
}
|
||
|
|
||
|
get minutes() {
|
||
|
return this.lminutes;
|
||
|
}
|
||
|
|
||
|
set minutes(val) {
|
||
|
this.lminutes = val;
|
||
|
calcMillis();
|
||
|
}
|
||
|
|
||
|
get hours(){
|
||
|
return this.lhours;
|
||
|
}
|
||
|
|
||
|
set hours(val){
|
||
|
this.lhours = val;
|
||
|
calcMillis();
|
||
|
}
|
||
|
|
||
|
calcMillis(){
|
||
|
this.lmilliseconds = (this.frame / 25 * 1000) + this.seconds * 1000 + this.minutes * 60 * 1000 + this.hours * 60 * 60 * 1000;
|
||
|
}
|
||
|
|
||
|
millisToFrame(millis) {
|
||
|
this.frame = Math.floor((millis % 1000)*25/1000);
|
||
|
this.seconds = Math.floor((millis / 1000) % 60);
|
||
|
this.minutes = Math.floor((millis / (1000*60)) % 60);
|
||
|
this.hours = Math.floor((millis / (1000*60*60)) % 24);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ioClient.on("update", (data)=>{
|
||
|
activeFile = data.file;
|
||
|
var t = data.time;
|
||
|
var ft = new FrameTime(t);
|
||
|
var answer = {};
|
||
|
answer.time = ft;
|
||
|
answer.timemillis = t;
|
||
|
answer.file = activeFile;
|
||
|
answer.playing = data.playing;
|
||
|
io.emit("update", answer);
|
||
|
|
||
|
});
|
||
|
|
||
|
ioClient.on("playing", (data)=>{
|
||
|
io.emit("playing", data);
|
||
|
});
|
||
|
|
||
|
ioClient.on("stopped", ()=>{
|
||
|
io.emit("stopped")
|
||
|
});
|
||
|
|
||
|
io.on("connection", (socket)=>{
|
||
|
//console.log("client connected:", socket.client.id);
|
||
|
socket.on("set", (data)=>{ //ToDo preset ids etc.
|
||
|
console.log(data);
|
||
|
var entry = {};
|
||
|
entry.id = sid.generate();
|
||
|
entry.time = new FrameTime(data.time); //typof FrameTime
|
||
|
entry.channel = data.channel;
|
||
|
entry.note = data.note;
|
||
|
entry.name = data.name;
|
||
|
data.name = data.name.replace(".", "");
|
||
|
entry.value = data.value;
|
||
|
if(db.get(data.name).value() === undefined) {
|
||
|
db.set(data.name, []).write();
|
||
|
}
|
||
|
db.get(data.name).push(entry).write();
|
||
|
});
|
||
|
|
||
|
socket.on("get", (data)=>{ //Requires filename
|
||
|
var v = db.get(data.replace(".", "")).value();
|
||
|
socket.emit("data", v);
|
||
|
});
|
||
|
|
||
|
socket.on("remove", (data)=>{ //requires id
|
||
|
db.get(data.replace(".", "")).remove({id:data}).write();
|
||
|
});
|
||
|
|
||
|
socket.on("load_preset", (data)=>{
|
||
|
toTrigger = db.get(data.replace(".", "")).value();
|
||
|
});
|
||
|
|
||
|
socket.on("play", (data)=>{
|
||
|
ioClient.emit("play", data);
|
||
|
});
|
||
|
|
||
|
socket.on("stop", (data)=>{
|
||
|
ioClient.emit("stop", data);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
setInterval(()=>{
|
||
|
var start
|
||
|
var update_infos = {};
|
||
|
player.getOrigTime((time)=>{
|
||
|
player.getTime((t)=>{
|
||
|
player.getState((playing)=>{
|
||
|
update_infos.file = activeFile;
|
||
|
update_infos.time = t;
|
||
|
update_infos.is_playing = playing;
|
||
|
update_infos.triggeredMidi = [];
|
||
|
if(playing){
|
||
|
if(toTrigger){
|
||
|
toTrigger.forEach(e=>{
|
||
|
if(e.time <= t){
|
||
|
var midi = {channel:e.channel, note:e.note, value:e.value}
|
||
|
io.emit("midi", {channel:e.channel, note:e.note, value:e.value});
|
||
|
var i = toTrigger.indexOf(e);
|
||
|
if (i < 0) return;
|
||
|
toTrigger.splice(i, 1);
|
||
|
update_infos.triggeredMidi.push(midi);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
io.emit("update", update_infos);
|
||
|
//console.log(JSON.stringify(update_infos, undefined, 4));
|
||
|
})
|
||
|
});
|
||
|
});
|
||
|
}, 1000/25)
|
||
|
|
||
|
http.listen(5000);
|