'use strict'; var IO; var LESS_THAN = //g, AMPERSAND = /&/g; function sanitize (s) { if (s) return s.replace(LESS_THAN, '<').replace(GREATER_THAN, '>').replace(AMPERSAND, '&'); 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); };