
// 
//
//     Mensurberechnung und -analyse für Orgelpfeifen
//
//     Autor: Arndt Brünner
//
//	 Version: 13. 4. 2001, 17:53
// 

var yy=new Array(61);


function ErzeugeTabelle()
{
	pr('<table><tr><td>');
	pr('<table cellspacing="0" cellpading="0" border="1" name="tab"><tr><th>Taste</th><th>Maß</th></tr>\n');
	for(var i=1;i<61;i++)
	{
		pr('<tr><td align="center">'+GetTonName(i)+' </td><td> ');
		var Name="y"+(i-1);
		pr('<input type="text" size="10" name="'+ Name +'"');
		pr(' onChange="yy['+(i-1)+']=this.value');
		pr('"></td></tr>\n');
		yy[i-1]="";
	}
	pr('</table></td><td>&nbsp;&nbsp;</td></tr>\n</table>');
}


function pr(t){document.write(t);}

function MensurAnalyse()
{
	for (var i=0 ; i<61 ; i++)
		eval('yy[i]=document.f.y'+i+'.value;');
	var Start=document.f.von.selectedIndex;
	var Ende=document.f.bis.selectedIndex;
	var R=GetFuss(document.f.Register.options[document.f.Register.selectedIndex].value,document.f.txtRegister.value);
	var f=document.f.Funktionsart.selectedIndex+1;
	var funkt="";
	var Nummer=1;
	var t=new String;
	var tt=new String;
	var sep="\t"; //unescape("%09");
	var MZ;
	if (document.f.MensurAnzeigen.checked==true) MZ=1; else MZ=0;
	var rund=Number(document.f.AnzDez.options[document.f.AnzDez.selectedIndex].value);
	var r="<html><head><title>Ergebnis der Mensuranalyse</title>";
	r+='<style type="text/css">\n<!--\ntd{text-align:center;}\n//-->\n</style>';
	r+='</head><body bgcolor="#FFFFEC"><h2>Ergebnis der Mensuranalyse</h2>';
	t="";
	for (var i=Start;i<Ende+1;i++)
	{
		yy[i]=yy[i].replace(/\,/g,".");
		if( yy[i] != "" ) 
		if (yy[i].indexOf("/")==-1)
			t+=("("+i+"/"+yy[i]+")");
		else
		{
			var ts=yy[i].split("/");
			t+=("("+i+"/"+(2*Math.sqrt(Number(ts[0])*Number(ts[1])/Math.PI))+")").replace(/\,/g,".");
		}
	}
	r+="<table border=\"1\" cellpadding=\"2\" width=\"750\"><tr>";
	if (f<6) r+="<th>Nr.</th><th>Art</th><th>&nbsp;Teilung&nbsp;</th><th><i>&nbsp;arcanum&nbsp;</th><th>Oktav-<br>&nbsp;teilung&nbsp;</th><th>Standard-<br>&nbsp;abweichung&nbsp;</th><th>&nbsp;Funktionsterm&nbsp;</th></tr>\n";
	switch (f)
	{
	case 0: // automatisch
		funkt=GetExpC(t,2)+"<br>";
		funkt+=GetExpG(t,2)+"<br>";
		funkt+=GetPolynom(t,1)+"<br>";
		funkt+=GetPolynom(t,2)+"<br>";
		funkt+=GetPolynom(t,3)+"<br>";
		break;
	case 1: // e + c
		funkt=GetExpC(t,2);
		if ((Math.abs(q)==5)||(Math.abs(q)>=24)||(SA>5)) {alert("Keine sinnvolle Exponentialfunktion gefunden.");return;}
		r+="<tr><td>"+Nummer+"</td><td>Exp+Const</td><td><nobr>"+GetIntervall(q)+"</nobr></td><td><nobr>"+Runden(k[0],rund)+"</nobr></td><td>1 : "+Runden(Math.pow(2,-12/q),4)+BTest(q)+"</td>";
		r+="<td>"+SA+"</td><td><nobr>"+funkt+"</nobr></td></tr>\n";
		Nummer++;
		break;
	case 2: // e + g
		funkt=GetExpG(t,2);
		if ((Math.abs(q)==5)||(Math.abs(q)>=24)||(SA>5)) {alert("Keine sinnvolle Exponentialfunktion gefunden.");return;}
		r+="<tr><td>"+Nummer+"</td><td>Exp+Gerade</td><td><nobr>"+GetIntervall(q)+"</nobr></td><td><nobr>"+(Runden(k[1],rund)+"x + "+Runden(k[0],rund)).replace(/\+\-/g,"-").replace(/\+ \-/g," - ")+"</nobr></td><td>1 : "+Runden(Math.pow(2,-12/q),4)+BTest(q)+"</td>";
		r+="<td>"+SA+"</td><td><nobr>"+funkt+"</nobr></td></tr>\n";
		Nummer++;
		break;
	case 3: // p1
		funkt=GetPolynom(t,1);
		if ((Math.abs(q)==5)||(Math.abs(q)>=24)||(SA>5)) {alert("Keine passende Gerade gefunden.");return;}
		r+="<tr><td>"+Nummer+"</td><td>Gerade</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>";
		r+="<td>"+SA+"</td><td><nobr>"+funkt+"</nobr></td></tr>\n";
		break;
	case 4: // p2
		funkt=GetPolynom(t,2);
		if ((Math.abs(q)==5)||(Math.abs(q)>=24)||(SA>5)) {alert("Keine passende Parabel gefunden.");return;}
		r+="<tr><td>"+Nummer+"</td><td>Parabel</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>";
		r+="<td>"+SA+"</td><td><nobr>"+funkt+"</nobr></td></tr>\n";
		break;
	case 5: // p3
		funkt=GetPolynom(t,3);
		if ((Math.abs(q)==5)||(Math.abs(q)>=24)||(SA>5)) {alert("Keine passende kubische Parabel gefunden.");return;}
		r+="<tr><td>"+Nummer+"</td><td><nobr>kubische Parabel</nobr></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>";
		r+="<td>"+SA+"</td><td><nobr>"+funkt+"</nobr></td></tr>\n";
		break;
	case 6: // alle
		r+='</table><table border="1" cellpadding="5"><tr><th>Art der Funktion</th><th>Funktionsterm</th><th>Standardabweichung</th></tr>\n';
		funkt="<tr><td>Exponential+Konstante</td><td>"+GetExpC(t,2)+"</td><td>"+SA+"</td></tr>\n";
		funkt+="<tr><td>Exponential+Gerade</td><td>"+GetExpG(t,2)+"</td><td>"+SA+"</td></tr>\n";
		funkt+="<tr><td>Gerade</td><td>"+GetPolynom(t,1)+"</td><td>"+SA+"</td></tr>\n";
		funkt+="<tr><td>Parabel</td><td>"+GetPolynom(t,2)+"</td><td>"+SA+"</td></tr>\n";
		funkt+="<tr><td>kubische Parabel</td><td>"+GetPolynom(t,3)+"</td><td>"+SA+"</td></tr>\n";
		r+=funkt+"</table><table>";
		break;
	}
	//r+='</table><br><a href="javascript:history.back()">zur&uuml;ck zur Eingabe</a><br><br>';
	r+='</table><br><br>';
	r+='<table><tr><td><table border=\"1\"><!--***//-->\n<tr><th>Taste</th><th>gegeben</th>';
	if (f<6) r+="<th>berechnet</th>";
	if ((MZ==1)&&(f<6)) r+="<th>Mensur</th>";
	if(f==6)r+="<th>Exp+C</th><th>Exp+G</th><th>Gerade</th><th>Parabel</th><th>Kub. Parabel</th>";
	r+="</tr>\n";
	for (i=Start;i<Ende+1;i++)
	{
		var M=0.0;
		var TN=GetTonName(i+1);
		r+="<tr><td>"+TN+"</td><td>"+yy[i]+"</td><td>";
		tt+=TN+sep;
		switch (f)
		{
		case 0:
			r+="?";
		break;
		case 1:
			M=Exp(i,q,2,k[1],0,k[0]);
			r+=Runden(M,rund);
			tt+=Runden(M,rund);			
		break;
		case 2:
			M=Exp(i,q,2,k[2],k[1],k[0]);
			r+=Runden(M,rund);			
			tt+=Runden(M,rund);			
		break;
		case 3:
			M=Polynom(i,1);
			r+=Runden(M,rund);
			tt+=Runden(M,rund);			
		break;
		case 4:
			M=Polynom(i,2);
			r+=Runden(M,rund);
			tt+=Runden(M,rund);			
		break;
		case 5:
			M=Polynom(i,3);
			r+=Runden(M,rund);
			tt+=Runden(M,rund);			
		break;
		case 6:
			M=Exp(i,q,2,k[1],0,k[0]);
			r+=Runden(M,rund)+"</td><td>";	
			tt+=Runden(M,rund)+sep;			
			M=Exp(i,q,2,k[2],k[1],k[0]);
			r+=Runden(M,rund)+"</td><td>";			
			tt+=Runden(M,rund)+sep;			
			M=Polynom(i,1);
			r+=Runden(M,rund)+"</td><td>";
			tt+=Runden(M,rund)+sep;			
			M=Polynom(i,2);
			r+=Runden(M,rund)+"</td><td>";
			tt+=Runden(M,rund)+sep;			
			M=Polynom(i,3);
			r+=Runden(M,rund);
			tt+=Runden(M,rund);			
		break;
		}
		r+="</td>";
		if ((MZ==1)&&(f<6))
		{
			 r+="<td>"+GetMensur(i,R,M,1)+"</td>";
		       tt+=sep+GetMensur(i,R,M,1);
		}
		r+="</tr>\n";
		tt+="\r\n";
	}
	if (f<6)
		r+='<tr><td colspan="2" align="right"><font face="Symbol" size="+2" > &#115; </font> = &nbsp;</td><td>'+SA+'</td></tr>\n';
	else
	;
	if (document.f.KommaArt.selectedIndex==0) 
	{
		r=r.replace(/\./g,",").replace(/Nr\,/,"Nr.");
		tt=tt.replace(/\./g,",");
	}
	r=r.replace(/Kub\,/,"Kub.");
	r=r.replace(/ory\,back/,"ory.back");
	r=r.replace(/ \,/g,"0,").replace(/\-\,/g,"-0,").replace(/\+\,/g,"+0,").replace(/\>\-\,/g,">-0,").replace(/\>\,/g,">0,");
	r=r.replace(/ \./g,"0.").replace(/\-\./g,"-0.").replace(/\+\./g,"+0.").replace(/\>\-\./g,">-0.").replace(/\>\./g,">0.").replace(/\+\-/g,"-");
	tt=tt.replace(/ \,/g,"0,").replace(/\-\,/g,"-0,").replace(/\+\,/g,"+0,").replace(/\>\-\,/g,">-0,").replace(/\>\,/g,">0,");
	tt=tt.replace(/ \./g,"0.").replace(/\-\./g,"-0.").replace(/\+\./g,"+0.").replace(/\>\-\./g,">-0.").replace(/\>\./g,">0.").replace(/\+\-/g,"-");
	r+='</table>';
	var tttt=false;
	if (document.f.Textfeld.checked==true) 
	{
		tttt=true;
		r+='<br></td><td>&nbsp;&nbsp;&nbsp;</td><td valign="top">';
//		r+='<br><br><a href="javascript:history.back()">zur&uuml;ck zur Eingabe</a></td><td>&nbsp;&nbsp;&nbsp;</td><td valign="top">';
		r+='<hr><form name="ff"><h3>Textfeld zum Kopieren und Einf&uuml;gen &uuml;ber die Zwischenablage in ein Tabellenblatt</h3>';
		r+='<br><textarea name="Text1" cols="40" rows="60" wrap="physical">'+tt+'</textarea></form><br><a href="javascript:history.back()">zur&uuml;ck zur Eingabe</a><br></td>';
	}
	r+="</td></tr></table></body></html>";
	//var win=window.window;    
	var win=window.open("","Analyseergebnisse");
	win.document.write(r);
	win.document.close();
	win.focus();
	win=null;
}

function GetIntervall(i)
{
//goldener Schnitt: 
if(Math.abs(Math.abs(i)-17.285)<0.1) return "goldener&nbsp;Schnitt<br>(=1728,5&nbsp;Cent)<br>"+Runden(Math.abs(i)*100,1)+"&nbsp;Cent";
if (Math.abs(Runden(i,0))==Math.abs(i))
if (Math.abs(i)<5) return "&lt; Quarte<br>"+Runden(Math.abs(i)*100,1)+"&nbsp;Cent";
if (Math.abs(i)>24) return "&gt; 2 Oktaven<br>"+Runden(Math.abs(i)*100,1)+"&nbsp;Cent";
if (Math.abs(i)==Math.abs(Math.floor(i)))
{
switch (Math.abs(i)){
case 5:return 'reine Quarte';
case 6:return 'verminderte Quinte';
case 7:return 'reine Quinte';
case 8:return 'kleine Sexte';
case 9:return 'große Sexte';
case 10:return 'kleine Septime';
case 11:return 'große Septime';
case 12:return 'reine Oktave';
case 13:return 'kleine None';
case 14:return 'große None';
case 15:return 'kleine Dezime';
case 16:return 'große Dezime';
case 17:return 'reine Undezime';
case 18:return 'übermäßige Undezime';
case 19:return 'reine Duodezime';
case 20:return 'Oktave + kleine Sexte';
case 21:return 'Oktave + große Sexte';
case 22:return 'Oktave + kleine Septime';
case 23:return 'Oktave + große Septime';
case 24:return '2 Oktaven';
default: ;
}
}
return "~ "+GetIntervall(Runden(i,0))+"<br>"+Runden(Math.abs(i)*100,1)+"&nbsp;Cent";
}

function GetMensur(i,R,M,rund)
{
	var t=Runden(i+1 + (8 * Math.log((M*M/4)*Math.PI) - 12 * Math.log(R)) / 0.69314718 - 78.704,rund);
	if (t<=0) return t; else return "+"+t;
}

function Wertetransfer(w,tt)
{
	var n=0;
	var n=GetTonNummer(tt)-1;
	w=w.replace(/\t/g,":");
	if (w.indexOf(':')>0)
	{
		w=w.replace(/: /g,":");
		w=w.replace(/\n/g," ").replace(/\r/g,"").replace(/;/g," ");
		var ww=w.split(" ")
		for (var i=0;i<61;i++)
			eval('document.f.y'+i+'.value=""');
		for (var i=0;i<ww.length;i++)
		{
			var www=ww[i].split(":");
			var nn=GetTonNummer(www[0])-1;
			if (nn>=0) eval('document.f.y'+nn+'.value=www[1]');
		}
		return;
	}
	w=w.replace(/\r/g,"");
	var ww=w.split("\n");
	for (var i=0;i<61;i++)
	{
		if ((i>=n)&&(i-n<ww.length)) 
		{
			eval('document.f.y'+(i)+'.value=ww[i-n]');
			if (ww[i] !="");// eval('document.f.y'+(i+1+n)+'.focus()');
			yy[i]=ww[i]
		}
			else {eval('document.f.y'+i+'.value=""');yy[i]="";}
	}
//	eval('document.f.y'+n+'.focus()');
}

function BTest(q)
{
var qq=Math.pow(2,-12/q);
if(Math.abs(Math.abs(qq)-Math.sqrt(2))<.025) return '<br><font face="Symbol" >&#187;&nbsp;&#214;</font>2';
if(Math.abs(Math.abs(qq)-1.618)<.025) return '<br><font face="Symbol" >&#187;</font>&nbsp;gold. Schnitt (1,618)';
if(Math.abs(Math.abs(qq)-Math.sqrt(3))<.025) return '<br><font face="Symbol" >&#187;&nbsp;&#214;</font>3';
if(Math.abs(Math.abs(qq)-Math.pow(8,0.25))<.025) return '<br><font face="Symbol" >&#187;&nbsp;<sup>4</sup>&#214;</font>8 (Normmensur)';
return '';
}