morse.js 4.62 KB
var morse = (function() {

    var morseDictionary = {
        'A': ".-",
        'B': "-...",
        'C': "-.-.",
        'D': "-..",
        'E': ".",
        'F': "..-.",
        'G': "--.",
        'H': "....",
        'I': "..",
        'J': ".---",
        'K': "-.-",
        'L': ".-..",
        'M': "--",
        'N': "-.",
        'O': "---",
        'P': ".--.",
        'Q': "--.-",
        'R': ".-.",
        'S': "...",
        'T': "-",
        'U': "..-",
        'V': "...-",
        'W': ".--",
        'X': "-..-",
        'Y': "-.--",
        'Z': "--..",
        'Å': ".--.-",
        'Ä': ".-.-",
        'Ö': "---.",

        '1': ".----",
        '2': "..---",
        '3': "...--",
        '4': "....-",
        '5': ".....",
        '6': "-....",
        '7': "--...",
        '8': "---..",
        '9': "----.",
        '0': "-----",

        'É': "..-..",
        'Ñ': "--.--",
        'Ñ': "--.--",
        'Ü': "..--",
        'Û': "..--",
        'Š': "----",
        'ß': "...--..",
        'Ç': "-.-..",
        'Ŝ': "-.-..",

        '?': "..--..",
        '!': "..--.",
        ',': "--..--",
        '.': ".-.-.-",
        '=': "-...-",
        '-': "-....-",
        '(': "-.--.-",
        ')': "-.--.-",
        '〰': "........",
        '+': ".-.-.",
        '@': ".--.-.",
        '/': "-..-.",
        '\'': ".----.",
        '%': ".--..",
        '"': ".-..-.",
        ';': "-.-.-.",
        ':': "---...",
        '§': "...-.",
        '¿': "..-.-",
        '~': "-.-.-",
        '#': ".-..-",
        '&': ".-...",
        '$': "...-..-",
        '√': ".-...",
        '*': ".. ..",
        '¡': "--...-"
    };

    var wpm = 13;
    var unitTime = 1.2 / wpm;
    var sampleRate = 8000;
    var toneHeight = 1.6;
    var toneBreak = [];
    var charBreak = [];
    var wordBreak = [];
    var short = [];
    var long = [];

    function codeToMorseData(code) {
        var tone = [];
        for (var i = 0; i < code.length; i++) {
            var char = code[i];
            if (i>0) tone = tone.concat(toneBreak);
            if (char === '-') {
                tone = tone.concat(long);
            } else if (char === '.') {
                tone = tone.concat(short);
            }
        };
        return tone;
    }

    function wordToMorseData(word) {
        var characters = word.toUpperCase().trim().split('');
        var tone = [];
        for (var i=0;  i<characters.length; i++) {
            var code = morseDictionary[ characters[i] ];
            if (code) {
                if (tone.length>0) tone = tone.concat(charBreak);
                tone = tone.concat( codeToMorseData(code) );
            }
        };
        return tone;
    }

    return {
            setWPM: function(wpm) {
                unitTime = 1.2 / wpm;
                toneBreak = []; for (var i=0; i<unitTime*sampleRate; i++) toneBreak[i] = 128;
                charBreak = []; for (var i=0; i<3*unitTime*sampleRate; i++) charBreak[i] = 128;
                wordBreak = []; for (var i=0; i<7*unitTime*sampleRate; i++) wordBreak[i] = 128;
                short = []; for (var i=0; i<unitTime*sampleRate; i++) short[i] = 128+Math.round(127*Math.sin(i/toneHeight));
                long = []; for (var i=0; i<3*unitTime*sampleRate; i++) long[i] = 128+Math.round(127*Math.sin(i/toneHeight));
            },

            sentenceToMorseString: function(sentence) {
                var result = "";
                var tokens = sentence.trim().match(/\S+/g);
                for (var i=0;  i<tokens.length; i++) {
                    var tokenResult = "";
                    var characters = tokens[i].toUpperCase().trim().split('');
                    for (var j=0;  j<characters.length; j++) {
                        var code = morseDictionary[ characters[j] ];
                        if (code) {
                            if (tokenResult.length>0) tokenResult += " ";
                            tokenResult += code;
                        }
                    };

                    if (result.length>0) {
                        result += " / ";
                    }
                    result += tokenResult;
                }
                return result;
            },

            sentenceToMorseData: function(sentence) {
                var tokens = sentence.trim().match(/\S+/g);
                var tone = [];
                for (var i=0;  i<tokens.length; i++) {
                    if (tone.length>0) {
                        tone = tone.concat(wordBreak);
                    }
                    tone = tone.concat( wordToMorseData(tokens[i]) );
                };
                return tone;
            }
    };
})();

morse.setWPM(13);