diff --git a/index.js b/index.js index b847faf..7a0031a 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ var audioContext; var sendButton; +var textToSend; var isListeningCheckbox; var microphoneStream; var microphoneNode; @@ -11,6 +12,9 @@ var MAX_DATA_POINTS = 1024; // 20 to 20,000 - human var FREQUENCY_TONE = 18000; +var FREQUENCY_HIGH = 900; +var FREQUENCY_LOW = 1200; +var FREQUENCY_DURATION = 100; function handleWindowLoad() { // grab dom elements @@ -18,12 +22,41 @@ function handleWindowLoad() { isListeningCheckbox = document.getElementById('is-listening-checkbox'); receivedDataTextarea = document.getElementById('received-data'); receivedGraph = document.getElementById('received-graph'); + textToSend = document.getElementById('text-to-send'); // wire up events sendButton.addEventListener('click', handleSendButtonClick); isListeningCheckbox.addEventListener('click', handleListeningCheckbox); + textToSend.addEventListener('keypress', handleTextToSendKeypress); } +function handleTextToSendKeypress(event) { + var keyCode = event.which || event.keyCode; + var bits = keyCode.toString(2) + .padStart(8, '0') + .split('') + .map(Number); + sendBits(bits); +} +function getFrequency(bit) { + return bit ? FREQUENCY_HIGH : FREQUENCY_LOW; +} +function sendBits(bits) { + var audioContext = getAudioContext(); + var oscillator = audioContext.createOscillator(); + var duration = bits.length * FREQUENCY_DURATION; + for(var i = 0; i < bits.length; i++) { + if(i > 0 && bits[i] === bits[i-1]) continue; + var offset = ((i * FREQUENCY_DURATION)/1000); + oscillator.frequency.setValueAtTime( + getFrequency(bits[i]), + audioContext.currentTime + offset + ); + } + oscillator.connect(audioContext.destination); + oscillator.start(); + window.setTimeout(function() { oscillator.stop(); }, duration); +} function getAudioContext() { if(!audioContext) { audioContext = new (window.AudioContext || webkitAudioContext)();