From 170406faf5af87aa7c8e1e51b96c31c8ea62e461 Mon Sep 17 00:00:00 2001 From: icalvin102 Date: Thu, 31 Jan 2019 17:35:07 +0100 Subject: [PATCH 1/3] added Waveform.java and JSynWaveform.java --- src/processing/sound/JSynWaveform.java | 37 +++++++++ src/processing/sound/Waveform.java | 105 +++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/processing/sound/JSynWaveform.java create mode 100644 src/processing/sound/Waveform.java diff --git a/src/processing/sound/JSynWaveform.java b/src/processing/sound/JSynWaveform.java new file mode 100644 index 0000000..d98b55f --- /dev/null +++ b/src/processing/sound/JSynWaveform.java @@ -0,0 +1,37 @@ +package processing.sound; + +import java.util.Arrays; + +import com.jsyn.data.FloatSample; +import com.jsyn.unitgen.FixedRateMonoWriter; + +/** + * This class copies all input to an audio buffer of the given size and returns it. + * + * @author icalvin102 + */ +class JSynWaveform extends FixedRateMonoWriter { + + private FloatSample buffer; + private double[] wave; + + protected JSynWaveform(int bufferSize) { + super(); + this.buffer = new FloatSample(bufferSize); + this.wave = new double[bufferSize]; + + // write any connected input into the output buffer ad infinitum + this.dataQueue.queueLoop(this.buffer); + } + + protected void calculateWaveform(float[] target) { + // get position currently being written to + int pos = (int) this.dataQueue.getFrameCount() % this.buffer.getNumFrames(); + for (int i = 0; i < this.buffer.getNumFrames(); i++) { + this.wave[i] = this.buffer.readDouble((pos + i) % this.buffer.getNumFrames()); + } + for (int i = 0; i < target.length; i++) { + target[i] = (float) (2 * this.wave[i]); + } + } +} diff --git a/src/processing/sound/Waveform.java b/src/processing/sound/Waveform.java new file mode 100644 index 0000000..dae5dbd --- /dev/null +++ b/src/processing/sound/Waveform.java @@ -0,0 +1,105 @@ +package processing.sound; + +import com.jsyn.ports.UnitOutputPort; + +import processing.core.PApplet; + +/** + * This is a Waveform analyzer. It returns the waveform of the + * of an audio stream the moment it is queried with the analyze() + * method. + * + * @author icalvin102 + * + * @webref sound + **/ +public class Waveform extends Analyzer { + + public float[] data; + + private JSynWaveform waveform; + + public PApplet app; + + public Waveform(PApplet parent) { + this(parent, 512); + } + + /** + * @param parent + * typically use "this" + * @param samples + * number of waveform samples as an integer (default 512). + * This parameter needs to be a power of 2 (e.g. 16, 32, 64, 128, + * ...). + * @webref sound + */ + public Waveform(PApplet parent, int samples) { + super(parent); + app = parent; + if (samples < 0 || Integer.bitCount(samples) != 1) { + // TODO throw RuntimeException? + Engine.printError("number of waveform frames needs to be a power of 2"); + } else { + // FFT buffer size is twice the number of frequency bands + this.waveform = new JSynWaveform(samples); + this.data = new float[samples]; + } + } + + protected void removeInput() { + this.waveform.input.disconnectAll(); + this.input = null; + } + + protected void setInput(UnitOutputPort input) { + // superclass makes sure that input unit is actually playing, just connect it + Engine.getEngine().add(this.waveform); + this.waveform.input.connect(input); + this.waveform.start(); + } + + /** + * Gets the content of the current audiobuffer from the input source, writes it + * into this Waveform's `data` array, and returns it. + * + * @return the current audiobuffer of the input source. The array has as + * many elements as this Waveform analyzer's number of samples + */ + public float[] analyze() { + return this.analyze(this.data); + } + + /** + * Gets the content of the current audiobuffer from the input source. + * + * @param value + * an array with as many elements as this Waveform analyzer's number of + * samples + * @return the current audiobuffer of the input source. The array has as + * many elements as this Waveform analyzer's number of samples + * @webref sound + **/ + public float[] analyze(float[] value) { + if (this.input == null) { + Engine.printWarning("this Waveform has no sound source connected to it, nothing to analyze"); + } + this.waveform.calculateWaveform(value); + return value; + } + + // Below are just duplicated methods from superclasses which are required + // for the online reference to build the corresponding pages. + + /** + * Define the audio input for the analyzer. + * + * @param input + * the input sound source. Can be an oscillator, noise generator, + * SoundFile or AudioIn. + * @webref sound + **/ + public void input(SoundObject input) { + super.input(input); + } +} From aaa0a1aaf84dc6303db4424fa0ed5c3f5f2b6a28 Mon Sep 17 00:00:00 2001 From: icalvin102 Date: Thu, 31 Jan 2019 17:36:58 +0100 Subject: [PATCH 2/3] added AudioWaveform example --- .../Analysis/AudioWaveform/AudioWaveform.pde | 48 ++++++++++++++++++ .../Analysis/AudioWaveform/data/beat.aiff | Bin 0 -> 694128 bytes 2 files changed, 48 insertions(+) create mode 100644 examples/Analysis/AudioWaveform/AudioWaveform.pde create mode 100644 examples/Analysis/AudioWaveform/data/beat.aiff diff --git a/examples/Analysis/AudioWaveform/AudioWaveform.pde b/examples/Analysis/AudioWaveform/AudioWaveform.pde new file mode 100644 index 0000000..7cd6027 --- /dev/null +++ b/examples/Analysis/AudioWaveform/AudioWaveform.pde @@ -0,0 +1,48 @@ +/** + * This sketch shows how to use the Waveform class to analyze a stream + * of sound. Change the number of samples to get a longer/shorter part of the waveform. + */ + +import processing.sound.*; + +// Declare the sound source and Waveform analyzer variables +SoundFile sample; +Waveform waveform; + +// Define how many samples of the Waveform you want to use (must be a power of two) +int samples = 128; + +public void setup() { + size(640, 360); + background(255); + + // Load and play a soundfile and loop it. + sample = new SoundFile(this, "beat.aiff"); + sample.loop(); + + // Create the Waveform analyzer and connect the playing soundfile to it. + waveform = new Waveform(this, samples); + waveform.input(sample); +} + +public void draw() { + // Set background color, noFill and stroke style + background(0); + stroke(255); + strokeWeight(2); + noFill(); + + // Perform the analysis + waveform.analyze(); + + beginShape(); + for(int i = 0; i < samples; i++){ + // Draw current data of the waveform + // Each sample in the data array is between -1 and +1 + vertex( + map(i, 0, samples, 0, width), + map(waveform.data[i], -1, 1, 0, height) + ); + } + endShape(); +} diff --git a/examples/Analysis/AudioWaveform/data/beat.aiff b/examples/Analysis/AudioWaveform/data/beat.aiff new file mode 100644 index 0000000000000000000000000000000000000000..017b7ce235be04821ef706eab00e445d132b2656 GIT binary patch literal 694128 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