/** * Test recording to disk in non-real-time. * Play several frequencies of a sine wave. * Save data in a WAV file format. * * @author (C) 1997 Phil Burk, All Rights Reserved */ package com.jsyn.examples; import java.io.File; import java.io.IOException; import com.jsyn.JSyn; import com.jsyn.Synthesizer; import com.jsyn.unitgen.ExponentialRamp; import com.jsyn.unitgen.LineOut; import com.jsyn.unitgen.SawtoothOscillatorBL; import com.jsyn.unitgen.SineOscillator; import com.jsyn.unitgen.UnitOscillator; import com.jsyn.util.WaveRecorder; public class RecordSineSweep { final static double SONG_DURATION = 4.0; private Synthesizer synth; private UnitOscillator leftOsc; private UnitOscillator rightOsc; private ExponentialRamp sweeper; private LineOut lineOut; private WaveRecorder recorder; private final static boolean useRecorder = false; private void test() throws IOException { // Create a context for the synthesizer. synth = JSyn.createSynthesizer(); synth.setRealTime( false ); if( useRecorder ) { File waveFile = new File( "temp_recording.wav" ); // Default is stereo, 16 bits. recorder = new WaveRecorder( synth, waveFile ); System.out.println( "Writing to WAV file " + waveFile.getAbsolutePath() ); } // Add some tone generators. synth.add( leftOsc = new SineOscillator() ); synth.add( rightOsc = new SawtoothOscillatorBL() ); // Add a controller that will sweep up. synth.add( sweeper = new ExponentialRamp() ); // Add an output unit. synth.add( lineOut = new LineOut() ); sweeper.current.set( 50.0 ); sweeper.input.set( 1400.0 ); sweeper.time.set( SONG_DURATION ); sweeper.output.connect( leftOsc.frequency ); sweeper.output.connect( rightOsc.frequency ); // Connect the oscillator to the left and right audio output. leftOsc.output.connect( 0, lineOut.input, 0 ); rightOsc.output.connect( 0, lineOut.input, 1 ); // Start synthesizer using default stereo output at 44100 Hz. synth.start(); if( useRecorder ) { leftOsc.output.connect( 0, recorder.getInput(), 0 ); rightOsc.output.connect( 0, recorder.getInput(), 1 ); // When we start the recorder it will pull data from the oscillator // and sweeper. recorder.start(); } // We also need to start the LineOut if we want to hear it now. lineOut.start(); // Get synthesizer time in seconds. double timeNow = synth.getCurrentTime(); // Sleep while the sound is being generated in the background thread. try { synth.sleepUntil( timeNow + SONG_DURATION ); } catch( InterruptedException e ) { e.printStackTrace(); } // Test stopping and restarting a recorder. This will cause a pop. if( recorder != null ) { System.out.println( "Stop and restart recorder." ); recorder.stop(); } sweeper.input.set( 100.0 ); timeNow = synth.getCurrentTime(); if( recorder != null ) { recorder.start(); } // Sleep while the sound is being generated in the background thread. try { synth.sleepUntil( timeNow + SONG_DURATION ); } catch( InterruptedException e ) { e.printStackTrace(); } if( recorder != null ) { recorder.stop(); recorder.close(); } // Stop everything. synth.stop(); } public static void main( String[] args ) { try { new RecordSineSweep().test(); } catch( IOException e ) { e.printStackTrace(); } } }