import controlP5.*; import ddf.minim.signals.*; import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.ugens.*; Minim minim; AudioOutput out; Pan panLeft; Oscil oscLeft; Oscil lfoLeft; Constant freqLeft; Pan panRight; Oscil oscRight; Oscil lfoRight; Constant freqRight; ControlP5 gui; Toggle linkToggle; Toggle linkLFOToggle; Slider leftSlider; Slider leftLFOSlider; Slider rightSlider; Slider rightLFOSlider; void setup() { size( 640, 480 ); minim = new Minim(this); out = minim.getLineOut(); AudioSample sample = minim.loadSample("hydra_loop.aif"); panLeft = new Pan(-1.f); oscLeft = new Oscil( 0.08f, 1.f, new Wavetable( sample.getChannel(AudioSample.LEFT) )); lfoLeft = new Oscil( 0.0f, 0.02f, Waves.SINE ); freqLeft = new Constant( 0.08f ); Summer sum = new Summer(); lfoLeft.patch(sum); freqLeft.patch(sum); sum.patch( oscLeft.frequency ); panRight = new Pan(1.f); oscRight = new Oscil( 0.08f, 1.f, new Wavetable( sample.getChannel(AudioSample.RIGHT) )); lfoRight = new Oscil( 0.0f, 0.02f, Waves.SINE ); freqRight = new Constant( 0.08f ); sum = new Summer(); lfoRight.patch(sum); freqRight.patch(sum); sum.patch( oscRight.frequency ); oscLeft.patch(panLeft).patch(out); oscRight.patch(panRight).patch(out); gui = new ControlP5(this); gui.addBang("sync", 10, 200, 30, 30); linkToggle = gui.addToggle("linkFREQ", true, 10, 250, 30, 30); linkLFOToggle = gui.addToggle("linkLFO", true, 10, 300, 30, 30); leftSlider = gui.addSlider("leftFreq", -0.1f, 0.1f, 0.08f, 100, 200, 30, 250); leftSlider.setSliderMode(Slider.FLEXIBLE); rightSlider = gui.addSlider("rightFreq", -0.1f, 0.1f, 0.08f, 200, 200, 30, 250); rightSlider.setSliderMode(Slider.FLEXIBLE); leftLFOSlider = gui.addSlider("leftLFOFreq", 0.f, 2.f, 0.0f, 300, 200, 30, 250); leftLFOSlider.setSliderMode(Slider.FLEXIBLE); rightLFOSlider = gui.addSlider("rightLFOFreq", 0.f, 2.f, 0.0f, 400, 200, 30, 250); rightLFOSlider.setSliderMode(Slider.FLEXIBLE); } public void leftFreq( float value ) { println("leftFreq to " + value); freqLeft.setConstant( value ); if ( linkToggle.getState() ) { println("Updating rightSlider"); rightSlider.setBroadcast( false ); rightSlider.setValue( value ); freqRight.setConstant( value ); rightSlider.setBroadcast( true ); } } public void rightFreq( float value ) { println("rightFreq to " + value); freqRight.setConstant( value ); if ( linkToggle.getState() ) { leftSlider.setBroadcast( false ); leftSlider.setValue( value ); freqLeft.setConstant( value ); leftSlider.setBroadcast( true ); } } public void leftLFOFreq( float value ) { lfoLeft.setFrequency( value ); if ( linkLFOToggle.getState() ) { rightLFOSlider.setBroadcast( false ); rightLFOSlider.setValue( value ); lfoRight.setFrequency( value ); rightLFOSlider.setBroadcast( true ); } if ( value == 0.f ) { lfoLeft.reset(); } } public void rightLFOFreq( float value ) { lfoRight.setFrequency( value ); if ( linkLFOToggle.getState() ) { leftLFOSlider.setBroadcast( false ); leftLFOSlider.setValue( value ); lfoLeft.setFrequency( value ); leftLFOSlider.setBroadcast( true ); } if ( value == 0.f ) { lfoRight.reset(); } } public void sync() { oscLeft.reset(); oscRight.reset(); } void draw() { background( 0 ); stroke( 255 ); for( int i = 0; i < out.bufferSize() - 1; i++ ) { float x1 = map( i, 0, out.bufferSize(), 0, width ); float x2 = map( i+1, 0, out.bufferSize(), 0, width ); line( x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50); line( x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50); } } void stop() { out.close(); minim.stop(); super.stop(); }