mirror of
https://github.com/lewismoten/data-over-audio.git
synced 2026-04-26 08:17:45 +08:00
create binary audio signal for key press
This commit is contained in:
33
index.js
33
index.js
@@ -1,5 +1,6 @@
|
|||||||
var audioContext;
|
var audioContext;
|
||||||
var sendButton;
|
var sendButton;
|
||||||
|
var textToSend;
|
||||||
var isListeningCheckbox;
|
var isListeningCheckbox;
|
||||||
var microphoneStream;
|
var microphoneStream;
|
||||||
var microphoneNode;
|
var microphoneNode;
|
||||||
@@ -11,6 +12,9 @@ var MAX_DATA_POINTS = 1024;
|
|||||||
|
|
||||||
// 20 to 20,000 - human
|
// 20 to 20,000 - human
|
||||||
var FREQUENCY_TONE = 18000;
|
var FREQUENCY_TONE = 18000;
|
||||||
|
var FREQUENCY_HIGH = 900;
|
||||||
|
var FREQUENCY_LOW = 1200;
|
||||||
|
var FREQUENCY_DURATION = 100;
|
||||||
|
|
||||||
function handleWindowLoad() {
|
function handleWindowLoad() {
|
||||||
// grab dom elements
|
// grab dom elements
|
||||||
@@ -18,12 +22,41 @@ function handleWindowLoad() {
|
|||||||
isListeningCheckbox = document.getElementById('is-listening-checkbox');
|
isListeningCheckbox = document.getElementById('is-listening-checkbox');
|
||||||
receivedDataTextarea = document.getElementById('received-data');
|
receivedDataTextarea = document.getElementById('received-data');
|
||||||
receivedGraph = document.getElementById('received-graph');
|
receivedGraph = document.getElementById('received-graph');
|
||||||
|
textToSend = document.getElementById('text-to-send');
|
||||||
|
|
||||||
// wire up events
|
// wire up events
|
||||||
sendButton.addEventListener('click', handleSendButtonClick);
|
sendButton.addEventListener('click', handleSendButtonClick);
|
||||||
isListeningCheckbox.addEventListener('click', handleListeningCheckbox);
|
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() {
|
function getAudioContext() {
|
||||||
if(!audioContext) {
|
if(!audioContext) {
|
||||||
audioContext = new (window.AudioContext || webkitAudioContext)();
|
audioContext = new (window.AudioContext || webkitAudioContext)();
|
||||||
|
|||||||
Reference in New Issue
Block a user