annot-server/static/js/pianoroll.js
changeset 28 6025b8470d18
child 46 7cff1f0a6882
equal deleted inserted replaced
27:68b29e36c9a2 28:6025b8470d18
       
     1 // Config vars
       
     2 var logger = false;
       
     3 var sceneWidth = 1920;
       
     4 //var sceneHeight = 128 * 4; // multiple of 128 because of 128 levels in midi signals ->  better look
       
     5 var prHeight1 = 435;
       
     6 var prHeight2 = 645;
       
     7 var sceneHeight = prHeight1 + prHeight2;
       
     8 var sceneBgColor = 0xFFFFFF;
       
     9 var lineColor = 0x444444;
       
    10 //var manualFramerate = 24;
       
    11 var pixelsPerSecond1 = Math.floor(sceneWidth / 30); // nb of pixels per second
       
    12 var manualFramerate = pixelsPerSecond1 / 4;
       
    13 var pixelsPerSecond2 = Math.floor(sceneWidth / 60); // nb of pixels per second
       
    14 var lineInterval = 5000; // means line every 5 seconds
       
    15 var nbLines = -1;
       
    16 var noteHeight = 110;
       
    17 var noteColor = 0xB74141;
       
    18 //var speed = 1; // container -x position at each frame. Speed = 1 ~ 100px for 2 seconds
       
    19 //var zeroTime = new Date("2014-10-06T12:16:43.000000Z").getTime();
       
    20 var noteDict = {};
       
    21 var pianoNotes = [1,0,1,0,1,1,0,1,0,1,0,1];//Do, Do#, Ré, Ré#, Mi, Fa, Fa#, Sol, Sol#, La, La#, Si
       
    22 // Visual config
       
    23 var drawPianoNotes = false;
       
    24 var drawHorizontalLines = false;
       
    25 var drawVerticalLines = true;
       
    26 
       
    27 
       
    28 //create an new instance of a pixi stage
       
    29 var stage = new PIXI.Stage(sceneBgColor);
       
    30 
       
    31 //create a renderer instance.
       
    32 var renderer = PIXI.autoDetectRenderer(sceneWidth, sceneHeight);
       
    33 
       
    34 //add the renderer view element to the DOM
       
    35 document.getElementById("canvasContainer").appendChild(renderer.view);
       
    36 
       
    37 //requestAnimFrame( animate );
       
    38 
       
    39 
       
    40 //Draw 127 lines
       
    41 var delta = sceneHeight / 128;
       
    42 if(drawHorizontalLines){
       
    43     for(var i=1;i<128;i++){
       
    44         var graphics = new PIXI.Graphics();
       
    45         graphics.beginFill(0xFFFF00);
       
    46         graphics.lineStyle(1, 0xAAAAAA);
       
    47         var y = delta * i;
       
    48         graphics.moveTo(0, y);
       
    49         graphics.lineTo(sceneWidth, y);
       
    50         graphics.endFill();
       
    51         stage.addChild(graphics);
       
    52     }
       
    53 }
       
    54 
       
    55 //Draw piano notes on the left
       
    56 if(drawPianoNotes){
       
    57     for(var i=0;i<128;i++){
       
    58         var graphics = new PIXI.Graphics();
       
    59         var color = pianoNotes[i%12]==1 ? 0xFFFFFF : 0x000000;
       
    60         if(i==60){
       
    61             color = 0xFFD700;
       
    62         }
       
    63         graphics.beginFill(color);
       
    64         graphics.lineStyle(1, 0xAAAAAA);
       
    65         var y = sceneHeight - delta * (i+1);
       
    66         graphics.drawRect(0, y, 20, delta);
       
    67         graphics.endFill();
       
    68         stage.addChild(graphics);
       
    69     }
       
    70 }
       
    71 
       
    72 var uberContainer = new PIXI.DisplayObjectContainer();
       
    73 uberContainer.position.x = Math.floor(sceneWidth*9/10);
       
    74 uberContainer.position.y = 0;
       
    75 stage.addChild(uberContainer);
       
    76 
       
    77 
       
    78 var container1 = new PIXI.DisplayObjectContainer();
       
    79 container1.position.x = 0;
       
    80 container1.position.y = 0;
       
    81 uberContainer.addChild(container1);
       
    82 var container2 = new PIXI.DisplayObjectContainer();
       
    83 container2.position.x = 0;
       
    84 container2.position.y = prHeight1;
       
    85 uberContainer.addChild(container2);
       
    86 
       
    87 // Line between two containers
       
    88 var graphics = new PIXI.Graphics();
       
    89 graphics.beginFill(0xFFFF00);
       
    90 graphics.lineStyle(1, lineColor);
       
    91 var y = delta * i;
       
    92 graphics.moveTo(0, prHeight1);
       
    93 graphics.lineTo(sceneWidth, prHeight1);
       
    94 graphics.endFill();
       
    95 stage.addChild(graphics);
       
    96 
       
    97 function moveContainer() {
       
    98     container1.x -= pixelsPerSecond1/manualFramerate;
       
    99     container2.x -= pixelsPerSecond2/manualFramerate;
       
   100     renderer.render(stage);
       
   101 }
       
   102 
       
   103 function addBunny(data){
       
   104     var timeFromZero = data.content[1];
       
   105     var note = data.content[3];
       
   106     var velocity = data.content[4];
       
   107     if(velocity===0){
       
   108         if(note in noteDict){
       
   109             // We close the note in container one
       
   110             /*var beginTime = new Date(noteDict[note].ts).getTime();
       
   111             var beginDelta = beginTime - zeroTime;
       
   112             var durationDelta = new Date(data.ts).getTime() - beginTime;
       
   113             var beginX = beginDelta * pixelsPerSecond1 / 1000;
       
   114             var width = durationDelta * pixelsPerSecond1 / 1000;*/
       
   115             var beginX = noteDict[note].ts * pixelsPerSecond1 / 1000;
       
   116             var width = (timeFromZero - noteDict[note].ts) * pixelsPerSecond1 / 1000;
       
   117             // We draw the rectangle
       
   118             var graphics = new PIXI.Graphics();
       
   119             graphics.beginFill(noteColor, (noteDict[note].velocity / 128));
       
   120             var y = (128-note) * prHeight1 / 128; // (128-note) because y = 0 is for note = 128 and y = 128 for note = 0
       
   121             graphics.drawRect(beginX, Math.floor(y - (noteHeight/2) + ((prHeight1 / 128)/2)), width, noteHeight);
       
   122             graphics.endFill();
       
   123             container1.addChild(graphics);
       
   124             // container 2
       
   125             beginX = noteDict[note].ts * pixelsPerSecond2 / 1000;
       
   126             width = (timeFromZero - noteDict[note].ts) * pixelsPerSecond2 / 1000;
       
   127             // We draw the rectangle
       
   128             graphics = new PIXI.Graphics();
       
   129             graphics.beginFill(noteColor, (noteDict[note].velocity / 128));
       
   130             y = (128-note) * prHeight2 / 128; // (128-note) because y = 0 is for note = 128 and y = 128 for note = 0
       
   131             graphics.drawRect(beginX, Math.floor(y - (noteHeight/2) + ((prHeight2 / 128)/2)), width, noteHeight);
       
   132             graphics.endFill();
       
   133             container2.addChild(graphics);
       
   134             // delete entry
       
   135             delete noteDict[note];
       
   136         }
       
   137     }
       
   138     else{
       
   139         noteDict[note] = {ts: timeFromZero, velocity:velocity};
       
   140     }
       
   141 }
       
   142 
       
   143 // Socket management
       
   144 var sock = null;
       
   145 var ellog = null;
       
   146 function log(m) {
       
   147     if(logger){
       
   148         ellog.innerHTML += m + '\n';
       
   149         ellog.scrollTop = ellog.scrollHeight;
       
   150     }
       
   151 }
       
   152 window.onload = function() {
       
   153 
       
   154     if(logger){
       
   155         ellog = document.getElementById('log');
       
   156     }
       
   157     else{
       
   158         document.body.removeChild(document.getElementById('log'));
       
   159     }
       
   160 
       
   161     var wsuri;
       
   162     if (window.location.protocol === "file:") {
       
   163        wsuri = "ws://127.0.0.1:8090/broadcast";
       
   164     } else {
       
   165        wsuri = "ws://" + window.location.hostname + ":8090/broadcast";
       
   166     }
       
   167     if ("WebSocket" in window) {
       
   168        sock = new WebSocket(wsuri);
       
   169     } else if ("MozWebSocket" in window) {
       
   170        sock = new MozWebSocket(wsuri);
       
   171     } else {
       
   172        log("Browser does not support WebSocket!");
       
   173        window.location = "http://autobahn.ws/unsupportedbrowser";
       
   174     }
       
   175 
       
   176     if (sock) {
       
   177        sock.onopen = function() {
       
   178            if(logger){
       
   179                log("Connected to " + wsuri);
       
   180            }
       
   181        }
       
   182 
       
   183        sock.onclose = function(e) {
       
   184            if(logger){
       
   185                log("Connection closed (wasClean = " + e.wasClean + ", code = " + e.code + ", reason = '" + e.reason + "')");
       
   186            }
       
   187           sock = null;
       
   188        }
       
   189 
       
   190        sock.onmessage = function(e) {
       
   191            if(logger){
       
   192                log("Got message: " + e.data);
       
   193            }
       
   194           addBunny(JSON.parse(e.data));
       
   195        }
       
   196     }
       
   197 };
       
   198 
       
   199 
       
   200 function addLine(){
       
   201     nbLines++;
       
   202     var graphics = new PIXI.Graphics();
       
   203     var x = nbLines * (lineInterval/1000) * pixelsPerSecond1;
       
   204     //console.log("nbLines = ",nbLines, "x = ", x);
       
   205     graphics.beginFill(0xFFFF00);
       
   206     graphics.lineStyle(1, lineColor);
       
   207     graphics.moveTo(x, prHeight1 - 20);
       
   208     graphics.lineTo(x, prHeight1);
       
   209     graphics.endFill();
       
   210     container1.addChild(graphics);
       
   211     // Add text
       
   212     var totalSec = nbLines * lineInterval / 1000;
       
   213     var hours = parseInt( totalSec / 3600 ) % 24;
       
   214     var minutes = parseInt( totalSec / 60 ) % 60;
       
   215     var seconds = totalSec % 60;
       
   216     var timeStr = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds  < 10 ? "0" + seconds : seconds);
       
   217     var fontObj = { font: "10pt Arial", fill: "#444444" };
       
   218     var t = new PIXI.Text(timeStr, fontObj);
       
   219     t.x = x + 2;
       
   220     t.y = prHeight1 - 15;
       
   221     container1.addChild(t);
       
   222     // Second container
       
   223     graphics = new PIXI.Graphics();
       
   224     x = nbLines * (lineInterval/1000) * pixelsPerSecond2;
       
   225     graphics.beginFill(0xFFFF00);
       
   226     graphics.lineStyle(1, lineColor);
       
   227     graphics.moveTo(x, 0);
       
   228     graphics.lineTo(x, 20);
       
   229     graphics.endFill();
       
   230     container2.addChild(graphics);
       
   231     var t = new PIXI.Text(timeStr, fontObj);
       
   232     t.x = x + 2;
       
   233     t.y = 2;
       
   234     container2.addChild(t);
       
   235     
       
   236 }
       
   237 addLine();
       
   238 var moveInterval = window.setInterval(moveContainer, 1000/manualFramerate);
       
   239 var verticalLinesInterval = false;
       
   240 if(drawVerticalLines){
       
   241     verticalLinesInterval = window.setInterval(addLine, lineInterval);
       
   242 }
       
   243 var nbSec = 0;
       
   244 var mySpan = document.getElementById("myspan");
       
   245 function updateTime(){
       
   246     nbSec++;
       
   247     var hours = parseInt( nbSec / 3600 ) % 24;
       
   248     var minutes = parseInt( nbSec / 60 ) % 60;
       
   249     var seconds = nbSec % 60;
       
   250     var timeStr = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds  < 10 ? "0" + seconds : seconds);
       
   251     mySpan.innerHTML = timeStr;
       
   252 }
       
   253 var secondInterval = window.setInterval(updateTime, 1000);