258 lines
7.5 KiB
JavaScript
Executable File
258 lines
7.5 KiB
JavaScript
Executable File
function playNote(id) //id format: distortion_atari note index
|
|
{
|
|
activeKeyID = id;
|
|
var dist = activeKeyID.substring(0,activeKeyID.indexOf("_"));
|
|
var atariIndex = activeKeyID.substring(activeKeyID.indexOf("_")+1);
|
|
|
|
if (atariIndex != "nil")
|
|
{
|
|
if (dist == "square") dist = 0;
|
|
else if (dist == "lead") dist = 1;
|
|
else if (dist == "saw") dist = 2;
|
|
else if (dist == "bass") dist = 3;
|
|
|
|
const audio = document.getElementById('sound');
|
|
audio.src = "midi/"+noteArray[dist][atariIndex][0];
|
|
audio.play();
|
|
writeNoteData(dist,atariIndex);
|
|
}
|
|
}
|
|
|
|
function writeNoteData(dist,atariIndex)
|
|
{
|
|
var nv = noteValue;
|
|
if (dotted)
|
|
{
|
|
nv = 2*noteValue/3;
|
|
nv = nv.toString().substring(0,nv.toString().indexOf(".")+3);
|
|
}
|
|
|
|
if (channel == 1)
|
|
document.createMidiForm.c1_display.value += noteArray[dist][atariIndex][1]+" "+dist+" "+atariIndex+" "+nv+"\n";
|
|
else if (channel == 2)
|
|
document.createMidiForm.c2_display.value += noteArray[dist][atariIndex][1]+" "+dist+" "+atariIndex+" "+nv+"\n";
|
|
|
|
updateBufferArray();
|
|
}
|
|
|
|
function writeRestData(restVal)
|
|
{
|
|
if (dotted)
|
|
{
|
|
restVal = 2*restVal/3;
|
|
restVal = restVal.toString().substring(0,restVal.toString().indexOf(".")+3);
|
|
}
|
|
if (channel == 1)
|
|
document.createMidiForm.c1_display.value += "x x x "+restVal+"\n";
|
|
else if (channel == 2)
|
|
document.createMidiForm.c2_display.value += "x x x "+restVal+"\n";
|
|
|
|
updateBufferArray();
|
|
}
|
|
|
|
function disableNils()
|
|
{
|
|
var x = document.getElementsByTagName("button");
|
|
for (i = 0; i < x.length; i++)
|
|
{
|
|
if (x[i].id.match(/nil/))
|
|
{
|
|
x[i].disabled = "disabled";
|
|
x[i].style.backgroundColor = "#CCCCCC";
|
|
x[i].style.cursor = "default";
|
|
}
|
|
}
|
|
}
|
|
|
|
function selectNote(val)
|
|
{
|
|
var x = document.getElementsByName("note-select");
|
|
for (i = 0; i < x.length; i++)
|
|
{
|
|
if (Math.pow(2,i) == val)
|
|
{
|
|
x[i].disabled = "disabled";
|
|
x[i].style.cursor = "default";
|
|
}
|
|
else
|
|
{
|
|
x[i].disabled = "";
|
|
x[i].style.cursor = "pointer";
|
|
}
|
|
}
|
|
noteValue = val;
|
|
}
|
|
|
|
function validateForm()
|
|
{
|
|
var x = document.createMidiForm;
|
|
|
|
if (isNaN(Number(x.tempo.value)) || isNaN(parseInt(x.tempo.value)) || x.tempo.value == "0")
|
|
{
|
|
x.tempo.value = "";
|
|
alert("Invalid tempo");
|
|
x.tempo.focus();
|
|
}
|
|
else if (isNaN(Number(x.timesig_num.value)) || isNaN(parseInt(x.timesig_num.value)) || x.timesig_num.value == "0")
|
|
{
|
|
x.timesig_num.value = "";
|
|
alert("Invalid time signature");
|
|
x.timesig_num.focus();
|
|
}
|
|
}
|
|
|
|
function toggleColor()
|
|
{
|
|
showColor = !showColor;
|
|
var x = document.getElementsByName('key');
|
|
|
|
if (showColor)
|
|
{
|
|
for (i = 0; i < x.length; i++)
|
|
{
|
|
var dist = x[i].id.substring(0,x[i].id.indexOf("_"));
|
|
var atariIndex = x[i].id.substring(x[i].id.indexOf("_")+1);
|
|
|
|
if (atariIndex != "nil")
|
|
{
|
|
if (dist == "square") dist = 0;
|
|
else if (dist == "lead") dist = 1;
|
|
else if (dist == "saw") dist = 2;
|
|
else if (dist == "bass") dist = 3;
|
|
|
|
x[i].style.backgroundColor = noteArray[dist][atariIndex][8];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; i < x.length; i++)
|
|
{
|
|
var dist = x[i].id.substring(0,x[i].id.indexOf("_"));
|
|
var atariIndex = x[i].id.substring(x[i].id.indexOf("_")+1);
|
|
|
|
if (atariIndex != "nil")
|
|
{
|
|
if (dist == "square") dist = 0;
|
|
else if (dist == "lead") dist = 1;
|
|
else if (dist == "saw") dist = 2;
|
|
else if (dist == "bass") dist = 3;
|
|
|
|
if (x[i].className.match("wkey")) x[i].style.backgroundColor = "#FFFFFF";
|
|
else x[i].style.backgroundColor = "#000000";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function showFloatingDiv(keyID,e)
|
|
{
|
|
activeKeyID = keyID;
|
|
mouseX = e.clientX-50;
|
|
mouseY = e.clientY+10;
|
|
if (mouseX > screen.width-125) mouseX = screen.width-130;
|
|
else if (mouseX < 5) mouseX = 5;
|
|
var dist = activeKeyID.substring(0,activeKeyID.indexOf("_"));
|
|
var atariIndex = activeKeyID.substring(activeKeyID.indexOf("_")+1);
|
|
|
|
if (dist == "square") dist = 0;
|
|
else if (dist == "lead") dist = 1;
|
|
else if (dist == "saw") dist = 2;
|
|
else if (dist == "bass") dist = 3;
|
|
|
|
var x = document.getElementById('floatDiv');
|
|
x.style.top = mouseY+"px";
|
|
x.style.left = mouseX+"px";
|
|
x.style.visibility = "visible";
|
|
x.innerHTML = "<a style='float: right; border: 1px dotted #000000; padding: 1px;' href='javascript:void(0)' onclick='hideFloatingDiv()' title='close'><b>X</b></a>";
|
|
x.innerHTML += "<b>"+noteArray[dist][atariIndex][1]+"</b><br />Pitch: <code>"+atariIndex+"</code><br />";
|
|
x.innerHTML += "Freq: <code>"+noteArray[dist][atariIndex][3]+" Hz</code><br />";
|
|
if (noteArray[dist][atariIndex][4] > 0)
|
|
x.innerHTML += "Error: <code>+"+noteArray[dist][atariIndex][4]+"</code>";
|
|
else
|
|
x.innerHTML += "Error: <code>"+noteArray[dist][atariIndex][4]+"</code>";
|
|
|
|
for (i = 0; i < 32; i++)
|
|
{
|
|
if (i != atariIndex)
|
|
if (noteArray[dist][atariIndex][1] == noteArray[dist][i][1]) //two pitches with same note name
|
|
{
|
|
x.innerHTML += "<br /><a href='javascript:exchange()'>Exchange</a>";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function exchange()
|
|
{
|
|
var dist = activeKeyID.substring(0,activeKeyID.indexOf("_"));
|
|
var atariIndex = activeKeyID.substring(activeKeyID.indexOf("_")+1);
|
|
|
|
if (dist == "square") dist = 0;
|
|
else if (dist == "lead") dist = 1;
|
|
else if (dist == "saw") dist = 2;
|
|
else if (dist == "bass") dist = 3;
|
|
|
|
for (j = 0; j < 32; j++)
|
|
if (j != atariIndex && noteArray[dist][atariIndex][1] == noteArray[dist][j][1])
|
|
{
|
|
document.getElementById(activeKeyID).id = dist+"_"+j;
|
|
activeKeyID = dist+"_"+j;
|
|
atariIndex = j;
|
|
break;
|
|
}
|
|
|
|
//update floating div
|
|
var x = document.getElementById('floatDiv');
|
|
x.style.top = mouseY+"px";
|
|
x.style.left = mouseX+"px";
|
|
x.style.visibility = "visible";
|
|
x.innerHTML = "<a style='float: right; padding: 1px; border: 1px dotted #000000;' href='javascript:void(0)' onclick='hideFloatingDiv()' title='close'><b>X</b></a>";
|
|
x.innerHTML += "<b>"+noteArray[dist][atariIndex][1]+"</b><br />Pitch: <code>"+atariIndex+"</code><br />";
|
|
x.innerHTML += "Freq: <code>"+noteArray[dist][atariIndex][3]+" Hz</code><br />";
|
|
if (noteArray[dist][atariIndex][4] > 0)
|
|
x.innerHTML += "Error: <code>+"+noteArray[dist][atariIndex][4];
|
|
else
|
|
x.innerHTML += "Error: <code>"+noteArray[dist][atariIndex][4];
|
|
x.innerHTML += "</code><br /><a href='javascript:exchange()'>Exchange</a>";
|
|
|
|
//change color, if necessary
|
|
if (showColor)
|
|
{
|
|
showColor = !showColor;
|
|
toggleColor();
|
|
}
|
|
}
|
|
|
|
function showFAQ()
|
|
{
|
|
document.getElementById('faq').style.visibility = "visible";
|
|
document.getElementById('faq').style.top = "50px";
|
|
document.getElementById('faq').style.left = "50px";
|
|
document.getElementById('faq').style.width = "910px";
|
|
document.getElementById('faq').style.height = "500px";
|
|
}
|
|
|
|
function updateBufferArray()
|
|
{
|
|
bufferArray[0][bufferCount] = document.getElementById('c1_display').value;
|
|
bufferArray[1][bufferCount] = document.getElementById('c2_display').value;
|
|
bufferCount++;
|
|
}
|
|
|
|
function undoLastKeypress()
|
|
{
|
|
if (bufferCount >= bufferMin)
|
|
{
|
|
document.getElementById('c1_display').value = bufferArray[0][bufferCount-2].toString();
|
|
document.getElementById('c2_display').value = bufferArray[1][bufferCount-2].toString();
|
|
bufferCount--;
|
|
}
|
|
}
|
|
|
|
function hideFAQ() {document.getElementById('faq').style.visibility = "hidden";}
|
|
function clearChannelData(x) {document.getElementById("c"+x.toString()+"_display").value = "";}
|
|
function setDotted() {dotted = !dotted;}
|
|
function toggleChannel(c) {channel = c;}
|
|
function hideFloatingDiv() {document.getElementById('floatDiv').style.visibility = "hidden";}
|