public class B {

static double SAMPLE_HZ=44100;
static double STEP = 1/SAMPLE_HZ;
static int OCTAVES = 160;
static double BASEFREQ_HZ = 110;
static double DURATION = 120;
static double LOOPDURATION = 40;

public static void main(String[] args) {
System.out.println("; Sample Rate "+SAMPLE_HZ);
System.out.println("; Channels 1");
double lastsec=0;
double maxampl=0;
  for(double rt=0; rt<DURATION; rt+=STEP) {
    double t = DURATION - rt;
    double v = 0;
    for(double i=0; i<OCTAVES; i++) {
        v+= wave(t-(i-80)*(LOOPDURATION/32));
        // v+= wave(t-i*(LOOPDURATION/2.0)+LOOPDURATION/24.0);
    }
//    v/=OCTAVES;
v/=15.0;
    System.out.println(""+rt+" "+v);
    if(Math.abs(v)>maxampl) {
        maxampl=Math.abs(v);
        System.err.println("new max ampl "+maxampl);
    }
    if(lastsec + 1 < rt) {
        System.err.println("Time "+rt);
        lastsec=rt;
    }
  }
  System.err.println("max amplitude was "+maxampl);
  }

public static double wave(double t) {
        if(t<0 || t>LOOPDURATION) return 0;
        double thisfreq = BASEFREQ_HZ * Math.pow(2,4*(t/LOOPDURATION));
        double phase = 2*Math.PI * t;
        double it = t/LOOPDURATION;
        //double amplitude=(1+Math.cos(2 * Math.PI * (t / LOOPDURATION - 0.5)))/2;
        double amplitude;
        if(t<(LOOPDURATION/2))  // attack
          amplitude = t / (LOOPDURATION/2);
        else //decay
          amplitude = 2 - t / (LOOPDURATION/2); 
        double v= (Math.sin( thisfreq * phase )) * amplitude;
        return v;
}
}
