Search code examples
javascriptaudiobinarybase64

Generating audio file manually


I'm trying to understand how generate audio based on a string. Think of how you can open a non-audio file in something like Audacity (it opens as binary I guess) and play it as noise.

I have a simple working player in tone.js below that plugs in a base64 string of an audio file to the player. How do I replace that base64 audio file with an ordinary string (text), say "Hello world", that gets converted into an audio file as a string, either as bas64 as below as perhaps using binary conversion?

<script>

//load a base64 mp3
const player = new Tone.Player("data:audio/mp3;base64, //uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAOAAAXnwAXFxcXFxcXKioqKioqKj09PT09PT1QUFBQUFBQY2NjY2NjY3Z2dnZ2dnaJiYmJiYmJiZycnJycnJyvr6+vr6+vwsLCwsLCwtXV1dXV1dXo6Ojo6Ojo+/v7+/v7+/////////8AAABNTEFNRTMuOTZyBL4AAAAAAAAAADSAJAXxQQAB4AAAF59rEpVtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//ugxAAADZRLWHTxgCzvtGz/P+jYACKbvBVljPQGwAaAEAGATAyGe79jZ37+/d3d3d3REQAAAAAQWHh4eHgAA7///gB4eHh4YAAAAAB4eHj////XgAABh4eHh4AAAAABh4e////wAPwAA8PDw8MAAAAEB4eHv///3YAAABh4eHh4AYBABAhJlKHTL/v7aGwQAAbPpzFGJZCQZhvovyYK4AkmQohdhgXIC2cUlK6mLDm3hgHgBOYAgAPmALAC0aMhzIOjMoUOQDAGohABL+jk85ZOySA1MVkWXTW0Y9M4lfo2jU6EUnSTG3/mPmkGZf5sRiMgJGP6q8jO5Vul/HnmL0TSZLhApjlDumFaMcY+ZBDAnjaa7MO475vzHdGAMCII8w0BAzECDlMA8BAwAAPZiI0USuSr/7r/MCgDELgEGBWCwYP4UhgSAnmCUCaYNQS/csu1s6X////zARAyMCsBwwFQFAIAmYDQCKABIWOCIA3fP/9f///////oCizRZZNEAAAmAEACyJE4u84MV///////////////VaZXK+ztK3MhYi1l4mdQr5T////////////////////UiMOuzfUAAKW3772IkGH2I/5iMoWYYP+CGBYCZMB6ANzAHgAsKgCwGAJp+6hJb21ruGetpn+XsLklSJ7bBJsgdRN7wPrvM2WwSSRBllkj4NWA//uQxCYAEPTZK73zACGimmX17IxczdKLZA/bNsvqzlF/fKOvPmn9O33wy5BU24LhhlYSGEmKSlTFxEPCqQSlAEXFg9QK+436EkcUKnlL2/9YAAdu33/1aINYJyw1dQgQgjkwYQIjgVM0AMFT6g6gazLgsPtQ55nArMyqFcEIqPU3QUC7glDJ7o9XUFRZN1xtwpB8xIUOQWTNKrRgSGRCFpFAkE3RodCMCJSx6iTlZ86/QbtoS53Z0fqVAAAkZmh///W0TRNbQMQQMg3bTOGQ3YI78OOXGwWH0dcs8NOqKKQhs1ZsHIQplNdDIuykHK3Y1IFjxLs7QMnks3QaYLitDHPq3q5GzCQtEPL13fNS901/fCN8vFe+iN97zto55qipVLTpdLGMF0e3L+66oAAqW76/WtEGL7IWY3wdZ56G0yYISAVdzu02MusttTJ5e1WGtd1pmwt6grBRggEH18NYEkSGVAKlcAQGeCFNmERglchkBMwqqIdlkciI0M6PuBgOAVZZg4GAISaoUMg8CWOYVEI2ZQkyOb/5u2xT0gAApdd///uQxHOADlEhMe9lAOG9m6W17IwktokQaCR3RkBggHUIgJkEBUrmmwNOXBBZb6nSXa/7mFsgbK+hhCxBIgd2NtmRi2ciRzINmJIjzXB+A8YetOs3S9JEuTbM2VuvfNZmfFXvQsBgmWAY8AtaiKi4suiMQMh5gkSz/7bdZIAF223/7WtEHxfCGjggAcNGht4Ei8sh+nBLbHrO8/Kb7Z+/ClSWV6OMPMMiSv0ciHJcrH1uW5iNtPjtdInwYgQvBD2fL98FlRu27Op/h37u8/afaSiLbFJN4wbNXt3DSvn3jF/94simIKaimZccmxcY1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAFx13b61pEGIUs2YOgO5pwDAqZNZdqUzV6esn61/PpnagN8hI4aMo4kSUGYKIFjxncUDujhyRdBFECwjhNgwRDMhok1csbY84+cpPx+mEL3/Km5mx2Mdt1xzZiyMU9EqoNk0WCYsIyFHSrcWAZAyu1H7P//uQxMiADYjbLa9pAOGbnaW13JgdsAAJGQFeN/9WkTZCrjNcKDBYAS+S6Xea7Fp25GbR/mVglpd4PIGfdZHpnkoLiF/aKgz8xF1HupjcBTW09ND3yfjIVbzuHtsn7arySxR59zGPJxdSkC5EsWFzzRohU8k9JYKKPMRE6iyWPym9VH0piCmopmXHJsXGKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAKS3bf7XNEH91UDrwUB5bouNTZEfr0Vrq2eXsYkskQ1MQRyxKqSHV02TF06wjyrVaDFeIHKlUOGigrFQIHEyaUQLKpzXIoGHJcybl0TN7ocHioZJaw4JQOkEhwskk5DlJBXLrzbT30RejbQtzbfXSIgGm//uQxP+ADnkhK69gYSG2mGX90JlUlemCIWpONhGioo0hKWb+3fC4O0vZrt5OUgBHrUZsnHg1mzy5g7K56CRRhzHmUNtmS+PmlJCM3FaVs/I1anQQTOsiVDADDhxQQPNe5y3OtCYoBhS2uRcbXeXw0WvnjUJdPipv/oTEFNRTMuOTYuMaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAkRFZo291iRM8bwymEkFWvBkmFKJYW3+faUmZjDtnCwrdjqjinW3QdCZG0HnEdJVoVUTNK6ixJElsptySMdLaYvYVa5eslq4Og9bO2QmAvhYdyte3fdk408Jm6SN2OMAFiau5v/f9773W1Py/M/2AE4L//uQxP+CDYDdLa4xAqGuGKV11JhEt9/rGkT+X0SzULnVi07PWXc7/6ap2WChl36kC3G5ifxlHoosRXJtQ3kbU2SIuzVnpN0LpN8U+vTtEdomafoXuZEXv2l3ra+Ztn7X/x5iayvv/n42Xsruqbl0JYhJ1Y/Zfzv6+/x8z+3/W6UxBTUUzLjk2LjGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAJFUAVo/3tiROe1wUZu5TgByHACHJ/dnZdGcWCkPBB9phIGbPEGQAMrVBYPQCVXFvwWq49YckeKDAl6ZDNIDEI5qDpKsmqpSBLxBJYxjEHVHbxARUqNBZYHFRE2ePBojXmyGUY1lEs+JQBGRFZ3j/bWNE//uQxP+ADfzlL+4lAmm3pOW1sZj9sawKDnZpnZjT+0x7nuhClJqUdhGF7EKQesCah450tVjke2XAZnYsgRBOpPQ4ZjMaAjGbYolyWEZULsTqZbggVeATbQpPum2mgoGUGTJAdrSwVW7qTR+pKK0xBTUUzLjk2LjGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAE0VFZo2+tjROr3EoLbS0CEilOtfLXwe82WBp1zWvNNsuqu5c4QIheMuVl3LNs37zEraFru28mvqoqv3lkbS1DpXsbKDIH7PrDIai08MBRCRzeuKpETYKHaR6F910/hRCpp/+/9X/9f+u2v78wC2Ldv/t//uQxP+ADTD1L+2IY+GJHWY9sIzUq2idZmPG5BfTQy5FOZEjM6banyh31RuppikSnm9fEdVuPLnu2rfaNmCTFECiybTzQ+7cZr1/U6f6Plmro48X7qJnn3G5GnOVnxstozMttJCACImATaAXhgIPCBkdXrs5mSmBjaUxBTUUzLjk2LjGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoCRFBmdo//+jaMXieIQrKpXc/iDmCNIbFWo4JAgXICauwJSAjSZyOzqCUYYnEjO0IXUFihicwTiSc0EEYYYV506I4DByF036mswr7gkBclQRwz07hiC9DwEMD1zBJH7q/ZzWb/a+zvvf3/YZ+YCjdGv32s//uQxP+ADajvL+0Mw+mqIyX1oJh8iRMvdFhImZFKy9hG1/eMVNoLQUYMQCYkHAxxATDhGMGpNQz1nIIYZwiYkcUgtUQVRAmMaSIq5otM9ITkgswSG4Z3FgAuhHF7KQmGy1ghwEYfTM8+bMEqUvWYnCEJC7r/bv//8t//7RfaYgpqKZlxybFxjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBNEBQV429taIG1CsOTWhLLFnwp/maiqcPJIrqJupWjmezmpFqCf2QNS7M/zKd93JqoQN8Sv9cdRU07L1HcKqfebctmf3/2g7wgRVlEg6GECCJChoutKDM8tJgsU/7Fotb3gRgCKrNH3+0aJlzO5XwP7Zx//uQxP+ADZTxMe0kYGm8HiW1pIwFozDAyzeUAcykkCW/d11WvQgw1Ga7KuSw5fxGtlm92gfnqCD1rNfp8mDIw16LJPW/axBSE2mle1HxBO9187+2MZr3zrR9yofv+239nNbWa5+KhdyE0yVnjExBTUUzLjk2LjFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUKMWzf/f6xojMrqgKSWT+Ocb5UqwKJNaFOMEIBIiDHcGkRBRMbiBTjgwSPIBARAFCKgR8ILFAQJzrgnDZCQEBoyOL2VxLmUdPKMhFGCjQj2ztdiM+lnWqeGYKn0GA01ooAGJFDZtbxsb2otzFagWmIMN/v//uQxP+ADDztLeyMw+GkqaX9kJh8K0iZAKc2cgjnPH8I18lHVQB8YBcIzCVCQDh5AUBqIwTOjiggdpARE24hrc1K4t2xUWnHDV6IyPNlDkMFNFeZ4Q81InPmYVwjPrJmg5AjRwKkgVHCcSHzIApNEb572WN2JiCmopmXHJsXGKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoINiTba72IAAETcH7Ov7L7mmGeak5ZilLpGsOOdNtaYZuqn7OGFXVxAotBRsOoVAoTionGhokGrGGlP1K/p0//b//6OtAb4AKJT3//z2JgaeVGEWw6mIKaimZccmxcY1VVVVVVVVVVVVVVVVVVVVVVVVVV//uQxP+ADakjL6yYYGGXoOW1gIx8VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU1EWujHeajMjZUAzmTgz7SED185zu4WTl1HDbBXzRxrSVrjMdWTQo2DO8eTLYTDhzs1o6MfXxl5M0WjYw82oTNhNDZF82meNQ1TKewynsMbzzSpY1thNOPjPy0zIeMZGyU4MFWjE080QeEqo1IbNVQjVHc//uQxP+BSIifK6eIYSBCgKUckAAEz2eMSrzCqsyKONHYTUDI00RHpU0ciMqPxGZDAYBAUx0YMkKzIzgyZNMnbDGIswugMTqDHZE0haNVIwFGDTsZoImUlhiRqYYag0wERSIR4wIhMVNjGFcwlsCz2FHkxxkM9OzSAweijQhUz88MqWzD2IwdgBKuYofGRkZkAYAi8IFAgDLqCAACAceHQETGLBpjJEYocmApBCkjp+YQYGLjpkAERJRkQOYyNGDEoqTFUgAI2YYHAovGj0yEKMcJTDTQLHIwamCFRiouY4AER+ZEBmRkBixyYGfGBng4akBUMkZAQFQnKpcOHIFSDD1oQqZixsZGLmOAQOLysWAxUYQEggREAYYKAhgoTD5iwCYuPAQrMCGh4UUGRqMEAQKDBYHEIUIBMRjhCQGDioOMBI2MYATGRQxgxMJRBEigg7BpgYEWmDlRiBmY2kGMM5gr0MQ4WhzIHA0VFNUEgyqNSJTSU4zJvMXeDFXwKt5iykZKYmNDhhI+BCYCl4EMhQuMFIVMQU1FMy45Ni4xVVVV//sQxP+D/jmieA93YwAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=").toDestination();

//if loaded then play
Tone.loaded().then(() => {
    player.start();
});
    
</script>

Solution

  • I've not used Tone.JS. But I have played by raw PCM data with the Web Audio API. The data consists of floating point values that range from -1 to 1. I think a necessary step will be coming up with a transform function that converts your String data to numbers that fall within this range, if you take the path of playing back PCM.

    You will need very long strings, though, if your play is a common sample rate of 44100 frames per second, and each char maps to a single frame.