var socket = io.connect(); var KEYCODES = { /** * The most common keycodes defined by : * @type {Object.} * @const */ // KEYMAP : { STRG: 17, CTRL: 17, CTRLRIGHT: 18, CTRLR: 18, SHIFT: 16, RETURN: 13, ENTER: 13, BACKSPACE: 8, BCKSP:8, ALT: 18, ALTR: 17, ALTRIGHT: 17, SPACE: 32, WIN: 91, MAC: 91, FN: null, UP: 38, DOWN: 40, LEFT: 37, RIGHT: 39, ESC: 27, DEL: 46, F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118, F8: 119, F9: 120, F10: 121, F11: 122, F12: 123, // }, /** * @type {Object.} * @const */ // KEYCODES : { 'backspace' : '8', 'tab' : '9', 'enter' : '13', 'shift' : '16', 'ctrl' : '17', 'alt' : '18', 'pause_break' : '19', 'caps_lock' : '20', 'escape' : '27', 'page_up' : '33', 'page down' : '34', 'end' : '35', 'home' : '36', 'left_arrow' : '37', 'up_arrow' : '38', 'right_arrow' : '39', 'down_arrow' : '40', 'insert' : '45', 'delete' : '46', '0' : '48', '1' : '49', '2' : '50', '3' : '51', '4' : '52', '5' : '53', '6' : '54', '7' : '55', '8' : '56', '9' : '57', 'a' : '65', 'b' : '66', 'c' : '67', 'd' : '68', 'e' : '69', 'f' : '70', 'g' : '71', 'h' : '72', 'i' : '73', 'j' : '74', 'k' : '75', 'l' : '76', 'm' : '77', 'n' : '78', 'o' : '79', 'p' : '80', 'q' : '81', 'r' : '82', 's' : '83', 't' : '84', 'u' : '85', 'v' : '86', 'w' : '87', 'x' : '88', 'y' : '89', 'z' : '90', 'left_window key' : '91', 'right_window key' : '92', 'select_key' : '93', 'numpad 0' : '96', 'numpad 1' : '97', 'numpad 2' : '98', 'numpad 3' : '99', 'numpad 4' : '100', 'numpad 5' : '101', 'numpad 6' : '102', 'numpad 7' : '103', 'numpad 8' : '104', 'numpad 9' : '105', 'multiply' : '106', 'add' : '107', 'subtract' : '109', 'decimal point' : '110', 'divide' : '111', 'f1' : '112', 'f2' : '113', 'f3' : '114', 'f4' : '115', 'f5' : '116', 'f6' : '117', 'f7' : '118', 'f8' : '119', 'f9' : '120', 'f10' : '121', 'f11' : '122', 'f12' : '123', 'num_lock' : '144', 'scroll_lock' : '145', 'semi_colon' : '186', 'equal_sign' : '187', 'comma' : '188', 'dash' : '189', 'period' : '190', 'forward_slash' : '191', 'grave_accent' : '192', 'open_bracket' : '219', 'backslash' : '220', 'closebracket' : '221', 'single_quote' : '222' // } } var sounds = {}; // Fix up prefixing window.AudioContext = window.AudioContext || window.webkitAudioContext; var context = new AudioContext(); // var mastergain = context.createGainNode(); var mastergain = context.createGain(); mastergain.gain.value = 1; binded = []; function bindkey(strkey, verbal, action, keyup) { var l = false; binded.forEach(function (existing) { if (existing.action == action) { l = true; existing = { keystr: strkey, keyid: KEYCODES[strkey],//.toLowerCase()], action: action, verbal: verbal, keyup: keyup }; return false; } }) if (!l) { binded.push({ keystr: strkey, keyid: KEYCODES[strkey],//.toLowerCase()], action: action, verbal: verbal, keyup: keyup }); } } window.addEventListener("keydown", function (e) { console.log(e.which); binded.forEach(function (keybind) { if (e.which == keybind.keyid) { if (keybind.preventRepeat != true) { keybind.action(); e.preventDefault(); document.querySelector("td[data-key='" + keybind.keystr + "']").classList.add("active"); if (!keybind.keyup) { setTimeout(function () { [].forEach.call(document.querySelectorAll("td[data-key]"), function (ele) { ele.classList.remove("active"); }); }, 300); } keybind.preventRepeat = true; return false; } } }); }, false); window.addEventListener("keyup", function (e) { binded.forEach(function (keybind) { if (e.which == keybind.keyid) { keybind.preventRepeat = false; if (keybind.keyup) { keybind.keyup(); e.preventDefault(); [].forEach.call(document.querySelectorAll("td[data-key]"), function (ele) { ele.classList.remove("active"); }); return false; } } }); }, false); // window.addEventListener("keyup", function (e) { // document.querySelectorAll("td").forEach(function (ele) { // ele.classList.remove("active"); // }); // }, false); var lengthInSamples = 4 * context.sampleRate; noiseBuffer = context.createBuffer( 1, lengthInSamples, context.sampleRate ); var bufferData = noiseBuffer.getChannelData( 0 ); for (var i = 0; i < lengthInSamples; ++i) { bufferData[i] = (2*Math.random() - 1); // -1 to +1 } // var shiftrate = 0.25; var shiftrate = 0.1; var movegaintoint = null; function movegainto(val, changeslider) { val = Math.round(val * 1000) / 1000; console.log(val); clearInterval(movegaintoint); movegaintoint = null; movegaintoint = setInterval(function () { mastergain.gain.value += (val - mastergain.gain.value) * shiftrate; // mastergain.gain.value = Math.round(mastergain.gain.value * 1000) / 1000; document.querySelector("#gainval").innerHTML = mastergain.gain.value; if (changeslider == true) { document.querySelector("#gainctrl").value = mastergain.gain.value; } if (Math.round(mastergain.gain.value * 1000) / 1000 == val) { clearInterval(movegaintoint); mastergain.gain.value = val; movegaintoint = null; } }, 100); } // document.querySelector("#gainctrl").addEventListener("mousemove", function (e) { // movegainto(e.target.value); // }, false); document.querySelector("#gainctrl").addEventListener("change", function (e) { movegainto(e.target.value, true); }, false); document.querySelector("#reset").addEventListener("click", function (e) { movegainto(1, true); }, true); // document.querySelector("#gainctrl").addEventListener("mousemove", function (e) { // mastergain.gain.value = e.target.value; // document.querySelector("#gainval").innerHTML = mastergain.gain.value; // }, false); // document.querySelector("#gainctrl").addEventListener("change", function (e) { // mastergain.gain.value = e.target.value; // document.querySelector("#gainval").innerHTML = mastergain.gain.value; // }, false); // document.querySelector("#reset").addEventListener("click", function (e) { // document.querySelector("#gainctrl").value = 1; // mastergain.gain.value = document.querySelector("#gainctrl").value; // document.querySelector("#gainval").innerHTML = mastergain.gain.value; // }, true); // setInterval(function () { // mastergain.gain.value = document.querySelector("#gainctrl").value; // document.querySelector("#gainval").innerHTML = document.querySelector("#gainctrl").value; // }, 200); function loadsound(idname, url, gain) { var request = new XMLHttpRequest(); request.open('GET', url, true); request.responseType = 'arraybuffer'; sounds[idname] = { url: url, buffer: null, id: idname, gain: gain, play: function () { playsound(this.buffer, this.gain); }, bindkey: function (key) { bindkey(key, idname); } }; // Decode asynchronously request.onload = function () { context.decodeAudioData(request.response, function(buffer) { sounds[idname].buffer = buffer; }, function (e) { console.error(e); }); } request.send(); } var nowplaying = []; function playsound(buffer, gain) { // var volume = context.createGainNode(); var volume = context.createGain(); volume.gain.value = gain; var source = context.createBufferSource(); source.buffer = buffer; // source.connect(context.destination); source.connect(volume); volume.connect(mastergain); mastergain.connect(context.destination); source.start(0); setTimeout(function () { nowplaying.push(source); // }, 50); }, 150); source.onended = function () { nowplaying.splice(tostop.indexOf(source), 1); } return source; } function stopall() { nowplaying.forEach(function (src) { src.stop(); }); nowplaying = []; } function updatekeys() { var ht = ""; binded.forEach(function (keybind) { // ht += ""; // "; ht += ""; // "; }); ht += "
keyverbalaction
" + keybind.keystr + "" + keybind.verbal + "" + keybind.action + "
" + keybind.keystr + "" + keybind.verbal + "" + "hmmm..." + "
"; document.querySelector("#keys").innerHTML = ht; } // var inputs = document.querySelectorAll("input"); // for (var i = 0; i < inputs.length; ++i) { // inputs[i].addEventListener("keydown", function (e) { // e.stopPropagation(); // }, false); // } // document.querySelector("#binder").addEventListener("submit", function (e) { // e.preventDefault(); // var name = document.querySelector("#name").value; // var file = document.querySelector("#file").value; // var key = document.querySelector("#key").value; // loadsound(name, file); // bindkey(key, name); // updatekeys(); // }, false); var toload = [ { name: "waves", verbal: "back: Beach Waves", file: "beach.wav", key: "comma", gain: 0.2 }, { name: "z-see", verbal: "back: See", file: "z-see.wav", key: "period", gain: 0.6 }, { name: "z-what", verbal: "back: What", file: "z-what.wav", key: "forward_slash", gain: 0.5 }, // { // name: "b5c", // verbal: "back: Darkness (Long)", // file: "b5c.wav", // key: "3", // gain: 0.5 // }, { name: "car1", verbal: "Car Nearer", file: "car21.wav", key: "q", gain: 0.7 }, { name: "crash1", verbal: "Car Crash", file: "crash.wav", key: "p", gain: 2 }, // { // name: "carstarting", // verbal: "Car Starting", // file: "carstart.wav", // key: "a", // gain: 2 // }, { name: "car2", verbal: "Car Leaving", file: "car2.wav", key: "l", gain: 0.5 }, { name: "emptyrevolver", verbal: "Empty Revolver", file: ["erevolver1.wav"], key: "m", gain: 1.8 }, { name: "revolver", verbal: "Revolver", file: ["revolver1.wav", "revolver2.wav", "revolver3.wav", "revolver4.wav", "revolver5.wav", "revolver6.wav"], key: "n", gain: 1.25 }, // { // name: "fire", // verbal: "Fire", // file: ["fire1.wav", "fire2.wav", "fire3.wav", "fire4.wav"], // key: "n", // gain: 1 // }, // { // name: "reload", // verbal: "Reload", // file: "firereload.wav", // key: "b", // gain: 1 // }, { name: "revolvercock", verbal: "Revolver Cock", file: "revolvercock.wav", key: "b", gain: 1.2 }, { name: "cuff", verbal: "Cuffs", file: "cuff.wav", key: "c", gain: 1 }, // { // name: "scream1", // verbal: "Scream 1", // file: "scream1.wav", // key: "h", // gain: 0.5 // }, // { // name: "scream2", // verbal: "Scream 2", // file: "scream2.wav", // key: "j", // gain: 1 // }, { name: "asiren", verbal: "Ambulance Siren", file: "siren.wav", key: "z", gain: 1 }, { name: "policesrien", verbal: "Police Srien", file: "policesiren.wav", key: "x", gain: 1 }, // { // name: "cardooropen", // verbal: "Car Door Open", // file: "cardooropen.wav", // key: "t", // gain: 1 // }, // { // name: "cardoorclose", // verbal: "Car Door Close", // file: "cardoorclose.wav", // key: "y", // gain: 1 // }, { name: "doorknocks", verbal: "Door Knocks (three)", file: "threeknocks.wav", key: "u", gain: 1.5 }, { name: "explosion", verbal: "Explosion", file: "explosion.wav", key: "e", gain: 2.5 }, { name: "ringtone", verbal: "Ringtone", file: "ringtone.wav", key: "i", gain: 1 }, // { // name: "beep", // verbal: "Beep", // file: "beep2.wav", // key: "w", // gain: 2 // }, ]; toload.forEach(function (obj) { if (Object.prototype.toString.call(obj.file) === '[object Array]') { obj.file.forEach(function (str, i) { loadsound(obj.name + i, str, obj.gain); }); bindkey(obj.key, obj.verbal, function () { var i = Math.floor(Math.random() * obj.file.length); sounds[obj.name + i].play(); // console.log(i); }); } else { loadsound(obj.name, obj.file, obj.gain); bindkey(obj.key, obj.verbal, function () { sounds[obj.name].play(); }); } }); var explosionbeepgain = 0.5, beepslow, beepmedium, beepfast, beepxfast; bindkey("s", "Beep Slow", function () { playiso(2000, 50, 0, beepgain, "sine"); beepslow = setInterval(function () { playiso(2000, 50, 0, beepgain, "sine"); }, 2000); }, function () { clearInterval(beepslow); }); bindkey("d", "Beep Medium", function () { playiso(2000, 50, 0, beepgain, "sine"); beepmedium = setInterval(function () { playiso(2000, 50, 0, beepgain, "sine"); }, 500); }, function () { clearInterval(beepmedium); }); bindkey("f", "Beep Fast", function () { playiso(2000, 50, 0, beepgain, "sine"); beepfast = setInterval(function () { playiso(2000, 50, 0, beepgain, "sine"); }, 200); }, function () { clearInterval(beepfast); }); bindkey("g", "Beep Extrafast", function () { beepxfast = playiso(2000, "callback", 0, beepgain, "sine"); }, function () { beepxfast(); }); var noiseSource; bindkey("equal_sign", "Noise", function () { noiseSource = playsound(noiseBuffer, 0.1); }, function () { noiseSource.stop(); }); var busytone1, busytone2; // American // bindkey("dash", "Busy", function () { // playiso(480, 500, 0, beepgain, "sine"); // playiso(620, 500, 0, beepgain, "sine"); // busytone = setInterval(function () { // playiso(480, 500, 0, beepgain, "sine"); // playiso(620, 500, 0, beepgain, "sine"); // }, 1000); // }, function () { // clearInterval(busytone); // }); // British // bindkey("dash", "Busy", function () { // playiso(400, 375, 0, beepgain, "sine"); // busytone = setInterval(function () { // playiso(400, 375, 0, beepgain, "sine"); // }, 750); // }, function () { // clearInterval(busytone); // }); // Singapore // bindkey("dash", "Busy", function () { // playiso(400, 125, 0, beepgain, "sine"); // setTimeout(function () { // playiso(400, 125, 0, beepgain, "sine"); // }, 250); // setTimeout(function () { // playiso(400, 125, 0, beepgain, "sine"); // }, 500); // }); // Manual bindkey("dash", "Busy", function () { busytone1 = playiso(400, "callback", 0, 0.15, "sine"); // busytone2 = playiso(400, "callback", 0, 0.05, "square"); }, function () { busytone1(); // busytone2(); }); var tones = []; var beepgain = 0.15; bindkey("open_bracket", "Dial Stolen Stone Phone", function () { playiso(1477, 150, 0, beepgain, "sine"); playiso(852, 150, 0, beepgain, "sine"); setTimeout(function () { playiso(1209, 150, 0, beepgain, "sine"); playiso(697, 150, 0, beepgain, "sine"); }, 200); setTimeout(function () { playiso(1336, 150, 0, beepgain, "sine"); playiso(697, 150, 0, beepgain, "sine"); }, 402); setTimeout(function () { playiso(1209, 160, 0, beepgain, "sine"); playiso(697, 160, 0, beepgain, "sine"); }, 600); setTimeout(function () { playiso(1336, 150, 0, beepgain, "sine"); playiso(941, 150, 0, beepgain, "sine"); }, 800); setTimeout(function () { playiso(1336, 150, 0, beepgain, "sine"); playiso(941, 150, 0, beepgain, "sine"); }, 990); setTimeout(function () { playiso(1209, 150, 0, beepgain, "sine"); playiso(852, 150, 0, beepgain, "sine"); }, 1223); setTimeout(function () { playiso(1209, 150, 0, beepgain, "sine"); playiso(852, 150, 0, beepgain, "sine"); }, 1392); }); // bindkey("dash", "Dial 1", function () { // tones[0] = []; // tones[0][0] = playiso(1209, "callback", 0, beepgain, "sine"); // tones[0][1] = playiso(697, "callback", 0, beepgain, "sine"); // }, function () { // tones[0][0](); // tones[0][1](); // }); // bindkey("equal_sign", "Dial 2", function () { // tones[1] = []; // tones[1][0] = playiso(1336, "callback", 0, beepgain, "sine"); // tones[1][1] = playiso(697, "callback", 0, beepgain, "sine"); // }, function () { // tones[1][0](); // tones[1][1](); // }); // bindkey("open_bracket", "Dial 3", function () { // tones[2] = []; // tones[2][0] = playiso(1477, "callback", 0, beepgain, "sine"); // tones[2][1] = playiso(697, "callback", 0, beepgain, "sine"); // }, function () { // tones[2][0](); // tones[2][1](); // }); // bindkey("closebracket", "Dial 4", function () { // tones[3] = []; // tones[3][0] = playiso(1209, "callback", 0, beepgain, "sine"); // tones[3][1] = playiso(770, "callback", 0, beepgain, "sine"); // }, function () { // tones[3][0](); // tones[3][1](); // }); // bindkey("backslash", "Dial 5", function () { // tones[4] = []; // tones[4][0] = playiso(1336, "callback", 0, beepgain, "sine"); // tones[4][1] = playiso(770, "callback", 0, beepgain, "sine"); // }, function () { // tones[4][0](); // tones[4][1](); // }); // bindkey("semi_colon", "Dial 6", function () { // tones[5] = []; // tones[5][0] = playiso(1477, "callback", 0, beepgain, "sine"); // tones[5][1] = playiso(770, "callback", 0, beepgain, "sine"); // }, function () { // tones[5][0](); // tones[5][1](); // }); // bindkey("single_quote", "Dial 7", function () { // tones[6] = []; // tones[6][0] = playiso(1209, "callback", 0, beepgain, "sine"); // tones[6][1] = playiso(852, "callback", 0, beepgain, "sine"); // }, function () { // tones[6][0](); // tones[6][1](); // }); // bindkey("comma", "Dial 8", function () { // tones[7] = []; // tones[7][0] = playiso(1336, "callback", 0, beepgain, "sine"); // tones[7][1] = playiso(852, "callback", 0, beepgain, "sine"); // }, function () { // tones[7][0](); // tones[7][1](); // }); // bindkey("period", "Dial 9", function () { // tones[8] = []; // tones[8][0] = playiso(1477, "callback", 0, beepgain, "sine"); // tones[8][1] = playiso(852, "callback", 0, beepgain, "sine"); // }, function () { // tones[8][0](); // tones[8][1](); // }); // bindkey("forward_slash", "Dial 0", function () { // tones[9] = []; // tones[9][0] = playiso(1336, "callback", 0, beepgain, "sine"); // tones[9][1] = playiso(941, "callback", 0, beepgain, "sine"); // }, function () { // tones[9][0](); // tones[9][1](); // }); var sbinds = [ { name: "kidnapped", verbal: "Kidnapped", key: "1" }, { name: "bowl", verbal: "Bowling Alley", key: "2" }, { name: "street", verbal: "Street", key: "3" }, { name: "beach", verbal: "Beach", key: "4" }, { name: "classroom", verbal: "Classroom", key: "5" }, { name: "schcampus", verbal: "School Campus", key: "6" }, { name: "office", verbal: "Office", key: "7" }, { name: "flashback", verbal: "3 years later", key: "8" }, { name: "mur", verbal: "4 Rounds", key: "9" }, { name: "blank", verbal: "Blank", key: "0" }, ]; sbinds.forEach(function (obj) { bindkey(obj.key, "slide: " + obj.verbal, function () { socket.emit("data", { name: obj.name }) }); }); // bindkey("BACKSPACE", "Stop All", function () { bindkey("BACKSPACE", "Stop All", function () { stopall(); }); updatekeys(); function playiso(freq, time, detune, gain, type) { var osc = context.createOscillator(); // var volume = context.createGainNode(); var volume = context.createGain(); volume.gain.value = gain; osc.type = type; osc.frequency.value = freq; osc.detune.value = detune; osc.connect(volume); volume.connect(mastergain); mastergain.connect(context.destination); // osc.setWaveTable(waveTable); // osc.connect(audio_context.destination); osc.start(0); if (time == "callback") { return function () { osc.stop(context.currentTime); } } else if (time > 0) { // setTimeout(function() { osc.stop(context.currentTime + time / 1000); // }, time); } } // playiso(40, 0, 0.4, "sine"); // playiso(40, 0, 0.2, "triangle"); // var win = window.open("/projection", "projection", "width=640,height=480,left=720,top=0"); // window.addEventListener("unload", function () { // win.close(); // })