package com.jsyn.examples;
import com.jsyn.JSyn;
import com.jsyn.Synthesizer;
import com.jsyn.unitgen.LineOut;
import com.jsyn.unitgen.LinearRamp;
import com.jsyn.unitgen.Multiply;
import com.jsyn.unitgen.SineOscillator;
import com.jsyn.unitgen.UnitOscillator;
/**
* Play a enharmonic sine tones using JSyn oscillators.
*
* @author Phil Burk (C) 2010 Mobileer Inc
*
*/
public class PlayPartials
{
private Synthesizer synth;
private UnitOscillator[] osc;
private Multiply[] multipliers;
private LinearRamp ramp;
private LineOut lineOut;
private double[] amps = { 0.2, 0.1, 0.3, 0.4 };
private double[] ratios = { 1.0, Math.sqrt( 2.0 ), Math.E, Math.PI };
private void test()
{
// Create a context for the synthesizer.
synth = JSyn.createSynthesizer();
// Start synthesizer using default stereo output at 44100 Hz.
synth.start();
// Add a stereo audio output unit.
synth.add( lineOut = new LineOut() );
synth.add( ramp = new LinearRamp() );
// Add a tone generator.
osc = new SineOscillator[amps.length];
multipliers = new Multiply[ratios.length];
for( int i = 0; i < osc.length; i++ )
{
// Create unit generators and store them in arrays.
synth.add( osc[i] = new SineOscillator() );
synth.add( multipliers[i] = new Multiply() );
// Connect each oscillator to both channels of the output.
// They will be mixed automatically.
osc[i].output.connect( 0, lineOut.input, 0 );
osc[i].output.connect( 0, lineOut.input, 1 );
// Use a multiplier to scale the output of the ramp.
// output = inputA * inputB
ramp.output.connect( multipliers[i].inputA );
multipliers[i].output.connect( osc[i].frequency );
multipliers[i].inputB.set( ratios[i] );
osc[i].amplitude.set( amps[i] );
}
// start ramping up
ramp.current.set( 100.0);
ramp.time.set(3.0);
ramp.input.set( 700.0 );
// We only need to start the LineOut. It will pull data from the
// oscillator.
lineOut.start();
System.out.println( "You should now be hearing a sine wave. ---------" );
// Sleep while the sound is generated in the background.
try
{
// Sleep for a few seconds.
synth.sleepFor( 4.0 );
// ramp down
ramp.input.set( 100.0 );
synth.sleepFor( 4.0 );
} catch( InterruptedException e )
{
e.printStackTrace();
}
System.out.println( "Stop playing. -------------------" );
// Stop everything.
synth.stop();
}
public static void main( String[] args )
{
System.out.println("Java version = " + System.getProperty( "java.version" ));
new PlayPartials().test();
}
}