var id=null;
function suivant() {
	document.getElementById("coeffs").innerHTML="";
	document.crv.init();
}
function continu() {
	document.getElementById("coeffs").innerHTML="";
	if(id==null) {
		id = window.setInterval("fourier(1);",2000);
	}
}
function arrete() {
	if(id != null) {
		window.clearInterval(id);
		id=null;
	}
}
function gcd(a, b) {
	var v=b, u= (a<0) ? -a : a;
	while(v>0) {
		w=u%v; u=v; v=w;
	}
	return u;
}

var  ccoeffs=[], scoeffs=[];
var numer, denom, ratio;

function coefsaleatoires() {
		var ncoefs = 2+Math.floor(19*Math.random())
		var k=45
		if(Math.random()<0.25) {
			ccoeffs[0] = 12*Math.random()-6
			ratio=false
		} else {
			ratio=true;
			do {
				numer=Math.floor(60*Math.random()-30);
				denom=Math.floor(1+30*Math.random())
				var g=gcd(numer,denom);
				numer /= g;
				denom /= g;
			ccoeffs[0] = numer/denom*Math.PI;
			} while(numer==0 || denom==1);
		}
		scoeffs[0] = 0
                for(var i=1;i<ncoefs;i++) {
                        ccoeffs[i]=Math.floor(2*k*Math.random()-k);
                        scoeffs[i]=Math.floor(2*k*Math.random()-k);
		}
		for(var i=ncoefs;i<=20;i++) {
			ccoeffs[i]=0;
			scoeffs[i]=0;
		}
}
coefsaleatoires();


function fourier(mode) {
		var t=1;
		var s="<pre>f(t) = \n",
		s2 = document.frm.n.value+";";
		if(mode==1)
		   coefsaleatoires();
                for(var i=0;i<=20;i++) {
			document.crv.injecte(i, ccoeffs[i], scoeffs[i]);
			if(i==0) {
				s += ccoeffs[0];
				//s2 += ccoeffs[i];
				if(ratio)
				s2 += numer+"/"+denom+"*PI";
				else
				s2 += ccoeffs[0];
			} else {
				
				if (ccoeffs[i]<0) s +=  "- "+(-ccoeffs[i])  
				else s +=  "+ "+ccoeffs[i];
				if (i==1) s += " cos(2PI*t) " 
				else s += " cos("+i+"*2PI*t) ";
				if(scoeffs[i]<0) s += "- "+(-scoeffs[i]) 
				else  s += "+ "+scoeffs[i];
				if (i==1) s += " sin(2PI*t) " 
				else s += " sin("+i+"*2PI*t) ";
				s2 +=ccoeffs[i]+" "+scoeffs[i]
			}
			s += "\n";
			s2 += ";";
                        t *=(i+1);
                }
		if(ratio) {
			s += "\nk= "+numer+"/"+denom+"\n"
		} else {
			s += "\n"
		}
		s +="</pre>"
		
		document.getElementById("coeffs").innerHTML=(document.frm.rd.checked == true)? s : "";
		document.frm2.ar.value=s2;
		document.crv.complete(0, parseInt(document.frm.n.value));
}

function  lit() {
	var s="<pre>f(t) = \n",
	s2 = "";
	for(var i=0;i<=20;i++) {
		ccoeffs[i]=0; scoeffs[i]=0;
	}
	var r = document.frm2.ar.value;
	r = r.replace(/^[\n\s\;]+/,"")
	r = r.replace(/[\n\s\;]+$/,"")
	r = r.replace(/[\n\;]+$/g,"\n")
	r = r.replace(/[\n]+$/g,"\n")
	r = r.replace(/[\;]+$/g,";")
	var tb=r.split(/[\n\;]+/g);
//alert(tb)
	with (Math) {
	var nseg=floor(tb[0]);
	s2 += nseg+";"
	document.frm.n.value=nseg;
	for(var i=0; i<tb.length-1&& i<20;i++) {
		var u = tb[i+1];
		u.replace(/\s+/g," ");
		u.replace(/^\s+/,"");
		u.replace(/\s+$/,"");
		var t2 = u.split(/\s+/g);
		 ccoeffs[i] = eval(t2[0]);
		if(t2.length>1)
		  scoeffs[i] = eval(t2[1]);
                document.crv.injecte(i, ccoeffs[i], scoeffs[i]);
                if(i==0) {
			s += ccoeffs[i];
                } else {
                                if (ccoeffs[i]<0) s +=  "- "+(-ccoeffs[i])
                                else s +=  "+ "+ccoeffs[i];
                                if (i==1) s += " cos(2PI*t) "
                                else s += " cos("+i+"*2PI*t) ";
                                if(scoeffs[i]<0) s += "- "+(-scoeffs[i])
                                else  s += "+ "+scoeffs[i];
                                if (i==1) s += " sin(2PI*t) "
                                else s += " sin("+i+"2PI*t) ";
				s2 +=ccoeffs[i]+"  "+scoeffs[i]
                }
                s += "\n";
		s2 += ";";
	}
	}
        s +="</pre>"
	if(document.frm.rd.checked == true)
       document.getElementById("coeffs").innerHTML=s;
	else document.getElementById("coeffs").innerHTML="";
      document.crv.complete(0, parseInt(document.frm.n.value));
}

var pi = Math.PI;

function courbure(s) {
         var r=0;
         for(var i=0; i<=20;i++) {
               r += ccoeffs[i]*Math.cos(2*i*pi*s) + scoeffs[i]*Math.sin(2*i*pi*s);
         }
         return r;
}

function toabc() {
               var t=1;
		var width=150, height=150,tabnotes=[];
                var N= parseInt(document.frm.n.value);
                var mx = Math.floor(width/2);
                var my = Math.floor(height/2);
                var k =  mx/4;
                var xd=0, yd=0;
                var X0, Y0, X1, Y1;

        var longueur=10, ds=4*longueur/N, a=0, k;

    var sabcV ="";
    var notes= "z B, C D E F G A B c d e f g a b c ";
    var ntable= notes.split(/\s+/g);

    var chif="0123456789ABCDEF", code=new Array();
    sabcV += "X:1\n" +
            "T:COURBURE placez le titre ici \n"+
            "N: (Fichier au format .abc, utiliser : abc2midi fichier.abc)\n"+
            "N: Musique\n"+
            "N: \n"+
            "N: \n"+
            "C: \n"+
            "M:4/4\n"+
            "L:1/8\n"+
            "Q:1/4=120\n"+     // 120 normal 160 rapide
            "N: \n"+
            "Z: \n"+
            "K:G \n"+
	"%%MIDI program 72\n"
    
	
	var nnotes=ntable.length;

	var tab1notes = []
	for(var j=0; j<100; j++) {
		tab1notes[j]= new Array();
		for(var i=0; i<=1.5*width; i++) {
			tab1notes[j][i]= Math.floor(i*Math.random())%nnotes;//Math.floor(Math.random()*i)%nnotes
		}
	}
//alert("1")
//alert(tab1notes[25])
/*
	for(var i=0; i<=width; i++) {
		tabnotes[i]=[];
		for(var j=0; j<=height; j++) {
			//tabnotes[i][j]= Math.floor(nnotes*Math.random());
			tabnotes[i][j]= Math.floor(0.5*i+0.8*j)%nnotes
		}
	}
*/
		var a = 0;
var maxa=0
                var  xmin=0,xmax=0,ymin=0,ymax=0;
                for (var  i = 1; i <= N; i++ ) {
                        var s = i*ds;
                        xd += ds*Math.cos(a);
                        yd += ds*Math.sin(a);
                        a += ds*courbure(s);
if(a>maxa) maxa = a
                        if(xd<xmin) xmin=xd;
                        if(xd>xmax) xmax=xd;
                        if(yd<ymin)ymin=yd;
                        if(yd>ymax)ymax=yd;
                }
                var deltax=(width)/(xmax-xmin), deltay=(height)/(ymax-ymin),
                        delta=(deltax<deltay)?deltax : deltay;
                var mx=Math.floor((width-delta*(xmax-xmin))/2),
                my=Math.floor((height-delta*(ymax-ymin))/2);
                a = 0;
                xd=0; yd=0;
                X1 = mx+Math.floor(delta*(-xmin));
                Y1= my+Math.floor(delta*(-ymin));
//alert(maxa)
		var ta = ""
		var bb;
                for (var i = 0; i < N; i++ ) {
                        X0=X1;
                        Y0=Y1;
                        var s = i*ds;
                        xd += ds*Math.cos(a);
                        yd += ds*Math.sin(a);
			bb=Math.floor(a*50)%37;
			if(bb<0)bb = -bb;
			while(bb>37) bb -=37
			//if(b>0) { alert(a+"   "+b); return; }
                        a += ds*courbure(s);
                        X1 = mx+Math.floor(delta*(xd-xmin));
                        Y1 = my+Math.floor(delta*(yd-ymin));
			//if(i<5) alert(X0+" "+Y0+" "+tabnotes[X0][Y0]);
			var X=(X0<0 || X0>width) ? 0 : X0;
			var Y=(Y0<0 || Y0>height) ? 0 : Y0;
//			ta += ntable[tabnotes[X][Y]]
//ta += ntable[tab1notes[b][Math.floor(Math.sqrt(X*X+Y*Y))]]
//ta += ntable[tab1notes[1][Math.floor(Math.sqrt(X*X+Y*Y))]]
ta += ntable[tab1notes[bb][Math.floor(Math.sqrt(X*X+Y*Y))]]
			if((i+1)%8==0) {
        	   ta  +="|";
		}
           if((i+1)%32==0) {
             ta +="\n";
         } else if ((i+1)%4==0) {         ta +=" ";         }
	}
	//alert(ta)
	sabcV += "V: 1\n"+
             "K:G clef=soprano octave=1\n"+              ta	
        document.frm2.ar.value = sabcV;
}        



/*
5000,7/13*PI+0.1,3 -5,-2 10,15 3,4 -14

5000,17/11*PI,3 0,-2 0,5 0

5000,17/11*PI,3 0,2 0,-5 0
5000,7/11*PI,9 0,-5 1,2 1,1 5,2 18
5000,7/3*PI,9 -5,-6 21
5000,7/3*PI,9 -5,-6 21,19 8,-3 16,8 -21
5000,21/4*PI,0 -10,-9 5,1.8 1
5000,3.2*PI,9 -4,-1 3,13 4,0 -8
5000,0.1*PI,9 -5,-1 4,3 0,0 -18,-5 3
5000,0.15*PI,-19 45,21 0,6 2,0 4,0 -2,14 0,0 0,13 0,-8 0,15 0
5000,1.0471975511965976,-12  -9,10  -9,7  -12
5000;1.1780972450961724;-6 6;
5000;-2.5132741228718345;-12 -1;11 3;10 2
5000;-2.5132741228718345;0 -8;-7 -11
5000;4.487989505128276;-15 -9
5000;3.5903916041026207;14 -9
5000;-3.141592653589793;-4 -7;-8 9
5000;-8.377580409572781;13 -11;3 -14;11 -11
5000;2.55981623625835;6 3;-1 2
5000;6.911503837897546;1 -5
5000;2.792526803190927;2 -1;13 -8;-10 -6
5000;3.6959913571644627;2 -9;-7 -1;7 -2;-4 0;-6 4;-2 -6;-12 -1;-1 -4;5 13;-4 -5;9 -15;-11 -12;7 -4;9 -11;13 -13



*/

