view audio/java/TestLine.java @ 61:eff6bddf82e3 tip

Finally implemented perceptual brightness thing.
author samer
date Sun, 11 Oct 2015 10:20:42 +0100
parents 63cefb01cbab
children
line wrap: on
line source
package ishara.audio;
import javax.sound.sampled.*;


public class TestLine {
	// Args: <dur> <freq in Hz> <bufsize> <framesize>
	public static double TwoPi=2*Math.PI;

	public static class SineSrc {
		double ph,freq;

		public SineSrc(double f) { freq=f; ph=0; }
		public void next(double [] buf, int l) {
			for (int i=0; i<l; i++) {
				buf[i]=Math.sin(ph);
				ph+=freq;
			}
			ph -= TwoPi*Math.floor(ph/TwoPi);
		}
	};

	public static void main(String[] args) {
		int bufsize, N, numframes;
		double [] buffer;
		double rate, dur, freq;

		if (args.length<4) {
			System.out.println("TestLine <dur> <freq in Hz> <bufsize> <framesize>");
			return;
		}

		try {
			dur=Double.parseDouble(args[0]);
			freq=Double.parseDouble(args[1]);
			bufsize=Integer.parseInt(args[2]);
			N=Integer.parseInt(args[3]);
			rate=22050;

			System.out.println("Playing test signal: "+dur+" s, "+freq+"% Hz");
			System.out.println("frame size="+N+" buffer size="+bufsize);

			buffer = new double[N];
			SineSrc src=new SineSrc(2*Math.PI*freq/rate);
			LineSink sink=new LineSink(new AudioFormat((float)rate,16,1,true,false),bufsize);
			try {
				AudioSink.Writer w=sink.writer(N);
				numframes = (int)(dur*rate/N);

				sink.start();
				for (int i=0; i<numframes; i++) {
					src.next(buffer,N);
					w.write(buffer,0,N);
				}
				sink.getLine().drain();
				sink.stop();
			} finally {
				sink.dispose();
			}
		} catch(Exception ex) {
		}
	}
}