be.tarsos.dsp.ui.layers.WaveFormLayer Maven / Gradle / Ivy
/*
* _______ _____ _____ _____
* |__ __| | __ \ / ____| __ \
* | | __ _ _ __ ___ ___ ___| | | | (___ | |__) |
* | |/ _` | '__/ __|/ _ \/ __| | | |\___ \| ___/
* | | (_| | | \__ \ (_) \__ \ |__| |____) | |
* |_|\__,_|_| |___/\___/|___/_____/|_____/|_|
*
* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*
* -------------------------------------------------------------
*
* Info: http://0110.be/tag/TarsosDSP
* Github: https://github.com/JorenSix/TarsosDSP
* Releases: http://0110.be/releases/TarsosDSP/
*
* TarsosDSP includes modified source code by various authors,
* for credits and info, see README.
*
*/
package be.tarsos.dsp.ui.layers;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.UnsupportedAudioFileException;
import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioEvent;
import be.tarsos.dsp.AudioProcessor;
import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
import be.tarsos.dsp.ui.Axis;
import be.tarsos.dsp.ui.CoordinateSystem;
public class WaveFormLayer implements Layer {
private final Color waveFormColor;
private final CoordinateSystem cs;
private final File audioFile;
private float[] samples;
private float sampleRate;
public WaveFormLayer(CoordinateSystem cs,File audioFile) {
waveFormColor = Color.black;
this.cs = cs;
this.audioFile = audioFile;
initialise();
}
public void draw(Graphics2D graphics) {
graphics.setColor(waveFormColor);
this.drawWaveForm(graphics);
}
private void drawWaveForm(Graphics2D graphics) {
final int waveFormXMin = (int) cs.getMin(Axis.X);
final int waveFormXMax = (int) cs.getMax(Axis.X);
graphics.setColor(Color.GRAY);
graphics.drawLine(waveFormXMin, 0, waveFormXMax,0);
graphics.setColor(Color.BLACK);
if (samples != null && samples.length > 0) {
//graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
final int waveFormHeightInUnits = (int) cs.getDelta(Axis.Y);
final float lengthInMs = samples.length/sampleRate*1000;
final int amountOfSamples = samples.length;
float sampleCalculateFactor = amountOfSamples / lengthInMs;
int amplitudeFactor = waveFormHeightInUnits / 2;
//every millisecond:
int step = 1;
for (int i = Math.max(0, waveFormXMin); i < Math.min(waveFormXMax, lengthInMs); i+= step) {
int index = (int) (i * sampleCalculateFactor);
if (index < samples.length) {
graphics.drawLine(i, 0, i,(int) (samples[index] * amplitudeFactor));
}
}
//graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
}
}
public void initialise() {
try {
AudioDispatcher adp;
//max 20min
adp = AudioDispatcherFactory.fromFile(audioFile,44100*60*20, 0);
adp.setZeroPadLastBuffer(false);
sampleRate = adp.getFormat().getSampleRate();
adp.addAudioProcessor(new AudioProcessor() {
public void processingFinished() {
}
public boolean process(AudioEvent audioEvent) {
float[] audioFloatBuffer = audioEvent.getFloatBuffer();
WaveFormLayer.this.samples = audioFloatBuffer.clone();
return true;
}
});
new Thread(adp).start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
}
@Override
public String getName() {
return "Waveform layer";
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy