Spaces:
Running
Running
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>Animalese.js Demo</title> | |
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet"> | |
<style> | |
body { | |
font-family: 'Roboto', sans-serif; | |
background-color: #000; /* Set background to black */ | |
color: #fff; | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
margin: 0; | |
padding: 20px; | |
} | |
h2 { | |
color: #4CAF50; | |
} | |
.container { | |
background-color: #111; /* Dark gray for container background */ | |
padding: 20px; | |
border-radius: 8px; | |
border: 2px solid #fff; /* White border around the box */ | |
box-shadow: 0 4px 8px rgba(255, 255, 255, 0.1); /* White shadow for slight emphasis */ | |
max-width: 600px; | |
width: 100%; | |
} | |
textarea { | |
width: 100%; | |
padding: 10px; | |
border: 1px solid #ccc; | |
border-radius: 4px; | |
background-color: #222; /* Darker background for textarea */ | |
color: #fff; /* White text in textarea */ | |
resize: vertical; | |
margin-bottom: 10px; | |
} | |
label { | |
display: flex; | |
align-items: center; | |
margin-bottom: 10px; | |
} | |
input[type="checkbox"], | |
input[type="range"] { | |
margin-left: 10px; | |
} | |
button { | |
background-color: #4CAF50; | |
color: white; | |
border: none; | |
padding: 10px 20px; | |
border-radius: 4px; | |
cursor: pointer; | |
margin-right: 10px; | |
} | |
button:disabled { | |
background-color: #555; | |
cursor: not-allowed; | |
} | |
a { | |
color: #4CAF50; | |
text-decoration: none; | |
} | |
a:hover { | |
text-decoration: underline; | |
} | |
</style> | |
<script src="riffwave.js"></script> | |
<script src="Blob.js"></script> | |
<script src="FileSaver.min.js"></script> | |
<script src="animalese.js"></script> | |
<script> | |
function dataURItoBlob(dataURI) { | |
var byteString; | |
if (dataURI.split(',')[0].indexOf('base64') >= 0) | |
byteString = atob(dataURI.split(',')[1]); | |
else | |
byteString = unescape(dataURI.split(',')[1]); | |
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; | |
var ia = new Uint8Array(byteString.length); | |
for (var i = 0; i < byteString.length; i++) { | |
ia[i] = byteString.charCodeAt(i); | |
} | |
return new Blob([ia], { type: mimeString }); | |
} | |
var synth = new Animalese('animalese.wav', function () { | |
document.getElementById("preview").disabled = false; | |
document.getElementById("download").disabled = false; | |
}); | |
function generateWav() { | |
return synth.Animalese(document.getElementById("text").value, | |
document.getElementById("shorten").checked, | |
document.getElementById("pitch").value).dataURI; | |
} | |
function preview() { | |
var audio = new Audio(); | |
audio.src = generateWav(); | |
audio.play(); | |
} | |
function download() { | |
var wave = generateWav(); | |
saveAs(dataURItoBlob(wave), "animalese.wav"); | |
} | |
</script> | |
</head> | |
<body> | |
<div class="container"> | |
<h2>Animalese.js Demo</h2> | |
<p>More information and the source at <a href="https://github.com/Acedio/animalese.js">https://github.com/Acedio/animalese.js</a>.</p> | |
<textarea id="text" rows="4" cols="50">Testing out animalese.js. Did it work?</textarea><br/> | |
<label>Shorten words<input id="shorten" type="checkbox" /></label><br/> | |
<label>Grump<input id="pitch" type="range" min="0.2" max="2.0" value="1.0" step="0.1" />Isabelle</label><br/> | |
<button id="preview" type="button" disabled="true" onclick="preview()">Preview!</button> | |
<button id="download" type="button" disabled="true" onclick="download()">Download!</button> | |
</div> | |
</body> | |
</html> | |