All Downloads are FREE. Search and download functionalities are using the official Maven repository.

examples.be.tarsos.dsp.example.GranulatorExample Maven / Gradle / Ivy

The newest version!
package be.tarsos.dsp.example;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.sound.sampled.LineUnavailableException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioEvent;
import be.tarsos.dsp.AudioProcessor;
import be.tarsos.dsp.granulator.Granulator;
import be.tarsos.dsp.granulator.OptimizedGranulator;
import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
import be.tarsos.dsp.io.jvm.AudioPlayer;

public class GranulatorExample extends JFrame {

	/**
		 * 
		 */
	private static final long serialVersionUID = 8730005768957982611L;

	private OptimizedGranulator granulator;
	private float[] orig;
	int sampleRate = 48000;
	int bufferSize = 256;
	

	final JSlider timeStretchSlider = new JSlider(-3000, 3000);
	final JSlider pitchShiftSlider = new JSlider(-3000, 3000);
	final JSlider grainSizeSlider = new JSlider(1, 300);
	final JSlider grainIntervallSlider = new JSlider(1, 300);
	final JSlider grainRandomnesslSlider = new JSlider(0, 1000);
	final JSlider positionSlider = new JSlider(0, 20000);

	public GranulatorExample() {
		setLayout(new GridLayout(0, 2));
		final JLabel openFileLabel = new JLabel("Open file:");
		final JLabel timeStretchLabel = new JLabel("Time stretch factor (%): 100%");
		final JLabel pitchShiftLabel = new JLabel("Pitch shift factor (%): 100%");
		final JLabel grainSizeLabel = new JLabel("Grain size (ms): 100");
		final JLabel grainIntervalLabel = new JLabel("Grain interval (ms): 40");
		final JLabel grainRandomnessLabel = new JLabel("Grain randomness (%): 10");
		final JLabel positionLabel = new JLabel("Position (s): 0");
		
		
		final JFileChooser fileChooser = new JFileChooser();
		final JButton openFileButton  = new JButton("Open file...");
		openFileButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int returnVal = fileChooser.showOpenDialog(GranulatorExample.this);
	            if (returnVal == JFileChooser.APPROVE_OPTION) {
	                File file = fileChooser.getSelectedFile();
	                openFile(file.getAbsolutePath());
	            } else {
	                //canceled
	            }
			}
		});
		

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		timeStretchSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				float currentFactor = (float) timeStretchSlider.getValue() / 1000.0f;
				timeStretchLabel.setText(String.format(
						"Time stretch factor: %.1f", currentFactor * 100));
				if(granulator!=null)
				granulator.setTimestretchFactor(currentFactor);
			}
		});

		pitchShiftSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				float currentFactor = (float) pitchShiftSlider.getValue() / 1000.0f;
				pitchShiftLabel.setText(String.format(
						"Pitch shift factor: %.1f", currentFactor * 100));
				if(granulator!=null)
				granulator.setPitchShiftFactor(currentFactor);
			}
		});
		
		grainIntervallSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				int grainInterval = grainIntervallSlider.getValue();
				grainIntervalLabel.setText(String.format(
						"Grain interval (ms): %d", grainInterval));
				if(granulator!=null)
				granulator.setGrainInterval(grainInterval);
			}
		});
		
		grainSizeSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				int grainSize = grainSizeSlider.getValue();
				grainSizeLabel.setText(String.format(
						"Grain size (ms): %d", grainSize));
				if(granulator!=null)
				granulator.setGrainSize(grainSize);
			}
		});
		
		grainRandomnesslSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				float grainRandomness = (float) grainRandomnesslSlider.getValue() / 1000.0f;
				grainRandomnessLabel.setText(String.format(
						"Grain randomness (%%): %.1f", grainRandomness * 100));
				if(granulator!=null)
				granulator.setGrainRandomness(grainRandomness);
			}
		});
		
		positionSlider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent arg0) {
				float position = (float) positionSlider.getValue() / 1000.0f;
				positionLabel.setText(String.format("Position (s): %.3f", position));
				if(granulator!=null)
				granulator.setPosition(position);
			}
		});

		timeStretchSlider.setValue(1000);
		pitchShiftSlider.setValue(950);
		positionSlider.setValue(0);
		grainRandomnesslSlider.setValue(0);
		grainSizeSlider.setValue(100);
		grainIntervallSlider.setValue(70);
		this.add(openFileLabel);
		this.add(openFileButton);
		this.add(timeStretchLabel);
		this.add(timeStretchSlider);
		this.add(pitchShiftLabel);
		this.add(pitchShiftSlider);
		this.add(grainIntervalLabel);
		this.add(grainIntervallSlider);
		this.add(grainSizeLabel);
		this.add(grainSizeSlider);
		this.add(grainRandomnessLabel);
		this.add(grainRandomnesslSlider);
		this.add(positionLabel);
		this.add(positionSlider);
		
		openFile("/home/joren/Desktop/sort/christina_40s-80s.wav");
	}
	
	private void openFile(String audioFile){
		AudioDispatcher d = AudioDispatcherFactory.fromPipe(audioFile, sampleRate,bufferSize,0);
		granulator = new OptimizedGranulator(sampleRate, bufferSize);
		d.addAudioProcessor(new AudioProcessor() {

			@Override
			public void processingFinished() {
			}

			@Override
			public boolean process(AudioEvent audioEvent) {
				orig = audioEvent.getFloatBuffer();
				return true;
			}
		});
		d.addAudioProcessor(granulator);
		try {
			d.addAudioProcessor(new AudioPlayer(d.getFormat()));
		} catch (LineUnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		d.addAudioProcessor(new AudioProcessor() {

			@Override
			public void processingFinished() {
				// TODO Auto-generated method stub
			}

			@Override
			public boolean process(AudioEvent audioEvent) {
				audioEvent.setFloatBuffer(orig);
				return true;
			}
		});

		granulator.setGrainInterval(grainIntervallSlider.getValue());
		granulator.setTimestretchFactor(timeStretchSlider.getValue()/1000.0f);
		granulator.setPitchShiftFactor(pitchShiftSlider.getValue()/1000.0f);
		granulator.setPosition(positionSlider.getValue()/1000f);
		granulator.setGrainRandomness(grainRandomnesslSlider.getValue()/100.0f);
		
		new Thread(d).start();

	}

	public static void main(String[] args) {
		GranulatorExample g = new GranulatorExample();
		g.pack();
		g.setVisible(true);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy