private void test() throws IOException { // Create a context for the synthesizer. synth = JSyn.createSynthesizer(); // Add a tone generator. synth.add(channelIn = new ChannelIn()); // Add an output mixer. synth.add(channelOut = new ChannelOut()); synth.add(minner = new Minimum()); synth.add(maxxer = new Maximum()); synth.add(reader = new FixedRateMonoReader()); synth.add(writer = new FixedRateMonoWriter()); sample = new FloatSample(44100 * DELAY_SECONDS, 1); maxxer.inputB.set(-0.98); // clip minner.inputB.set(0.98); // Connect the input to the output. channelIn.output.connect(minner.inputA); minner.output.connect(maxxer.inputA); maxxer.output.connect(writer.input); reader.output.connect(channelOut.input); // Both stereo. int numInputChannels = 2; int numOutputChannels = 2; synth.start( 44100, AudioDeviceManager.USE_DEFAULT_DEVICE, numInputChannels, AudioDeviceManager.USE_DEFAULT_DEVICE, numOutputChannels); writer.start(); channelOut.start(); // For a long echo, read cursor should be just in front of the write cursor. reader.dataQueue.queue(sample, 1000, sample.getNumFrames() - 1000); // Loop both forever. reader.dataQueue.queueLoop(sample, 0, sample.getNumFrames()); writer.dataQueue.queueLoop(sample, 0, sample.getNumFrames()); System.out.println( "Start talking. You should hear an echo after " + DELAY_SECONDS + " seconds."); // Sleep a while. try { double time = synth.getCurrentTime(); // Sleep for a while synth.sleepUntil(time + 30.0); } catch (InterruptedException e) { e.printStackTrace(); } saveEcho(new File("saved_echo.wav")); // Stop everything. synth.stop(); }
private void saveEcho(File file) throws IOException { WaveFileWriter writer = new WaveFileWriter(file); writer.setFrameRate(44100); writer.setSamplesPerFrame(1); writer.setBitsPerSample(16); float[] buffer = new float[sample.getNumFrames()]; sample.read(buffer); for (float v : buffer) { writer.write(v); } writer.close(); }