summaryrefslogtreecommitdiff
path: root/lib/room.js
blob: 0aed7ebc308a3eee3ac49cc33310aed1f6c73010 (plain)
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
115
116
'use strict';

var IO;

var LESS_THAN = /</g, GREATER_THAN = />/g, AMPERSAND = /&/g;
function sanitize (s) {
  if (s)
    return s.replace(LESS_THAN, '&lt;').replace(GREATER_THAN, '&gt;').replace(AMPERSAND, '&amp;');
  return "";
}
function sanitizeJSON (json) {
  try {
    var data = JSON.parse(sanitize(json));
    return data;
  } catch (SyntaxError) {
    console.log('Invalid JSON: ' + json);
    return false;
  }
}

function Param(state){
  var base = this;
  base.state = state || {}; 
  base.get = function(){
    return base.state;
  }
  base.set = function(param){
    if (data.key in state) {
      base.state[data.key] = data.value;
      return true;
    }
    return false;
  }
}
function Grid(){
  this.param = new Param({
    'tempo': 125,
    'pattern': [
    	[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
    	[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]
    ]
  });
}
function Grain(){
  this.param = new Param({
    'sample': 'Clap.wav',
    'attack': 0,     // grain envelope (attack)
    'sustain': 0,    // grain envelope (hold)
    'step': 100,     // % of envelope size used to find next grain
    'rate': 100,     // % of envelope size used to emit next grain
     // other things in fruity were step LFO, rate LFO, panning..
  });
}

function Connection (socket) {
  var base = this;

  function init(){
    bind();
  }
  function bind(){
    socket.on('event-join', join);
    socket.on('event-mouse', mouse);
    socket.on('event-chat', chat);

    listen('event-grid', grid);
    listen('event-grain', grain);

    socket.on('disconnect', disconnect);
  }
  function join(json){
    socket.broadcast.emit("event-join", json);
    socket.emit("event-grid", grid.getState());
  }
  function listen(msg, obj){
    socket.on(msg, function (json){
      var data = sanitizeJSON(json);
      if (data && 'key' in data && 'value' in data && obj.param.set(data)) {;
        socket.broadcast.emit(msg, data);
      }
    });
  }

  function mouse(json){
    socket.broadcast.emit("event-mouse", json);
  }
  function chat(json){
    socket.broadcast.emit("event-chat", json);
  }

  function note(json){
    var data = sanitizeJSON(json);
    if (data) {
      grid.setNote(data);
      socket.broadcast.emit("event-note", data);
    }
  }
  function disconnect(json){
    base = null;
  }
  init();
}

var grid = new Grid ();
var grain = new Grain ();

exports.connect = function(io, socket) {
  IO = IO || io;
  var user = new Connection (socket);
};