morse-beep
Version:
A simple text to Morse Code player for the modern web
146 lines (129 loc) • 2.27 kB
JavaScript
var lettersToMorse = {
"a": "sl",
"b": "lsss",
"c": "lsls",
"d": "lss",
"e": "s",
"f": "ssls",
"g": "lls",
"h": "ssss",
"i": "ss",
"j": "slll",
"k": "lsl",
"l": "slss",
"m": "ll",
"n": "ls",
"o": "lll",
"p": "slls",
"q": "llsl",
"r": "sls",
"s": "sss",
"t": "l",
"u": "ssl",
"v": "sssl",
"w": "sll",
"x": "lssl",
"y": "lsll",
"z": "llss",
"1": "sllll",
"2": "sslll",
"3": "sssll",
"4": "ssssl",
"5": "sssss",
"6": "lssss",
"7": "llsss",
"8": "lllss",
"9": "lllls",
"0": "lllll"
}
module.exports = function(opts){
opts = opts || {};
var unit = opts.unit || 25;
var gap = opts.gap || 10;
var beeper = require("./lib/beep")(0);
var beep = function(num, cb){
var type = num == unit ? "dit" : "dah";
emit("start-beep", type);
beeper(gap*num, function(){
emit("end-beep", type);
setTimeout(cb, unit*gap);
});
}
var long = function(cb){
cb = cb || function(){};
beep(3*unit, cb);
}
var short = function(cb){
cb = cb || function(){};
beep(unit, cb);
}
var pause = function(cb){
setTimeout(cb, 2*unit*gap);
}
var space = function(cb){
setTimeout(cb, 4*unit*gap);
}
var parse = function(str,cb){
if(str.length){
var l = str[0];
str = str.slice(1);
if(l=="s"){
short(function(){
parse(str,cb);
});
}
else{
long(function(){
parse(str, cb);
});
}
}
else{
pause(cb);
}
}
var say = function(msg, cb){
if(msg.length){
var l = msg[0];
emit("start-letter", l);
msg = msg.slice(1);
var code = lettersToMorse[l];
if(code){
parse(code, function(){
emit("end-letter", l);
say(msg, cb);
});
}
else if(l==" "){
space(function(){
emit("end-letter", l);
say(msg, cb);
});
}
else{
emit("end-letter", l);
say(msg, cb);
}
}
else{
cb();
}
}
var listeners = {"start":[], "stop":[]};
var emit = function(key, value){
listeners[key] = listeners[key] || [];
for(var i=0; i<listeners[key].length; i++){
listeners[key][i](value);
}
}
var sayer = function(msg, cb){
cb = cb || function(){};
msg = msg.toLowerCase();
say(msg, cb);
}
sayer.on = function(key, fn){
listeners[key] = listeners[key] || [];
listeners[key].push(fn);
}
return sayer;
}