package com.jsyn.examples; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.ButtonGroup; import javax.swing.JApplet; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.event.ChangeEvent; import com.jsyn.JSyn; import com.jsyn.Synthesizer; import com.jsyn.scope.AudioScope; import com.jsyn.swing.JAppletFrame; import com.jsyn.swing.PortControllerFactory; import com.jsyn.unitgen.ImpulseOscillator; import com.jsyn.unitgen.ImpulseOscillatorBL; import com.jsyn.unitgen.LineOut; import com.jsyn.unitgen.LinearRamp; import com.jsyn.unitgen.Multiply; import com.jsyn.unitgen.PulseOscillator; import com.jsyn.unitgen.PulseOscillatorBL; import com.jsyn.unitgen.RedNoise; import com.jsyn.unitgen.SawtoothOscillator; import com.jsyn.unitgen.SawtoothOscillatorBL; import com.jsyn.unitgen.SawtoothOscillatorDPW; import com.jsyn.unitgen.SineOscillator; import com.jsyn.unitgen.SquareOscillator; import com.jsyn.unitgen.SquareOscillatorBL; import com.jsyn.unitgen.TriangleOscillator; import com.jsyn.unitgen.UnitOscillator; /** * Display each oscillators waveform using the AudioScope. This is a * reimplementation of the TJ_SeeOsc Applet from the old API. * * @author Phil Burk (C) 2010 Mobileer Inc * */ public class SeeOscillators extends JApplet { private static final long serialVersionUID = -8315903842197137926L; private Synthesizer synth; private ArrayList<UnitOscillator> oscillators = new ArrayList<UnitOscillator>(); private LineOut lineOut; private AudioScope scope; private JPanel oscPanel; private Multiply oscGain; private ButtonGroup buttonGroup; private LinearRamp freqRamp; /* Can be run as either an application or as an applet. */ public static void main( String args[] ) { SeeOscillators applet = new SeeOscillators(); JAppletFrame frame = new JAppletFrame( "ShowWaves", applet ); frame.setSize( 640, 500 ); frame.setVisible( true ); frame.test(); frame.validate(); } private void setupGUI() { setLayout( new BorderLayout() ); add( BorderLayout.NORTH, new JLabel( "Show Oscillators in an AudioScope" ) ); scope = new AudioScope( synth ); scope.addProbe( oscGain.output ); scope.setTriggerMode( AudioScope.TriggerMode.NORMAL ); //scope.getModel().getTriggerModel().getLevelModel().setDoubleValue( 0.0001 ); // Turn off the gain and trigger control GUI. scope.getView().setShowControls( false ); scope.start(); add( BorderLayout.CENTER, scope.getView() ); JPanel southPanel = new JPanel(); southPanel.setLayout( new GridLayout( 0, 1 ) ); add( BorderLayout.SOUTH, southPanel ); oscPanel = new JPanel(); oscPanel.setLayout( new GridLayout( 2, 5 ) ); southPanel.add( oscPanel ); southPanel.add( PortControllerFactory.createExponentialPortSlider( freqRamp.input ) ); southPanel.add( PortControllerFactory.createExponentialPortSlider( oscGain.inputB ) ); oscPanel.validate(); validate(); } public void start() { synth = JSyn.createSynthesizer(); // Use a multiplier for gain control and so we can hook up to the scope // from a single unit. synth.add( oscGain = new Multiply() ); oscGain.inputB.setup( 0.02, 0.5, 1.0 ); oscGain.inputB.setName( "Amplitude" ); synth.add( freqRamp = new LinearRamp() ); freqRamp.input.setup( 50.0, 300.0, 20000.0 ); freqRamp.input.setName( "Frequency" ); freqRamp.time.set( 0.1 ); // Add an output so we can hear the oscillators. synth.add( lineOut = new LineOut() ); oscGain.output.connect( lineOut.input ); setupGUI(); buttonGroup = new ButtonGroup(); addOscillator( new SineOscillator(), "Sine" ); addOscillator( new TriangleOscillator(), "Triangle" ); addOscillator( new SawtoothOscillator(), "Sawtooth" ); addOscillator( new SawtoothOscillatorBL(), "SawBL" ); addOscillator( new SawtoothOscillatorDPW(), "SawDPW" ); addOscillator( new RedNoise(), "RedNoise" ); addOscillator( new SquareOscillator(), "Square" ); addOscillator( new SquareOscillatorBL(), "SquareBL" ); addOscillator( new PulseOscillator(), "Pulse" ); addOscillator( new PulseOscillatorBL(), "PulseBL" ); addOscillator( new ImpulseOscillator(), "Impulse" ); addOscillator( new ImpulseOscillatorBL(), "ImpulseBL" ); // Start synthesizer using default stereo output at 44100 Hz. synth.start(); // Start lineOut so it can pull data from other units. lineOut.start(); // We only need to start the LineOut. It will pull data from the // oscillator. lineOut.start(); } private void addOscillator( final UnitOscillator osc, String label ) { oscillators.add( osc ); synth.add( osc ); freqRamp.output.connect( osc.frequency ); osc.amplitude.set( 1.0 ); JRadioButton checkBox = new JRadioButton( label ); buttonGroup.add( checkBox ); checkBox.addActionListener(new ActionListener() { public void actionPerformed( ActionEvent arg0 ) { // Disconnect other oscillators. oscGain.inputA.disconnectAll( 0 ); // Connect this one. osc.output.connect( oscGain.inputA ); } } ); oscPanel.add( checkBox ); } public void stop() { scope.stop(); synth.stop(); } }