package com.jsyn.examples;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import com.jsyn.JSyn;
import com.jsyn.Synthesizer;
import com.jsyn.data.FloatSample;
import com.jsyn.unitgen.LineOut;
import com.jsyn.unitgen.VariableRateDataReader;
import com.jsyn.unitgen.VariableRateMonoReader;
import com.jsyn.unitgen.VariableRateStereoReader;
import com.jsyn.util.SampleLoader;
/**
* Play a sample from a WAV file using JSyn.
*
* @author Phil Burk (C) 2010 Mobileer Inc
*
*/
public class PlaySample
{
private Synthesizer synth;
private VariableRateDataReader samplePlayer;
private LineOut lineOut;
private void test()
{
URL sampleFile;
try
{
sampleFile = new URL("http://www.softsynth.com/samples/Clarinet.wav");
} catch( MalformedURLException e2 )
{
e2.printStackTrace();
return;
}
synth = JSyn.createSynthesizer();
FloatSample sample;
try
{
// Add an output mixer.
synth.add( lineOut = new LineOut() );
// Load the sample and display its properties.
SampleLoader.setJavaSoundPreferred( false );
sample = SampleLoader.loadFloatSample( sampleFile );
System.out.println( "Sample has: channels = " + sample.getChannelsPerFrame() );
System.out.println( " frames = " + sample.getNumFrames() );
System.out.println( " rate = " + sample.getFrameRate() );
System.out.println( " loopStart = " + sample.getSustainBegin() );
System.out.println( " loopEnd = " + sample.getSustainEnd() );
if( sample.getChannelsPerFrame() == 1 )
{
synth.add( samplePlayer = new VariableRateMonoReader() );
samplePlayer.output.connect( 0, lineOut.input, 0 );
}
else if( sample.getChannelsPerFrame() == 2 )
{
synth.add( samplePlayer = new VariableRateStereoReader() );
samplePlayer.output.connect( 0, lineOut.input, 0 );
samplePlayer.output.connect( 1, lineOut.input, 1 );
}
else
{
throw new RuntimeException(
"Can only play mono or stereo samples." );
}
// Start synthesizer using default stereo output at 44100 Hz.
synth.start();
samplePlayer.rate.set( sample.getFrameRate() );
// We only need to start the LineOut. It will pull data from the
// sample player.
lineOut.start();
// We can simply queue the entire file.
// Or if it has a loop we can play the loop for a while.
if( sample.getSustainBegin() < 0 )
{
System.out.println( "queue the sample" );
samplePlayer.dataQueue.queue( sample );
}
else
{
System.out.println( "queueOn the sample" );
samplePlayer.dataQueue.queueOn( sample );
synth.sleepFor( 8.0 );
System.out.println( "queueOff the sample" );
samplePlayer.dataQueue.queueOff( sample );
}
// Wait until the sample has finished playing.
do
{
synth.sleepFor( 1.0 );
} while( samplePlayer.dataQueue.hasMore() );
} catch( IOException e1 )
{
e1.printStackTrace();
} catch( InterruptedException e )
{
e.printStackTrace();
}
// Stop everything.
synth.stop();
}
public static void main( String[] args )
{
new PlaySample().test();
}
}