aboutsummaryrefslogtreecommitdiffstats
path: root/tests/com
diff options
context:
space:
mode:
authorRubbaBoy <[email protected]>2020-07-06 02:33:28 -0400
committerPhil Burk <[email protected]>2020-10-30 11:19:34 -0700
commit46888fae6eb7b1dd386f7af7d101ead99ae61981 (patch)
tree8969bbfd68d2fb5c0d8b86da49ec2eca230a72ab /tests/com
parentc51e92e813dd481603de078f0778e1f75db2ab05 (diff)
Restructured project, added gradle, JUnit, logger, and more
Added Gradle (and removed ant), modernized testing via the JUnit framework, moved standalone examples from the tests directory to a separate module, removed sparsely used Java logger and replaced it with SLF4J. More work could be done, however this is a great start to greatly improving the health of the codebase.
Diffstat (limited to 'tests/com')
-rw-r--r--tests/com/jsyn/SynthTestSuite.java76
-rw-r--r--tests/com/jsyn/benchmarks/BenchJSyn.java228
-rw-r--r--tests/com/jsyn/data/TestShortSample.java78
-rw-r--r--tests/com/jsyn/engine/TestAudioOutput.java86
-rw-r--r--tests/com/jsyn/engine/TestDevices.java69
-rw-r--r--tests/com/jsyn/engine/TestEngine.java213
-rw-r--r--tests/com/jsyn/engine/TestFifo.java250
-rw-r--r--tests/com/jsyn/engine/TestWaveFileReadWrite.java107
-rw-r--r--tests/com/jsyn/examples/AudioPassThrough.java71
-rw-r--r--tests/com/jsyn/examples/ChebyshevSong.java181
-rw-r--r--tests/com/jsyn/examples/CircuitTester.java113
-rw-r--r--tests/com/jsyn/examples/CustomCubeUnit.java48
-rw-r--r--tests/com/jsyn/examples/DualOscilloscope.java164
-rw-r--r--tests/com/jsyn/examples/EditEnvelope1.java148
-rw-r--r--tests/com/jsyn/examples/FFTPassthrough.java100
-rw-r--r--tests/com/jsyn/examples/GoogleWaveOscillator.java73
-rw-r--r--tests/com/jsyn/examples/HearDAHDSR.java125
-rw-r--r--tests/com/jsyn/examples/HearMoogFilter.java208
-rw-r--r--tests/com/jsyn/examples/HearSinePM.java129
-rw-r--r--tests/com/jsyn/examples/HearSpectralFilter.java206
-rw-r--r--tests/com/jsyn/examples/ListAudioDevices.java46
-rw-r--r--tests/com/jsyn/examples/LongEcho.java123
-rw-r--r--tests/com/jsyn/examples/MonoPassThrough.java66
-rw-r--r--tests/com/jsyn/examples/NotesToTone.java214
-rw-r--r--tests/com/jsyn/examples/PlayChords.java180
-rw-r--r--tests/com/jsyn/examples/PlayCustomUnit.java73
-rw-r--r--tests/com/jsyn/examples/PlayFunction.java91
-rw-r--r--tests/com/jsyn/examples/PlayGrains.java208
-rw-r--r--tests/com/jsyn/examples/PlayMIDI.java241
-rw-r--r--tests/com/jsyn/examples/PlayNotes.java103
-rw-r--r--tests/com/jsyn/examples/PlayPartials.java110
-rw-r--r--tests/com/jsyn/examples/PlaySample.java121
-rw-r--r--tests/com/jsyn/examples/PlaySampleCrossfade.java183
-rw-r--r--tests/com/jsyn/examples/PlaySampleWaveShaper.java112
-rw-r--r--tests/com/jsyn/examples/PlaySegmentedEnvelope.java151
-rw-r--r--tests/com/jsyn/examples/PlaySegmentedEnvelopeCallback.java114
-rw-r--r--tests/com/jsyn/examples/PlaySequence.java85
-rw-r--r--tests/com/jsyn/examples/PlayTone.java80
-rw-r--r--tests/com/jsyn/examples/RecordSineSweep.java136
-rw-r--r--tests/com/jsyn/examples/SampleHoldNoteBlaster.java153
-rw-r--r--tests/com/jsyn/examples/SawFaders.java104
-rw-r--r--tests/com/jsyn/examples/SeeGoogleWave.java111
-rw-r--r--tests/com/jsyn/examples/SeeOscillators.java220
-rw-r--r--tests/com/jsyn/examples/ShowWaves.java121
-rw-r--r--tests/com/jsyn/examples/SwarmOfOscillators.java146
-rw-r--r--tests/com/jsyn/examples/UseMidiKeyboard.java121
-rw-r--r--tests/com/jsyn/examples/WindCircuit.java90
-rw-r--r--tests/com/jsyn/midi/TestMidiLoop.java98
-rw-r--r--tests/com/jsyn/ports/TestQueuedDataPort.java525
-rw-r--r--tests/com/jsyn/ports/TestSequentialData.java50
-rw-r--r--tests/com/jsyn/ports/TestSet.java96
-rw-r--r--tests/com/jsyn/research/BenchMultiThreading.java143
-rw-r--r--tests/com/jsyn/research/RecordVariousRamps.java183
-rw-r--r--tests/com/jsyn/research/lambdas/LambdaUnits.java22
-rw-r--r--tests/com/jsyn/swing/TestRangeModels.java60
-rw-r--r--tests/com/jsyn/unitgen/CalibrateMoogFilter.java141
-rw-r--r--tests/com/jsyn/unitgen/EnablingGate.java51
-rw-r--r--tests/com/jsyn/unitgen/NonRealTimeTestCase.java48
-rw-r--r--tests/com/jsyn/unitgen/RecordMoogFilter.java153
-rw-r--r--tests/com/jsyn/unitgen/TestConnections.java113
-rw-r--r--tests/com/jsyn/unitgen/TestDelay.java73
-rw-r--r--tests/com/jsyn/unitgen/TestEnable.java78
-rw-r--r--tests/com/jsyn/unitgen/TestEnvelopeAttackDecay.java126
-rw-r--r--tests/com/jsyn/unitgen/TestEnvelopeDAHDSR.java339
-rw-r--r--tests/com/jsyn/unitgen/TestFunction.java78
-rw-r--r--tests/com/jsyn/unitgen/TestMath.java413
-rw-r--r--tests/com/jsyn/unitgen/TestRamps.java196
-rw-r--r--tests/com/jsyn/unitgen/TestUnitGate.java80
-rw-r--r--tests/com/jsyn/util/DebugSampleLoader.java138
-rw-r--r--tests/com/jsyn/util/TestFFT.java207
-rw-r--r--tests/com/jsyn/util/TestPseudoRandom.java82
-rw-r--r--tests/com/jsyn/util/TestVoiceAllocator.java111
72 files changed, 0 insertions, 9780 deletions
diff --git a/tests/com/jsyn/SynthTestSuite.java b/tests/com/jsyn/SynthTestSuite.java
deleted file mode 100644
index 958bd4f..0000000
--- a/tests/com/jsyn/SynthTestSuite.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import com.jsyn.data.TestShortSample;
-import com.jsyn.engine.TestDevices;
-import com.jsyn.engine.TestEngine;
-import com.jsyn.engine.TestFifo;
-import com.jsyn.engine.TestWaveFileReadWrite;
-import com.jsyn.ports.TestQueuedDataPort;
-import com.jsyn.ports.TestSet;
-import com.jsyn.unitgen.TestEnable;
-import com.jsyn.unitgen.TestEnvelopeAttackDecay;
-import com.jsyn.unitgen.TestEnvelopeDAHDSR;
-import com.jsyn.unitgen.TestFunction;
-import com.jsyn.unitgen.TestRamps;
-import com.jsyn.util.TestFFT;
-import com.jsyn.util.TestVoiceAllocator;
-
-/**
- * Test new pure Java JSyn API.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class SynthTestSuite {
-
- public static Test suite() {
-
- TestSuite suite = new TestSuite();
-
- suite.addTestSuite(TestEngine.class);
- suite.addTestSuite(TestSet.class);
- // suite.addTestSuite( TestMath.class );
- suite.addTestSuite(TestRamps.class);
- suite.addTestSuite(TestEnvelopeAttackDecay.class);
- suite.addTestSuite(TestEnvelopeDAHDSR.class);
- suite.addTestSuite(TestShortSample.class);
- suite.addTestSuite(TestDevices.class);
- suite.addTestSuite(TestQueuedDataPort.class);
- suite.addTestSuite(TestFifo.class);
- suite.addTestSuite(TestEnable.class);
- suite.addTestSuite(TestFunction.class);
- suite.addTestSuite(TestFFT.class);
- // suite.addTestSuite( TestSampleLoader.class );
- suite.addTestSuite(TestWaveFileReadWrite.class);
- suite.addTestSuite(TestVoiceAllocator.class);
- // suite.addTestSuite(TestWrapAroundBug.class);
-
- return suite;
- }
-
- /**
- * Runs the test suite using the textual runner.
- */
- public static void main(String[] args) {
- junit.textui.TestRunner.run(suite());
- System.exit(0);
- }
-}
diff --git a/tests/com/jsyn/benchmarks/BenchJSyn.java b/tests/com/jsyn/benchmarks/BenchJSyn.java
deleted file mode 100644
index 5b8d128..0000000
--- a/tests/com/jsyn/benchmarks/BenchJSyn.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2013 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- */
-
-package com.jsyn.benchmarks;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.PitchDetector;
-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.UnitOscillator;
-import com.softsynth.math.FourierMath;
-
-/**
- * @author Phil Burk (C) 2013 Mobileer Inc
- */
-public class BenchJSyn {
- private Synthesizer synth;
- private long startTime;
- private long endTime;
- private PassThrough pass;
-
- public void run() {
- try {
- // Run multiple times to see if HotSpot compiler or cache makes a difference.
- for (int i = 0; i < 4; i++) {
- benchmark();
- }
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- private void benchmark() throws InstantiationException, IllegalAccessException,
- InterruptedException {
- double realTime = 10.0;
- int count = 40;
-
- // benchFFTDouble();
- // benchFFTFloat();
- /*
- * realTime = 20.0; benchmarkOscillator(SawtoothOscillator.class, count, realTime);
- * benchmarkOscillator(SawtoothOscillatorDPW.class, count, realTime);
- * benchmarkOscillator(SawtoothOscillatorBL.class, count, realTime);
- */
- benchmarkOscillator(SquareOscillator.class, count, realTime);
- benchmarkOscillator(SquareOscillatorBL.class, count, realTime);
-
- benchmarkOscillator(SineOscillator.class, count, realTime);
- benchmarkPitchDetector(count, realTime);
-
- }
-
- public void benchFFTDouble() {
- int size = 2048;
- int bin = 5;
- int count = 20000;
- double[] ar = new double[size];
- double[] ai = new double[size];
- double[] magnitudes = new double[size];
-
- double amplitude = 1.0;
- addSineWave(size, bin, ar, amplitude);
- System.out.println("Bench double FFT");
- startTiming();
- for (int i = 0; i < count; i++) {
- FourierMath.transform(1, size, ar, ai);
- }
-
- endTiming(FourierMath.class, count, size / (2.0 * 44100));
- FourierMath.calculateMagnitudes(ar, ai, magnitudes);
-
- assert (magnitudes[bin - 1] < 0.001);
- assert (magnitudes[bin] > 0.5);
- assert (magnitudes[bin + 1] < 0.001);
-
- }
-
- public void benchFFTFloat() {
- int size = 2048;
- int bin = 5;
- int count = 20000;
- float[] ar = new float[size];
- float[] ai = new float[size];
- float[] magnitudes = new float[size];
-
- float amplitude = 1.0f;
- addSineWave(size, bin, ar, amplitude);
-
- System.out.println("Bench float FFT");
- startTiming();
- for (int i = 0; i < count; i++) {
- FourierMath.transform(1, size, ar, ai);
- }
-
- endTiming(FourierMath.class, count, size / (2.0 * 44100));
- FourierMath.calculateMagnitudes(ar, ai, magnitudes);
-
- assert (magnitudes[bin - 1] < 0.001);
- assert (magnitudes[bin] > 0.5);
- assert (magnitudes[bin + 1] < 0.001);
-
- }
-
- private void addSineWave(int size, int bin, double[] ar, double amplitude) {
- double phase = 0.0;
- double phaseIncrement = 2.0 * Math.PI * bin / size;
- for (int i = 0; i < size; i++) {
- ar[i] += Math.sin(phase) * amplitude;
- // System.out.println( i + " = " + ar[i] );
- phase += phaseIncrement;
- }
- }
-
- private void addSineWave(int size, int bin, float[] ar, float amplitude) {
- float phase = 0.0f;
- float phaseIncrement = (float) (2.0 * Math.PI * bin / size);
- for (int i = 0; i < size; i++) {
- ar[i] += (float) Math.sin(phase) * amplitude;
- // System.out.println( i + " = " + ar[i] );
- phase += phaseIncrement;
- }
- }
-
- private void stopSynth() {
- synth.stop();
- }
-
- private void startSynth() {
- synth = JSyn.createSynthesizer(); // Mac
- // synth = JSyn.createSynthesizer( new JSynAndroidAudioDevice() ); // Android
- synth.setRealTime(false);
- pass = new PassThrough();
- synth.add(pass);
- synth.start();
- pass.start();
- }
-
- private void benchmarkOscillator(Class<?> clazz, int count, double realTime)
- throws InstantiationException, IllegalAccessException, InterruptedException {
- startSynth();
- for (int i = 0; i < count; i++) {
- UnitOscillator osc = (UnitOscillator) clazz.newInstance();
- osc.output.connect(pass.input);
- synth.add(osc);
- }
- startTiming();
- synth.sleepFor(realTime);
- endTiming(clazz, count, realTime);
- stopSynth();
- }
-
- private void benchmarkPitchDetector(int count, double realTime) throws InstantiationException,
- IllegalAccessException, InterruptedException {
- startSynth();
-
- PitchDetector detector = new PitchDetector();
- synth.add(detector);
- double frequency = 198.0;
- double period = synth.getFrameRate() / frequency;
- // simple harmonic synthesis
- for (int i = 0; i < count; i++) {
- SineOscillator osc = new SineOscillator();
- synth.add(osc);
- osc.frequency.set(frequency * (i + 1));
- osc.amplitude.set(0.5 * (1.0 - (i * 0.2)));
- osc.output.connect(detector.input);
- }
- detector.start();
- startTiming();
- synth.sleepFor(realTime);
- endTiming(PitchDetector.class, count, realTime);
-
- double measuredPeriod = detector.period.getValue();
- double confidence = detector.confidence.getValue();
- System.out.println("period = " + period + ", measured = " + measuredPeriod
- + ", confidence = " + confidence);
- if (confidence > 0.1) {
- assert (Math.abs(measuredPeriod - period) < 0.1);
- }
- stopSynth();
- }
-
- private void endTiming(Class<?> clazz, int count, double realTime) {
- endTime = System.nanoTime();
- double elapsedTime = (endTime - startTime) * 1E-9;
- double percent = 100.0 * elapsedTime / (realTime * count);
- System.out.printf("%32s took %5.3f/%d seconds to process %5.4f of audio = %6.3f%c.\n",
- clazz.getSimpleName(), elapsedTime, count, realTime, percent, '%');
- }
-
- private void startTiming() {
- startTime = System.nanoTime();
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- new BenchJSyn().run();
- }
-
-}
diff --git a/tests/com/jsyn/data/TestShortSample.java b/tests/com/jsyn/data/TestShortSample.java
deleted file mode 100644
index 3837c19..0000000
--- a/tests/com/jsyn/data/TestShortSample.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.data;
-
-import junit.framework.TestCase;
-
-/**
- * @author Phil Burk, (C) 2009 Mobileer Inc
- */
-public class TestShortSample extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testBytes() {
- byte[] bar = {
- 18, -3
- };
- short s = (short) ((bar[0] << 8) | (bar[1] & 0xFF));
- assertEquals("A", 0x12FD, s);
- }
-
- public void testReadWrite() {
- short[] data = {
- 123, 456, -789, 111, 20000, -32768, 32767, 0, 9876
- };
- ShortSample sample = new ShortSample(data.length, 1);
- assertEquals("Sample numFrames", data.length, sample.getNumFrames());
-
- // Write and read entire sample.
- sample.write(data);
- short[] buffer = new short[data.length];
- sample.read(buffer);
-
- for (int i = 0; i < data.length; i++) {
- assertEquals("read = write", data[i], buffer[i]);
- }
-
- // Write and read part of an array.
- short[] partial = {
- 333, 444, 555, 666, 777
- };
-
- sample.write(2, partial, 1, 3);
- sample.read(1, buffer, 1, 5);
-
- for (int i = 0; i < data.length; i++) {
- if ((i >= 2) && (i <= 4)) {
- assertEquals("partial", partial[i - 1], buffer[i]);
- } else {
- assertEquals("read = write", data[i], buffer[i]);
- }
- }
-
- }
-
-}
diff --git a/tests/com/jsyn/engine/TestAudioOutput.java b/tests/com/jsyn/engine/TestAudioOutput.java
deleted file mode 100644
index a95d426..0000000
--- a/tests/com/jsyn/engine/TestAudioOutput.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.engine;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.devices.AudioDeviceOutputStream;
-import com.jsyn.devices.javasound.JavaSoundAudioDevice;
-
-/**
- * @author Phil Burk, (C) 2009 Mobileer Inc
- */
-public class TestAudioOutput extends TestCase {
-
- SynthesisEngine synthesisEngine;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testMonoSine() throws IOException {
- System.out.println("Test mono output.");
- final int FRAMES_PER_BUFFER = 128;
- final int SAMPLES_PER_FRAME = 1;
- double[] buffer = new double[FRAMES_PER_BUFFER * SAMPLES_PER_FRAME];
- AudioDeviceManager audioDevice = new JavaSoundAudioDevice();
- AudioDeviceOutputStream audioOutput = audioDevice.createOutputStream(
- audioDevice.getDefaultOutputDeviceID(), 44100, SAMPLES_PER_FRAME);
- for (int i = 0; i < FRAMES_PER_BUFFER; i++) {
- double angle = (i * Math.PI * 2.0) / FRAMES_PER_BUFFER;
- buffer[i] = Math.sin(angle);
- }
- audioOutput.start();
- for (int i = 0; i < 1000; i++) {
- audioOutput.write(buffer);
- }
- audioOutput.stop();
-
- }
-
- public void testStereoSine() throws IOException {
- System.out.println("Test stereo output.");
- final int FRAMES_PER_BUFFER = 128;
- final int SAMPLES_PER_FRAME = 2;
- double[] buffer = new double[FRAMES_PER_BUFFER * SAMPLES_PER_FRAME];
- AudioDeviceManager audioDevice = new JavaSoundAudioDevice();
- AudioDeviceOutputStream audioOutput = audioDevice.createOutputStream(
- audioDevice.getDefaultOutputDeviceID(), 44100, SAMPLES_PER_FRAME);
- int bi = 0;
- for (int i = 0; i < FRAMES_PER_BUFFER; i++) {
- double angle = (i * Math.PI * 2.0) / FRAMES_PER_BUFFER;
- buffer[bi++] = Math.sin(angle);
- buffer[bi++] = Math.sin(angle);
- }
- audioOutput.start();
- for (int i = 0; i < 1000; i++) {
- audioOutput.write(buffer);
- }
- audioOutput.stop();
-
- }
-
-}
diff --git a/tests/com/jsyn/engine/TestDevices.java b/tests/com/jsyn/engine/TestDevices.java
deleted file mode 100644
index 56f2c1f..0000000
--- a/tests/com/jsyn/engine/TestDevices.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.engine;
-
-import junit.framework.TestCase;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.AudioDeviceFactory;
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.unitgen.LineIn;
-import com.jsyn.unitgen.LineOut;
-
-public class TestDevices extends TestCase {
- // Test audio input and output simultaneously.
- public void testPassThrough() {
- Synthesizer synth;
- LineIn lineIn;
- LineOut lineOut;
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer(AudioDeviceFactory.createAudioDeviceManager(true));
- // Add an audio input.
- synth.add(lineIn = new LineIn());
- // Add an audio output.
- synth.add(lineOut = new LineOut());
- // Connect the input to the output.
- lineIn.output.connect(0, lineOut.input, 0);
- lineIn.output.connect(1, lineOut.input, 1);
-
- // Both stereo.
- int numInputChannels = 2;
- int numOutputChannels = 2;
- synth.start(44100, AudioDeviceManager.USE_DEFAULT_DEVICE, numInputChannels,
- AudioDeviceManager.USE_DEFAULT_DEVICE, numOutputChannels);
-
- // We only need to start the LineOut. It will pull data from the LineIn.
- lineOut.start();
- System.out.println("Audio passthrough started.");
- // Sleep a while.
- double sleepTime = 2.0;
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + sleepTime);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- double synthTime = synth.getCurrentTime();
- assertEquals("Time has advanced. " + synthTime, sleepTime, synthTime, 0.2);
- // Stop everything.
- synth.stop();
- System.out.println("All done.");
-
- }
-}
diff --git a/tests/com/jsyn/engine/TestEngine.java b/tests/com/jsyn/engine/TestEngine.java
deleted file mode 100644
index 9572f3d..0000000
--- a/tests/com/jsyn/engine/TestEngine.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.engine;
-
-import junit.framework.TestCase;
-
-import com.jsyn.unitgen.Add;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.PitchDetector;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.ZeroCrossingCounter;
-
-public class TestEngine extends TestCase {
-
- public void testInitialization() {
- final int DEFAULT_FRAME_RATE = 44100;
- SynthesisEngine synthesisEngine = new SynthesisEngine();
- assertEquals("frameCount zero before starting", 0, synthesisEngine.getFrameCount());
- assertEquals("default frameRate", DEFAULT_FRAME_RATE, synthesisEngine.getFrameRate());
- assertEquals("default pullData", true, synthesisEngine.isPullDataEnabled());
- }
-
- public void checkPullData(boolean pullData) {
- SynthesisEngine synthesisEngine = new SynthesisEngine();
- assertEquals("default realTime", true, synthesisEngine.isRealTime());
- synthesisEngine.setRealTime(false);
-
- assertEquals("default pullData", true, synthesisEngine.isPullDataEnabled());
- synthesisEngine.setPullDataEnabled(pullData);
-
- SineOscillator sineOscillator = new SineOscillator();
- synthesisEngine.add(sineOscillator);
-
- LineOut lineOut = new LineOut();
- synthesisEngine.add(lineOut);
- sineOscillator.output.connect(0, lineOut.input, 0);
-
- assertEquals("initial sine value", 0.0, sineOscillator.output.getValue());
-
- synthesisEngine.start();
- if (!pullData) {
- sineOscillator.start();
- }
- // We always have to start the LineOut.
- lineOut.start();
- synthesisEngine.generateNextBuffer();
- synthesisEngine.generateNextBuffer();
-
- double value = sineOscillator.output.getValue();
- assertTrue("sine value after generation = " + value, (value > 0.0));
- }
-
- public void testPullDataFalse() {
- checkPullData(false);
- }
-
- public void testPullDataTrue() {
- checkPullData(true);
- }
-
- public void testMixedAdding() {
- boolean gotCaught = false;
- SynthesisEngine synthesisEngine1 = new SynthesisEngine();
- synthesisEngine1.setRealTime(false);
- synthesisEngine1.setPullDataEnabled(true);
- SynthesisEngine synthesisEngine2 = new SynthesisEngine();
- synthesisEngine2.setRealTime(false);
- synthesisEngine2.setPullDataEnabled(true);
-
- // Create a sineOscillator but do not add it to the synth!
- SineOscillator sineOscillator = new SineOscillator();
- LineOut lineOut = new LineOut();
-
- synthesisEngine1.add(lineOut);
- synthesisEngine2.add(sineOscillator);
- try {
- sineOscillator.output.connect(0, lineOut.input, 0);
- } catch (RuntimeException e) {
- gotCaught = true;
- assertTrue("informative MPE message", e.getMessage().contains("different synths"));
- }
-
- assertTrue("caught NPE caused by forgetting synth.add", gotCaught);
- }
-
- public void testNotAdding() {
- SynthesisEngine synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- synthesisEngine.setPullDataEnabled(true);
-
- // Create a sineOscillator but do not add it to the synth!
- SineOscillator sineOscillator = new SineOscillator();
-
- LineOut lineOut = new LineOut();
- sineOscillator.output.connect(0, lineOut.input, 0);
- synthesisEngine.add(lineOut);
-
- assertEquals("initial sine value", 0.0, sineOscillator.output.getValue());
-
- synthesisEngine.start();
- // We always have to start the LineOut.
- lineOut.start();
- boolean gotCaught = false;
- try {
- synthesisEngine.generateNextBuffer();
- synthesisEngine.generateNextBuffer();
- } catch (NullPointerException e) {
- gotCaught = true;
- assertTrue("informative MPE message", e.getMessage().contains("forgot to add"));
- }
-
- assertTrue("caught NPE caused by forgetting synth.add", gotCaught);
- }
-
- public void testMultipleStarts() throws InterruptedException {
- SynthesisEngine synth = new SynthesisEngine();
-
- // Create a sineOscillator but do not add it to the synth!
- SineOscillator osc = new SineOscillator();
- ZeroCrossingCounter counter = new ZeroCrossingCounter();
- PitchDetector pitchDetector = new PitchDetector();
- LineOut lineOut = new LineOut();
- synth.add(osc);
- synth.add(counter);
- synth.add(lineOut);
- synth.add(pitchDetector);
- osc.output.connect(counter.input);
- osc.output.connect(pitchDetector.input);
- counter.output.connect(0, lineOut.input, 0);
-
- assertEquals("initial count", 0, counter.getCount());
-
- int[] rates = {
- 32000, 48000, 44100, 22050
- };
- for (int rate : rates) {
- synth.start(rate);
- lineOut.start();
- pitchDetector.start();
-
- double time = synth.getCurrentTime();
- double interval = 1.0;
- time += interval;
-
- long previousFrameCount = counter.getCount();
- synth.sleepUntil(time);
-
- double frequencyMeasured = pitchDetector.frequency.get();
- double confidenceMeasured = pitchDetector.confidence.get();
- double oscFreq = osc.frequency.get();
- String msg = "freq at " + rate + " Hz";
- System.out.println(msg);
- assertEquals(msg, oscFreq, frequencyMeasured, oscFreq * 0.1);
- assertEquals("pitch confidence", 0.9, confidenceMeasured, 0.1);
-
- double expectedCount = interval * oscFreq;
- double framesMeasured = counter.getCount() - previousFrameCount;
- msg = "count at " + rate + " Hz";
- System.out.println(msg);
- assertEquals(msg, expectedCount, framesMeasured, expectedCount * 0.1);
-
- synth.stop();
- }
-
- }
-
-
- public void testScheduler() throws InterruptedException {
- SynthesisEngine synth = new SynthesisEngine();
- synth.setRealTime(false);
- Add adder = new Add();
- synth.add(adder);
- synth.start();
- adder.start();
- adder.inputA.set(4.0);
- adder.inputB.set(10.0);
- synth.sleepFor(0.1);
- assertEquals("simple add", 14.0, adder.output.get(), 0.01);
-
- // Schedule a set() in the near future.
- double time = synth.getCurrentTime();
- adder.inputA.set(7.0, time + 1.0);
- synth.sleepFor(0.5);
- assertEquals("before scheduled set", 14.0, adder.output.get(), 0.01);
- synth.sleepFor(1.0);
- assertEquals("after scheduled set", 17.0, adder.output.get(), 0.01);
-
- // Schedule a set() in the near future then cancel it.
- time = synth.getCurrentTime();
- adder.inputA.set(5.0, time + 1.0);
- synth.sleepFor(0.5);
- assertEquals("before scheduled set", 17.0, adder.output.get(), 0.01);
- synth.clearCommandQueue();
- synth.sleepFor(1.0);
- assertEquals("after canceled set", 17.0, adder.output.get(), 0.01);
-
- synth.stop();
- }
-}
diff --git a/tests/com/jsyn/engine/TestFifo.java b/tests/com/jsyn/engine/TestFifo.java
deleted file mode 100644
index 03333bf..0000000
--- a/tests/com/jsyn/engine/TestFifo.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.engine;
-
-import junit.framework.TestCase;
-
-import com.jsyn.io.AudioFifo;
-
-public class TestFifo extends TestCase {
-
- public void testBasic() {
- Thread watchdog = startWatchdog(600);
-
- AudioFifo fifo = new AudioFifo();
- fifo.setReadWaitEnabled(false);
- fifo.allocate(8);
- assertEquals("start empty", 0, fifo.available());
-
- assertEquals("read back Nan when emopty", Double.NaN, fifo.read());
-
- fifo.write(1.0);
- assertEquals("added one value", 1, fifo.available());
- assertEquals("read back same value", 1.0, fifo.read());
- assertEquals("back to empty", 0, fifo.available());
-
- for (int i = 0; i < fifo.size(); i++) {
- assertEquals("adding data", i, fifo.available());
- fifo.write(100.0 + i);
- }
- for (int i = 0; i < fifo.size(); i++) {
- assertEquals("removing data", fifo.size() - i, fifo.available());
- assertEquals("reading back data", 100.0 + i, fifo.read());
- }
- watchdog.interrupt();
- }
-
- /**
- * Wrap around several times to test masking.
- */
- public void testWrapping() {
-
- final int chunk = 5;
- AudioFifo fifo = new AudioFifo();
- fifo.allocate(8);
- double value = 1000.0;
- for (int i = 0; i < (fifo.size() * chunk); i++) {
- value = checkFifoChunk(fifo, value, chunk);
- }
-
- }
-
- private double checkFifoChunk(AudioFifo fifo, double value, int chunk) {
- for (int i = 0; i < chunk; i++) {
- assertEquals("adding data", i, fifo.available());
- fifo.write(value + i);
- }
- for (int i = 0; i < chunk; i++) {
- assertEquals("removing data", chunk - i, fifo.available());
- assertEquals("reading back data", value + i, fifo.read());
- }
- return value + chunk;
- }
-
- public void testBadSize() {
- boolean caught = false;
- try {
- AudioFifo fifo = new AudioFifo();
- fifo.allocate(20); // not power of 2
- assertTrue("should not get here", false);
- } catch (IllegalArgumentException e) {
- caught = true;
- }
- assertTrue("should have caught size exception", caught);
- }
-
- public void testSingleReadWait() {
- final int chunk = 5;
- final AudioFifo fifo = new AudioFifo();
- fifo.allocate(8);
-
- fifo.setWriteWaitEnabled(false);
- fifo.setReadWaitEnabled(true);
- final double value = 50.0;
-
- // Schedule a delayed write in another thread.
- new Thread() {
- @Override
- public void run() {
- try {
- sleep(200);
- for (int i = 0; i < chunk; i++) {
- fifo.write(value + i);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }.start();
-
- Thread watchdog = startWatchdog(500);
- for (int i = 0; i < chunk; i++) {
- assertEquals("reading back data", value + i, fifo.read());
- }
- watchdog.interrupt();
- }
-
- private Thread startWatchdog(final int msec) {
- Thread watchdog = new Thread() {
- @Override
- public void run() {
- try {
- sleep(msec);
- assertTrue("test must still be waiting", false);
- } catch (InterruptedException e) {
- }
- }
- };
- watchdog.start();
- return watchdog;
- }
-
- public void testSingleWriteWait() {
- final int chunk = 13;
- final AudioFifo fifo = new AudioFifo();
- fifo.allocate(8);
-
- fifo.setWriteWaitEnabled(true);
- fifo.setReadWaitEnabled(true);
- final double value = 50.0;
-
- // Schedule a delayed read in another thread.
- Thread readThread = new Thread() {
- @Override
- public void run() {
- try {
- sleep(200);
- for (int i = 0; i < chunk; i++) {
- // System.out.println( "testSingleWriteWait: try to read" );
- double got = fifo.read();
- assertEquals("adding data", value + i, got);
- // System.out.println( "testSingleWriteWait: read " + got );
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- };
- readThread.start();
-
- Thread watchdog = startWatchdog(500);
- // Try to write more than will fit so we will hang.
- for (int i = 0; i < chunk; i++) {
- fifo.write(value + i);
- }
- watchdog.interrupt();
-
- try {
- readThread.join(200);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- assertEquals("readThread should be done.", false, readThread.isAlive());
- }
-
- public void testBlockReadWait() {
- final int chunk = 50;
- final AudioFifo fifo = new AudioFifo();
- fifo.allocate(8);
-
- fifo.setWriteWaitEnabled(false);
- fifo.setReadWaitEnabled(true);
- final double value = 300.0;
- double[] readBuffer = new double[chunk];
-
- // Schedule delayed writes in another thread.
- new Thread() {
- @Override
- public void run() {
- int numWritten = 0;
- double[] writeBuffer = new double[4];
- try {
- while (numWritten < chunk) {
- sleep(30);
- for (int i = 0; i < writeBuffer.length; i++) {
- writeBuffer[i] = value + numWritten;
- numWritten += 1;
- }
-
- fifo.write(writeBuffer);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }.start();
-
- Thread watchdog = startWatchdog(600);
- fifo.read(readBuffer);
- for (int i = 0; i < chunk; i++) {
- assertEquals("reading back data", value + i, readBuffer[i]);
- }
- watchdog.interrupt();
-
- }
-
- public void testBlockReadAndWriteWaitStress() {
- final int chunk = 10000000; // 10 Megabytes
- final AudioFifo fifo = new AudioFifo();
- fifo.allocate(8);
-
- fifo.setWriteWaitEnabled(true);
- fifo.setReadWaitEnabled(true);
- final double value = 50.0;
-
- // Schedule a delayed write in another thread.
- new Thread() {
- @Override
- public void run() {
- try {
- sleep(200);
- for (int i = 0; i < chunk; i++) {
- fifo.write(value + i);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }.start();
-
- Thread watchdog = startWatchdog(10000);
- for (int i = 0; i < chunk; i++) {
- assertEquals("reading back data", value + i, fifo.read());
- }
- watchdog.interrupt();
- }
-}
diff --git a/tests/com/jsyn/engine/TestWaveFileReadWrite.java b/tests/com/jsyn/engine/TestWaveFileReadWrite.java
deleted file mode 100644
index ee406de..0000000
--- a/tests/com/jsyn/engine/TestWaveFileReadWrite.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.engine;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.sound.sampled.UnsupportedAudioFileException;
-
-import junit.framework.TestCase;
-
-import com.jsyn.data.FloatSample;
-import com.jsyn.util.SampleLoader;
-import com.jsyn.util.WaveFileWriter;
-
-public class TestWaveFileReadWrite extends TestCase {
-
- public void checkWriteReadWave(int numChannels, float[] data) throws IOException,
- UnsupportedAudioFileException {
- File temp = File.createTempFile("test_wave", ".wav");
- temp.deleteOnExit();
- System.out.println("Creating wave file " + temp);
-
- WaveFileWriter writer = new WaveFileWriter(temp);
- writer.setFrameRate(44100);
- writer.setSamplesPerFrame(numChannels);
- writer.setBitsPerSample(16);
-
- for (int i = 0; i < data.length; i++) {
- writer.write(data[i]);
- }
- writer.close();
-
- // TODO Make sure blow up if writing after close.
- // writer.write( 0.7 );
-
- FloatSample sample = SampleLoader.loadFloatSample(temp);
- assertEquals("stereo", numChannels, sample.getChannelsPerFrame());
- assertEquals("frame rate", 44100.0, sample.getFrameRate());
-
- for (int i = 0; i < data.length; i++) {
- float v = data[i];
- if (v > 1.0)
- v = 1.0f;
- else if (v < -1.0)
- v = -1.0f;
- assertEquals("sample data", v, sample.readDouble(i), 0.0001);
- }
-
- }
-
- public void testRamp() throws IOException, UnsupportedAudioFileException {
- float[] data = new float[200];
- for (int i = 0; i < data.length; i++) {
- data[i] = i / 1000.0f;
- }
-
- checkWriteReadWave(2, data);
- }
-
- public void testClippedSine() throws IOException, UnsupportedAudioFileException {
- float[] data = new float[200];
- for (int i = 0; i < data.length; i++) {
- double phase = i * Math.PI * 2.0 / 100;
- data[i] = (float) (1.3 * Math.sin(phase));
- }
-
- checkWriteReadWave(2, data);
- }
-
- public void testArguments() throws IOException {
- File temp = File.createTempFile("test_wave", ".wav");
- temp.deleteOnExit();
- System.out.println("Creating wave file " + temp);
-
- WaveFileWriter writer = new WaveFileWriter(temp);
- writer.setBitsPerSample(16);
- assertEquals("bitsPerSample", 16, writer.getBitsPerSample());
- writer.setBitsPerSample(24);
- assertEquals("bitsPerSample", 24, writer.getBitsPerSample());
- boolean caughtIt = false;
- try {
- writer.setBitsPerSample(17);
- assertTrue("tried setting illegal value", false);
- } catch (IllegalArgumentException e) {
- // e.printStackTrace();
- caughtIt = true;
- }
- assertTrue("17 generated exception", caughtIt);
- writer.close();
- }
-
-}
diff --git a/tests/com/jsyn/examples/AudioPassThrough.java b/tests/com/jsyn/examples/AudioPassThrough.java
deleted file mode 100644
index fb46992..0000000
--- a/tests/com/jsyn/examples/AudioPassThrough.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.unitgen.LineIn;
-import com.jsyn.unitgen.LineOut;
-
-/**
- * Pass audio input to audio output.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class AudioPassThrough {
- Synthesizer synth;
- LineIn lineIn;
- LineOut lineOut;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- // Add an audio input.
- synth.add(lineIn = new LineIn());
- // Add an audio output.
- synth.add(lineOut = new LineOut());
- // Connect the input to the output.
- lineIn.output.connect(0, lineOut.input, 0);
- lineIn.output.connect(1, lineOut.input, 1);
-
- // Both stereo.
- int numInputChannels = 2;
- int numOutputChannels = 2;
- synth.start(44100, AudioDeviceManager.USE_DEFAULT_DEVICE, numInputChannels,
- AudioDeviceManager.USE_DEFAULT_DEVICE, numOutputChannels);
-
- // We only need to start the LineOut. It will pull data from the LineIn.
- lineOut.start();
- System.out.println("Audio passthrough started.");
- // Sleep a while.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 8.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- System.out.println("All done.");
- }
-
- public static void main(String[] args) {
- new AudioPassThrough().test();
- }
-}
diff --git a/tests/com/jsyn/examples/ChebyshevSong.java b/tests/com/jsyn/examples/ChebyshevSong.java
deleted file mode 100644
index fffd4bb..0000000
--- a/tests/com/jsyn/examples/ChebyshevSong.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JApplet;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.instruments.WaveShapingVoice;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.unitgen.Add;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.util.PseudoRandom;
-import com.jsyn.util.VoiceAllocator;
-import com.softsynth.math.AudioMath;
-import com.softsynth.shared.time.TimeStamp;
-
-/***************************************************************
- * Play notes using a WaveShapingVoice. Allocate the notes using a VoiceAllocator.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class ChebyshevSong extends JApplet implements Runnable {
- private static final long serialVersionUID = -7459137388629333223L;
- private Synthesizer synth;
- private Add mixer;
- private LineOut lineOut;
- private AudioScope scope;
- private volatile boolean go = false;
- private PseudoRandom pseudo = new PseudoRandom();
- private final static int MAX_VOICES = 8;
- private final static int MAX_NOTES = 5;
- private VoiceAllocator allocator;
- private final static int scale[] = {
- 0, 2, 4, 7, 9
- }; // pentatonic scale
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- ChebyshevSong applet = new ChebyshevSong();
- JAppletFrame frame = new JAppletFrame("ChebyshevSong", applet);
- frame.setSize(640, 300);
- frame.setVisible(true);
- frame.test();
- }
-
- /*
- * Setup synthesis.
- */
- @Override
- public void start() {
- setLayout(new BorderLayout());
-
- synth = JSyn.createSynthesizer();
-
- // Use a submix so we can show it on the scope.
- synth.add(mixer = new Add());
- synth.add(lineOut = new LineOut());
-
- mixer.output.connect(0, lineOut.input, 0);
- mixer.output.connect(0, lineOut.input, 1);
-
- WaveShapingVoice[] voices = new WaveShapingVoice[MAX_VOICES];
- for (int i = 0; i < MAX_VOICES; i++) {
- WaveShapingVoice voice = new WaveShapingVoice();
- synth.add(voice);
- voice.usePreset(0);
- voice.getOutput().connect(mixer.inputA);
- voices[i] = voice;
- }
- allocator = new VoiceAllocator(voices);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- lineOut.start();
-
- // Use a scope to show the mixed output.
- scope = new AudioScope(synth);
- scope.addProbe(mixer.output);
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- scope.getView().setControlsVisible(false);
- add(BorderLayout.CENTER, scope.getView());
- scope.start();
-
- /* Synchronize Java display. */
- getParent().validate();
- getToolkit().sync();
-
- // start thread that plays notes
- Thread thread = new Thread(this);
- go = true;
- thread.start();
-
- }
-
- @Override
- public void stop() {
- // tell song thread to finish
- go = false;
- removeAll();
- synth.stop();
- }
-
- double indexToFrequency(int index) {
- int octave = index / scale.length;
- int temp = index % scale.length;
- int pitch = scale[temp] + (12 * octave);
- return AudioMath.pitchToFrequency(pitch + 16);
- }
-
- private void noteOff(double time, int noteNumber) {
- allocator.noteOff(noteNumber, new TimeStamp(time));
- }
-
- private void noteOn(double time, int noteNumber) {
- double frequency = indexToFrequency(noteNumber);
- double amplitude = 0.1;
- TimeStamp timeStamp = new TimeStamp(time);
- allocator.noteOn(noteNumber, frequency, amplitude, timeStamp);
- allocator.setPort(noteNumber, "Range", 0.7, synth.createTimeStamp());
- }
-
- @Override
- public void run() {
- // always choose a new song based on time&date
- int savedSeed = (int) System.currentTimeMillis();
- // calculate tempo
- double duration = 0.2;
- // set time ahead of any system latency
- double advanceTime = 0.5;
- // time for next note to start
- double nextTime = synth.getCurrentTime() + advanceTime;
- // note is ON for half the duration
- double onTime = duration / 2;
- int beatIndex = 0;
- try {
- do {
- // on every measure, maybe repeat previous pattern
- if ((beatIndex & 7) == 0) {
- if ((Math.random() < (1.0 / 2.0)))
- pseudo.setSeed(savedSeed);
- else if ((Math.random() < (1.0 / 2.0)))
- savedSeed = pseudo.getSeed();
- }
-
- // Play a bunch of random notes in the scale.
- int numNotes = pseudo.choose(MAX_NOTES);
- for (int i = 0; i < numNotes; i++) {
- int noteNumber = pseudo.choose(30);
- noteOn(nextTime, noteNumber);
- noteOff(nextTime + onTime, noteNumber);
- }
-
- nextTime += duration;
- beatIndex += 1;
-
- // wake up before we need to play note to cover system latency
- synth.sleepUntil(nextTime - advanceTime);
- } while (go);
- } catch (InterruptedException e) {
- System.err.println("Song exiting. " + e);
- }
- }
-}
diff --git a/tests/com/jsyn/examples/CircuitTester.java b/tests/com/jsyn/examples/CircuitTester.java
deleted file mode 100644
index 948e8a0..0000000
--- a/tests/com/jsyn/examples/CircuitTester.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2012 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JApplet;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.instruments.DualOscillatorSynthVoice;
-import com.jsyn.instruments.SubtractiveSynthVoice;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.SoundTweaker;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.UnitSource;
-
-/**
- * Listen to a circuit while tweaking it knobs. Show output in a scope.
- *
- * @author Phil Burk (C) 2012 Mobileer Inc
- */
-public class CircuitTester extends JApplet {
- private static final long serialVersionUID = -2704222221111608377L;
- private Synthesizer synth;
- private LineOut lineOut;
- private SoundTweaker tweaker;
- private UnitSource unitSource;
- private AudioScope scope;
-
- @Override
- public void init() {
- setLayout(new BorderLayout());
-
- synth = JSyn.createSynthesizer();
- synth.add(lineOut = new LineOut());
-
- unitSource = createUnitSource();
- synth.add(unitSource.getUnitGenerator());
-
- // Connect the source to both left and right speakers.
- unitSource.getOutput().connect(0, lineOut.input, 0);
- unitSource.getOutput().connect(0, lineOut.input, 1);
-
- tweaker = new SoundTweaker(synth, unitSource.getUnitGenerator().getClass().getName(),
- unitSource);
- add(tweaker, BorderLayout.CENTER);
-
- // Use a scope to see the output.
- scope = new AudioScope(synth);
- scope.addProbe(unitSource.getOutput());
- scope.setTriggerMode(AudioScope.TriggerMode.AUTO);
- scope.getView().setControlsVisible(false);
- add(BorderLayout.SOUTH, scope.getView());
-
- validate();
- }
-
- /**
- * Override this to test your own circuits.
- *
- * @return
- */
- public UnitSource createUnitSource() {
- //return new SampleHoldNoteBlaster();
- //return new com.syntona.exported.FMVoice();
- return new DualOscillatorSynthVoice();
- //return new WindCircuit();
- //return new WhiteNoise();
- //return new BrownNoise();
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // Start the LineOut. It will pull data from the other units.
- lineOut.start();
-
- scope.start();
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- CircuitTester applet = new CircuitTester();
- JAppletFrame frame = new JAppletFrame("JSyn Circuit Tester", applet);
- frame.setSize(600, 600);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/CustomCubeUnit.java b/tests/com/jsyn/examples/CustomCubeUnit.java
deleted file mode 100644
index 892c30c..0000000
--- a/tests/com/jsyn/examples/CustomCubeUnit.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.unitgen.UnitFilter;
-
-/**
- * Custom unit generator that can be used with other JSyn units. Cube the input value and write it
- * to output port.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class CustomCubeUnit extends UnitFilter {
-
- @Override
- /** This is where the synthesis occurs.
- * It is called in a high priority background thread so do not do
- * anything crazy here like reading a file or doing network I/O.
- * Just do fast arithmetic.
- * <br>
- * The start and limit allow us to do either block or single sample processing.
- */
- public void generate(int start, int limit) {
- // Get signal arrays from ports.
- double[] inputs = input.getValues();
- double[] outputs = output.getValues();
-
- for (int i = start; i < limit; i++) {
- double x = inputs[i];
- // Do the math.
- outputs[i] = x * x * x;
- }
- }
-}
diff --git a/tests/com/jsyn/examples/DualOscilloscope.java b/tests/com/jsyn/examples/DualOscilloscope.java
deleted file mode 100644
index d7798f4..0000000
--- a/tests/com/jsyn/examples/DualOscilloscope.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright 2012 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-
-import javax.swing.JApplet;
-import javax.swing.JComboBox;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.AudioDeviceFactory;
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.unitgen.ChannelIn;
-import com.jsyn.unitgen.PassThrough;
-
-/**
- * Two channel oscilloscope that demonstrates the use of audio input.
- *
- * @author Phil Burk (C) 2012 Mobileer Inc
- */
-public class DualOscilloscope extends JApplet {
- private static final long serialVersionUID = -2704222221111608377L;
- private Synthesizer synth;
- private ChannelIn channel1;
- private ChannelIn channel2;
- private PassThrough pass1;
- private PassThrough pass2;
- private AudioScope scope;
- private AudioDeviceManager audioManager;
- private int defaultInputId;
- private ArrayList<String> deviceNames = new ArrayList<String>();
- private ArrayList<Integer> deviceMaxInputs = new ArrayList<Integer>();
- private ArrayList<Integer> deviceIds = new ArrayList<Integer>();
- private int defaultSelection;
- private JComboBox deviceComboBox;
-
- @Override
- public void init() {
- audioManager = AudioDeviceFactory.createAudioDeviceManager(true);
- synth = JSyn.createSynthesizer(audioManager);
-
- int numDevices = audioManager.getDeviceCount();
- defaultInputId = audioManager.getDefaultInputDeviceID();
- for (int i = 0; i < numDevices; i++) {
- int maxInputs = audioManager.getMaxInputChannels(i);
- if (maxInputs > 0) {
- String deviceName = audioManager.getDeviceName(i);
- String itemName = maxInputs + ", " + deviceName + " (#" + i + ")";
- if (i == defaultInputId) {
- defaultSelection = deviceNames.size();
- itemName += " (Default)";
- }
- deviceNames.add(itemName);
- deviceMaxInputs.add(maxInputs);
- deviceIds.add(i);
- }
- }
-
- synth.add(channel1 = new ChannelIn());
- channel1.setChannelIndex(0);
- synth.add(channel2 = new ChannelIn());
- channel2.setChannelIndex(1);
-
- // Use PassThrough so we can easily disconnect input channels from the scope.
- synth.add(pass1 = new PassThrough());
- synth.add(pass2 = new PassThrough());
-
- setupGUI();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- deviceComboBox = new JComboBox(deviceNames.toArray(new String[0]));
- deviceComboBox.setSelectedIndex(defaultSelection);
- add(deviceComboBox, BorderLayout.NORTH);
- deviceComboBox.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- stopAudio();
- int itemIndex = deviceComboBox.getSelectedIndex();
- startAudio(itemIndex);
- }
- });
-
- scope = new AudioScope(synth);
-
- scope.addProbe(pass1.output);
- scope.addProbe(pass2.output);
-
- scope.setTriggerMode(AudioScope.TriggerMode.AUTO);
- scope.getView().setControlsVisible(true);
- add(scope.getView(), BorderLayout.CENTER);
- validate();
- }
-
- protected void startAudio(int itemIndex) {
- // Both stereo.
- int numInputChannels = deviceMaxInputs.get(itemIndex);
- if (numInputChannels > 2)
- numInputChannels = 2;
- int inputDeviceIndex = deviceIds.get(itemIndex);
- synth.start(44100, inputDeviceIndex, numInputChannels,
- AudioDeviceManager.USE_DEFAULT_DEVICE, 0);
-
- channel1.output.connect(pass1.input);
- // Only connect second channel if more than one input channel.
- if (numInputChannels > 1) {
- channel2.output.connect(pass2.input);
- }
-
- // We only need to start the LineOut. It will pull data from the
- // channels.
- scope.start();
- }
-
- @Override
- public void start() {
- startAudio(defaultSelection);
- }
-
- public void stopAudio() {
- pass1.input.disconnectAll();
- pass2.input.disconnectAll();
- scope.stop();
- synth.stop();
- }
-
- @Override
- public void stop() {
- stopAudio();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- DualOscilloscope applet = new DualOscilloscope();
- JAppletFrame frame = new JAppletFrame("Dual Oscilloscope", applet);
- frame.setSize(640, 400);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/EditEnvelope1.java b/tests/com/jsyn/examples/EditEnvelope1.java
deleted file mode 100644
index 763037b..0000000
--- a/tests/com/jsyn/examples/EditEnvelope1.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 1997 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Test Envelope using Java Audio Synthesizer
- * Trigger attack or release portion.
- *
- * @author (C) 1997 Phil Burk
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JApplet;
-import javax.swing.JButton;
-import javax.swing.JPanel;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.SegmentedEnvelope;
-import com.jsyn.swing.EnvelopeEditorPanel;
-import com.jsyn.swing.EnvelopePoints;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-
-public class EditEnvelope1 extends JApplet {
- private Synthesizer synth;
- private UnitOscillator osc;
- private LineOut lineOut;
- private SegmentedEnvelope envelope;
- private VariableRateDataReader envelopePlayer;
-
- final int MAX_FRAMES = 16;
- JButton hitme;
- JButton attackButton;
- JButton releaseButton;
- private EnvelopeEditorPanel envEditor;
- private EnvelopePoints points;
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- EditEnvelope1 applet = new EditEnvelope1();
- JAppletFrame frame = new JAppletFrame("Test SynthEnvelope", applet);
- frame.setSize(440, 200);
- frame.setVisible(true);
- frame.test();
- }
-
- /*
- * Setup synthesis.
- */
- @Override
- public void start() {
- setLayout(new BorderLayout());
-
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- // Add a tone generator.
- synth.add(osc = new SawtoothOscillatorBL());
- // Add an envelope player.
- synth.add(envelopePlayer = new VariableRateMonoReader());
-
- envelope = new SegmentedEnvelope(MAX_FRAMES);
-
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
- envelopePlayer.output.connect(osc.amplitude);
- // Connect the oscillator to the output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- JPanel bottomPanel = new JPanel();
- bottomPanel.add(hitme = new JButton("On"));
- hitme.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- points.updateEnvelopeIfDirty(envelope);
- envelopePlayer.dataQueue.queueOn(envelope);
- }
- });
-
- bottomPanel.add(attackButton = new JButton("Off"));
- attackButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- points.updateEnvelopeIfDirty(envelope);
- envelopePlayer.dataQueue.queueOff(envelope);
- }
- });
-
- bottomPanel.add(releaseButton = new JButton("Queue"));
- releaseButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- points.updateEnvelopeIfDirty(envelope);
- envelopePlayer.dataQueue.queue(envelope);
- }
- });
-
- add(bottomPanel, BorderLayout.SOUTH);
- lineOut.start();
-
- // Create vector of points for editor.
- points = new EnvelopePoints();
- points.setName(osc.amplitude.getName());
-
- // Setup initial envelope shape.
- points.add(0.5, 1.0);
- points.add(0.5, 0.2);
- points.add(0.5, 0.8);
- points.add(0.5, 0.0);
- points.updateEnvelope(envelope);
-
- // Add an envelope editor to the center of the panel.
- add("Center", envEditor = new EnvelopeEditorPanel(points, MAX_FRAMES));
-
- /* Synchronize Java display. */
- getParent().validate();
- getToolkit().sync();
- }
-
- @Override
- public void stop() {
- synth.stop();
- }
-}
diff --git a/tests/com/jsyn/examples/FFTPassthrough.java b/tests/com/jsyn/examples/FFTPassthrough.java
deleted file mode 100644
index 1a1a7c5..0000000
--- a/tests/com/jsyn/examples/FFTPassthrough.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.SpectralFFT;
-import com.jsyn.unitgen.SpectralIFFT;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a sine sweep through an FFT/IFFT pair.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class FFTPassthrough {
- private Synthesizer synth;
- private PassThrough center;
- private UnitOscillator osc;
- private UnitOscillator lfo;
- private SpectralFFT fft;
- private SpectralIFFT ifft1;
- private LineOut lineOut;
- private SpectralIFFT ifft2;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // Add a tone generator.
- synth.add(center = new PassThrough());
- // synth.add( osc = new SawtoothOscillatorBL() );
- synth.add(osc = new SineOscillator());
- synth.add(lfo = new SineOscillator());
- synth.add(fft = new SpectralFFT());
- synth.add(ifft1 = new SpectralIFFT());
- synth.add(ifft2 = new SpectralIFFT());
- // Add a stereo audio output unit.
- synth.add(lineOut = new LineOut());
-
- // Connect the oscillator to both channels of the output.
- center.output.connect(osc.frequency);
- lfo.output.connect(osc.frequency);
- osc.output.connect(fft.input);
- fft.output.connect(ifft1.input);
- fft.output.connect(ifft2.input);
- ifft1.output.connect(0, lineOut.input, 0);
- ifft2.output.connect(0, lineOut.input, 1);
-
- // Set the frequency and amplitude for the modulated sine wave.
- center.input.set(600.0);
- lfo.frequency.set(0.2);
- lfo.amplitude.set(400.0);
- osc.amplitude.set(0.6);
-
- // We only need to start the LineOut. It will pull data through the
- // chain.
- lineOut.start();
-
- System.out.println("You should now be hearing a clean oscillator on the left channel,");
- System.out.println("and the FFT->IFFT processed signal on the right channel.");
-
- // Sleep while the sound is generated in the background.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 20.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("Stop playing. -------------------");
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new FFTPassthrough().test();
- }
-}
diff --git a/tests/com/jsyn/examples/GoogleWaveOscillator.java b/tests/com/jsyn/examples/GoogleWaveOscillator.java
deleted file mode 100644
index 2f45cc4..0000000
--- a/tests/com/jsyn/examples/GoogleWaveOscillator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Custom unit generator to create the waveform shown on the Google home page on 2/22/12.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class GoogleWaveOscillator extends UnitOscillator {
- public UnitInputPort variance;
- private double phaseIncrement = 0.1;
- private double previousY;
- private double randomAmplitude = 0.0;
-
- public GoogleWaveOscillator() {
- addPort(variance = new UnitInputPort("Variance", 0.0));
- }
-
- @Override
- public void generate(int start, int limit) {
- // Get signal arrays from ports.
- double[] freqs = frequency.getValues();
- double[] outputs = output.getValues();
- double currentPhase = phase.getValue();
- double y;
-
- for (int i = start; i < limit; i++) {
- if (currentPhase > 0.0) {
- double p = currentPhase;
- y = Math.sqrt(4.0 * (p * (1.0 - p)));
- } else {
- double p = -currentPhase;
- y = -Math.sqrt(4.0 * (p * (1.0 - p)));
- }
-
- if ((previousY * y) <= 0.0) {
- // Calculate randomly offset phaseIncrement.
- double v = variance.getValues()[0];
- double range = ((Math.random() - 0.5) * 4.0 * v);
- double scale = Math.pow(2.0, range);
- phaseIncrement = convertFrequencyToPhaseIncrement(freqs[i]) * scale;
-
- // Calculate random amplitude.
- scale = 1.0 + ((Math.random() - 0.5) * 1.5 * v);
- randomAmplitude = amplitude.getValues()[0] * scale;
- }
-
- outputs[i] = y * randomAmplitude;
- previousY = y;
-
- currentPhase = incrementWrapPhase(currentPhase, phaseIncrement);
- }
- phase.setValue(currentPhase);
- }
-}
diff --git a/tests/com/jsyn/examples/HearDAHDSR.java b/tests/com/jsyn/examples/HearDAHDSR.java
deleted file mode 100644
index 23e6fb5..0000000
--- a/tests/com/jsyn/examples/HearDAHDSR.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.GridLayout;
-
-import javax.swing.BorderFactory;
-import javax.swing.JApplet;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.swing.DoubleBoundedRangeModel;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortModelFactory;
-import com.jsyn.swing.RotaryTextController;
-import com.jsyn.unitgen.EnvelopeDAHDSR;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.SquareOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a tone using a JSyn oscillator. Modulate the amplitude using a DAHDSR envelope.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class HearDAHDSR extends JApplet {
- private static final long serialVersionUID = -2704222221111608377L;
- private Synthesizer synth;
- private UnitOscillator osc;
- // Use a square wave to trigger the envelope.
- private UnitOscillator gatingOsc;
- private EnvelopeDAHDSR dahdsr;
- private LineOut lineOut;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
-
- // Add a tone generator.
- synth.add(osc = new SineOscillator());
- // Add a trigger.
- synth.add(gatingOsc = new SquareOscillator());
- // Use an envelope to control the amplitude.
- synth.add(dahdsr = new EnvelopeDAHDSR());
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- gatingOsc.output.connect(dahdsr.input);
- dahdsr.output.connect(osc.amplitude);
- dahdsr.attack.setup(0.001, 0.01, 2.0);
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- gatingOsc.frequency.setup(0.001, 0.5, 10.0);
- gatingOsc.frequency.setName("Rate");
-
- osc.frequency.setup(50.0, 440.0, 2000.0);
- osc.frequency.setName("Freq");
-
- // Arrange the knob in a row.
- setLayout(new GridLayout(1, 0));
-
- setupPortKnob(osc.frequency);
- setupPortKnob(gatingOsc.frequency);
- setupPortKnob(dahdsr.attack);
- setupPortKnob(dahdsr.hold);
- setupPortKnob(dahdsr.decay);
- setupPortKnob(dahdsr.sustain);
- setupPortKnob(dahdsr.release);
-
- validate();
- }
-
- private void setupPortKnob(UnitInputPort port) {
-
- DoubleBoundedRangeModel model = PortModelFactory.createExponentialModel(port);
- System.out.println("Make knob for " + port.getName() + ", model.getDV = "
- + model.getDoubleValue() + ", model.getV = " + model.getValue() + ", port.getV = "
- + port.get());
- RotaryTextController knob = new RotaryTextController(model, 10);
- knob.setBorder(BorderFactory.createTitledBorder(port.getName()));
- knob.setTitle(port.getName());
- add(knob);
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
- }
-
- @Override
- public void stop() {
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- HearDAHDSR applet = new HearDAHDSR();
- JAppletFrame frame = new JAppletFrame("Hear DAHDSR Envelope", applet);
- frame.setSize(640, 200);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/HearMoogFilter.java b/tests/com/jsyn/examples/HearMoogFilter.java
deleted file mode 100644
index 4ec4811..0000000
--- a/tests/com/jsyn/examples/HearMoogFilter.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.JApplet;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.scope.AudioScopeProbe;
-import com.jsyn.swing.DoubleBoundedRangeModel;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortModelFactory;
-import com.jsyn.swing.RotaryTextController;
-import com.jsyn.unitgen.FilterFourPoles;
-import com.jsyn.unitgen.FilterLowPass;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.LinearRamp;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a sawtooth through a 4-pole filter.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class HearMoogFilter extends JApplet {
- private Synthesizer synth;
- private UnitOscillator oscillator;
- private FilterFourPoles filterMoog;
- private FilterLowPass filterBiquad;
- private LinearRamp rampCutoff;
- private PassThrough tieQ;
- private PassThrough tieCutoff;
- private PassThrough mixer;
- private LineOut lineOut;
-
- private AudioScope scope;
- private boolean useCutoffRamp = false;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
- synth.add(oscillator = new SawtoothOscillatorBL());
- synth.add(rampCutoff = new LinearRamp());
- synth.add(tieQ = new PassThrough());
- synth.add(tieCutoff = new PassThrough());
- synth.add(filterMoog = new FilterFourPoles());
- synth.add(filterBiquad = new FilterLowPass());
- synth.add(mixer = new PassThrough());
- synth.add(lineOut = new LineOut());
-
- oscillator.output.connect(filterMoog.input);
- oscillator.output.connect(filterBiquad.input);
- if (useCutoffRamp) {
- rampCutoff.output.connect(filterMoog.frequency);
- rampCutoff.output.connect(filterBiquad.frequency);
- rampCutoff.time.set(0.000);
- } else {
- tieCutoff.output.connect(filterMoog.frequency);
- tieCutoff.output.connect(filterBiquad.frequency);
- }
- tieQ.output.connect(filterMoog.Q);
- tieQ.output.connect(filterBiquad.Q);
- filterMoog.output.connect(mixer.input);
- mixer.output.connect(0, lineOut.input, 0);
- mixer.output.connect(0, lineOut.input, 1);
-
- filterBiquad.amplitude.set(0.1);
- oscillator.frequency.setup(50.0, 130.0, 3000.0);
- oscillator.amplitude.setup(0.0, 0.336, 1.0);
- rampCutoff.input.setup(filterMoog.frequency);
- tieCutoff.input.setup(filterMoog.frequency);
- tieQ.input.setup(0.1, 0.7, 10.0);
- setupGUI();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- add(new JLabel("Sawtooth through a \"Moog\" style filter."), BorderLayout.NORTH);
-
- JPanel rackPanel = new JPanel();
- rackPanel.setLayout(new BoxLayout(rackPanel, BoxLayout.Y_AXIS));
-
- JPanel buttonPanel = new JPanel();
- ButtonGroup cbg = new ButtonGroup();
- JRadioButton radioButton = new JRadioButton("Moog", true);
- cbg.add(radioButton);
- radioButton.addItemListener(new ItemListener() {
- @Override
- public void itemStateChanged(ItemEvent e) {
- mixer.input.disconnectAll();
- filterMoog.output.connect(mixer.input);
- }
- });
- buttonPanel.add(radioButton);
- radioButton = new JRadioButton("Biquad", false);
- cbg.add(radioButton);
- radioButton.addItemListener(new ItemListener() {
- @Override
- public void itemStateChanged(ItemEvent e) {
- mixer.input.disconnectAll();
- filterBiquad.output.connect(mixer.input);
- }
- });
- buttonPanel.add(radioButton);
-
- /*
- * buttonPanel.add( new JLabel("Show:") ); cbg = new ButtonGroup(); radioButton = new
- * JRadioButton( "Waveform", true ); cbg.add( radioButton ); radioButton.addItemListener(
- * new ItemListener() { public void itemStateChanged( ItemEvent e ) { scope.setViewMode(
- * AudioScope.ViewMode.WAVEFORM ); } } ); buttonPanel.add( radioButton ); radioButton = new
- * JRadioButton( "Spectrum", true ); cbg.add( radioButton ); radioButton.addItemListener(
- * new ItemListener() { public void itemStateChanged( ItemEvent e ) { scope.setViewMode(
- * AudioScope.ViewMode.SPECTRUM ); } } ); buttonPanel.add( radioButton );
- */
-
- rackPanel.add(buttonPanel);
-
- // Arrange the knobs in a row.
- JPanel knobPanel = new JPanel();
- knobPanel.setLayout(new GridLayout(1, 0));
-
- knobPanel.add(setupPortKnob(oscillator.frequency, "OscFreq"));
- knobPanel.add(setupPortKnob(oscillator.amplitude, "OscAmp"));
-
- if (useCutoffRamp) {
- knobPanel.add(setupPortKnob(rampCutoff.input, "Cutoff"));
- } else {
- knobPanel.add(setupPortKnob(tieCutoff.input, "Cutoff"));
- }
- knobPanel.add(setupPortKnob(tieQ.input, "Q"));
- rackPanel.add(knobPanel);
- add(rackPanel, BorderLayout.SOUTH);
-
- scope = new AudioScope(synth);
- scope.addProbe(oscillator.output);
- scope.addProbe(filterMoog.output);
- scope.addProbe(filterBiquad.output);
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- scope.getView().setControlsVisible(false);
- add(scope.getView(), BorderLayout.CENTER);
- scope.start();
- validate();
- }
-
- private RotaryTextController setupPortKnob(UnitInputPort port, String label) {
- DoubleBoundedRangeModel model = PortModelFactory.createExponentialModel(port);
- RotaryTextController knob = new RotaryTextController(model, 10);
- knob.setBorder(BorderFactory.createTitledBorder(label));
- knob.setTitle(label);
- return knob;
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- scope.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- HearMoogFilter applet = new HearMoogFilter();
- JAppletFrame frame = new JAppletFrame("Hear Moog Style Filter", applet);
- frame.setSize(800, 600);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/HearSinePM.java b/tests/com/jsyn/examples/HearSinePM.java
deleted file mode 100644
index 1e19505..0000000
--- a/tests/com/jsyn/examples/HearSinePM.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-
-import javax.swing.BorderFactory;
-import javax.swing.JApplet;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.DoubleBoundedRangeModel;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortModelFactory;
-import com.jsyn.swing.RotaryTextController;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.SineOscillatorPhaseModulated;
-
-/**
- * Play a tone using a phase modulated sinewave oscillator. Phase modulation (PM) is very similar to
- * frequency modulation (FM) but is easier to control.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class HearSinePM extends JApplet {
- private static final long serialVersionUID = -2704222221111608377L;
- private Synthesizer synth;
- SineOscillatorPhaseModulated carrier;
- SineOscillator modulator;
- LineOut lineOut;
- AudioScope scope;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
- // Add a tone generator.
- synth.add(modulator = new SineOscillator());
- // Add a trigger.
- synth.add(carrier = new SineOscillatorPhaseModulated());
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- modulator.output.connect(carrier.modulation);
- carrier.output.connect(0, lineOut.input, 0);
- carrier.output.connect(0, lineOut.input, 1);
- modulator.amplitude.setup(0.0, 1.0, 10.0);
- carrier.amplitude.setup(0.0, 0.25, 1.0);
- setupGUI();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- add(new JLabel("Show Phase Modulation in an AudioScope"), BorderLayout.NORTH);
-
- // Arrange the knob in a row.
- JPanel knobPanel = new JPanel();
- knobPanel.setLayout(new GridLayout(1, 0));
-
- knobPanel.add(setupPortKnob(modulator.frequency, "MFreq"));
- knobPanel.add(setupPortKnob(modulator.amplitude, "MAmp"));
- knobPanel.add(setupPortKnob(carrier.frequency, "CFreq"));
- knobPanel.add(setupPortKnob(carrier.amplitude, "CAmp"));
- add(knobPanel, BorderLayout.SOUTH);
-
- scope = new AudioScope(synth);
- scope.addProbe(carrier.output);
- scope.addProbe(modulator.output);
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- scope.getView().setControlsVisible(true);
- add(scope.getView(), BorderLayout.CENTER);
- scope.start();
- validate();
- }
-
- private RotaryTextController setupPortKnob(UnitInputPort port, String label) {
- DoubleBoundedRangeModel model = PortModelFactory.createExponentialModel(port);
- RotaryTextController knob = new RotaryTextController(model, 10);
- knob.setBorder(BorderFactory.createTitledBorder(label));
- knob.setTitle(label);
- return knob;
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- scope.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- HearSinePM applet = new HearSinePM();
- JAppletFrame frame = new JAppletFrame("Hear Phase Modulation", applet);
- frame.setSize(640, 400);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/HearSpectralFilter.java b/tests/com/jsyn/examples/HearSpectralFilter.java
deleted file mode 100644
index 93559b4..0000000
--- a/tests/com/jsyn/examples/HearSpectralFilter.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.Spectrum;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.SpectralFilter;
-import com.jsyn.unitgen.SpectralProcessor;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.WhiteNoise;
-import com.jsyn.util.WaveRecorder;
-
-/**
- * Play a sine sweep through an FFT/IFFT pair.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class HearSpectralFilter {
- private Synthesizer synth;
- private PassThrough center;
- private UnitOscillator osc;
- private UnitOscillator lfo;
- private PassThrough mixer;
- private SpectralFilter filter;
- private LineOut lineOut;
- private WaveRecorder recorder;
- private final static boolean useRecorder = true;
- private final static boolean useProcessor = true;
- private final static int NUM_FFTS = 4;
- private final static int SIZE_LOG_2 = 10;
- private final static int SIZE = 1 << SIZE_LOG_2;
- private SpectralProcessor[] processors;
- private WhiteNoise noise;
- private static int SAMPLE_RATE = 44100;
-
- private static class CustomSpectralProcessor extends SpectralProcessor {
- public CustomSpectralProcessor() {
- super(SIZE);
- }
-
- @Override
- public void processSpectrum(Spectrum inputSpectrum, Spectrum outputSpectrum) {
- // pitchUpOctave( inputSpectrum, outputSpectrum );
- lowPassFilter(inputSpectrum, outputSpectrum, 1500.0);
- }
-
- public void lowPassFilter(Spectrum inputSpectrum, Spectrum outputSpectrum, double frequency) {
- inputSpectrum.copyTo(outputSpectrum);
- double[] outReal = outputSpectrum.getReal();
- double[] outImag = outputSpectrum.getImaginary();
- // brickwall filter
- int size = outReal.length;
- int cutoff = (int) (frequency * size / SAMPLE_RATE);
- int nyquist = size / 2;
- for (int i = cutoff; i < nyquist; i++) {
- // Bins above nyquist are mirror of ones below.
- outReal[i] = outReal[size - i] = 0.0;
- outImag[i] = outImag[size - i] = 0.0;
- }
- }
-
- // TODO Figure out why this sounds bad.
- public void pitchUpOctave(Spectrum inputSpectrum, Spectrum outputSpectrum) {
- outputSpectrum.clear();
- double[] inReal = inputSpectrum.getReal();
- double[] inImag = inputSpectrum.getImaginary();
- double[] outReal = outputSpectrum.getReal();
- double[] outImag = outputSpectrum.getImaginary();
- int size = inReal.length;
- int nyquist = size / 2;
- // Octave doubling by shifting the spectrum.
- for (int i = nyquist - 2; i > 1; i--) {
- int h = i / 2;
- outReal[i] = inReal[h];
- outImag[i] = inImag[h];
- outReal[size - i] = inReal[size - h];
- outImag[size - i] = inImag[size - h];
- }
- }
- }
-
- private void test() throws IOException {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- synth.setRealTime(true);
-
- if (useRecorder) {
- File waveFile = new File("temp_recording.wav");
- // Default is stereo, 16 bits.
- recorder = new WaveRecorder(synth, waveFile);
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
-
- if (useProcessor) {
- processors = new SpectralProcessor[NUM_FFTS];
- for (int i = 0; i < NUM_FFTS; i++) {
- processors[i] = new CustomSpectralProcessor();
- }
- }
-
- // Add a tone generator.
- synth.add(center = new PassThrough());
- synth.add(lfo = new SineOscillator());
- synth.add(noise = new WhiteNoise());
- synth.add(mixer = new PassThrough());
-
- synth.add(osc = new SawtoothOscillatorBL());
- // synth.add( osc = new SineOscillator() );
-
- synth.add(filter = new SpectralFilter(NUM_FFTS, SIZE_LOG_2));
- // Add a stereo audio output unit.
- synth.add(lineOut = new LineOut());
-
- center.output.connect(osc.frequency);
- lfo.output.connect(osc.frequency);
- osc.output.connect(mixer.input);
- noise.output.connect(mixer.input);
- mixer.output.connect(filter.input);
- if (useProcessor) {
- // Pass spectra through a custom processor.
- for (int i = 0; i < NUM_FFTS; i++) {
- filter.getSpectralOutput(i).connect(processors[i].input);
- processors[i].output.connect(filter.getSpectralInput(i));
- }
- } else {
- for (int i = 0; i < NUM_FFTS; i++) {
- // Connect FFTs directly to IFFTs for passthrough.
- filter.getSpectralOutput(i).connect(filter.getSpectralInput(i));
- }
-
- }
- mixer.output.connect(0, lineOut.input, 0);
- filter.output.connect(0, lineOut.input, 1);
-
- // Set the frequency and amplitude for the modulated sine wave.
- center.input.set(600.0);
- lfo.frequency.set(0.2);
- lfo.amplitude.set(400.0);
- osc.amplitude.set(0.2);
- noise.amplitude.set(0.2);
-
- synth.start(SAMPLE_RATE);
-
- if (useRecorder) {
- mixer.output.connect(0, recorder.getInput(), 0);
- filter.output.connect(0, recorder.getInput(), 1);
- // When we start the recorder it will pull data from the oscillator
- // and sweeper.
- recorder.start();
- }
-
- lineOut.start();
-
- System.out.println("You should now be hearing a clean oscillator on the left channel,");
- System.out.println("and the FFT->IFFT processed signal on the right channel.");
-
- // Sleep while the sound is generated in the background.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 10.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
-
- System.out.println("Stop playing. -------------------");
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- try {
- new HearSpectralFilter().test();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-}
diff --git a/tests/com/jsyn/examples/ListAudioDevices.java b/tests/com/jsyn/examples/ListAudioDevices.java
deleted file mode 100644
index dceaa0d..0000000
--- a/tests/com/jsyn/examples/ListAudioDevices.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.devices.AudioDeviceFactory;
-import com.jsyn.devices.AudioDeviceManager;
-
-public class ListAudioDevices {
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- AudioDeviceManager audioManager = AudioDeviceFactory.createAudioDeviceManager();
-
- int numDevices = audioManager.getDeviceCount();
- for (int i = 0; i < numDevices; i++) {
- String deviceName = audioManager.getDeviceName(i);
- int maxInputs = audioManager.getMaxInputChannels(i);
- int maxOutputs = audioManager.getMaxInputChannels(i);
- boolean isDefaultInput = (i == audioManager.getDefaultInputDeviceID());
- boolean isDefaultOutput = (i == audioManager.getDefaultOutputDeviceID());
- System.out.println("#" + i + " : " + deviceName);
- System.out.println(" max inputs : " + maxInputs
- + (isDefaultInput ? " (default)" : ""));
- System.out.println(" max outputs: " + maxOutputs
- + (isDefaultOutput ? " (default)" : ""));
- }
-
- }
-
-}
diff --git a/tests/com/jsyn/examples/LongEcho.java b/tests/com/jsyn/examples/LongEcho.java
deleted file mode 100644
index 0a86efd..0000000
--- a/tests/com/jsyn/examples/LongEcho.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.unitgen.ChannelIn;
-import com.jsyn.unitgen.ChannelOut;
-import com.jsyn.unitgen.FixedRateMonoReader;
-import com.jsyn.unitgen.FixedRateMonoWriter;
-import com.jsyn.unitgen.Maximum;
-import com.jsyn.unitgen.Minimum;
-import com.jsyn.util.WaveFileWriter;
-
-/**
- * Echo the input using a circular buffer in a sample.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class LongEcho {
- final static int DELAY_SECONDS = 4;
- Synthesizer synth;
- ChannelIn channelIn;
- ChannelOut channelOut;
- FloatSample sample;
- FixedRateMonoReader reader;
- FixedRateMonoWriter writer;
- Minimum minner;
- Maximum maxxer;
-
- private void test() throws IOException {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- synth.add(channelIn = new ChannelIn());
- synth.add(channelOut = new ChannelOut());
-
- synth.add(minner = new Minimum());
- synth.add(maxxer = new Maximum());
- synth.add(reader = new FixedRateMonoReader());
- synth.add(writer = new FixedRateMonoWriter());
-
- sample = new FloatSample(44100 * DELAY_SECONDS, 1);
-
- maxxer.inputB.set(-0.98); // clip
- minner.inputB.set(0.98);
-
- // Connect the input to the output.
- channelIn.output.connect(minner.inputA);
- minner.output.connect(maxxer.inputA);
- maxxer.output.connect(writer.input);
-
- reader.output.connect(channelOut.input);
-
- // Both stereo.
- int numInputChannels = 2;
- int numOutputChannels = 2;
- synth.start(44100, AudioDeviceManager.USE_DEFAULT_DEVICE, numInputChannels,
- AudioDeviceManager.USE_DEFAULT_DEVICE, numOutputChannels);
-
- writer.start();
- channelOut.start();
-
- // For a long echo, read cursor should be just in front of the write cursor.
- reader.dataQueue.queue(sample, 1000, sample.getNumFrames() - 1000);
- // Loop both forever.
- reader.dataQueue.queueLoop(sample, 0, sample.getNumFrames());
- writer.dataQueue.queueLoop(sample, 0, sample.getNumFrames());
- System.out.println("Start talking. You should hear an echo after " + DELAY_SECONDS
- + " seconds.");
- // Sleep a while.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a while
- synth.sleepUntil(time + 30.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- saveEcho(new File("saved_echo.wav"));
- // Stop everything.
- synth.stop();
- }
-
- private void saveEcho(File file) throws IOException {
- WaveFileWriter writer = new WaveFileWriter(file);
- writer.setFrameRate(44100);
- writer.setSamplesPerFrame(1);
- writer.setBitsPerSample(16);
- float[] buffer = new float[sample.getNumFrames()];
- sample.read(buffer);
- for (float v : buffer) {
- writer.write(v);
- }
- writer.close();
- }
-
- public static void main(String[] args) {
- try {
- new LongEcho().test();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/tests/com/jsyn/examples/MonoPassThrough.java b/tests/com/jsyn/examples/MonoPassThrough.java
deleted file mode 100644
index 0e81abf..0000000
--- a/tests/com/jsyn/examples/MonoPassThrough.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.AudioDeviceManager;
-import com.jsyn.unitgen.ChannelIn;
-import com.jsyn.unitgen.ChannelOut;
-
-/**
- * Pass audio input to audio output.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class MonoPassThrough {
- Synthesizer synth;
- ChannelIn channelIn;
- ChannelOut channelOut;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- synth.add(channelIn = new ChannelIn());
- synth.add(channelOut = new ChannelOut());
- // Connect the input to the output.
- channelIn.output.connect(channelOut.input);
-
- // Both stereo.
- int numInputChannels = 2;
- int numOutputChannels = 2;
- synth.start(48000, AudioDeviceManager.USE_DEFAULT_DEVICE, numInputChannels,
- AudioDeviceManager.USE_DEFAULT_DEVICE, numOutputChannels);
-
- // We only need to start the ChannelOut. It will pull data from the ChannelIn.
- channelOut.start();
- // Sleep a while.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 4.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new MonoPassThrough().test();
- }
-}
diff --git a/tests/com/jsyn/examples/NotesToTone.java b/tests/com/jsyn/examples/NotesToTone.java
deleted file mode 100644
index 9186087..0000000
--- a/tests/com/jsyn/examples/NotesToTone.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * If you play notes fast enough they become a tone.
- *
- * Play a sine wave modulated by an envelope.
- * Speed up the envelope until it is playing at audio rate.
- * Slow down the oscillator until it becomes an LFO amp modulator.
- * Use a LatchZeroCrossing to stop at the end of a sine wave cycle when we are finished.
- *
- * @author Phil Burk, (C) 2010 Mobileer Inc
- */
-
-package com.jsyn.examples;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.SegmentedEnvelope;
-import com.jsyn.unitgen.ExponentialRamp;
-import com.jsyn.unitgen.LatchZeroCrossing;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-import com.jsyn.util.WaveRecorder;
-
-/**
- * When notes speed up they can become a new tone. <br>
- * Multiply an oscillator and an envelope. Speed up the envelope until it becomes a tone. Slow down
- * the oscillator until it acts like an envelope. Write the resulting audio to a WAV file.
- *
- * @author Phil Burk (C) 2011 Mobileer Inc
- */
-
-public class NotesToTone {
- private final static double SONG_AMPLITUDE = 0.7;
- private final static double INTRO_DURATION = 2.0;
- private final static double OUTRO_DURATION = 2.0;
- private final static double RAMP_DURATION = 20.0;
- private final static double LOW_FREQUENCY = 1.0;
- private final static double HIGH_FREQUENCY = 800.0;
-
- private final static boolean useRecorder = true;
- private WaveRecorder recorder;
-
- private Synthesizer synth;
- private ExponentialRamp envSweeper;
- private ExponentialRamp oscSweeper;
- private VariableRateDataReader envelopePlayer;
- private UnitOscillator osc;
- private LatchZeroCrossing latch;
- private LineOut lineOut;
- private SegmentedEnvelope envelope;
-
- private void play() throws IOException {
- synth = JSyn.createSynthesizer();
- synth.setRealTime(true);
-
- if (useRecorder) {
- File waveFile = new File("notes_to_tone.wav");
- // Default is stereo, 16 bits.
- recorder = new WaveRecorder(synth, waveFile, 1);
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
-
- createUnits();
-
- connectUnits();
-
- setupEnvelope();
-
- osc.amplitude.set(SONG_AMPLITUDE);
-
- // Ramp the rate of the envelope up until it becomes an audible tone.
- envSweeper.current.set(LOW_FREQUENCY);
- envSweeper.input.set(LOW_FREQUENCY);
- envSweeper.time.set(RAMP_DURATION);
-
- // Ramp the rate of the oscillator down until it becomes an LFO.
- oscSweeper.current.set(HIGH_FREQUENCY);
- oscSweeper.input.set(HIGH_FREQUENCY);
- oscSweeper.time.set(RAMP_DURATION);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // When we start the recorder it will pull data from the oscillator and
- // sweeper.
- if (recorder != null) {
- recorder.start();
- }
-
- // We also need to start the LineOut if we want to hear it now.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Schedule start of ramps.
- double songDuration = INTRO_DURATION + RAMP_DURATION + OUTRO_DURATION;
- envSweeper.input.set(HIGH_FREQUENCY, timeNow + INTRO_DURATION);
- oscSweeper.input.set(LOW_FREQUENCY, timeNow + INTRO_DURATION);
-
- // Arm zero crossing latch
- latch.gate.set(0.0, timeNow + songDuration);
-
- // Sleep while the sound is being generated in the background thread.
- try {
- synth.sleepUntil(timeNow + songDuration + 2.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
- // Stop everything.
- synth.stop();
- }
-
- private void createUnits() {
- // Add a tone generators.
- synth.add(osc = new SineOscillator());
- // Add a controller that will sweep the envelope rate up.
- synth.add(envSweeper = new ExponentialRamp());
- // Add a controller that will sweep the oscillator down.
- synth.add(oscSweeper = new ExponentialRamp());
-
- synth.add(latch = new LatchZeroCrossing());
- // Add an output unit.
- synth.add(lineOut = new LineOut());
-
- // Add an envelope player.
- synth.add(envelopePlayer = new VariableRateMonoReader());
- }
-
- private void connectUnits() {
- oscSweeper.output.connect(osc.frequency);
- osc.output.connect(latch.input);
- // Latch when sine LFO crosses zero.
- latch.output.connect(envelopePlayer.amplitude);
-
- envSweeper.output.connect(envelopePlayer.rate);
-
- // Connect the envelope player to the audio output.
- envelopePlayer.output.connect(0, lineOut.input, 0);
- // crossFade.output.connect( 0, lineOut.input, 1 );
-
- if (recorder != null) {
- envelopePlayer.output.connect(0, recorder.getInput(), 0);
- // crossFade.output.connect( 0, recorder.getInput(), 1 );
- }
- }
-
- private void setupEnvelope() {
- // Setup envelope. The envelope has a total duration of 1.0 seconds.
- // Values are (duration,target) pairs.
- double[] pairs = new double[5 * 2 * 2];
- int i = 0;
- // duration, target for delay
- pairs[i++] = 0.15;
- pairs[i++] = 0.0;
- // duration, target for attack
- pairs[i++] = 0.05;
- pairs[i++] = 1.0;
- // duration, target for release
- pairs[i++] = 0.1;
- pairs[i++] = 0.6;
- // duration, target for sustain
- pairs[i++] = 0.1;
- pairs[i++] = 0.6;
- // duration, target for release
- pairs[i++] = 0.1;
- pairs[i++] = 0.0;
- // Create mirror image of this envelope.
- int halfLength = i;
- while (i < pairs.length) {
- pairs[i] = pairs[i - halfLength];
- i++;
- pairs[i] = pairs[i - halfLength] * -1.0;
- i++;
- }
- envelope = new SegmentedEnvelope(pairs);
-
- envelopePlayer.dataQueue.queueLoop(envelope, 0, envelope.getNumFrames());
- }
-
- public static void main(String[] args) {
- try {
- new NotesToTone().play();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
-}
diff --git a/tests/com/jsyn/examples/PlayChords.java b/tests/com/jsyn/examples/PlayChords.java
deleted file mode 100644
index 28cab5f..0000000
--- a/tests/com/jsyn/examples/PlayChords.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.instruments.SubtractiveSynthVoice;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.UnitVoice;
-import com.jsyn.util.VoiceAllocator;
-import com.softsynth.math.AudioMath;
-import com.softsynth.shared.time.TimeStamp;
-
-/**
- * Play chords and melody using the VoiceAllocator.
- *
- * @author Phil Burk (C) 2009 Mobileer Inc
- */
-public class PlayChords {
- private static final int MAX_VOICES = 8;
- private Synthesizer synth;
- private VoiceAllocator allocator;
- private LineOut lineOut;
- /** Number of seconds to generate music in advance of presentation-time. */
- private double advance = 0.2;
- private double secondsPerBeat = 0.6;
- // on time over note duration
- private double dutyCycle = 0.8;
- private double measure = secondsPerBeat * 4.0;
- private UnitVoice[] voices;
-
- private void test() {
- synth = JSyn.createSynthesizer();
-
- // Add an output.
- synth.add(lineOut = new LineOut());
-
- voices = new UnitVoice[MAX_VOICES];
- for (int i = 0; i < MAX_VOICES; i++) {
- SubtractiveSynthVoice voice = new SubtractiveSynthVoice();
- synth.add(voice);
- voice.getOutput().connect(0, lineOut.input, 0);
- voice.getOutput().connect(0, lineOut.input, 1);
- voices[i] = voice;
- }
- allocator = new VoiceAllocator(voices);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the
- // voices.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Advance to a near future time so we have a clean start.
- double time = timeNow + 1.0;
-
- try {
- int tonic = 60 - 12;
- for (int i = 0; i < 4; i++) {
- playMajorMeasure1(time, tonic);
- time += measure;
- catchUp(time);
- playMajorMeasure1(time, tonic + 4);
- time += measure;
- catchUp(time);
- playMajorMeasure1(time, tonic + 7);
- time += measure;
- catchUp(time);
- playMinorMeasure1(time, tonic + 2); // minor chord
- time += measure;
- catchUp(time);
- }
- time += secondsPerBeat;
- catchUp(time);
-
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- // Stop everything.
- synth.stop();
- }
-
- private void playMinorMeasure1(double time, int base) throws InterruptedException {
- int p1 = base;
- int p2 = base + 3;
- int p3 = base + 7;
- playChord1(time, p1, p2, p3);
- playNoodle1(time, p1 + 24, p2 + 24, p3 + 24);
- }
-
- private void playMajorMeasure1(double time, int base) throws InterruptedException {
- int p1 = base;
- int p2 = base + 4;
- int p3 = base + 7;
- playChord1(time, p1, p2, p3);
- playNoodle1(time, p1 + 24, p2 + 24, p3 + 24);
- }
-
- private void playNoodle1(double time, int p1, int p2, int p3) {
- double secondsPerNote = secondsPerBeat * 0.5;
- for (int i = 0; i < 8; i++) {
- int p = pickFromThree(p1, p2, p3);
- noteOn(time, p);
- noteOff(time + dutyCycle * secondsPerNote, p);
- time += secondsPerNote;
- }
- }
-
- private int pickFromThree(int p1, int p2, int p3) {
- int r = (int) (Math.random() * 3.0);
- if (r < 1)
- return p1;
- else if (r < 2)
- return p2;
- else
- return p3;
- }
-
- private void playChord1(double time, int p1, int p2, int p3) throws InterruptedException {
- double dur = dutyCycle * secondsPerBeat;
- playTriad(time, dur, p1, p2, p3);
- time += secondsPerBeat;
- playTriad(time, dur, p1, p2, p3);
- time += secondsPerBeat;
- playTriad(time, dur * 0.25, p1, p2, p3);
- time += secondsPerBeat * 0.25;
- playTriad(time, dur * 0.25, p1, p2, p3);
- time += secondsPerBeat * 0.75;
- playTriad(time, dur, p1, p2, p3);
- time += secondsPerBeat;
- }
-
- private void playTriad(double time, double dur, int p1, int p2, int p3)
- throws InterruptedException {
- noteOn(time, p1);
- noteOn(time, p2);
- noteOn(time, p3);
- double offTime = time + dur;
- noteOff(offTime, p1);
- noteOff(offTime, p2);
- noteOff(offTime, p3);
- }
-
- private void catchUp(double time) throws InterruptedException {
- synth.sleepUntil(time - advance);
- }
-
- private void noteOff(double time, int noteNumber) {
- allocator.noteOff(noteNumber, new TimeStamp(time));
- }
-
- private void noteOn(double time, int noteNumber) {
- double frequency = AudioMath.pitchToFrequency(noteNumber);
- double amplitude = 0.2;
- TimeStamp timeStamp = new TimeStamp(time);
- allocator.noteOn(noteNumber, frequency, amplitude, timeStamp);
- }
-
- public static void main(String[] args) {
- new PlayChords().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlayCustomUnit.java b/tests/com/jsyn/examples/PlayCustomUnit.java
deleted file mode 100644
index 609c351..0000000
--- a/tests/com/jsyn/examples/PlayCustomUnit.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a tone using a JSyn oscillator and process it using a custom unit generator.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlayCustomUnit {
- private Synthesizer synth;
- private UnitOscillator osc;
- private CustomCubeUnit cuber;
- private LineOut lineOut;
-
- private void test() {
- synth = JSyn.createSynthesizer();
- // Add a tone generator.
- synth.add(osc = new SineOscillator());
- // Add a tone generator.
- synth.add(cuber = new CustomCubeUnit());
- // Add an output to the DAC.
- synth.add(lineOut = new LineOut());
- // Connect the oscillator to the cuber.
- osc.output.connect(0, cuber.input, 0);
- // Connect the cuber to the right output.
- cuber.output.connect(0, lineOut.input, 1);
- // Send the original to the left output for comparison.
- osc.output.connect(0, lineOut.input, 0);
-
- osc.frequency.set(240.0);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut.
- // It will pull data from the cuber and the oscillator.
- lineOut.start();
- // Sleep while the sound is generated in the background.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 10.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlayCustomUnit().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlayFunction.java b/tests/com/jsyn/examples/PlayFunction.java
deleted file mode 100644
index 700152b..0000000
--- a/tests/com/jsyn/examples/PlayFunction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.Function;
-import com.jsyn.unitgen.FunctionOscillator;
-import com.jsyn.unitgen.LineOut;
-
-/**
- * Play a tone using a FunctionOscillator.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlayFunction {
- Synthesizer synth;
- FunctionOscillator osc;
- LineOut lineOut;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // Add a FunctionOscillator
- synth.add(osc = new FunctionOscillator());
-
- // Define a function that gives the shape of the waveform.
- Function func = new Function() {
- @Override
- public double evaluate(double input) {
- // Input ranges from -1.0 to 1.0
- double s = Math.sin(input * Math.PI * 2.0);
- double cubed = s * s * s;
- return cubed;
- }
- };
- osc.function.set(func);
-
- // Add a stereo audio output unit.
- synth.add(lineOut = new LineOut());
-
- // Connect the oscillator to both channels of the output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Set the frequency and amplitude for the sine wave.
- osc.frequency.set(345.0);
- osc.amplitude.set(0.6);
-
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- System.out.println("You should now be hearing a sine wave. ---------");
-
- // Sleep while the sound is generated in the background.
- try {
- double time = synth.getCurrentTime();
- // Sleep for a few seconds.
- synth.sleepUntil(time + 4.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("Stop playing. -------------------");
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlayFunction().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlayGrains.java b/tests/com/jsyn/examples/PlayGrains.java
deleted file mode 100644
index b9a7b5b..0000000
--- a/tests/com/jsyn/examples/PlayGrains.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2011 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-import java.io.File;
-import java.io.IOException;
-
-import javax.swing.BorderFactory;
-import javax.swing.JApplet;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.DoubleBoundedRangeModel;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortModelFactory;
-import com.jsyn.swing.RotaryTextController;
-import com.jsyn.unitgen.ContinuousRamp;
-import com.jsyn.unitgen.GrainFarm;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SampleGrainFarm;
-import com.jsyn.util.SampleLoader;
-import com.jsyn.util.WaveRecorder;
-
-/**
- * Play with Granular Synthesis tools.
- *
- * @author Phil Burk (C) 2011 Mobileer Inc
- */
-public class PlayGrains extends JApplet {
- private static final long serialVersionUID = -8315903842197137926L;
- private Synthesizer synth;
- private LineOut lineOut;
- private AudioScope scope;
- private GrainFarm grainFarm;
- private ContinuousRamp ramp;
- private static final int NUM_GRAINS = 32;
- private FloatSample sample;
- private WaveRecorder recorder;
- private final static boolean useRecorder = false;
-
- private static final boolean useSample = false;
- // If you enable useSample then you will need to replace the file name below with a valid
- // file name on your computer.
- private File sampleFile = new File("/Users/phil/Music/samples/ChewyMonkeysWhistle.aiff");
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- PlayGrains applet = new PlayGrains();
- JAppletFrame frame = new JAppletFrame("PlayGrains", applet);
- frame.setSize(840, 500);
- frame.setVisible(true);
- frame.test();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- add(BorderLayout.NORTH,
- new JLabel("PlayGrains in an AudioScope - JSyn V" + synth.getVersion()));
-
- scope = new AudioScope(synth);
-
- // scope.addProbe( osc.output );
- scope.addProbe(grainFarm.output);
-
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- scope.getView().setControlsVisible(true);
- add(BorderLayout.CENTER, scope.getView());
- scope.start();
-
- // Arrange the knob in a row.
- JPanel knobPanel = new JPanel();
- knobPanel.setLayout(new GridLayout(1, 0));
-
- if (useSample) {
- SampleGrainFarm sampleGrainFarm = (SampleGrainFarm) grainFarm;
- knobPanel.add(setupLinearPortKnob(ramp.time, 0.001, 10.0, "Time"));
- knobPanel.add(setupLinearPortKnob(ramp.input, -1.0, 1.0, "Position"));
- knobPanel.add(setupLinearPortKnob(sampleGrainFarm.positionRange, 0.0, 0.5, "PosRange"));
- }
- knobPanel.add(setupPortKnob(grainFarm.density, 1.0, "Density"));
- knobPanel.add(setupPortKnob(grainFarm.rate, 4.0, "Rate"));
- knobPanel.add(setupPortKnob(grainFarm.rateRange, 3.0, "RateRange"));
- knobPanel.add(setupPortKnob(grainFarm.duration, 0.1, "Duration"));
- knobPanel.add(setupPortKnob(grainFarm.durationRange, 3.0, "DurRange"));
- knobPanel.add(setupPortKnob(grainFarm.amplitude, 6.0, "Amplitude"));
- knobPanel.add(setupPortKnob(grainFarm.amplitudeRange, 1.0, "AmpRange"));
- add(knobPanel, BorderLayout.SOUTH);
-
- validate();
- }
-
- private RotaryTextController setupLinearPortKnob(UnitInputPort port, double min, double max,
- String label) {
- port.setMinimum(min);
- port.setMaximum(max);
-
- DoubleBoundedRangeModel model = PortModelFactory.createLinearModel(port);
- RotaryTextController knob = new RotaryTextController(model, 10);
- knob.setBorder(BorderFactory.createTitledBorder(label));
- knob.setTitle(label);
- return knob;
- }
-
- private RotaryTextController setupPortKnob(UnitInputPort port, double max, String label) {
- port.setMinimum(0.0);
- port.setMaximum(max);
-
- DoubleBoundedRangeModel model = PortModelFactory.createExponentialModel(port);
- RotaryTextController knob = new RotaryTextController(model, 10);
- knob.setBorder(BorderFactory.createTitledBorder(label));
- knob.setTitle(label);
- return knob;
- }
-
- @Override
- public void start() {
- synth = JSyn.createSynthesizer();
-
- try {
-
- if (useRecorder) {
- File waveFile = new File("temp_recording.wav");
- // Record mono 16 bits.
- recorder = new WaveRecorder(synth, waveFile, 1);
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
-
- if (useSample) {
- sample = SampleLoader.loadFloatSample(sampleFile);
- SampleGrainFarm sampleGrainFarm = new SampleGrainFarm();
- synth.add(ramp = new ContinuousRamp());
- sampleGrainFarm.setSample(sample);
- ramp.output.connect(sampleGrainFarm.position);
- grainFarm = sampleGrainFarm;
- } else {
- GrainFarm sampleGrainFarm = new GrainFarm();
- grainFarm = sampleGrainFarm;
- }
-
- synth.add(grainFarm);
-
- grainFarm.allocate(NUM_GRAINS);
-
- // Add an output so we can hear the grains.
- synth.add(lineOut = new LineOut());
-
- grainFarm.getOutput().connect(0, lineOut.input, 0);
- grainFarm.getOutput().connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- if (useRecorder) {
- grainFarm.output.connect(0, recorder.getInput(), 0);
- // When we start the recorder it will pull data from the
- // oscillator
- // and sweeper.
- recorder.start();
- }
-
- setupGUI();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
-
- @Override
- public void stop() {
- try {
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- scope.stop();
- synth.stop();
- }
-
-}
diff --git a/tests/com/jsyn/examples/PlayMIDI.java b/tests/com/jsyn/examples/PlayMIDI.java
deleted file mode 100644
index 04c6b9b..0000000
--- a/tests/com/jsyn/examples/PlayMIDI.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.javasound.MidiDeviceTools;
-import com.jsyn.instruments.DualOscillatorSynthVoice;
-import com.jsyn.instruments.SubtractiveSynthVoice;
-import com.jsyn.midi.MessageParser;
-import com.jsyn.midi.MidiConstants;
-import com.jsyn.midi.MidiSynthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.PowerOfTwo;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.UnitVoice;
-import com.jsyn.util.MultiChannelSynthesizer;
-import com.jsyn.util.VoiceAllocator;
-import com.jsyn.util.VoiceDescription;
-import com.softsynth.math.AudioMath;
-import com.softsynth.shared.time.TimeStamp;
-
-/**
- * Send MIDI messages to JSyn based MIDI synthesizer.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlayMIDI {
- private static final int NUM_CHANNELS = 16;
- private static final int VOICES_PER_CHANNEL = 6;
- private Synthesizer synth;
- private MidiSynthesizer midiSynthesizer;
- private LineOut lineOut;
-
- private VoiceDescription voiceDescription;
- private MultiChannelSynthesizer multiSynth;
-
- public static void main(String[] args) {
- PlayMIDI app = new PlayMIDI();
- try {
- VoiceDescription description = DualOscillatorSynthVoice.getVoiceDescription();
- app.test(description);
- System.out.println("Test complete");
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.exit(0);
- }
-
- public void sendMidiMessage(byte[] bytes) {
- midiSynthesizer.onReceive(bytes, 0, bytes.length);
- }
-
- public void sendNoteOff(int channel, int pitch, int velocity) {
- midiCommand(MidiConstants.NOTE_OFF + channel, pitch, velocity);
- }
-
- public void sendNoteOn(int channel, int pitch, int velocity) {
- midiCommand(MidiConstants.NOTE_ON + channel, pitch, velocity);
- }
-
- public void sendControlChange(int channel, int index, int value) {
- midiCommand(MidiConstants.CONTROL_CHANGE + channel, index, value);
- }
-
- /**
- * @param channel
- * @param program starts at zero
- */
- private void sendProgramChange(int channel, int program) {
- midiCommand(MidiConstants.PROGRAM_CHANGE + channel, program);
-
- }
-
- /**
- * Send either RPN or NRPN.
- */
- public void sendParameter(int channel, int index14, int value14, int controllerXPN) {
- int indexLsb = index14 & 0x07F;
- int indexMsb = (index14 >> 7) & 0x07F;
- int valueLsb = value14 & 0x07F;
- int valueMsb = (value14 >> 7) & 0x07F;
- sendControlChange(channel, controllerXPN + 1, indexMsb);
- sendControlChange(channel, controllerXPN, indexLsb);
- sendControlChange(channel, MidiConstants.CONTROLLER_DATA_ENTRY, valueMsb);
- sendControlChange(channel, MidiConstants.CONTROLLER_DATA_ENTRY_LSB, valueLsb);
- sendControlChange(channel, controllerXPN + 1, 0x7F); // NULL RPN index
- sendControlChange(channel, controllerXPN, 0x7F); // to deactivate RPN
- }
-
- public void sendRPN(int channel, int index14, int value14) {
- sendParameter(channel, index14, value14, MidiConstants.CONTROLLER_RPN_LSB);
- }
-
- public void sendNRPN(int channel, int index14, int value14) {
- sendParameter(channel, index14, value14, MidiConstants.CONTROLLER_NRPN_LSB);
- }
-
- private void midiCommand(int status, int data1, int data2) {
- byte[] buffer = new byte[3];
- buffer[0] = (byte) status;
- buffer[1] = (byte) data1;
- buffer[2] = (byte) data2;
- sendMidiMessage(buffer);
- }
-
- private void midiCommand(int status, int data1) {
- byte[] buffer = new byte[2];
- buffer[0] = (byte) status;
- buffer[1] = (byte) data1;
- sendMidiMessage(buffer);
- }
-
- public int test(VoiceDescription description) throws IOException, InterruptedException {
- setupSynth(description);
-
- //playOctaveUsingBend();
- playSameNotesBent();
-
- // Setup all the channels.
- int maxChannels = 8;
- for (int channel = 0; channel < maxChannels; channel++) {
- int program = channel;
- sendProgramChange(channel, program);
- }
- playNotePerChannel(maxChannels);
-
- return 0;
- }
-
- private void playOctaveUsingBend() throws InterruptedException {
- sendProgramChange(0, 0);
- float range0 = 12.0f;
- sendPitchBendRange(0, range0);
- for(int i = 0; i < 13; i++) {
- System.out.println("Bend to pitch " + i);
- sendPitchBend(0, i / range0);
- sendNoteOn(0, 60, 100);
- synth.sleepFor(0.5);
- sendNoteOff(0, 60, 100);
- synth.sleepFor(0.5);
- }
- }
-
- private void playSameNotesBent() throws InterruptedException {
- sendProgramChange(0, 0);
- sendProgramChange(1, 0);
- float range0 = 2.3f;
- float range1 = 6.8f;
- sendPitchBendRange(0, range0);
- sendPitchBendRange(1, range1);
- sendPitchBend(0, 0.0f / range0); // bend by 0 semitones
- sendPitchBend(1, 1.0f / range1); // bend by 1 semitones
-
- System.out.println("These two notes should play at the same pitch.");
- sendNoteOn(0, 61, 100);
- synth.sleepFor(0.5);
- sendNoteOff(0, 61, 100);
-
- sendNoteOn(1, 60, 100);
- synth.sleepFor(0.5);
- sendNoteOff(1, 60, 100);
-
- synth.sleepFor(2.0);
- System.out.println("------ done ---------------");
- }
-
- /**
- *
- * @param channel
- * @param normalizedBend between -1 and +1
- */
- private void sendPitchBend(int channel, float normalizedBend) {
- final int BEND_MIN = 0x0000;
- final int BEND_CENTER = 0x2000;
- final int BEND_MAX = 0x3FFF;
- int bend = BEND_CENTER + (int)(BEND_CENTER * normalizedBend);
- if (bend < BEND_MIN) bend = BEND_MIN;
- else if (bend > BEND_MAX) bend = BEND_MAX;
- int lsb = bend & 0x07F;
- int msb = (bend >> 7) & 0x07F;
- midiCommand(MidiConstants.PITCH_BEND + channel, lsb, msb);
- }
-
- private void sendPitchBendRange(int channel, float range0) {
- int semitones = (int)range0;
- int cents = (int) (100 * (range0 - semitones));
- int value = (semitones << 7) + cents;
- sendRPN(channel, MidiConstants.RPN_BEND_RANGE, value);
- }
-
- private void playNotePerChannel(int maxChannels) throws InterruptedException {
- // Play notes on those channels.
- for (int channel = 0; channel < maxChannels; channel++) {
- sendNoteOn(channel, 60 + channel, 100);
- synth.sleepFor(0.5);
- sendNoteOff(channel, 60 + channel, 100);
- synth.sleepFor(0.5);
- }
- }
-
- private void setupSynth(VoiceDescription description) {
- synth = JSyn.createSynthesizer();
-
- // Add an output.
- synth.add(lineOut = new LineOut());
-
- voiceDescription = description;
- multiSynth = new MultiChannelSynthesizer();
- final int startChannel = 0;
- multiSynth.setup(synth, startChannel, NUM_CHANNELS, VOICES_PER_CHANNEL, voiceDescription);
- midiSynthesizer = new MidiSynthesizer(multiSynth);
-
- multiSynth.getOutput().connect(0,lineOut.input, 0);
- multiSynth.getOutput().connect(1,lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- lineOut.start();
- }
-
-}
diff --git a/tests/com/jsyn/examples/PlayNotes.java b/tests/com/jsyn/examples/PlayNotes.java
deleted file mode 100644
index 65dc930..0000000
--- a/tests/com/jsyn/examples/PlayNotes.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillator;
-import com.jsyn.unitgen.UnitGenerator;
-import com.jsyn.unitgen.UnitVoice;
-import com.softsynth.shared.time.TimeStamp;
-
-/**
- * Play notes using timestamped noteOn and noteOff methods of the UnitVoice.
- *
- * @author Phil Burk (C) 2009 Mobileer Inc
- */
-public class PlayNotes {
- Synthesizer synth;
- UnitGenerator ugen;
- UnitVoice voice;
- LineOut lineOut;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- // Set output latency to 123 msec because this is not an interactive app.
- synth.getAudioDeviceManager().setSuggestedOutputLatency(0.123);
-
- // Add a tone generator.
- synth.add(ugen = new SawtoothOscillator());
- // synth.add( ugen = new SineOscillator() );
- // synth.add( ugen = new SubtractiveSynthVoice() );
- voice = (UnitVoice) ugen;
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Connect the oscillator to the left and right audio output.
- voice.getOutput().connect(0, lineOut.input, 0);
- voice.getOutput().connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Advance to a near future time so we have a clean start.
- TimeStamp timeStamp = new TimeStamp(timeNow + 0.5);
-
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- synth.startUnit(lineOut, timeStamp);
-
- // Schedule a note on and off.
- double freq = 200.0; // hertz
- double duration = 1.4;
- double onTime = 1.0;
- voice.noteOn(freq, 0.5, timeStamp);
- voice.noteOff(timeStamp.makeRelative(onTime));
-
- // Schedule this to happen a bit later.
- timeStamp = timeStamp.makeRelative(duration);
- freq *= 1.5; // up a perfect fifth
- voice.noteOn(freq, 0.5, timeStamp);
- voice.noteOff(timeStamp.makeRelative(onTime));
-
- timeStamp = timeStamp.makeRelative(duration);
- freq *= 4.0 / 5.0; // down a major third
- voice.noteOn(freq, 0.5, timeStamp);
- voice.noteOff(timeStamp.makeRelative(onTime));
-
- // Sleep while the song is being generated in the background thread.
- try {
- System.out.println("Sleep while synthesizing.");
- synth.sleepUntil(timeStamp.getTime() + 2.0);
- System.out.println("Woke up...");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlayNotes().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlayPartials.java b/tests/com/jsyn/examples/PlayPartials.java
deleted file mode 100644
index 1d7d88e..0000000
--- a/tests/com/jsyn/examples/PlayPartials.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.LinearRamp;
-import com.jsyn.unitgen.Multiply;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a enharmonic sine tones using JSyn oscillators.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlayPartials {
- private Synthesizer synth;
- private UnitOscillator[] osc;
- private Multiply[] multipliers;
- private LinearRamp ramp;
- private LineOut lineOut;
- private double[] amps = {
- 0.2, 0.1, 0.3, 0.4
- };
- private double[] ratios = {
- 1.0, Math.sqrt(2.0), Math.E, Math.PI
- };
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // Add a stereo audio output unit.
- synth.add(lineOut = new LineOut());
- synth.add(ramp = new LinearRamp());
-
- // Add a tone generator.
- osc = new SineOscillator[amps.length];
- multipliers = new Multiply[ratios.length];
-
- for (int i = 0; i < osc.length; i++) {
- // Create unit generators and store them in arrays.
- synth.add(osc[i] = new SineOscillator());
- synth.add(multipliers[i] = new Multiply());
-
- // Connect each oscillator to both channels of the output.
- // They will be mixed automatically.
- osc[i].output.connect(0, lineOut.input, 0);
- osc[i].output.connect(0, lineOut.input, 1);
-
- // Use a multiplier to scale the output of the ramp.
- // output = inputA * inputB
- ramp.output.connect(multipliers[i].inputA);
- multipliers[i].output.connect(osc[i].frequency);
- multipliers[i].inputB.set(ratios[i]);
-
- osc[i].amplitude.set(amps[i]);
- }
-
- // start ramping up
- ramp.current.set(100.0);
- ramp.time.set(3.0);
- ramp.input.set(700.0);
-
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- System.out.println("You should now be hearing a sine wave. ---------");
-
- // Sleep while the sound is generated in the background.
- try {
- // Sleep for a few seconds.
- synth.sleepFor(4.0);
- // ramp down
- ramp.input.set(100.0);
- synth.sleepFor(4.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("Stop playing. -------------------");
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- System.out.println("Java version = " + System.getProperty("java.version"));
- new PlayPartials().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlaySample.java b/tests/com/jsyn/examples/PlaySample.java
deleted file mode 100644
index ac3d5ff..0000000
--- a/tests/com/jsyn/examples/PlaySample.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-import com.jsyn.unitgen.VariableRateStereoReader;
-import com.jsyn.util.SampleLoader;
-
-/**
- * Play a sample from a WAV file using JSyn.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlaySample {
- private Synthesizer synth;
- private VariableRateDataReader samplePlayer;
- private LineOut lineOut;
-
- private void test() {
-
- URL sampleFile;
- try {
- sampleFile = new URL("http://www.softsynth.com/samples/Clarinet.wav");
- // sampleFile = new URL("http://www.softsynth.com/samples/NotHereNow22K.wav");
- } catch (MalformedURLException e2) {
- e2.printStackTrace();
- return;
- }
-
- synth = JSyn.createSynthesizer();
-
- FloatSample sample;
- try {
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Load the sample and display its properties.
- SampleLoader.setJavaSoundPreferred(false);
- sample = SampleLoader.loadFloatSample(sampleFile);
- System.out.println("Sample has: channels = " + sample.getChannelsPerFrame());
- System.out.println(" frames = " + sample.getNumFrames());
- System.out.println(" rate = " + sample.getFrameRate());
- System.out.println(" loopStart = " + sample.getSustainBegin());
- System.out.println(" loopEnd = " + sample.getSustainEnd());
-
- if (sample.getChannelsPerFrame() == 1) {
- synth.add(samplePlayer = new VariableRateMonoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- } else if (sample.getChannelsPerFrame() == 2) {
- synth.add(samplePlayer = new VariableRateStereoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- samplePlayer.output.connect(1, lineOut.input, 1);
- } else {
- throw new RuntimeException("Can only play mono or stereo samples.");
- }
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- samplePlayer.rate.set(sample.getFrameRate());
-
- // We only need to start the LineOut. It will pull data from the
- // sample player.
- lineOut.start();
-
- // We can simply queue the entire file.
- // Or if it has a loop we can play the loop for a while.
- if (sample.getSustainBegin() < 0) {
- System.out.println("queue the sample");
- samplePlayer.dataQueue.queue(sample);
- } else {
- System.out.println("queueOn the sample");
- samplePlayer.dataQueue.queueOn(sample);
- synth.sleepFor(8.0);
- System.out.println("queueOff the sample");
- samplePlayer.dataQueue.queueOff(sample);
- }
-
- // Wait until the sample has finished playing.
- do {
- synth.sleepFor(1.0);
- } while (samplePlayer.dataQueue.hasMore());
-
- synth.sleepFor(0.5);
-
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlaySample().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlaySampleCrossfade.java b/tests/com/jsyn/examples/PlaySampleCrossfade.java
deleted file mode 100644
index b5ea5ca..0000000
--- a/tests/com/jsyn/examples/PlaySampleCrossfade.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.GridLayout;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import javax.swing.JApplet;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.devices.AudioDeviceFactory;
-import com.jsyn.ports.QueueDataCommand;
-import com.jsyn.swing.DoubleBoundedRangeModel;
-import com.jsyn.swing.DoubleBoundedRangeSlider;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortControllerFactory;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-import com.jsyn.unitgen.VariableRateStereoReader;
-import com.jsyn.util.SampleLoader;
-
-/**
- * Play a sample from a WAV file using JSyn. Use a crossfade to play a loop at an arbitrary
- * position.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlaySampleCrossfade extends JApplet {
- private static final double LOOP_START_FRACTION = 0.2;
- private Synthesizer synth;
- private VariableRateDataReader samplePlayer;
- private LineOut lineOut;
- private FloatSample sample;
- private DoubleBoundedRangeModel rangeModelSize;
- private DoubleBoundedRangeModel rangeModelCrossfade;
- private int loopStartFrame;
-
- @Override
- public void init() {
-
- URL sampleFile;
- try {
- sampleFile = new URL("http://www.softsynth.com/samples/Clarinet.wav");
- } catch (MalformedURLException e2) {
- e2.printStackTrace();
- return;
- }
-
- synth = JSyn.createSynthesizer(AudioDeviceFactory.createAudioDeviceManager(true));
-
- try {
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Load the sample and display its properties.
- SampleLoader.setJavaSoundPreferred(false);
- sample = SampleLoader.loadFloatSample(sampleFile);
- System.out.println("Sample has: channels = " + sample.getChannelsPerFrame());
- System.out.println(" frames = " + sample.getNumFrames());
- System.out.println(" rate = " + sample.getFrameRate());
- System.out.println(" loopStart = " + sample.getSustainBegin());
- System.out.println(" loopEnd = " + sample.getSustainEnd());
-
- if (sample.getChannelsPerFrame() == 1) {
- synth.add(samplePlayer = new VariableRateMonoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- } else if (sample.getChannelsPerFrame() == 2) {
- synth.add(samplePlayer = new VariableRateStereoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- samplePlayer.output.connect(1, lineOut.input, 1);
- } else {
- throw new RuntimeException("Can only play mono or stereo samples.");
- }
-
- samplePlayer.rate.set(sample.getFrameRate());
-
- } catch (IOException e1) {
- e1.printStackTrace();
- }
-
- // Start at arbitrary position near beginning of sample.
- loopStartFrame = (int) (sample.getNumFrames() * LOOP_START_FRACTION);
-
- // Arrange the faders in a stack.
- setLayout(new GridLayout(0, 1));
-
- samplePlayer.rate.setup(4000.0, sample.getFrameRate(), sample.getFrameRate() * 2.0);
- add(PortControllerFactory.createExponentialPortSlider(samplePlayer.rate));
-
- // Use fader to select arbitrary loop size.
- rangeModelSize = new DoubleBoundedRangeModel("LoopSize", 10000, 0.01,
- (1.0 - LOOP_START_FRACTION), 0.5);
- rangeModelSize.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- queueNewLoop();
- }
-
- });
- add(new DoubleBoundedRangeSlider(rangeModelSize, 3));
-
- // Use fader to set the size of the crossfade region.
- rangeModelCrossfade = new DoubleBoundedRangeModel("Crossfade", 1000, 0.0, 1000.0, 0.0);
- rangeModelCrossfade.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- queueNewLoop();
- }
-
- });
-
- add(new DoubleBoundedRangeSlider(rangeModelCrossfade, 3));
-
- validate();
- }
-
- private void queueNewLoop() {
- int loopSize = (int) (sample.getNumFrames() * rangeModelSize.getDoubleValue());
- if ((loopStartFrame + loopSize) > sample.getNumFrames()) {
- loopSize = sample.getNumFrames() - loopStartFrame;
- }
- int crossFadeSize = (int) (rangeModelCrossfade.getDoubleValue());
-
- // For complex queuing operations, create a command and then customize it.
- QueueDataCommand command = samplePlayer.dataQueue.createQueueDataCommand(sample,
- loopStartFrame, loopSize);
- command.setNumLoops(-1);
- command.setSkipIfOthers(true);
- command.setCrossFadeIn(crossFadeSize);
-
- System.out.println("Queue: " + loopStartFrame + ", #" + loopSize + ", X=" + crossFadeSize);
- synth.queueCommand(command);
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // Start the LineOut. It will pull data from the oscillator.
- lineOut.start();
-
- // Queue attack portion of sample.
- samplePlayer.dataQueue.queue(sample, 0, loopStartFrame);
- queueNewLoop();
- }
-
- @Override
- public void stop() {
- synth.stop();
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- PlaySampleCrossfade applet = new PlaySampleCrossfade();
- JAppletFrame frame = new JAppletFrame("PlaySampleCrossfade", applet);
- frame.setSize(440, 300);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/PlaySampleWaveShaper.java b/tests/com/jsyn/examples/PlaySampleWaveShaper.java
deleted file mode 100644
index 73758dd..0000000
--- a/tests/com/jsyn/examples/PlaySampleWaveShaper.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.data.Function;
-import com.jsyn.unitgen.FunctionEvaluator;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.util.SampleLoader;
-
-/**
- * Play a sample from a WAV file using JSyn.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlaySampleWaveShaper {
- private Synthesizer synth;
- private LineOut lineOut;
-
- private void test() {
-
- URL sampleFile;
- try {
- sampleFile = new URL("http://www.softsynth.com/samples/Clarinet.wav");
- // sampleFile = new URL("http://www.softsynth.com/samples/NotHereNow22K.wav");
- } catch (MalformedURLException e2) {
- e2.printStackTrace();
- return;
- }
-
- synth = JSyn.createSynthesizer();
-
- FloatSample sample;
- try {
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Load the sample and display its properties.
- SampleLoader.setJavaSoundPreferred(false);
- sample = SampleLoader.loadFloatSample(sampleFile);
- System.out.println("Sample has: channels = " + sample.getChannelsPerFrame());
- System.out.println(" frames = " + sample.getNumFrames());
- System.out.println(" rate = " + sample.getFrameRate());
- System.out.println(" loopStart = " + sample.getSustainBegin());
- System.out.println(" loopEnd = " + sample.getSustainEnd());
-
- if (sample.getChannelsPerFrame() != 1) {
- throw new RuntimeException("Can only use mono samples.");
- }
-
- System.out.println("eval -1.1 = " + sample.evaluate(-1.1));
- System.out.println("eval -1.0 = " + sample.evaluate(-1.0));
- System.out.println("eval 0.3 = " + sample.evaluate(0.3));
- System.out.println("eval 1.0 = " + sample.evaluate(1.0));
- System.out.println("eval 1.1 = " + sample.evaluate(1.1));
-
- FunctionEvaluator shaper = new FunctionEvaluator();
- shaper.function.set(sample);
- synth.add(shaper);
-
- shaper.output.connect(0, lineOut.input, 0);
- shaper.output.connect(0, lineOut.input, 1);
-
- SineOscillator osc = new SineOscillator();
- osc.frequency.set(0.2);
- osc.output.connect(shaper.input);
- synth.add(osc);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // We only need to start the LineOut. It will pull data from the
- // sample player.
- lineOut.start();
-
- // Wait until the sample has finished playing.
- synth.sleepFor(5.0);
-
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlaySampleWaveShaper().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlaySegmentedEnvelope.java b/tests/com/jsyn/examples/PlaySegmentedEnvelope.java
deleted file mode 100644
index e7cc8f7..0000000
--- a/tests/com/jsyn/examples/PlaySegmentedEnvelope.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.SegmentedEnvelope;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-import com.jsyn.util.WaveRecorder;
-
-/**
- * Modulate the amplitude of an oscillator using a segmented envelope.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlaySegmentedEnvelope {
- private Synthesizer synth;
- private UnitOscillator osc;
- private LineOut lineOut;
- private SegmentedEnvelope envelope;
- private VariableRateDataReader envelopePlayer;
- private WaveRecorder recorder;
- private final static boolean useRecorder = true;
-
- private void test() throws IOException {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- // Add a tone generator.
- synth.add(osc = new SawtoothOscillatorBL());
- // Add an envelope player.
- synth.add(envelopePlayer = new VariableRateMonoReader());
-
- if (useRecorder) {
- File waveFile = new File("temp_recording.wav");
- // Default is stereo, 16 bits.
- recorder = new WaveRecorder(synth, waveFile);
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
-
- // Create an envelope consisting of (duration,value) pairs.
- double[] pairs = {
- 0.1, 1.0, 0.2, 0.3, 0.6, 0.0
- };
- envelope = new SegmentedEnvelope(pairs);
-
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
- envelopePlayer.output.connect(osc.amplitude);
- // Connect the oscillator to the output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- if (useRecorder) {
- osc.output.connect(0, recorder.getInput(), 0);
- envelopePlayer.output.connect(0, recorder.getInput(), 1);
- // When we start the recorder it will pull data from the oscillator
- // and sweeper.
- recorder.start();
- }
-
- // We only need to start the LineOut. It will pull data from the other
- // units.
- lineOut.start();
-
- try {
- // ---------------------------------------------
- // Queue the entire envelope to play once.
- envelopePlayer.dataQueue.queue(envelope);
- synth.sleepFor(2.0);
-
- // ---------------------------------------------
- // Queue the attack, then sustain for a while, then queue the
- // release.
- osc.frequency.set(750.0);
- envelopePlayer.dataQueue.queue(envelope, 0, 2); // attack
- synth.sleepFor(2.0);
- envelopePlayer.dataQueue.queue(envelope, 2, 1); // release
- synth.sleepFor(2.0);
-
- // ---------------------------------------------
- // Queue the attack, then sustain for a while, then queue the
- // release. But this time use the sustain loop points.
- osc.frequency.set(950.0);
- // For noteOn, we want to play frames 0 and 1 then stop before 2.
- envelope.setSustainBegin(2);
- envelope.setSustainEnd(2);
- envelopePlayer.dataQueue.queueOn(envelope); // attack
- synth.sleepFor(2.0);
- envelopePlayer.dataQueue.queueOff(envelope); // release
- synth.sleepFor(2.0);
-
- // ---------------------------------------------
- // Queue the entire envelope to play 4 times (3 loops back).
- osc.frequency.set(350.0);
- envelopePlayer.dataQueue.queueLoop(envelope, 0, envelope.getNumFrames(), 3);
- synth.sleepFor(5.0);
-
- // ---------------------------------------------
- // Queue the entire envelope as a repeating loop.
- // It will loop until something else is queued.
- osc.frequency.set(450.0);
- envelopePlayer.dataQueue.queueLoop(envelope, 0, envelope.getNumFrames());
- envelopePlayer.rate.set(3.0);
- synth.sleepFor(5.0);
- // Queue last frame to stop the looping.
- envelopePlayer.dataQueue.queue(envelope, envelope.getNumFrames() - 1, 1);
- synth.sleepFor(1.0);
-
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- try {
- new PlaySegmentedEnvelope().test();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/tests/com/jsyn/examples/PlaySegmentedEnvelopeCallback.java b/tests/com/jsyn/examples/PlaySegmentedEnvelopeCallback.java
deleted file mode 100644
index cf2441e..0000000
--- a/tests/com/jsyn/examples/PlaySegmentedEnvelopeCallback.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.SegmentedEnvelope;
-import com.jsyn.ports.QueueDataCommand;
-import com.jsyn.ports.QueueDataEvent;
-import com.jsyn.ports.UnitDataQueueCallback;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-
-/**
- * Use a UnitDataQueueCallback to notify us of the envelope's progress. Modulate the amplitude of an
- * oscillator using a segmented envelope.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlaySegmentedEnvelopeCallback {
- private Synthesizer synth;
- private UnitOscillator osc;
- private LineOut lineOut;
- private SegmentedEnvelope envelope;
- private VariableRateDataReader envelopePlayer;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- // Add a tone generator.
- synth.add(osc = new SawtoothOscillatorBL());
- // Add an envelope player.
- synth.add(envelopePlayer = new VariableRateMonoReader());
-
- // Create an envelope consisting of (duration,value) pairs.
- double[] pairs = {
- 0.1, 1.0, 0.2, 0.5, 0.6, 0.0
- };
- envelope = new SegmentedEnvelope(pairs);
-
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
- envelopePlayer.output.connect(osc.amplitude);
- // Connect the oscillator to the output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the other
- // units.
- lineOut.start();
-
- try {
- // Queue an envelope with callbacks.
- QueueDataCommand command = envelopePlayer.dataQueue.createQueueDataCommand(envelope, 0,
- envelope.getNumFrames());
- // Create an object to be called when the queued data is done.
- TestQueueCallback callback = new TestQueueCallback();
- command.setCallback(callback);
- command.setNumLoops(2);
- envelopePlayer.rate.set(0.2);
- synth.queueCommand(command);
- synth.sleepFor(20.0);
-
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- class TestQueueCallback implements UnitDataQueueCallback {
- @Override
- public void started(QueueDataEvent event) {
- System.out.println("CALLBACK: Envelope started.");
- }
-
- @Override
- public void looped(QueueDataEvent event) {
- System.out.println("CALLBACK: Envelope looped.");
- }
-
- @Override
- public void finished(QueueDataEvent event) {
- System.out.println("CALLBACK: Envelope finished.");
- // Queue the envelope again at a faster rate.
- // (If this hangs we may have hit a deadlock.)
- envelopePlayer.rate.set(2.0);
- envelopePlayer.dataQueue.queue(envelope);
- }
- }
-
- public static void main(String[] args) {
- new PlaySegmentedEnvelopeCallback().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlaySequence.java b/tests/com/jsyn/examples/PlaySequence.java
deleted file mode 100644
index 9d058b2..0000000
--- a/tests/com/jsyn/examples/PlaySequence.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Use time stamps to change the frequency of an oscillator at precise times.
- *
- * @author Phil Burk (C) 2009 Mobileer Inc
- */
-public class PlaySequence {
- Synthesizer synth;
- UnitOscillator osc;
- LineOut lineOut;
-
- private void test() {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
-
- // Add a tone generator.
- synth.add(osc = new SawtoothOscillatorBL());
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Connect the oscillator to the left and right audio output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Advance to a near future time so we have a clean start.
- double time = timeNow + 0.5;
- double freq = 400.0; // hertz
- osc.frequency.set(freq, time);
-
- // Schedule this to happen a bit later.
- time += 0.5;
- freq *= 1.5; // up a perfect fifth
- osc.frequency.set(freq, time);
-
- time += 0.5;
- freq *= 4.0 / 5.0; // down a major third
- osc.frequency.set(freq, time);
-
- // Sleep while the sound is being generated in the background thread.
- try {
- synth.sleepUntil(time + 0.5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlaySequence().test();
- }
-}
diff --git a/tests/com/jsyn/examples/PlayTone.java b/tests/com/jsyn/examples/PlayTone.java
deleted file mode 100644
index 172c98a..0000000
--- a/tests/com/jsyn/examples/PlayTone.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a tone using a JSyn oscillator.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class PlayTone {
- Synthesizer synth;
- UnitOscillator osc;
- LineOut lineOut;
-
- private void test() {
-
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- // Add a tone generator.
- synth.add(osc = new SineOscillator());
- // Add a stereo audio output unit.
- synth.add(lineOut = new LineOut());
-
- // Connect the oscillator to both channels of the output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Set the frequency and amplitude for the sine wave.
- osc.frequency.set(345.0);
- osc.amplitude.set(0.6);
-
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- System.out.println("You should now be hearing a sine wave. ---------");
-
- // Sleep while the sound is generated in the background.
- try {
- double time = synth.getCurrentTime();
- System.out.println("time = " + time);
- // Sleep for a few seconds.
- synth.sleepUntil(time + 4.0);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("Stop playing. -------------------");
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new PlayTone().test();
- }
-}
diff --git a/tests/com/jsyn/examples/RecordSineSweep.java b/tests/com/jsyn/examples/RecordSineSweep.java
deleted file mode 100644
index bb248e8..0000000
--- a/tests/com/jsyn/examples/RecordSineSweep.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Test recording to disk in non-real-time.
- * Play several frequencies of a sine wave.
- * Save data in a WAV file format.
- *
- * @author (C) 2010 Phil Burk
- */
-
-package com.jsyn.examples;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.ExponentialRamp;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.util.WaveRecorder;
-
-public class RecordSineSweep {
- final static double SONG_DURATION = 4.0;
- private Synthesizer synth;
- private UnitOscillator leftOsc;
- private UnitOscillator rightOsc;
- private ExponentialRamp sweeper;
- private LineOut lineOut;
- private WaveRecorder recorder;
- private final static boolean useRecorder = true;
-
- private void test() throws IOException {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
-
- if (useRecorder) {
- File waveFile = new File("temp_recording.wav");
- // Default is stereo, 16 bits.
- recorder = new WaveRecorder(synth, waveFile);
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
- // Add some tone generators.
- synth.add(leftOsc = new SineOscillator());
- synth.add(rightOsc = new SawtoothOscillatorBL());
-
- // Add a controller that will sweep up.
- synth.add(sweeper = new ExponentialRamp());
- // Add an output unit.
- synth.add(lineOut = new LineOut());
-
- sweeper.current.set(50.0);
- sweeper.input.set(1400.0);
- sweeper.time.set(SONG_DURATION);
- sweeper.output.connect(leftOsc.frequency);
- sweeper.output.connect(rightOsc.frequency);
-
- // Connect the oscillator to the left and right audio output.
- leftOsc.output.connect(0, lineOut.input, 0);
- rightOsc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- if (useRecorder) {
- leftOsc.output.connect(0, recorder.getInput(), 0);
- rightOsc.output.connect(0, recorder.getInput(), 1);
- // When we start the recorder it will pull data from the oscillator
- // and sweeper.
- recorder.start();
- }
-
- // We also need to start the LineOut if we want to hear it now.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Sleep while the sound is being generated in the background thread.
- try {
- synth.sleepUntil(timeNow + SONG_DURATION);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- // Test stopping and restarting a recorder. This will cause a pop.
- if (recorder != null) {
- System.out.println("Stop and restart recorder.");
- recorder.stop();
- }
- sweeper.input.set(100.0);
- timeNow = synth.getCurrentTime();
- if (recorder != null) {
- recorder.start();
- }
-
- // Sleep while the sound is being generated in the background thread.
- try {
- synth.sleepUntil(timeNow + SONG_DURATION);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- try {
- new RecordSineSweep().test();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
-}
diff --git a/tests/com/jsyn/examples/SampleHoldNoteBlaster.java b/tests/com/jsyn/examples/SampleHoldNoteBlaster.java
deleted file mode 100644
index bc6b4d0..0000000
--- a/tests/com/jsyn/examples/SampleHoldNoteBlaster.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2011 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.ports.UnitOutputPort;
-import com.jsyn.unitgen.Circuit;
-import com.jsyn.unitgen.EdgeDetector;
-import com.jsyn.unitgen.EnvelopeDAHDSR;
-import com.jsyn.unitgen.FilterLowPass;
-import com.jsyn.unitgen.Latch;
-import com.jsyn.unitgen.Multiply;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.PulseOscillator;
-import com.jsyn.unitgen.SawtoothOscillatorDPW;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.UnitSource;
-
-/**
- * Classic osc-filter-envelope voice with a sample and hold.
- *
- * @author Phil Burk (C) 2011 Mobileer Inc
- */
-public class SampleHoldNoteBlaster extends Circuit implements UnitSource {
-
- public UnitInputPort frequency;
- public UnitInputPort amplitude;
- public UnitInputPort modRate;
- public UnitInputPort modDepth;
- private UnitInputPort cutoff;
- private UnitInputPort resonance;
- private UnitInputPort pulseRate;
- private UnitInputPort sweepRate;
- private UnitInputPort sweepDepth;
- public UnitOutputPort output;
-
- private static SampleHoldNoteBlaster soundMaker; // singleton
-
- private UnitOscillator osc;
- private UnitOscillator samplee; // for sample and hold
- private PulseOscillator pulser;
- private Latch latch;
- private UnitOscillator lfo;
- private FilterLowPass filter;
- private PassThrough frequencyPin;
- private Multiply modScaler;
- private EnvelopeDAHDSR ampEnv;
- private Multiply sweepScaler;
- private EdgeDetector edgeDetector;
- private UnitInputPort pulseWidth;
- private UnitInputPort attack;
- private UnitInputPort decay;
- private UnitInputPort sustain;
- private UnitInputPort release;
-
- public static SampleHoldNoteBlaster getInstance() {
- if (soundMaker == null) {
- soundMaker = new SampleHoldNoteBlaster();
- }
- return soundMaker;
- }
-
- public SampleHoldNoteBlaster() {
- add(frequencyPin = new PassThrough());
- add(modScaler = new Multiply());
- add(sweepScaler = new Multiply());
- add(edgeDetector = new EdgeDetector());
- add(latch = new Latch());
- add(samplee = new SineOscillator());
- add(pulser = new PulseOscillator());
- add(lfo = new SineOscillator());
- add(osc = new SawtoothOscillatorDPW());
- add(filter = new FilterLowPass());
- // Use an envelope to control the amplitude.
- add(ampEnv = new EnvelopeDAHDSR());
-
- samplee.output.connect(latch.input);
- pulser.output.connect(edgeDetector.input);
- edgeDetector.output.connect(latch.gate);
- latch.output.connect(osc.frequency);
-
- frequencyPin.output.connect(osc.frequency);
-
- frequencyPin.output.connect(modScaler.inputA);
- modScaler.output.connect(lfo.amplitude);
-
- frequencyPin.output.connect(sweepScaler.inputA);
- sweepScaler.output.connect(samplee.amplitude);
-
- lfo.output.connect(osc.frequency);
- osc.output.connect(filter.input);
- filter.output.connect(ampEnv.amplitude);
- pulser.output.connect(ampEnv.input);
-
- // Setup ports ---------------
- addPort(amplitude = osc.amplitude, "amplitude");
- amplitude.set(0.6);
-
- addPort(frequency = frequencyPin.input, "frequency");
- frequency.setup(50.0, 800.0, 2000.0);
-
- addPort(modRate = lfo.frequency, "modRate");
- modRate.setup(0.0, 12, 20.0);
-
- addPort(modDepth = modScaler.inputB, "modDepth");
- modDepth.setup(0.0, 0.0, 0.5);
-
- addPort(cutoff = filter.frequency, "cutoff");
- cutoff.setup(20.0, 2000.0, 5000.0);
- addPort(resonance = filter.Q, "Q");
-
- addPort(sweepDepth = sweepScaler.inputB, "sweepDepth");
- sweepDepth.setup(0.0, 0.6, 1.0);
- addPort(sweepRate = samplee.frequency, "sweepRate");
- sweepRate.setup(0.2, 5.9271, 20.0);
-
- addPort(pulseRate = pulser.frequency, "pulseRate");
- pulseRate.setup(0.2, 7.0, 20.0);
- addPort(pulseWidth = pulser.width, "pulseWidth");
- pulseWidth.setup(-0.9, 0.9, 0.9);
-
- addPort(attack = ampEnv.attack, "attack");
- attack.setup(0.001, 0.001, 2.0);
- addPort(decay = ampEnv.decay, "decay");
- decay.setup(0.001, 0.26, 2.0);
- addPort(sustain = ampEnv.sustain, "sustain");
- sustain.setup(0.000, 0.24, 1.0);
- addPort(release = ampEnv.release, "release");
- release.setup(0.001, 0.2, 2.0);
-
- addPort(output = ampEnv.output);
- }
-
- @Override
- public UnitOutputPort getOutput() {
- return output;
- }
-}
diff --git a/tests/com/jsyn/examples/SawFaders.java b/tests/com/jsyn/examples/SawFaders.java
deleted file mode 100644
index eaa3d1b..0000000
--- a/tests/com/jsyn/examples/SawFaders.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.GridLayout;
-
-import javax.swing.JApplet;
-import javax.swing.JPanel;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.swing.ExponentialRangeModel;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.swing.PortControllerFactory;
-import com.jsyn.swing.PortModelFactory;
-import com.jsyn.swing.RotaryTextController;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.LinearRamp;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Play a sawtooth using a JSyn oscillator and some knobs.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class SawFaders extends JApplet {
- private static final long serialVersionUID = -2704222221111608377L;
- private Synthesizer synth;
- private UnitOscillator osc;
- private LinearRamp lag;
- private LineOut lineOut;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
-
- // Add a tone generator. (band limited sawtooth)
- synth.add(osc = new SawtoothOscillatorBL());
- // Add a lag to smooth out amplitude changes and avoid pops.
- synth.add(lag = new LinearRamp());
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
- // Connect the oscillator to both left and right output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Set the minimum, current and maximum values for the port.
- lag.output.connect(osc.amplitude);
- lag.input.setup(0.0, 0.5, 1.0);
- lag.time.set(0.2);
-
- // Arrange the faders in a stack.
- setLayout(new GridLayout(0, 1));
-
- ExponentialRangeModel amplitudeModel = PortModelFactory.createExponentialModel(lag.input);
- RotaryTextController knob = new RotaryTextController(amplitudeModel, 5);
- JPanel knobPanel = new JPanel();
- knobPanel.add(knob);
- add(knobPanel);
-
- osc.frequency.setup(50.0, 300.0, 10000.0);
- add(PortControllerFactory.createExponentialPortSlider(osc.frequency));
- validate();
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
- }
-
- @Override
- public void stop() {
- synth.stop();
- }
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- SawFaders applet = new SawFaders();
- JAppletFrame frame = new JAppletFrame("SawFaders", applet);
- frame.setSize(440, 200);
- frame.setVisible(true);
- frame.test();
- }
-
-}
diff --git a/tests/com/jsyn/examples/SeeGoogleWave.java b/tests/com/jsyn/examples/SeeGoogleWave.java
deleted file mode 100644
index eb7a5ff..0000000
--- a/tests/com/jsyn/examples/SeeGoogleWave.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-
-import javax.swing.JApplet;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-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.LineOut;
-
-/**
- * Generate the waveform shown on the Google home page on 2/22/12.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class SeeGoogleWave extends JApplet {
- private static final long serialVersionUID = -831590388347137926L;
- private Synthesizer synth;
- private GoogleWaveOscillator googleWaveUnit;
- private LineOut lineOut;
- private AudioScope scope;
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- SeeGoogleWave applet = new SeeGoogleWave();
- JAppletFrame frame = new JAppletFrame("Google Wave", applet);
- frame.setSize(640, 500);
- frame.setVisible(true);
- frame.test();
- frame.validate();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- add(BorderLayout.NORTH, new JLabel("GoogleWave - elliptical segments"));
-
- scope = new AudioScope(synth);
- scope.addProbe(googleWaveUnit.output);
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- 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);
-
- southPanel.add(PortControllerFactory.createExponentialPortSlider(googleWaveUnit.frequency));
- southPanel.add(PortControllerFactory.createExponentialPortSlider(googleWaveUnit.variance));
- southPanel.add(PortControllerFactory.createExponentialPortSlider(googleWaveUnit.amplitude));
-
- validate();
- }
-
- @Override
- public void start() {
- synth = JSyn.createSynthesizer();
- synth.add(googleWaveUnit = new GoogleWaveOscillator());
- googleWaveUnit.amplitude.setup(0.02, 0.5, 1.0);
- googleWaveUnit.variance.setup(0.0, 0.0, 1.0);
- googleWaveUnit.frequency.setup(40.0, 200.0, 1000.0);
-
- // Add an output so we can hear it.
- synth.add(lineOut = new LineOut());
-
- googleWaveUnit.output.connect(0, lineOut.input, 0);
- googleWaveUnit.output.connect(0, lineOut.input, 1);
-
- setupGUI();
-
- // 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();
-
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
-}
diff --git a/tests/com/jsyn/examples/SeeOscillators.java b/tests/com/jsyn/examples/SeeOscillators.java
deleted file mode 100644
index b8088c4..0000000
--- a/tests/com/jsyn/examples/SeeOscillators.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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 com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.scope.AudioScopeProbe;
-import com.jsyn.swing.DoubleBoundedRangeSlider;
-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.MorphingOscillatorBL;
-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 oscillator's waveform using the AudioScope. This is a re-implementation 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;
- private LinearRamp widthRamp;
- private LinearRamp shapeRamp;
- private DoubleBoundedRangeSlider widthSlider;
- private DoubleBoundedRangeSlider shapeSlider;
-
- /* 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);
- AudioScopeProbe probe = scope.addProbe(oscGain.output);
- probe.setAutoScaleEnabled(false);
- probe.setVerticalScale(1.1);
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- // scope.getModel().getTriggerModel().getLevelModel().setDoubleValue( 0.0001 );
- // Turn off the gain and trigger control GUI.
- scope.getView().setControlsVisible(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));
- southPanel.add(widthSlider = PortControllerFactory.createPortSlider(widthRamp.input));
- widthSlider.setEnabled(false);
- southPanel.add(shapeSlider = PortControllerFactory.createPortSlider(shapeRamp.input));
- shapeSlider.setEnabled(false);
-
- oscPanel.validate();
- validate();
- }
-
- @Override
- 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);
-
- synth.add(widthRamp = new LinearRamp());
- widthRamp.input.setup(-1.0, 0.0, 1.0);
- widthRamp.input.setName("Width");
- widthRamp.time.set(0.1);
-
- synth.add(shapeRamp = new LinearRamp());
- shapeRamp.input.setup(-1.0, 0.0, 1.0);
- shapeRamp.input.setName("Shape");
- shapeRamp.time.set(0.1);
-
- // Add an output so we can hear the oscillators.
- synth.add(lineOut = new LineOut());
-
- oscGain.output.connect(0, lineOut.input, 0);
- oscGain.output.connect(0, lineOut.input, 1);
-
- 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 MorphingOscillatorBL(), "MorphBL");
- 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);
- if (osc instanceof PulseOscillatorBL) {
- widthRamp.output.connect(((PulseOscillatorBL)osc).width);
- }
- if (osc instanceof PulseOscillator) {
- widthRamp.output.connect(((PulseOscillator)osc).width);
- }
- if (osc instanceof MorphingOscillatorBL) {
- shapeRamp.output.connect(((MorphingOscillatorBL)osc).shape);
- }
- osc.amplitude.set(1.0);
- JRadioButton checkBox = new JRadioButton(label);
- buttonGroup.add(checkBox);
- checkBox.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent arg0) {
- // Disconnect other oscillators.
- oscGain.inputA.disconnectAll(0);
- // Connect this one.
- osc.output.connect(oscGain.inputA);
- widthSlider.setEnabled(osc instanceof PulseOscillator
- || osc instanceof PulseOscillatorBL);
- shapeSlider.setEnabled(osc instanceof MorphingOscillatorBL);
- }
- });
- oscPanel.add(checkBox);
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
-}
diff --git a/tests/com/jsyn/examples/ShowWaves.java b/tests/com/jsyn/examples/ShowWaves.java
deleted file mode 100644
index b1dd215..0000000
--- a/tests/com/jsyn/examples/ShowWaves.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.awt.BorderLayout;
-import java.util.ArrayList;
-
-import javax.swing.JApplet;
-import javax.swing.JLabel;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.scope.AudioScope;
-import com.jsyn.swing.JAppletFrame;
-import com.jsyn.unitgen.Add;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.TriangleOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-
-/**
- * Display waveforms using the AudioScope. The frequency of the oscillators is modulated by an LFO.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class ShowWaves extends JApplet {
- private static final long serialVersionUID = -8315903842197137926L;
- private Synthesizer synth;
- private UnitOscillator lfo;
- private Add adder;
- private ArrayList<UnitOscillator> oscillators = new ArrayList<UnitOscillator>();
- private LineOut lineOut;
- private AudioScope scope;
-
- /* Can be run as either an application or as an applet. */
- public static void main(String args[]) {
- ShowWaves applet = new ShowWaves();
- JAppletFrame frame = new JAppletFrame("ShowWaves", applet);
- frame.setSize(640, 300);
- frame.setVisible(true);
- frame.test();
- }
-
- private void setupGUI() {
- setLayout(new BorderLayout());
-
- add(BorderLayout.NORTH, new JLabel("ShowWaves in an AudioScope Mod001"));
-
- scope = new AudioScope(synth);
- for (UnitOscillator osc : oscillators) {
- scope.addProbe(osc.output);
- }
- scope.setTriggerMode(AudioScope.TriggerMode.NORMAL);
- scope.start();
-
- // Turn on the gain and trigger control GUI.
- scope.getView().setControlsVisible(true);
- add(BorderLayout.CENTER, scope.getView());
- validate();
- }
-
- @Override
- public void start() {
- synth = JSyn.createSynthesizer();
-
- // Add an LFO.
- synth.add(lfo = new SineOscillator());
- synth.add(adder = new Add());
-
- // Add an output so we can hear the oscillators.
- synth.add(lineOut = new LineOut());
-
- lfo.frequency.set(0.1);
- lfo.amplitude.set(200.0);
- adder.inputB.set(400.0);
- lfo.output.connect(adder.inputA);
-
- oscillators.add(new SawtoothOscillatorBL());
- oscillators.add(new SineOscillator());
- oscillators.add(new TriangleOscillator());
- for (UnitOscillator osc : oscillators) {
- synth.add(osc);
- adder.output.connect(osc.frequency);
- osc.output.connect(0, lineOut.input, 0);
- osc.amplitude.set(0.2);
- }
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // Start lineOut so it can pull data from other units.
- lineOut.start();
- setupGUI();
-
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- }
-
- @Override
- public void stop() {
- scope.stop();
- synth.stop();
- }
-
-}
diff --git a/tests/com/jsyn/examples/SwarmOfOscillators.java b/tests/com/jsyn/examples/SwarmOfOscillators.java
deleted file mode 100644
index 9f7c19c..0000000
--- a/tests/com/jsyn/examples/SwarmOfOscillators.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.ports.UnitOutputPort;
-import com.jsyn.unitgen.Add;
-import com.jsyn.unitgen.AsymptoticRamp;
-import com.jsyn.unitgen.Circuit;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.Pan;
-import com.jsyn.unitgen.SawtoothOscillatorDPW;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.unitgen.UnitSource;
-
-/**
- * Make a bunch of oscillators that swarm around a moving frequency.
- *
- * @author Phil Burk (C) 2009 Mobileer Inc
- */
-public class SwarmOfOscillators {
- private Synthesizer synth;
- Follower[] followers;
- SineOscillator lfo;
- LineOut lineOut;
- private Add tiePoint;
- private static final int NUM_FOLLOWERS = 30;
-
- class Follower extends Circuit implements UnitSource {
- UnitOscillator osc;
- AsymptoticRamp lag;
- Pan panner;
-
- Follower() {
- // Add a tone generator.
- add(osc = new SawtoothOscillatorDPW());
- osc.amplitude.set(0.03);
-
- // Use a lag to smoothly change frequency.
- add(lag = new AsymptoticRamp());
- double hlife = 0.01 + (Math.random() * 0.9);
- lag.halfLife.set(hlife);
-
- // Set left/right pan randomly between -1.0 and +1.0.
- add(panner = new Pan());
- panner.pan.set((Math.random() * 2.0) - 1.0);
-
- // Track the frequency coming through the tiePoint.
- tiePoint.output.connect(lag.input);
- // Add the LFO offset.
- lfo.output.connect(lag.input);
-
- lag.output.connect(osc.frequency);
-
- // Connect the oscillator to the left and right audio output.
- osc.output.connect(panner.input);
- }
-
- @Override
- public UnitOutputPort getOutput() {
- return panner.output;
- }
- }
-
- private void test() {
- synth = JSyn.createSynthesizer();
-
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Add a unit just to distribute the control frequency.
- synth.add(tiePoint = new Add());
- synth.add(lfo = new SineOscillator());
- lfo.amplitude.set(40.0);
- lfo.frequency.set(2.3);
-
- followers = new Follower[NUM_FOLLOWERS];
- for (int i = 0; i < followers.length; i++) {
- Follower follower = new Follower();
- synth.add(follower);
-
- // Every follower can connect directly to the lineOut because all input ports are
- // mixers.
- follower.getOutput().connect(0, lineOut.input, 0);
- follower.getOutput().connect(1, lineOut.input, 1);
-
- followers[i] = follower;
- }
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Advance to a near future time so we have a clean start.
- double duration = 0.9;
- double time = timeNow + duration;
- double freq = 400.0; // hertz
- tiePoint.inputA.set(freq, time);
-
- // Randomly change the target frequency for the followers.
- try {
- for (int i = 0; i < 20; i++) {
- // Schedule this to happen a bit later.
- time += duration;
- freq = 200.0 + (Math.random() * 500.0);
- tiePoint.inputA.set(freq, time);
-
- // Sleep while the sound is being generated in the background
- // thread.
- synth.sleepUntil(time - 0.2);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.format("CPU usage = %4.2f%c\n", synth.getUsage() * 100, '%');
-
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- new SwarmOfOscillators().test();
- }
-}
diff --git a/tests/com/jsyn/examples/UseMidiKeyboard.java b/tests/com/jsyn/examples/UseMidiKeyboard.java
deleted file mode 100644
index 0efa039..0000000
--- a/tests/com/jsyn/examples/UseMidiKeyboard.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import java.io.IOException;
-
-import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiMessage;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.Receiver;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.javasound.MidiDeviceTools;
-import com.jsyn.instruments.DualOscillatorSynthVoice;
-import com.jsyn.midi.MidiSynthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.util.MultiChannelSynthesizer;
-import com.jsyn.util.VoiceDescription;
-
-/**
- * Connect a USB MIDI Keyboard to the internal MIDI Synthesizer using JavaSound.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class UseMidiKeyboard {
- private static final int NUM_CHANNELS = 16;
- private static final int VOICES_PER_CHANNEL = 3;
-
- private Synthesizer synth;
- private LineOut lineOut;
- private MidiSynthesizer midiSynthesizer;
- private VoiceDescription voiceDescription;
- private MultiChannelSynthesizer multiSynth;
-
- public static void main(String[] args) {
- UseMidiKeyboard app = new UseMidiKeyboard();
- try {
- app.test();
- } catch (MidiUnavailableException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- // Write a Receiver to get the messages from a Transmitter.
- class CustomReceiver implements Receiver {
- @Override
- public void close() {
- System.out.print("Closed.");
- }
-
- @Override
- public void send(MidiMessage message, long timeStamp) {
- byte[] bytes = message.getMessage();
- midiSynthesizer.onReceive(bytes, 0, bytes.length);
- }
- }
-
- public int test() throws MidiUnavailableException, IOException, InterruptedException {
- setupSynth();
-
- int result = 2;
- MidiDevice keyboard = MidiDeviceTools.findKeyboard();
- Receiver receiver = new CustomReceiver();
- // Just use default synthesizer.
- if (keyboard != null) {
- // If you forget to open them you will hear no sound.
- keyboard.open();
- // Put the receiver in the transmitter.
- // This gives fairly low latency playing.
- keyboard.getTransmitter().setReceiver(receiver);
- System.out.println("Play MIDI keyboard: " + keyboard.getDeviceInfo().getDescription());
- result = 0;
- } else {
- System.out.println("Could not find a keyboard.");
- }
- return result;
- }
-
-
- private void setupSynth() {
- synth = JSyn.createSynthesizer();
-
- voiceDescription = DualOscillatorSynthVoice.getVoiceDescription();
-// voiceDescription = SubtractiveSynthVoice.getVoiceDescription();
-
- multiSynth = new MultiChannelSynthesizer();
- final int startChannel = 0;
- multiSynth.setup(synth, startChannel, NUM_CHANNELS, VOICES_PER_CHANNEL, voiceDescription);
- midiSynthesizer = new MidiSynthesizer(multiSynth);
-
- // Create a LineOut for the entire synthesizer.
- synth.add(lineOut = new LineOut());
- multiSynth.getOutput().connect(0,lineOut.input, 0);
- multiSynth.getOutput().connect(1,lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- lineOut.start();
-
- }
-
-}
diff --git a/tests/com/jsyn/examples/WindCircuit.java b/tests/com/jsyn/examples/WindCircuit.java
deleted file mode 100644
index 1e3623e..0000000
--- a/tests/com/jsyn/examples/WindCircuit.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 1997 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.examples;
-
-import com.jsyn.ports.UnitInputPort;
-import com.jsyn.ports.UnitOutputPort;
-import com.jsyn.unitgen.Circuit;
-import com.jsyn.unitgen.FilterStateVariable;
-import com.jsyn.unitgen.MultiplyAdd;
-import com.jsyn.unitgen.RedNoise;
-import com.jsyn.unitgen.UnitSource;
-import com.jsyn.unitgen.WhiteNoise;
-
-/**
- * Wind Sound Create a wind-like sound by feeding white noise "shshshshsh" through a randomly
- * varying state filter to make a "whooowhoosh" sound. The cuttoff frequency of the low pass filter
- * is controlled by a RedNoise unit which creates a slowly varying random control signal.
- *
- * @author (C) 1997 Phil Burk, SoftSynth.com
- */
-
-public class WindCircuit extends Circuit implements UnitSource {
- /* Declare units that will be part of the circuit. */
- WhiteNoise myNoise;
- FilterStateVariable myFilter;
- RedNoise myLFO;
- MultiplyAdd myScalar;
-
- /* Declare ports. */
- public UnitInputPort noiseAmp;
- public UnitInputPort modRate;
- public UnitInputPort modDepth;
- public UnitInputPort cutoff;
- public UnitInputPort resonance;
- public UnitInputPort amplitude;
- public UnitOutputPort output;
-
- public WindCircuit() {
- /*
- * Create various unit generators and add them to circuit.
- */
- add(myNoise = new WhiteNoise());
- add(myFilter = new FilterStateVariable());
- add(myLFO = new RedNoise());
- add(myScalar = new MultiplyAdd());
-
- /* Make ports on internal units appear as ports on circuit. */
- /* Optionally give some circuit ports more meaningful names. */
- addPort(noiseAmp = myNoise.amplitude, "NoiseAmp");
- addPort(modRate = myLFO.frequency, "ModRate");
- addPort(modDepth = myScalar.inputB, "ModDepth");
- addPort(cutoff = myScalar.inputC, "Cutoff");
- addPort(resonance = myFilter.resonance);
- addPort(amplitude = myFilter.amplitude);
- addPort(output = myFilter.output);
-
- /* Connect SynthUnits to make control signal path. */
- myLFO.output.connect(myScalar.inputA);
- myScalar.output.connect(myFilter.frequency);
- /* Connect SynthUnits to make audio signal path. */
- myNoise.output.connect(myFilter.input);
-
- /* Set ports to useful values and ranges. */
- noiseAmp.setup(0.0, 0.3, 0.4);
- modRate.setup(0.0, 1.0, 10.0);
- modDepth.setup(0.0, 300.0, 1000.0);
- cutoff.setup(0.0, 600.0, 1000.0);
- resonance.setup(0.0, 0.066, 0.2);
- amplitude.setup(0.0, 0.9, 0.999);
- }
-
- @Override
- public UnitOutputPort getOutput() {
- return output;
- }
-}
diff --git a/tests/com/jsyn/midi/TestMidiLoop.java b/tests/com/jsyn/midi/TestMidiLoop.java
deleted file mode 100644
index 5837696..0000000
--- a/tests/com/jsyn/midi/TestMidiLoop.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.midi;
-
-import java.io.IOException;
-
-import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiMessage;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.Receiver;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.devices.javasound.MidiDeviceTools;
-import com.jsyn.instruments.DualOscillatorSynthVoice;
-import com.jsyn.midi.MidiSynthesizer;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.util.MultiChannelSynthesizer;
-import com.jsyn.util.VoiceDescription;
-
-/**
- * Connect a USB MIDI Keyboard to the internal MIDI Synthesizer using JavaSound.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class TestMidiLoop {
-
- public static void main(String[] args) {
- TestMidiLoop app = new TestMidiLoop();
- int result = 0;
- try {
- for (int i = 0; i < 3 && result == 0; i++) {
- result = app.test();
- }
- } catch (MidiUnavailableException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.print("Test finished.");
- System.exit((result == 0) ? 0 : 1);
- }
-
- // Write a Receiver to get the messages from a Transmitter.
- class CustomReceiver implements Receiver {
- @Override
- public void close() {
- System.out.print("Receiver.close() was called.");
- }
-
- @Override
- public void send(MidiMessage message, long timeStamp) {
- byte[] bytes = message.getMessage();
- System.out.println("Got " + bytes.length + " bytes.");
- }
- }
-
- public int test() throws MidiUnavailableException, IOException, InterruptedException {
-
- int result = -1;
- MidiDevice keyboard = MidiDeviceTools.findKeyboard();
- Receiver receiver = new CustomReceiver();
- // Just use default synthesizer.
- if (keyboard != null) {
- // If you forget to open them you will hear no sound.
- keyboard.open();
- // Put the receiver in the transmitter.
- // This gives fairly low latency playing.
- keyboard.getTransmitter().setReceiver(receiver);
- System.out.println("Play MIDI keyboard: " + keyboard.getDeviceInfo().getDescription());
- result = 0;
- Thread.sleep(4000);
- System.out.println("Close the keyboard. It may not work after this according to the docs!");
- keyboard.close();
- } else {
- System.out.println("Could not find a keyboard.");
- }
- return result;
- }
-
-
-}
diff --git a/tests/com/jsyn/ports/TestQueuedDataPort.java b/tests/com/jsyn/ports/TestQueuedDataPort.java
deleted file mode 100644
index e229038..0000000
--- a/tests/com/jsyn/ports/TestQueuedDataPort.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.ports;
-
-import junit.framework.TestCase;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.data.SequentialData;
-import com.jsyn.data.ShortSample;
-import com.jsyn.unitgen.FixedRateMonoReader;
-
-/**
- * Test sample and envelope queuing and looping.
- *
- * @author Phil Burk, (C) 2009 Mobileer Inc
- */
-public class TestQueuedDataPort extends TestCase {
- Synthesizer synth;
- float[] floatData = {
- 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f
- };
- FloatSample floatSample;
- FixedRateMonoReader reader;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
- synth.start();
- }
-
- @Override
- protected void tearDown() throws Exception {
- synth.stop();
- super.tearDown();
- }
-
- private void queueDirect(UnitDataQueuePort port, SequentialData data, int startFrame,
- int numFrames) {
- queueDirect(port, data, startFrame, numFrames, 0);
- }
-
- private void queueDirect(UnitDataQueuePort port, SequentialData data, int startFrame,
- int numFrames, int numLoops) {
- QueueDataCommand command = port.createQueueDataCommand(data, startFrame, numFrames);
- command.setNumLoops(numLoops);
- port.addQueuedBlock(command);
- }
-
- public void testQueueSingleShort() {
- short[] data = {
- 234, -9876, 4567
- };
- ShortSample sample = new ShortSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- assertEquals("start empty", false, dataQueue.hasMore());
-
- queueDirect(dataQueue, sample, 0, data.length);
- checkQueuedData(data, dataQueue, 0, data.length);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueSingleFloat() {
- float[] data = {
- 0.4f, 1.9f, 22.7f
- };
- FloatSample sample = new FloatSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- assertEquals("start empty", false, dataQueue.hasMore());
-
- queueDirect(dataQueue, sample, 0, data.length);
- checkQueuedData(data, dataQueue, 0, data.length);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueOutOfBounds() {
- float[] data = {
- 0.4f, 1.9f, 22.7f
- };
- FloatSample sample = new FloatSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- boolean caught = false;
- try {
- queueDirect(dataQueue, sample, 0, sample.getNumFrames() + 1); // should cause an error!
- } catch(IllegalArgumentException e) {
- caught = true;
- }
- assertTrue("expect exception when we go past end of the array", caught);
-
- caught = false;
- try {
- queueDirect(dataQueue, sample, 1, sample.getNumFrames()); // should cause an error!
- } catch(IllegalArgumentException e) {
- caught = true;
- }
- assertTrue("expect exception when we go past end of the array", caught);
-
- caught = false;
- try {
- queueDirect(dataQueue, sample, -1, sample.getNumFrames()); // should cause an error!
- } catch(IllegalArgumentException e) {
- caught = true;
- }
- assertTrue("expect exception when we start before beginning of the array", caught);
- }
-
- public void testQueueMultiple() {
- short[] data = {
- 234, 17777, -9876, 4567, -14287
- };
- ShortSample sample = new ShortSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- assertEquals("start empty", false, dataQueue.hasMore());
-
- queueDirect(dataQueue, sample, 1, 3);
- queueDirect(dataQueue, sample, 0, 5);
- queueDirect(dataQueue, sample, 2, 2);
-
- checkQueuedData(data, dataQueue, 1, 3);
- checkQueuedData(data, dataQueue, 0, 5);
- checkQueuedData(data, dataQueue, 2, 2);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueNoLoops() throws InterruptedException {
- System.out.println("testQueueNoLoops() ================");
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- dataQueue.queueOn(floatSample, synth.createTimeStamp());
- // Advance synth so that the queue command propagates to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- // play entire sample
- checkQueuedData(floatData, dataQueue, 0, floatData.length);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueLoopForever() throws InterruptedException {
- System.out.println("testQueueLoopForever() ================");
-
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- dataQueue.queue(floatSample, 0, 3);
- dataQueue.queueLoop(floatSample, 3, 4);
-
- // Advance synth so that the queue commands propagate to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 3);
- checkQueuedData(floatData, dataQueue, 3, 4);
- checkQueuedData(floatData, dataQueue, 3, 4);
- checkQueuedData(floatData, dataQueue, 3, 4);
- checkQueuedData(floatData, dataQueue, 3, 1);
-
- // queue final release
- dataQueue.queue(floatSample, 3, 5);
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
- // current loop will finish
- checkQueuedData(floatData, dataQueue, 4, 3);
- // release portion will play
- checkQueuedData(floatData, dataQueue, 3, 5);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueLoopAtLeastOnce() throws InterruptedException {
- System.out.println("testQueueLoopAtLeastOnce() ================");
-
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- dataQueue.queue(floatSample, 0, 3);
- dataQueue.queueLoop(floatSample, 3, 2); // this should play at least once
- dataQueue.queue(floatSample, 5, 2);
-
- // Advance synth so that the queue commands propagate to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 3);
- checkQueuedData(floatData, dataQueue, 3, 2);
- checkQueuedData(floatData, dataQueue, 5, 2);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueNumLoops() throws InterruptedException {
- System.out.println("testQueueNumLoops() ================");
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- dataQueue.queue(floatSample, 0, 2);
-
- int numLoopsA = 5;
- dataQueue.queueLoop(floatSample, 2, 3, numLoopsA);
-
- dataQueue.queue(floatSample, 4, 2);
-
- int numLoopsB = 3;
- dataQueue.queueLoop(floatSample, 3, 4, numLoopsB);
-
- dataQueue.queue(floatSample, 5, 2);
-
- // Advance synth so that the queue commands propagate to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 2);
- for (int i = 0; i < (numLoopsA + 1); i++) {
- System.out.println("loop A #" + i);
- checkQueuedData(floatData, dataQueue, 2, 3);
- }
- checkQueuedData(floatData, dataQueue, 4, 2);
- for (int i = 0; i < (numLoopsB + 1); i++) {
- System.out.println("loop B #" + i);
- checkQueuedData(floatData, dataQueue, 3, 4);
- }
-
- checkQueuedData(floatData, dataQueue, 5, 2);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- private UnitDataQueuePort setupFloatSample() {
- floatSample = new FloatSample(floatData.length, 1);
- floatSample.write(floatData);
-
- synth.add(reader = new FixedRateMonoReader());
- UnitDataQueuePort dataQueue = reader.dataQueue;
- assertEquals("start empty", false, dataQueue.hasMore());
- return dataQueue;
- }
-
- public void testQueueSustainLoop() throws InterruptedException {
- System.out.println("testQueueSustainLoop() ================");
-
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- // set up sustain loops ===========================
- floatSample.setSustainBegin(2);
- floatSample.setSustainEnd(4);
- floatSample.setReleaseBegin(-1);
- floatSample.setReleaseEnd(-1);
-
- dataQueue.queueOn(floatSample, synth.createTimeStamp());
- // Advance synth so that the queue command propagates to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 2);
- checkQueuedData(floatData, dataQueue, 2, 2);
- checkQueuedData(floatData, dataQueue, 2, 2);
- checkQueuedData(floatData, dataQueue, 2, 1); // looping
-
- dataQueue.queueOff(floatSample, true); // queue off in middle of loop
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 3, 5); // release
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testQueueReleaseLoop() throws InterruptedException {
- System.out.println("testQueueReleaseLoop() ================");
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- // set up sustain loops ===========================
- floatSample.setSustainBegin(-1);
- floatSample.setSustainEnd(-1);
- floatSample.setReleaseBegin(4);
- floatSample.setReleaseEnd(6);
-
- dataQueue.queueOn(floatSample, synth.createTimeStamp());
- // Advance synth so that the queue command propagates to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 4);
- checkQueuedData(floatData, dataQueue, 4, 2);
- checkQueuedData(floatData, dataQueue, 4, 2);
- checkQueuedData(floatData, dataQueue, 4, 2); // looping in release cuz no
- // sustain loop
-
- dataQueue.queueOff(floatSample, true); // queue off in middle of loop
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 4, 2);
- checkQueuedData(floatData, dataQueue, 4, 2); // still looping
- assertEquals("end full", true, dataQueue.hasMore());
- }
-
- public void testQueueSustainReleaseLoops() throws InterruptedException {
- System.out.println("testQueueSustainReleaseLoops() ================");
- UnitDataQueuePort dataQueue = setupFloatSample();
-
- // set up sustain loops ===========================
- floatSample.setSustainBegin(2);
- floatSample.setSustainEnd(4);
- floatSample.setReleaseBegin(5);
- floatSample.setReleaseEnd(7);
-
- dataQueue.queueOn(floatSample, synth.createTimeStamp());
- // Advance synth so that the queue command propagates to the engine.
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 0, 4);
- checkQueuedData(floatData, dataQueue, 2, 2);
- checkQueuedData(floatData, dataQueue, 2, 1); // middle of sustain loop
-
- dataQueue.queueOff(floatSample, true); // queue off in middle of loop
- synth.sleepUntil(synth.getCurrentTime() + 0.01);
-
- checkQueuedData(floatData, dataQueue, 3, 2);
- checkQueuedData(floatData, dataQueue, 5, 2); // release loop
- checkQueuedData(floatData, dataQueue, 5, 2); // release loop
- assertEquals("end full", true, dataQueue.hasMore());
- }
-
- private void checkQueuedData(short[] data, UnitDataQueuePort dataQueue, int offset,
- int numFrames) {
- for (int i = 0; i < numFrames; i++) {
- assertEquals("got data", true, dataQueue.hasMore());
- double value = dataQueue.readNextMonoDouble(synth.getFramePeriod());
- assertEquals("data matches", data[i + offset] / 32768.0, value, 0.0001);
- }
- }
-
- private void checkQueuedData(float[] data, UnitDataQueuePort dataQueue, int offset,
- int numFrames) {
- for (int i = 0; i < numFrames; i++) {
- assertEquals("got data", true, dataQueue.hasMore());
- double value = dataQueue.readNextMonoDouble(synth.getFramePeriod());
- assertEquals("data matches", data[i + offset], value, 0.0001);
- }
- }
-
- class TestQueueCallback implements UnitDataQueueCallback {
- boolean gotStarted = false;
- boolean gotLooped = false;
- boolean gotFinished = false;
- QueueDataEvent lastEvent;
-
- @Override
- public void started(QueueDataEvent event) {
- System.out.println("Callback started.");
- gotStarted = true;
- lastEvent = event;
- }
-
- @Override
- public void looped(QueueDataEvent event) {
- System.out.println("Callback looped.");
- gotLooped = true;
- lastEvent = event;
- }
-
- @Override
- public void finished(QueueDataEvent event) {
- System.out.println("Callback finished.");
- gotFinished = true;
- lastEvent = event;
- }
- }
-
- public void testQueueCallback() {
- float[] data = {
- 0.2f, -8.9f, 2.7f
- };
- FloatSample sample = new FloatSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- assertEquals("start empty", false, dataQueue.hasMore());
-
- // Create an object to be called when the queued data is done.
- TestQueueCallback callback = new TestQueueCallback();
-
- QueueDataCommand command = dataQueue.createQueueDataCommand(sample, 0, data.length);
- command.setCallback(callback);
- command.setNumLoops(2);
- dataQueue.addQueuedBlock(command);
-
- // Check to see if flags get set true by callback.
- dataQueue.firePendingCallbacks();
- assertEquals("not started yet", false, callback.gotStarted);
- assertEquals("not looped yet", false, callback.gotLooped);
- assertEquals("not finished yet", false, callback.gotFinished);
-
- checkQueuedData(data, dataQueue, 0, 1);
- dataQueue.firePendingCallbacks();
- assertEquals("should be started now", true, callback.gotStarted);
- assertEquals("not looped yet", false, callback.gotLooped);
- assertEquals("not finished yet", false, callback.gotFinished);
- assertEquals("check source of event", dataQueue, callback.lastEvent.getSource());
- assertEquals("check sample", sample, callback.lastEvent.getSequentialData());
- assertEquals("check loopCount", 2, callback.lastEvent.getLoopsLeft());
-
- checkQueuedData(data, dataQueue, 1, data.length - 1);
- dataQueue.firePendingCallbacks();
- assertEquals("should be looped now", true, callback.gotLooped);
- assertEquals("check loopCount", 1, callback.lastEvent.getLoopsLeft());
- assertEquals("not finished yet", false, callback.gotFinished);
-
- checkQueuedData(data, dataQueue, 0, data.length);
- dataQueue.firePendingCallbacks();
- assertEquals("check loopCount", 0, callback.lastEvent.getLoopsLeft());
-
- checkQueuedData(data, dataQueue, 0, data.length);
- dataQueue.firePendingCallbacks();
- assertEquals("should be finished now", true, callback.gotFinished);
-
- assertEquals("end empty", false, dataQueue.hasMore());
- }
-
- public void testImmediate() {
- float[] data = {
- 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f
- };
- FloatSample sample = new FloatSample(data.length, 1);
- sample.write(data);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- dataQueue.queue(sample);
-
- // Only play some of the data then interrupt it with an immediate block.
- checkQueuedData(data, dataQueue, 0, 3);
-
- QueueDataCommand command = dataQueue.createQueueDataCommand(sample, 7, 3);
- command.setImmediate(true);
- command.run(); // execute "immediate" operation and add to block list
-
- // Should already be in new data.
- checkQueuedData(data, dataQueue, 7, 3);
- }
-
- public void testCrossFade() {
- float[] data1 = {
- 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
- };
- float[] data2 = {
- 20.0f, 19.0f, 18.0f, 17.0f, 16.0f, 15.0f, 14.0f, 13.0f, 12.0f, 11.0f
- };
- FloatSample sample1 = new FloatSample(data1);
- FloatSample sample2 = new FloatSample(data2);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- dataQueue.queue(sample1, 0, 4);
-
- QueueDataCommand command = dataQueue.createQueueDataCommand(sample2, 1, 8);
- command.setCrossFadeIn(3);
- command.run(); // execute "immediate" operation and add to block list
-
- // Only play some of the data then crossfade to another sample.
- checkQueuedData(data1, dataQueue, 0, 4);
-
- for (int i = 0; i < 3; i++) {
- double factor = i / 3.0;
- double value = ((1.0 - factor) * data1[i + 4]) + (factor * data2[i + 1]);
- System.out.println("i = " + i + ", factor = " + factor + ", value = " + value);
-
- double actual = dataQueue.readNextMonoDouble(synth.getFramePeriod());
- assertEquals("crossfade " + i, value, actual, 0.00001);
- }
-
- // Should already be in new data.
- checkQueuedData(data2, dataQueue, 4, 5);
- }
-
- public void testImmediateCrossFade() {
- float[] data1 = {
- 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
- };
- float[] data2 = {
- 20.0f, 19.0f, 18.0f, 17.0f, 16.0f, 15.0f, 14.0f, 13.0f, 12.0f, 11.0f
- };
- FloatSample sample1 = new FloatSample(data1);
- FloatSample sample2 = new FloatSample(data2);
-
- UnitDataQueuePort dataQueue = new UnitDataQueuePort("test");
- dataQueue.queue(sample1, 0, 4);
-
- // Only play some of the data then crossfade to another sample.
- int beforeInterrupt = 2;
- checkQueuedData(data1, dataQueue, 0, beforeInterrupt);
-
- QueueDataCommand command = dataQueue.createQueueDataCommand(sample2, 1, 8);
- command.setImmediate(true);
- command.setCrossFadeIn(3);
- command.run(); // execute "immediate" operation and add to block list
-
- for (int i = 0; i < 3; i++) {
- double factor = i / 3.0;
- double value = ((1.0 - factor) * data1[i + beforeInterrupt]) + (factor * data2[i + 1]);
- System.out.println("i = " + i + ", factor = " + factor + ", value = " + value);
-
- double actual = dataQueue.readNextMonoDouble(synth.getFramePeriod());
- assertEquals("crossfade " + i, value, actual, 0.00001);
- }
-
- // Should already be in new data.
- checkQueuedData(data2, dataQueue, 4, 5);
- }
-}
diff --git a/tests/com/jsyn/ports/TestSequentialData.java b/tests/com/jsyn/ports/TestSequentialData.java
deleted file mode 100644
index 1328c78..0000000
--- a/tests/com/jsyn/ports/TestSequentialData.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.ports;
-
-import junit.framework.TestCase;
-
-import com.jsyn.data.FloatSample;
-
-public class TestSequentialData extends TestCase {
-
- float[] data1 = {
- 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
- };
- FloatSample sample1;
- float[] data2 = {
- 20.0f, 19.0f, 18.0f, 17.0f, 16.0f, 15.0f, 14.0f, 13.0f, 12.0f, 11.0f
- };
- FloatSample sample2;
-
- public void testCrossfade() {
- sample1 = new FloatSample(data1);
- sample2 = new FloatSample(data2);
- SequentialDataCrossfade xfade = new SequentialDataCrossfade();
- xfade.setup(sample1, 4, 3, sample2, 1, 6);
-
- for (int i = 0; i < 3; i++) {
- double factor = i / 3.0;
- double value = ((1.0 - factor) * data1[i + 4]) + (factor * data2[i + 1]);
- System.out.println("i = " + i + ", factor = " + factor + ", value = " + value);
- assertEquals("crossfade " + i, value, xfade.readDouble(i), 0.00001);
- }
- for (int i = 3; i < 6; i++) {
- assertEquals("crossfade " + i, sample2.readDouble(i + 1), xfade.readDouble(i), 0.00001);
- }
- }
-}
diff --git a/tests/com/jsyn/ports/TestSet.java b/tests/com/jsyn/ports/TestSet.java
deleted file mode 100644
index 8d1f3ea..0000000
--- a/tests/com/jsyn/ports/TestSet.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.ports;
-
-import junit.framework.TestCase;
-
-import com.jsyn.engine.SynthesisEngine;
-import com.jsyn.unitgen.Minimum;
-
-public class TestSet extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- /** Internal value setting. */
- public void testSetValue() {
- int numParts = 4;
- UnitInputPort port = new UnitInputPort(numParts, "Tester");
- port.setValueInternal(0, 100.0);
- port.setValueInternal(2, 120.0);
- port.setValueInternal(1, 110.0);
- port.setValueInternal(3, 130.0);
- assertEquals("check port value", 100.0, port.getValue(0));
- assertEquals("check port value", 120.0, port.getValue(2));
- assertEquals("check port value", 110.0, port.getValue(1));
- assertEquals("check port value", 130.0, port.getValue(3));
- }
-
- public void testSet() throws InterruptedException {
- SynthesisEngine synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- synthesisEngine.start();
- synthesisEngine.sleepUntil(0.01);
- Minimum min;
- synthesisEngine.add(min = new Minimum());
-
- double x = 33.99;
- double y = 8.31;
- min.inputA.set(x);
- min.inputB.set(y);
- synthesisEngine.sleepFor(0.01);
- assertEquals("min set A", x, min.inputA.getValue());
- assertEquals("min set B", y, min.inputB.getValue());
- min.start();
- synthesisEngine.sleepFor(0.01);
-
- assertEquals("min output", y, min.output.getValue());
- synthesisEngine.stop();
- }
-
- /** if we use a port index out of range we want to know now and not blow up the engine. */
- public void testSetBadPort() throws InterruptedException {
- SynthesisEngine synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- synthesisEngine.start();
- Minimum min;
- synthesisEngine.add(min = new Minimum());
-
- min.start();
- Exception caught = null;
- try {
- min.inputA.set(1, 23.45);
- } catch (Exception e) {
- caught = e;
- }
- assertTrue("Catch port out of range, caught " + caught,
- (caught instanceof ArrayIndexOutOfBoundsException));
-
- // Don't blow up here.
- synthesisEngine.sleepUntil(0.01);
-
- synthesisEngine.stop();
- }
-
-}
diff --git a/tests/com/jsyn/research/BenchMultiThreading.java b/tests/com/jsyn/research/BenchMultiThreading.java
deleted file mode 100644
index 79b20bb..0000000
--- a/tests/com/jsyn/research/BenchMultiThreading.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.research;
-
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-
-public class BenchMultiThreading extends TestCase {
- private static final int FRAMES_PER_BLOCK = 64;
- int numThreads = 4;
- int numLoops = 100000;
- private ArrayList<CustomThread> threadList;
-
- class CustomThread extends Thread {
- long frameCount = 0;
- long desiredFrame = 0;
- Object semaphore = new Object();
- Object goSemaphore = new Object();
- volatile boolean go = true;
- long startNano;
- long stopNano;
- long maxElapsed;
-
- @Override
- public void run() {
- try {
- startNano = System.nanoTime();
- while (go) {
- // Watch for long delays.
- stopNano = System.nanoTime();
- long elapsed = stopNano - startNano;
- startNano = System.nanoTime();
- if (elapsed > maxElapsed) {
- maxElapsed = elapsed;
- }
-
- synchronized (semaphore) {
- // Audio synthesis would occur here.
- frameCount += 1;
- // System.out.println( this + " generating frame " +
- // frameCount );
- semaphore.notify();
- }
- synchronized (goSemaphore) {
- while (desiredFrame <= frameCount) {
- goSemaphore.wait();
- }
- }
- long stopNano = System.nanoTime();
- }
- } catch (InterruptedException e) {
- System.out.println("CustomThread interrupted. ");
- }
- System.out.println("Finishing " + this);
- }
-
- public void abort() {
- go = false;
- interrupt();
- }
-
- public void waitForFrame(long targetFrame) throws InterruptedException {
- synchronized (semaphore) {
- while (frameCount < targetFrame) {
- semaphore.wait();
- }
- }
- }
-
- public void generateFrame(long desiredFrame) {
- synchronized (goSemaphore) {
- this.desiredFrame = desiredFrame;
- goSemaphore.notify();
- }
- }
-
- }
-
- public void testMultiThreads() {
- threadList = new ArrayList<CustomThread>();
- for (int i = 0; i < numThreads; i++) {
- CustomThread thread = new CustomThread();
- threadList.add(thread);
- thread.start();
- }
-
- long frameCount = 0;
- long startTime = System.currentTimeMillis();
- try {
- for (int i = 0; i < numLoops; i++) {
- frameCount += 1;
- waitForThreads(frameCount);
- // System.out.println("got frame " + frameCount );
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- long stopTime = System.currentTimeMillis();
- long elapsedTime = stopTime - startTime;
- double elapsedSeconds = 0.001 * elapsedTime;
- double blocksPerSecond = numLoops / elapsedSeconds;
- System.out.format("blocksPerSecond = %10.3f\n", blocksPerSecond);
- double framesPerSecond = blocksPerSecond * FRAMES_PER_BLOCK;
- System.out.format("audio framesPerSecond = %10.3f at %d frames per block\n",
- framesPerSecond, FRAMES_PER_BLOCK);
-
- for (CustomThread thread : threadList) {
- System.out.format("max elapsed time is %d nanos or %f msec\n", thread.maxElapsed,
- (thread.maxElapsed / 1000000.0));
- }
- for (CustomThread thread : threadList) {
- assertEquals("BlockCount must match ", frameCount, thread.frameCount);
- thread.abort();
- }
-
- }
-
- private void waitForThreads(long frameCount) throws InterruptedException {
- for (CustomThread thread : threadList) {
- // Ask threads to wake up and generate up to this frame.
- thread.generateFrame(frameCount);
- }
- for (CustomThread thread : threadList) {
- // Wait for all the threads to catch up.
- thread.waitForFrame(frameCount);
- }
- }
-}
diff --git a/tests/com/jsyn/research/RecordVariousRamps.java b/tests/com/jsyn/research/RecordVariousRamps.java
deleted file mode 100644
index c90ea9a..0000000
--- a/tests/com/jsyn/research/RecordVariousRamps.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2014 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Generate steps, linear ramps and smooth ramps.
- *
- * @author (C) 2014 Phil Burk
- */
-
-package com.jsyn.research;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.unitgen.ContinuousRamp;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.LinearRamp;
-import com.jsyn.unitgen.Multiply;
-import com.jsyn.unitgen.PassThrough;
-import com.jsyn.unitgen.PowerOfTwo;
-import com.jsyn.unitgen.SawtoothOscillatorBL;
-import com.jsyn.unitgen.UnitFilter;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.util.WaveRecorder;
-
-public class RecordVariousRamps {
- private Synthesizer synth;
- private UnitOscillator osc;
- private Multiply multiplier;
- private UnitFilter ramp;
- private LinearRamp linearRamp;
- private ContinuousRamp continuousRamp;
- private LineOut lineOut;
- private WaveRecorder recorder;
- private PowerOfTwo powerOfTwo;
- private static final int MODE_STEP = 0;
- private static final int MODE_LINEAR = 1;
- private static final int MODE_SMOOTH = 2;
- private static final String[] modeNames = {
- "step", "linear", "smooth"
- };
-
- private RampEvent[] rampData = {
- new RampEvent(1.0, 1.5, 2.0), new RampEvent(-0.9, 0.5, 1.0),
- new RampEvent(0.9, 0.5, 0.8), new RampEvent(-0.3, 0.5, 0.8),
- new RampEvent(0.9, 0.5, 0.3), new RampEvent(-0.5, 0.5, 0.3),
- new RampEvent(0.8, 2.0, 1.0),
- };
-
- private static class RampEvent {
- double target;
- double eventDuration;
- double rampDuration;
-
- RampEvent(double target, double eventDuration, double rampDuration) {
- this.target = target;
- this.eventDuration = eventDuration;
- this.rampDuration = rampDuration;
- }
- }
-
- private void test(int mode) throws IOException {
- // Create a context for the synthesizer.
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
-
- File waveFile = new File("ramp_pitch_" + modeNames[mode] + ".wav");
- // Mono 16 bits.
- recorder = new WaveRecorder(synth, waveFile, 1, 16);
- System.out.println("Writing to 16-bit WAV file " + waveFile.getAbsolutePath());
-
- // Add some tone generators.
- synth.add(osc = new SawtoothOscillatorBL());
-
- // Add a controller that will sweep up.
- synth.add(multiplier = new Multiply());
- synth.add(powerOfTwo = new PowerOfTwo());
- // Add an output unit.
- synth.add(lineOut = new LineOut());
- multiplier.inputB.set(660.0);
-
- switch (mode) {
- case MODE_STEP:
- synth.add(ramp = new PassThrough());
- break;
- case MODE_LINEAR:
- synth.add(ramp = linearRamp = new LinearRamp());
- linearRamp.current.set(-1.0);
- linearRamp.time.set(10.0);
- break;
- case MODE_SMOOTH:
- synth.add(ramp = continuousRamp = new ContinuousRamp());
- continuousRamp.current.set(-1.0);
- continuousRamp.time.set(10.0);
- break;
- }
-
- ramp.getInput().set(-1.0);
- ramp.getOutput().connect(powerOfTwo.input);
-
- powerOfTwo.output.connect(multiplier.inputA);
- multiplier.output.connect(osc.frequency);
-
- // Connect the oscillator to the left and right audio output.
- osc.output.connect(0, lineOut.input, 0);
- osc.output.connect(0, lineOut.input, 1);
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- osc.output.connect(0, recorder.getInput(), 0);
- // When we start the recorder it will pull data from the oscillator
- // and sweeper.
- recorder.start();
-
- // We also need to start the LineOut if we want to hear it now.
- lineOut.start();
-
- // Get synthesizer time in seconds.
- double nextEventTime = synth.getCurrentTime() + 1.0;
- try {
- synth.sleepUntil(nextEventTime);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- for (RampEvent rampEvent : rampData) {
-
- switch (mode) {
- case MODE_STEP:
- break;
- case MODE_LINEAR:
- linearRamp.time.set(rampEvent.rampDuration);
- break;
- case MODE_SMOOTH:
- continuousRamp.time.set(rampEvent.rampDuration);
- break;
- }
- ramp.getInput().set(rampEvent.target);
-
- nextEventTime += rampEvent.eventDuration;
- System.out.println("target = " + rampEvent.target + ", rampDur = "
- + rampEvent.rampDuration + ", eventDur = " + rampEvent.eventDuration);
- try {
- synth.sleepUntil(nextEventTime);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- if (recorder != null) {
- recorder.stop();
- recorder.close();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- try {
- new RecordVariousRamps().test(MODE_STEP);
- new RecordVariousRamps().test(MODE_LINEAR);
- new RecordVariousRamps().test(MODE_SMOOTH);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
-}
diff --git a/tests/com/jsyn/research/lambdas/LambdaUnits.java b/tests/com/jsyn/research/lambdas/LambdaUnits.java
deleted file mode 100644
index 42807ac..0000000
--- a/tests/com/jsyn/research/lambdas/LambdaUnits.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.jsyn.research.lambdas;
-
-import java.util.function.BinaryOperator;
-
-public class LambdaUnits {
-
-
- public static void main(String[] args) {
- test();
- }
-
- void tryLambda(BinaryOperator<Double> op) {
- double result = op.apply(3.0, 4.0);
- System.out.println("result = " + result);
- }
-
- private static void test() {
- System.out.println("Test Lambdas");
- // Need Java 8! tryLambda((x, y) -> (x * y));
- }
-
-}
diff --git a/tests/com/jsyn/swing/TestRangeModels.java b/tests/com/jsyn/swing/TestRangeModels.java
deleted file mode 100644
index 8bcd021..0000000
--- a/tests/com/jsyn/swing/TestRangeModels.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.swing;
-
-import junit.framework.TestCase;
-
-public class TestRangeModels extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void checkDoubleRange(double dmin, double dmax, double dval) {
- int resolution = 1000;
- DoubleBoundedRangeModel model = new DoubleBoundedRangeModel("test", resolution, dmin, dmax,
- dval);
- assertEquals("setup min", dmin, model.getDoubleMinimum(), 0.0001);
- assertEquals("setup max", dmax, model.getDoubleMaximum(), 0.0001);
- assertEquals("setup value", dval, model.getDoubleValue(), 0.0001);
-
- model.setDoubleValue(dmin);
- assertEquals("min double value", dmin, model.getDoubleValue(), 0.0001);
- assertEquals("min value", 0, model.getValue());
-
- double dmid = (dmax + dmin) / 2.0;
- model.setDoubleValue(dmid);
- assertEquals("middle double value", dmid, model.getDoubleValue(), 0.0001);
- assertEquals("middle value", resolution / 2, model.getValue());
-
- model.setDoubleValue(dmax);
- assertEquals("max double value", dmax, model.getDoubleValue(), 0.0001);
- assertEquals("max value", resolution, model.getValue());
-
- }
-
- public void testDoubleRange() {
- checkDoubleRange(10.0, 20.0, 12.0);
- checkDoubleRange(-1.0, 1.0, 0.5);
- }
-}
diff --git a/tests/com/jsyn/unitgen/CalibrateMoogFilter.java b/tests/com/jsyn/unitgen/CalibrateMoogFilter.java
deleted file mode 100644
index a830fcc..0000000
--- a/tests/com/jsyn/unitgen/CalibrateMoogFilter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import javax.swing.JApplet;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-
-/**
- * Play a sawtooth through a 4-pole filter.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class CalibrateMoogFilter extends JApplet {
- private Synthesizer synth;
- private UnitOscillator oscillator;
- private SineOscillator reference;
- ZeroCrossingCounter zeroCounter;
- PitchDetector pitchDetector;
- ZeroCrossingCounter sineZeroCounter;
- PitchDetector sinePitchDetector;
- private FilterFourPoles filterMoog;
- private LineOut lineOut;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
- synth.add(oscillator = new SawtoothOscillatorBL());
- synth.add(reference = new SineOscillator());
- synth.add(filterMoog = new FilterFourPoles());
- synth.add(pitchDetector = new PitchDetector());
- synth.add(sinePitchDetector = new PitchDetector());
- synth.add(zeroCounter = new ZeroCrossingCounter());
- synth.add(sineZeroCounter = new ZeroCrossingCounter());
- synth.add(lineOut = new LineOut());
-
- oscillator.output.connect(filterMoog.input);
- filterMoog.output.connect(zeroCounter.input);
- zeroCounter.output.connect(pitchDetector.input);
- reference.output.connect(0, lineOut.input, 0);
- filterMoog.output.connect(0, lineOut.input, 1);
-
- reference.output.connect(sineZeroCounter.input);
- sineZeroCounter.output.connect(sinePitchDetector.input);
-
- oscillator.frequency.set(130.0);
- oscillator.amplitude.set(0.001);
- filterMoog.frequency.set(440.0);
- filterMoog.Q.set(4.1);
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- pitchDetector.start();
- sinePitchDetector.start();
- lineOut.start();
- }
-
- @Override
- public void stop() {
- pitchDetector.stop();
- sinePitchDetector.stop();
- lineOut.stop();
- synth.stop();
- }
-
- public void test() {
- init();
- start();
- try {
- calibrate();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- stop();
- }
-
- private void calibrate() throws InterruptedException {
- synth.sleepFor(2.0);
- double freq = 100.0;
- System.out
- .printf("freq, moogFreq, ratio, moogConf, sineFreq, sineConf, moogZRate, sineZRate\n");
- long startingFrameCount = synth.getFrameCount();
- long startingMoogZeroCount = zeroCounter.getCount();
- long startingSineZeroCount = sineZeroCounter.getCount();
- for (int i = 0; i < 50; i++) {
- reference.frequency.set(freq);
- filterMoog.frequency.set(freq);
- synth.sleepFor(2.0);
-
- long endingFrameCount = synth.getFrameCount();
- long elapsedFrames = endingFrameCount - startingFrameCount;
- startingFrameCount = endingFrameCount;
-
- long endingMoogZeroCount = zeroCounter.getCount();
- long elapsedMoogZeros = endingMoogZeroCount - startingMoogZeroCount;
- startingMoogZeroCount = endingMoogZeroCount;
-
- long endingSineZeroCount = sineZeroCounter.getCount();
- long elapsedSineZeros = endingSineZeroCount - startingSineZeroCount;
- startingSineZeroCount = endingSineZeroCount;
-
- double moogZeroRate = elapsedMoogZeros * (double) synth.getFrameRate() / elapsedFrames;
- double sineZeroRate = elapsedSineZeros * (double) synth.getFrameRate() / elapsedFrames;
-
- double moogMeasuredFreq = pitchDetector.frequency.get();
- double moogConfidence = pitchDetector.confidence.get();
- double sineMeasuredFreq = sinePitchDetector.frequency.get();
- double sineConfidence = sinePitchDetector.confidence.get();
- double ratio = freq / moogMeasuredFreq;
- System.out.printf("%7.2f, %8.5f, %7.5f, %4.2f, %8.5f, %4.2f, %8.4f, %8.4f\n", freq,
- moogMeasuredFreq, ratio, moogConfidence, sineMeasuredFreq, sineConfidence,
- moogZeroRate, sineZeroRate);
-
- freq *= 1.1;
- }
- }
-
- public static void main(String args[]) {
- new CalibrateMoogFilter().test();
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/EnablingGate.java b/tests/com/jsyn/unitgen/EnablingGate.java
deleted file mode 100644
index daf36be..0000000
--- a/tests/com/jsyn/unitgen/EnablingGate.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import com.jsyn.ports.UnitInputPort;
-
-/**
- * This can be used to block the execution of upstream units. It can be placed at the output of a
- * circuit and driven with an amplitude envelope.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class EnablingGate extends UnitFilter {
- public UnitInputPort gate;
-
- /* Define Unit Ports used by connect() and set(). */
- public EnablingGate() {
- super();
- addPort(gate = new UnitInputPort("Gate"));
- }
-
- @Override
- public void generate(int start, int limit) {
- double[] aValues = input.getValues();
- double[] bValues = gate.getValues();
- double[] outputs = output.getValues();
- for (int i = start; i < limit; i++) {
- outputs[i] = aValues[i] * bValues[i];
- }
- // If we end up at zero then disable pulling of data.
- // We do this at the end so that envelope can get started.
- if (outputs[limit - 1] <= 0.0) {
- setEnabled(false);
- }
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/NonRealTimeTestCase.java b/tests/com/jsyn/unitgen/NonRealTimeTestCase.java
deleted file mode 100644
index 5d332a9..0000000
--- a/tests/com/jsyn/unitgen/NonRealTimeTestCase.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.engine.SynthesisEngine;
-
-public abstract class NonRealTimeTestCase extends TestCase {
-
- protected SynthesisEngine synthesisEngine;
-
- public NonRealTimeTestCase() {
- super();
- }
-
- public NonRealTimeTestCase(String name) {
- super(name);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- synthesisEngine.stop();
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/RecordMoogFilter.java b/tests/com/jsyn/unitgen/RecordMoogFilter.java
deleted file mode 100644
index 6af11fd..0000000
--- a/tests/com/jsyn/unitgen/RecordMoogFilter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import javax.swing.JApplet;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.util.WaveRecorder;
-
-/**
- * Measure actual frequency as a function of input frequency and Q.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class RecordMoogFilter extends JApplet {
- private final static boolean SWEEP_Q = false;
- private final static boolean SWEEP_FREQUENCY = true;
- private final static int NUM_STEPS = 11;
-
- private final static double MIN_Q = 0.0;
- private final static double DEFAULT_Q = 9.0;
- private final static double MAX_Q = 10.0;
-
- private final static double MIN_FREQUENCY = 100.0;
- private final static double DEFAULT_FREQUENCY = 500.0;
- private final static double MAX_FREQUENCY = 4000.0;
-
- private Synthesizer synth;
- private WhiteNoise source;
- private SineOscillator reference;
- private FilterFourPoles filterMoog;
- private LineOut lineOut;
- private WaveRecorder recorder;
-
- @Override
- public void init() {
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
- synth.add(source = new WhiteNoise());
- synth.add(filterMoog = new FilterFourPoles());
- synth.add(reference = new SineOscillator());
- synth.add(lineOut = new LineOut());
-
- source.output.connect(filterMoog.input);
- reference.output.connect(0, lineOut.input, 0);
- filterMoog.output.connect(0, lineOut.input, 1);
-
- reference.amplitude.set(0.5);
- source.amplitude.set(0.5);
- filterMoog.frequency.set(DEFAULT_FREQUENCY);
- filterMoog.Q.set(DEFAULT_Q);
-
- File waveFile = new File("temp_recording.wav");
- // Default is stereo, 16 bits.
- try {
- recorder = new WaveRecorder(synth, waveFile);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("Writing to WAV file " + waveFile.getAbsolutePath());
- }
-
- @Override
- public void start() {
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
- lineOut.start();
-
- reference.output.connect(0, recorder.getInput(), 0);
- filterMoog.output.connect(0, recorder.getInput(), 1);
- recorder.start();
- }
-
- @Override
- public void stop() {
- if (recorder != null) {
- recorder.stop();
- try {
- recorder.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- lineOut.stop();
- synth.stop();
- }
-
- public void test() {
- init();
- start();
- try {
- calibrate();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- stop();
- }
-
- private void calibrate() throws InterruptedException {
- synth.sleepFor(0.2);
- double freq = SWEEP_FREQUENCY ? MIN_FREQUENCY : DEFAULT_FREQUENCY;
- double q = SWEEP_Q ? MIN_Q : DEFAULT_Q;
- double stepQ = (MAX_Q - MIN_Q) / (NUM_STEPS - 1);
- double scaleFrequency = Math.pow((MAX_FREQUENCY / MIN_FREQUENCY), (1.0 / (NUM_STEPS - 1)));
- System.out.printf("freq, q, measured\n");
- for (int i = 0; i < NUM_STEPS; i++) {
- double refAmp = reference.amplitude.get();
- reference.amplitude.set(0.0);
- synth.sleepFor(0.1);
- reference.amplitude.set(refAmp);
-
- System.out.printf("%8.2f, %6.3f, \n", freq, q);
- filterMoog.frequency.set(freq);
- reference.frequency.set(freq);
- filterMoog.Q.set(q);
-
- synth.sleepFor(2.0);
-
- if (SWEEP_FREQUENCY) {
- freq *= scaleFrequency;
- }
- if (SWEEP_Q) {
- q += stepQ;
- }
- }
- }
-
- public static void main(String args[]) {
- new RecordMoogFilter().test();
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestConnections.java b/tests/com/jsyn/unitgen/TestConnections.java
deleted file mode 100644
index d15a257..0000000
--- a/tests/com/jsyn/unitgen/TestConnections.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-
-public class TestConnections extends TestCase {
- Add add1;
- Add add2;
- Add add3;
-
- Synthesizer synth;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synth = JSyn.createSynthesizer();
-
- synth.add(add1 = new Add());
- synth.add(add2 = new Add());
- synth.add(add3 = new Add());
-
- add1.start();
- add2.start();
- add3.start();
-
- add1.inputA.set(0.1);
- add1.inputB.set(0.2);
-
- add2.inputA.set(0.4);
- add2.inputB.set(0.8);
-
- add3.inputA.set(1.6);
- add3.inputB.set(3.2);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testSet() throws InterruptedException {
- synth.sleepFor(0.01);
- assertEquals("set inputs of adder", 0.3, add1.output.getValue(), 0.0001);
- }
-
- public void testConnect() throws InterruptedException {
- synth.sleepFor(0.01);
- assertEquals("set inputs of adder", 0.3, add1.output.getValue(), 0.0001);
- assertEquals("set inputs of adder", 1.2, add2.output.getValue(), 0.0001);
-
- // Test different ways of connecting.
- add1.output.connect(add2.inputB);
- checkConnection();
-
- add1.output.connect(0, add2.inputB, 0);
- checkConnection();
-
- add1.output.connect(add2.inputB.getConnectablePart(0));
- checkConnection();
-
- add1.output.getConnectablePart(0).connect(add2.inputB);
- checkConnection();
-
- add1.output.getConnectablePart(0).connect(add2.inputB.getConnectablePart(0));
- checkConnection();
-
- add2.inputB.connect(add1.output);
- checkConnection();
-
- add2.inputB.connect(0, add1.output, 0);
- checkConnection();
-
- add2.inputB.connect(add1.output.getConnectablePart(0));
- checkConnection();
-
- add2.inputB.getConnectablePart(0).connect(add1.output);
- checkConnection();
-
- add2.inputB.getConnectablePart(0).connect(add1.output.getConnectablePart(0));
- checkConnection();
- }
-
- private void checkConnection() throws InterruptedException {
- synth.sleepFor(0.01);
- assertEquals("connection should not change output", 0.3, add1.output.getValue(), 0.0001);
- assertEquals("replace set value with output", 0.7, add2.output.getValue(), 0.0001);
-
- // Revert to set value after disconnection.
- add1.output.disconnectAll();
- synth.sleepFor(0.01);
- assertEquals("still the same", 0.3, add1.output.getValue(), 0.0001);
- assertEquals("should revert to original set() value", 1.2, add2.output.getValue(), 0.0001);
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestDelay.java b/tests/com/jsyn/unitgen/TestDelay.java
deleted file mode 100644
index 12af1cd..0000000
--- a/tests/com/jsyn/unitgen/TestDelay.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import com.jsyn.util.AudioStreamReader;
-
-public class TestDelay extends NonRealTimeTestCase {
- public void testFloor() {
- double x = -7.3;
- int n = (int) Math.floor(x);
- assertEquals("int", -8, n);
- }
-
- public void checkInterpolatingDelay(int maxFrames, double delayFrames)
- throws InterruptedException {
- synthesisEngine.start();
-
- System.out.printf("test delayFrames = %7.5f\n", delayFrames);
- InterpolatingDelay delay = new InterpolatingDelay();
- synthesisEngine.add(delay);
- delay.allocate(maxFrames);
- delay.delay.set(delayFrames / 44100.0);
- SawtoothOscillator osc = new SawtoothOscillator();
- synthesisEngine.add(osc);
- osc.frequency.set(synthesisEngine.getFrameRate() / 4.0);
- osc.amplitude.set(1.0);
- osc.output.connect(delay.input);
-
- int samplesPerFrame = 1;
- AudioStreamReader reader = new AudioStreamReader(synthesisEngine, samplesPerFrame);
- delay.output.connect(reader.getInput());
-
- delay.start();
- for (int i = 0; i < (3 * maxFrames); i++) {
- if (reader.available() == 0) {
- synthesisEngine.sleepFor(0.01);
- }
- double actual = reader.read();
- double expected = 1 + i - delayFrames;
- if (expected < 0.0) {
- expected = 0.0;
- }
- // System.out.printf( "[%d] expected = %7.3f, delayed = %7.3f\n", i, expected, actual );
- // assertEquals("delayed output", expected, actual, 0.00001);
- }
- }
-
- public void testSmall() throws InterruptedException {
- checkInterpolatingDelay(40, 7.0);
- }
-
- public void testEven() throws InterruptedException {
- checkInterpolatingDelay(44100, 13671.0);
- }
-
- public void testInterpolatingDelay() throws InterruptedException {
- checkInterpolatingDelay(44100, 13671.4);
- }
-}
diff --git a/tests/com/jsyn/unitgen/TestEnable.java b/tests/com/jsyn/unitgen/TestEnable.java
deleted file mode 100644
index 37a4a2b..0000000
--- a/tests/com/jsyn/unitgen/TestEnable.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.engine.SynthesisEngine;
-
-public class TestEnable extends TestCase {
- SynthesisEngine synthesisEngine;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- synthesisEngine.stop();
- }
-
- public void testEnablingGate() throws InterruptedException {
- LinearRamp ramp = new LinearRamp();
- synthesisEngine.add(ramp);
- EnablingGate enabler = new EnablingGate();
- synthesisEngine.add(enabler);
- Add adder = new Add();
- synthesisEngine.add(adder);
-
- ramp.output.connect(enabler.input);
- enabler.output.connect(adder.inputA);
-
- // set up so ramp should equal time
- ramp.current.set(0.0);
- ramp.input.set(1.0);
- ramp.time.set(1.0);
- enabler.gate.set(1.0);
-
- synthesisEngine.start();
- double startTime = synthesisEngine.getCurrentTime();
- // pull from final adder
- adder.start();
- synthesisEngine.sleepUntil(startTime + 0.1);
- double tolerance = 0.002;
- assertEquals("ramp going up", 0.1, ramp.output.getValue(), tolerance);
- assertEquals("enabler going up", 0.1, enabler.output.getValue(), tolerance);
- assertEquals("adder going up", 0.1, adder.output.getValue(), tolerance);
- synthesisEngine.sleepUntil(startTime + 0.2);
- assertEquals("start enabled", 0.2, adder.output.getValue(), tolerance);
-
- // disable everything upstream
- enabler.gate.set(0.0);
-
- synthesisEngine.sleepUntil(startTime + 0.3);
- assertEquals("should not be pulled", 0.2, ramp.output.getValue(), tolerance);
- assertEquals("should be disabled", false, enabler.isEnabled());
- assertEquals("should be zero", 0.0, enabler.output.getValue(), tolerance);
- assertEquals("zero", 0.0, adder.output.getValue(), tolerance);
-
- }
-}
diff --git a/tests/com/jsyn/unitgen/TestEnvelopeAttackDecay.java b/tests/com/jsyn/unitgen/TestEnvelopeAttackDecay.java
deleted file mode 100644
index 50ecb15..0000000
--- a/tests/com/jsyn/unitgen/TestEnvelopeAttackDecay.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import com.jsyn.engine.SynthesisEngine;
-
-public class TestEnvelopeAttackDecay extends TestUnitGate {
- double attackTime;
- double decayTime;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- attackTime = 0.2;
- decayTime = 0.4;
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- synthesisEngine.stop();
- }
-
- public void testOnOff() throws InterruptedException {
- EnvelopeAttackDecay envelope = new EnvelopeAttackDecay();
- synthesisEngine.add(envelope);
-
- envelope.attack.set(0.1);
- envelope.decay.set(0.2);
-
- synthesisEngine.start();
- envelope.start();
- time = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(time + 0.1);
- assertEquals("still idling", 0.0, envelope.output.getValue());
-
- // Trigger the envelope using on/off
- envelope.input.on();
- time = synthesisEngine.getCurrentTime();
- // Check end of attack cycle.
- synthesisEngine.sleepUntil(time + 0.1);
- assertTrue("at peak", (envelope.output.getValue() > 0.8));
- envelope.input.off();
- // Check end of decay cycle.
- synthesisEngine.sleepUntil(time + 0.3);
- assertTrue("at peak", (envelope.output.getValue() < 0.1));
-
- synthesisEngine.sleepFor(0.1);
-
- // Trigger the envelope using trigger()
- envelope.input.trigger();
- time = synthesisEngine.getCurrentTime();
- // Check end of attack cycle.
- synthesisEngine.sleepUntil(time + 0.1);
- assertTrue("at peak", (envelope.output.getValue() > 0.8));
- // Check end of decay cycle.
- synthesisEngine.sleepUntil(time + 0.3);
- assertTrue("at peak", (envelope.output.getValue() < 0.1));
-
- }
-
- public void testRetrigger() throws InterruptedException {
- EnvelopeAttackDecay envelope = new EnvelopeAttackDecay();
- synthesisEngine.add(envelope);
-
- envelope.attack.set(0.1);
- envelope.decay.set(0.2);
-
- synthesisEngine.start();
- envelope.start();
- time = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(time + 0.1);
- assertEquals("still idling", 0.0, envelope.output.getValue());
-
- // Trigger the envelope using trigger()
- envelope.input.trigger();
- // Check end of attack cycle.
- synthesisEngine.sleepFor(0.1);
- assertEquals("at peak", 1.0, envelope.output.getValue(), 0.1);
-
- // Decay half way.
- synthesisEngine.sleepFor(0.1);
- assertTrue("at peak", (envelope.output.getValue() < 0.7));
-
- // Retrigger while decaying
- envelope.input.trigger();
- // Will get to top faster.
- synthesisEngine.sleepFor(0.1);
- assertEquals("at peak", 1.0, envelope.output.getValue(), 0.1);
-
- // Check end of decay cycle.
- synthesisEngine.sleepFor(0.2);
- assertTrue("at peak", (envelope.output.getValue() < 0.1));
-
- }
-
- public void testAutoDisable() throws InterruptedException {
-
- LinearRamp ramp = new LinearRamp();
- synthesisEngine.add(ramp);
- EnvelopeAttackDecay envelope = new EnvelopeAttackDecay();
- envelope.attack.set(0.1);
- envelope.decay.set(0.1);
- synthesisEngine.add(envelope);
- ramp.output.connect(envelope.amplitude);
-
- checkAutoDisable(ramp, envelope);
-
- }
-}
diff --git a/tests/com/jsyn/unitgen/TestEnvelopeDAHDSR.java b/tests/com/jsyn/unitgen/TestEnvelopeDAHDSR.java
deleted file mode 100644
index 8c781ac..0000000
--- a/tests/com/jsyn/unitgen/TestEnvelopeDAHDSR.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import com.jsyn.engine.SynthesisEngine;
-
-public class TestEnvelopeDAHDSR extends TestUnitGate {
- double delayTime;
- double attackTime;
- double holdTime;
- double decayTime;
- double sustainLevel;
- double releaseTime;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synthesisEngine = new SynthesisEngine();
- synthesisEngine.setRealTime(false);
- delayTime = 0.1;
- attackTime = 0.2;
- holdTime = 0.3;
- decayTime = 0.4;
- sustainLevel = 0.5;
- releaseTime = 0.6;
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- synthesisEngine.stop();
- }
-
- public void testStages() throws InterruptedException {
- EnvelopeDAHDSR ramp = checkToSustain();
-
- // Change sustain level to simulate tremolo sustain.
- sustainLevel = 0.7;
- ramp.sustain.set(sustainLevel);
- time += 0.01;
- synthesisEngine.sleepUntil(time);
- assertEquals("sustain moving delaying", sustainLevel, ramp.output.getValue(), 0.01);
-
- // Gate off to let envelope release.
- ramp.input.set(0.0);
- synthesisEngine.sleepUntil(time + (releaseTime * 0.1));
- double releaseValue = ramp.output.getValue();
- assertEquals("partway down release", sustainLevel * 0.36, releaseValue, 0.01);
- }
-
- private EnvelopeDAHDSR checkToSustain() throws InterruptedException {
- EnvelopeDAHDSR ramp = new EnvelopeDAHDSR();
- synthesisEngine.add(ramp);
-
- ramp.delay.set(delayTime);
- ramp.attack.set(attackTime);
- ramp.hold.set(holdTime);
- ramp.decay.set(decayTime);
- ramp.sustain.set(sustainLevel);
- ramp.release.set(releaseTime);
-
- synthesisEngine.start();
- ramp.start();
- time = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(time + (2.0 * delayTime));
- assertEquals("still idling", 0.0, ramp.output.getValue());
-
- // Trigger the envelope.
- ramp.input.set(1.0);
- time = synthesisEngine.getCurrentTime();
- // Check end of delay cycle.
- synthesisEngine.sleepUntil(time + (delayTime * 0.9));
- assertEquals("still delaying", 0.0, ramp.output.getValue(), 0.01);
- // Half way up attack ramp.
- synthesisEngine.sleepUntil(time + delayTime + (attackTime * 0.5));
- assertEquals("half attack", 0.5, ramp.output.getValue(), 0.01);
- // Holding after attack.
- synthesisEngine.sleepUntil(time + delayTime + attackTime + (holdTime * 0.1));
- assertEquals("holding", 1.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(time + delayTime + attackTime + (holdTime * 0.9));
- assertEquals("still holding", 1.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(time + delayTime + attackTime + holdTime + decayTime);
- time = synthesisEngine.getCurrentTime();
- assertEquals("at sustain", sustainLevel, ramp.output.getValue(), 0.01);
- return ramp;
- }
-
- public void testRetrigger() throws InterruptedException {
- EnvelopeDAHDSR ramp = checkToSustain();
-
- // Gate off to let envelope release.
- ramp.input.set(0.0);
- synthesisEngine.sleepUntil(time + (releaseTime * 0.1));
- double releaseValue = ramp.output.getValue();
- assertEquals("partway down release", sustainLevel * 0.36, releaseValue, 0.01);
-
- // Retrigger during release phase.
- time = synthesisEngine.getCurrentTime();
- ramp.input.set(1.0);
- // Check end of delay cycle.
- synthesisEngine.sleepUntil(time + (delayTime * 0.9));
- assertEquals("still delaying", releaseValue, ramp.output.getValue(), 0.01);
- // Half way up attack ramp from where it started.
- synthesisEngine.sleepUntil(time + delayTime + (attackTime * 0.5));
- assertEquals("half attack", releaseValue + 0.5, ramp.output.getValue(), 0.01);
-
- }
-
- // I noticed a hang while playing with knobs.
- public void testHang() throws InterruptedException {
-
- delayTime = 0.0;
- attackTime = 0.0;
- holdTime = 0.0;
- decayTime = 0.0;
- sustainLevel = 0.3;
- releaseTime = 3.0;
-
- EnvelopeDAHDSR ramp = new EnvelopeDAHDSR();
- synthesisEngine.add(ramp);
-
- ramp.delay.set(delayTime);
- ramp.attack.set(attackTime);
- ramp.hold.set(holdTime);
- ramp.decay.set(decayTime);
- ramp.sustain.set(sustainLevel);
- ramp.release.set(releaseTime);
-
- synthesisEngine.start();
- ramp.start();
- // Trigger the envelope.
- ramp.input.set(1.0);
- time = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(time + 0.01);
- assertEquals("should jump to sustain level", sustainLevel, ramp.output.getValue());
-
- // Gate off to let envelope release.
- ramp.input.set(0.0);
- synthesisEngine.sleepUntil(time + 1.0);
- double releaseValue = ramp.output.getValue();
- assertTrue("partway down release", sustainLevel > releaseValue);
-
- holdTime = 0.5;
- ramp.hold.set(holdTime);
- decayTime = 0.5;
- ramp.decay.set(decayTime);
-
- // Retrigger during release phase and try to catch it at top of hold
- time = synthesisEngine.getCurrentTime();
- ramp.input.set(1.0);
- // Check end of delay cycle.
- synthesisEngine.sleepUntil(time + (holdTime * 0.1));
- assertEquals("should jump to hold", 1.0, ramp.output.getValue(), 0.01);
- }
-
- public void testNegative() throws InterruptedException {
- delayTime = -0.1;
- attackTime = -0.2;
- holdTime = -0.3;
- decayTime = -0.4;
- sustainLevel = 0.3;
- releaseTime = -0.5;
-
- EnvelopeDAHDSR ramp = new EnvelopeDAHDSR();
- synthesisEngine.add(ramp);
-
- ramp.delay.set(delayTime);
- ramp.attack.set(attackTime);
- ramp.hold.set(holdTime);
- ramp.decay.set(decayTime);
- ramp.sustain.set(sustainLevel);
- ramp.release.set(releaseTime);
-
- synthesisEngine.start();
- ramp.start();
- // Trigger the envelope.
- ramp.input.set(1.0);
- time = synthesisEngine.getCurrentTime();
- time += 0.1;
- synthesisEngine.sleepUntil(time + 0.01);
- assertEquals("should jump to sustain level", sustainLevel, ramp.output.getValue());
-
- ramp.sustain.set(sustainLevel = -0.4);
- time += 0.1;
- synthesisEngine.sleepUntil(time);
- assertEquals("sustain should clip at zero", sustainLevel, ramp.output.getValue());
-
- ramp.sustain.set(sustainLevel = 0.4);
- time += 0.1;
- synthesisEngine.sleepUntil(time);
- assertEquals("sustain should come back", sustainLevel, ramp.output.getValue());
-
- // Gate off to let envelope release.
- ramp.input.set(0.0);
- time += 0.1;
- synthesisEngine.sleepUntil(time);
- double releaseValue = ramp.output.getValue();
- assertEquals("release quickly", 0.0, releaseValue);
- }
-
- public void testOnOff() throws InterruptedException {
- EnvelopeDAHDSR ramp = new EnvelopeDAHDSR();
- synthesisEngine.add(ramp);
-
- ramp.delay.set(0.0);
- ramp.attack.set(0.1);
- ramp.hold.set(0.0);
- ramp.decay.set(0.0);
- ramp.sustain.set(0.9);
- ramp.release.set(0.1);
-
- synthesisEngine.start();
- ramp.start();
- time = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(time + 0.2);
- assertEquals("still idling", 0.0, ramp.output.getValue());
-
- // Trigger the envelope.
- ramp.input.on();
- time = synthesisEngine.getCurrentTime();
- // Check end of delay cycle.
- synthesisEngine.sleepUntil(time + 0.2);
- assertEquals("at sustain", 0.9, ramp.output.getValue(), 0.01);
-
- // Release the envelope.
- ramp.input.off();
- time = synthesisEngine.getCurrentTime();
- // Check end of delay cycle.
- synthesisEngine.sleepUntil(time + 0.2);
- assertEquals("after release", 0.0, ramp.output.getValue(), 0.01);
- }
-
- public void testAutoDisable() throws InterruptedException {
-
- LinearRamp ramp = new LinearRamp();
- synthesisEngine.add(ramp);
- EnvelopeDAHDSR envelope = new EnvelopeDAHDSR();
- synthesisEngine.add(envelope);
- envelope.attack.set(0.1);
- envelope.decay.set(0.1);
- envelope.release.set(0.1);
- envelope.sustain.set(0.1);
- ramp.output.connect(envelope.amplitude);
-
- checkAutoDisable(ramp, envelope);
-
- }
-
- class GatedRampCircuit extends Circuit {
- LinearRamp ramp;
- EnvelopeDAHDSR envelope;
-
- GatedRampCircuit() {
- add(ramp = new LinearRamp());
- add(envelope = new EnvelopeDAHDSR());
- envelope.attack.set(0.1);
- envelope.decay.set(0.1);
- envelope.release.set(0.1);
- envelope.sustain.set(0.1);
-
- envelope.setupAutoDisable(this);
- ramp.output.connect(envelope.amplitude);
- }
- }
-
- public void testAutoDisableCircuit() throws InterruptedException {
- GatedRampCircuit circuit = new GatedRampCircuit();
- synthesisEngine.add(circuit);
- checkAutoDisable(circuit.ramp, circuit.envelope);
- }
-
- public void checkReleaseTiming(double releaseTime, double tolerance)
- throws InterruptedException {
- delayTime = 0.0;
- attackTime = 0.2;
- holdTime = 0.0;
- decayTime = 10.0;
- sustainLevel = 1.0;
-
- EnvelopeDAHDSR ramp = new EnvelopeDAHDSR();
- synthesisEngine.add(ramp);
-
- ramp.delay.set(delayTime);
- ramp.attack.set(attackTime);
- ramp.hold.set(holdTime);
- ramp.decay.set(decayTime);
- ramp.sustain.set(sustainLevel);
- ramp.release.set(releaseTime);
-
- synthesisEngine.start();
- ramp.start();
- // Trigger the envelope.
- ramp.input.set(1.0);
- time = synthesisEngine.getCurrentTime();
- time += attackTime * 2;
- synthesisEngine.sleepUntil(time);
- assertEquals("should be at to sustain level", sustainLevel, ramp.output.getValue());
-
- // Start envelope release.
- ramp.input.set(0.0);
- final double db90 = 20.0 * Math.log(1.0 / 32768.0) / Math.log(10.0);
- System.out.println("JSyns DB90 is actually " + db90);
- int numSteps = 10;
- for (int i = 0; i < 10; i++) {
- time += releaseTime / numSteps;
- synthesisEngine.sleepUntil(time);
- double expectedDB = db90 * (i + 1) / numSteps;
- double expectedAmplitude = sustainLevel * Math.pow(10.0, expectedDB / 20.0);
- double releaseValue = ramp.output.getValue();
- assertEquals("release " + i + " at", expectedAmplitude, releaseValue, tolerance);
- }
- time += releaseTime / numSteps;
- synthesisEngine.sleepUntil(time);
- double releaseValue = ramp.output.getValue();
- assertEquals("env after release time should go to zero", 0.0, releaseValue, 0.0001);
- }
-
- public void testReleaseTiming() throws InterruptedException {
- checkReleaseTiming(0.1, 0.004);
- checkReleaseTiming(1.0, 0.002);
- checkReleaseTiming(2.5, 0.001);
- checkReleaseTiming(10.0, 0.001);
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestFunction.java b/tests/com/jsyn/unitgen/TestFunction.java
deleted file mode 100644
index a8bfac0..0000000
--- a/tests/com/jsyn/unitgen/TestFunction.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.DoubleTable;
-import com.jsyn.data.Function;
-
-/**
- * @author Phil Burk, (C) 2009 Mobileer Inc
- */
-public class TestFunction extends TestCase {
- Synthesizer synth;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synth = JSyn.createSynthesizer();
- synth.setRealTime(false);
- synth.start();
- }
-
- @Override
- protected void tearDown() throws Exception {
- synth.stop();
- }
-
- public void testDoubleTable() {
- double[] data = {
- 2.0, 0.0, 3.0
- };
- DoubleTable table = new DoubleTable(data);
- assertEquals("DoubleTable below", 2.0, table.evaluate(-1.4));
- assertEquals("DoubleTable edge", 2.0, table.evaluate(-1.0));
- assertEquals("DoubleTable mid", 1.0, table.evaluate(-0.5));
- assertEquals("DoubleTable zero", 0.0, table.evaluate(0.0));
- assertEquals("DoubleTable mid", 0.75, table.evaluate(0.25));
- assertEquals("DoubleTable above", 3.0, table.evaluate(1.3));
-
- }
-
- public void testFunctionEvaluator() throws InterruptedException {
- FunctionEvaluator shaper = new FunctionEvaluator();
- synth.add(shaper);
- shaper.start();
-
- Function cuber = new Function() {
- @Override
- public double evaluate(double x) {
- return x * x * x;
- }
- };
- shaper.function.set(cuber);
-
- shaper.input.set(0.5);
- synth.sleepFor(0.001);
-
- assertEquals("Cuber", (0.5 * 0.5 * 0.5), shaper.output.getValue());
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestMath.java b/tests/com/jsyn/unitgen/TestMath.java
deleted file mode 100644
index cae1dea..0000000
--- a/tests/com/jsyn/unitgen/TestMath.java
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.engine.SynthesisEngine;
-import com.softsynth.math.AudioMath;
-
-/**
- * @author Phil Burk, (C) 2009 Mobileer Inc
- */
-public class TestMath extends TestCase {
- SynthesisEngine synthesisEngine;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- synthesisEngine = new SynthesisEngine();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testAdd() {
- Add add = new Add();
- add.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- add.inputA.setValueInternal(x);
- add.inputB.setValueInternal(y);
-
- add.generate();
-
- assertEquals("Add", x + y, add.output.getValue(), 0.001);
- }
-
- public void testPartialAdd() {
- Add add = new Add();
- add.setSynthesisEngine(synthesisEngine);
-
- double x = 2.5;
- double y = 9.7;
- add.inputA.setValueInternal(x);
- add.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- add.generate(2, 5);
-
- assertEquals("Add partial", 0.0, add.output.getValues()[0], 0.001);
- assertEquals("Add partial", 0.0, add.output.getValues()[1], 0.001);
- assertEquals("Add partial", x + y, add.output.getValues()[2], 0.001);
- assertEquals("Add partial", x + y, add.output.getValues()[3], 0.001);
- assertEquals("Add partial", x + y, add.output.getValues()[4], 0.001);
- assertEquals("Add partial", 0.0, add.output.getValues()[5], 0.001);
- assertEquals("Add partial", 0.0, add.output.getValues()[6], 0.001);
- assertEquals("Add partial", 0.0, add.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Subtract.java - added by Lisa Tolentino 06/17/2009
- */
- public void testSubtract() {
- Subtract sub = new Subtract();
- sub.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- sub.inputA.setValueInternal(x);
- sub.inputB.setValueInternal(y);
-
- sub.generate();
-
- assertEquals("Subtract", x - y, sub.output.getValue(), 0.001);
- }
-
- public void testPartialSubtract() {
- Subtract sub = new Subtract();
- sub.setSynthesisEngine(synthesisEngine);
-
- double x = 2.5;
- double y = 9.7;
- sub.inputA.setValueInternal(x);
- sub.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- sub.generate(2, 5);
-
- assertEquals("Subtract partial", 0.0, sub.output.getValues()[0], 0.001);
- assertEquals("Subtract partial", 0.0, sub.output.getValues()[1], 0.001);
- assertEquals("Subtract partial", x - y, sub.output.getValues()[2], 0.001);
- assertEquals("Subtract partial", x - y, sub.output.getValues()[3], 0.001);
- assertEquals("Subtract partial", x - y, sub.output.getValues()[4], 0.001);
- assertEquals("Subtract partial", 0.0, sub.output.getValues()[5], 0.001);
- assertEquals("Subtract partial", 0.0, sub.output.getValues()[6], 0.001);
- assertEquals("Subtract partial", 0.0, sub.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Multiply.java - added by Lisa Tolentino 06/19/2009
- */
- public void testMultiply() {
- Multiply mult = new Multiply();
- mult.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- mult.inputA.setValueInternal(x);
- mult.inputB.setValueInternal(y);
-
- mult.generate();
-
- assertEquals("Multiply", x * y, mult.output.getValue(), 0.001);
- }
-
- public void testPartialMultiply() {
- Multiply mult = new Multiply();
- mult.setSynthesisEngine(synthesisEngine);
-
- double x = 2.5;
- double y = 9.7;
- mult.inputA.setValueInternal(x);
- mult.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- mult.generate(2, 5);
-
- assertEquals("Multiply partial", 0.0, mult.output.getValues()[0], 0.001);
- assertEquals("Multiply partial", 0.0, mult.output.getValues()[1], 0.001);
- assertEquals("Multiply partial", x * y, mult.output.getValues()[2], 0.001);
- assertEquals("Multiply partial", x * y, mult.output.getValues()[3], 0.001);
- assertEquals("Multiply partial", x * y, mult.output.getValues()[4], 0.001);
- assertEquals("Multiply partial", 0.0, mult.output.getValues()[5], 0.001);
- assertEquals("Multiply partial", 0.0, mult.output.getValues()[6], 0.001);
- assertEquals("Multiply partial", 0.0, mult.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Divide.java - added by Lisa Tolentino 06/19/2009
- */
- public void testDivide() {
- Divide divide = new Divide();
- divide.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- divide.inputA.setValueInternal(x);
- divide.inputB.setValueInternal(y);
-
- divide.generate();
-
- assertEquals("Divide", x / y, divide.output.getValue(), 0.001);
- }
-
- public void testPartialDivide() {
- Divide divide = new Divide();
- divide.setSynthesisEngine(synthesisEngine);
-
- double x = 2.5;
- double y = 9.7;
- divide.inputA.setValueInternal(x);
- divide.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- divide.generate(2, 5);
-
- assertEquals("Divide partial", 0.0, divide.output.getValues()[0], 0.001);
- assertEquals("Divide partial", 0.0, divide.output.getValues()[1], 0.001);
- assertEquals("Divide partial", x / y, divide.output.getValues()[2], 0.001);
- assertEquals("Divide partial", x / y, divide.output.getValues()[3], 0.001);
- assertEquals("Divide partial", x / y, divide.output.getValues()[4], 0.001);
- assertEquals("Divide partial", 0.0, divide.output.getValues()[5], 0.001);
- assertEquals("Divide partial", 0.0, divide.output.getValues()[6], 0.001);
- assertEquals("Divide partial", 0.0, divide.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for MultiplyAdd.java - added by Lisa Tolentino 06/19/2009
- */
- public void testMultiplyAdd() {
- MultiplyAdd multAdd = new MultiplyAdd();
- multAdd.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- double z = 2.28;
- multAdd.inputA.setValueInternal(x);
- multAdd.inputB.setValueInternal(y);
- multAdd.inputC.setValueInternal(z);
-
- multAdd.generate();
-
- assertEquals("MultiplyAdd", (x * y) + z, multAdd.output.getValue(), 0.001);
- }
-
- public void testPartialMultiplyAdd() {
- MultiplyAdd multAdd = new MultiplyAdd();
- multAdd.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- double z = 2.28;
- multAdd.inputA.setValueInternal(x);
- multAdd.inputB.setValueInternal(y);
- multAdd.inputC.setValueInternal(z);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- multAdd.generate(2, 5);
-
- assertEquals("MultiplyAdd partial", 0.0, multAdd.output.getValues()[0], 0.001);
- assertEquals("MultiplyAdd partial", 0.0, multAdd.output.getValues()[1], 0.001);
- assertEquals("MultiplyAdd partial", (x * y) + z, multAdd.output.getValues()[2], 0.001);
- assertEquals("MultiplyAdd partial", (x * y) + z, multAdd.output.getValues()[3], 0.001);
- assertEquals("MultiplyAdd partial", (x * y) + z, multAdd.output.getValues()[4], 0.001);
- assertEquals("MultiplyAdd partial", 0.0, multAdd.output.getValues()[5], 0.001);
- assertEquals("MultiplyAdd partial", 0.0, multAdd.output.getValues()[6], 0.001);
- assertEquals("MultiplyAdd partial", 0.0, multAdd.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Compare.java - added by Lisa Tolentino 06/19/2009
- */
- public void testCompare() {
- UnitBinaryOperator compare = new Compare();
- compare.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- compare.inputA.setValueInternal(x);
- compare.inputB.setValueInternal(y);
-
- compare.generate();
-
- assertEquals("Compare", (x > y ? 1 : 0), compare.output.getValue(), 0.001);
- }
-
- public void testPartialCompare() {
- UnitBinaryOperator compare = new Compare();
- compare.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- compare.inputA.setValueInternal(x);
- compare.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- compare.generate(2, 5);
-
- assertEquals("Compare partial", 0.0, compare.output.getValues()[0], 0.001);
- assertEquals("Compare partial", 0.0, compare.output.getValues()[1], 0.001);
- assertEquals("Compare partial", (x > y ? 1 : 0), compare.output.getValues()[2], 0.001);
- assertEquals("Compare partial", (x > y ? 1 : 0), compare.output.getValues()[3], 0.001);
- assertEquals("Compare partial", (x > y ? 1 : 0), compare.output.getValues()[4], 0.001);
- assertEquals("Compare partial", 0.0, compare.output.getValues()[5], 0.001);
- assertEquals("Compare partial", 0.0, compare.output.getValues()[6], 0.001);
- assertEquals("Compare partial", 0.0, compare.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Maximum.java - added by Lisa Tolentino 06/20/2009
- */
- public void testMaximum() {
- Maximum max = new Maximum();
- max.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- max.inputA.setValueInternal(x);
- max.inputB.setValueInternal(y);
-
- max.generate();
-
- assertEquals("Maximum", (x > y ? x : y), max.output.getValue(), 0.001);
- }
-
- public void testPartialMaximum() {
- Maximum max = new Maximum();
- max.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- max.inputA.setValueInternal(x);
- max.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- max.generate(2, 5);
-
- assertEquals("Maximum partial", 0.0, max.output.getValues()[0], 0.001);
- assertEquals("Maximum partial", 0.0, max.output.getValues()[1], 0.001);
- assertEquals("Maximum partial", (x > y ? x : y), max.output.getValues()[2], 0.001);
- assertEquals("Maximum partial", (x > y ? x : y), max.output.getValues()[3], 0.001);
- assertEquals("Maximum partial", (x > y ? x : y), max.output.getValues()[4], 0.001);
- assertEquals("Maximum partial", 0.0, max.output.getValues()[5], 0.001);
- assertEquals("Maximum partial", 0.0, max.output.getValues()[6], 0.001);
- assertEquals("Maximum partial", 0.0, max.output.getValues()[7], 0.001);
-
- }
-
- /**
- * Unit test for Minimum.java - added by Lisa Tolentino 06/20/2009
- */
- public void testMinimum() {
- Minimum min = new Minimum();
- min.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- min.inputA.setValueInternal(x);
- min.inputB.setValueInternal(y);
-
- min.generate();
-
- assertEquals("Minimum", (x < y ? x : y), min.output.getValue(), 0.001);
- }
-
- public void testPartialMinimum() {
- Minimum min = new Minimum();
- min.setSynthesisEngine(synthesisEngine);
-
- double x = 33.99;
- double y = 8.31;
- min.inputA.setValueInternal(x);
- min.inputB.setValueInternal(y);
-
- // Only generate a few values in the middle.
- // This is to test low latency feedback loops.
- // Only generate values for 2,3,4
- min.generate(2, 5);
-
- assertEquals("Maximum partial", 0.0, min.output.getValues()[0], 0.001);
- assertEquals("Maximum partial", 0.0, min.output.getValues()[1], 0.001);
- assertEquals("Maximum partial", (x < y ? x : y), min.output.getValues()[2], 0.001);
- assertEquals("Maximum partial", (x < y ? x : y), min.output.getValues()[3], 0.001);
- assertEquals("Maximum partial", (x < y ? x : y), min.output.getValues()[4], 0.001);
- assertEquals("Maximum partial", 0.0, min.output.getValues()[5], 0.001);
- assertEquals("Maximum partial", 0.0, min.output.getValues()[6], 0.001);
- assertEquals("Maximum partial", 0.0, min.output.getValues()[7], 0.001);
-
- }
-
- public void testPowerOfTwo() {
- PowerOfTwo powerOfTwo = new PowerOfTwo();
- powerOfTwo.setSynthesisEngine(synthesisEngine);
- final double smallValue = -1.5308084989341915E-17;
- double values[] = {
- 0.0, 1.3, 4.5, -0.5, -1.0, -2.8, smallValue, -smallValue, 1.0 - smallValue,
- 1.0 + smallValue
- };
- for (double in : values) {
- powerOfTwo.input.setValueInternal(in);
- powerOfTwo.generate();
- assertEquals("PowerOfTwo", Math.pow(2.0, in), powerOfTwo.output.getValue(), 0.001);
- }
- }
- public void testPitchToFrequency() {
- PitchToFrequency ugen = new PitchToFrequency();
- ugen.setSynthesisEngine(synthesisEngine);
- final double smallValue = -1.5308084989341915E-17;
- double values[] = {
- 49.0, 49.5, 50.0 + smallValue,
- 60.0 -smallValue,
- 79.2, 12.9, 118.973
- };
- // Sanity check AudioMath
- assertEquals("PitchToFrequency", 440.0, AudioMath.pitchToFrequency(69), 0.001);
- assertEquals("PitchToFrequency", 660.0, AudioMath.pitchToFrequency(69+7.02), 0.1);
-
- for (double pitch : values) {
- ugen.input.setValueInternal(pitch);
- ugen.generate();
- assertEquals("PitchToFrequency", AudioMath.pitchToFrequency(pitch),
- ugen.output.getValue(), 0.001);
- }
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestRamps.java b/tests/com/jsyn/unitgen/TestRamps.java
deleted file mode 100644
index 83ebacf..0000000
--- a/tests/com/jsyn/unitgen/TestRamps.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-public class TestRamps extends NonRealTimeTestCase {
-
- public void viewContinuousRamp(double duration, double startValue, double targetValue)
- throws InterruptedException {
- ContinuousRamp ramp = new ContinuousRamp();
- synthesisEngine.add(ramp);
-
- ramp.current.set(startValue);
- ramp.input.set(startValue);
- ramp.time.set(duration);
-
- synthesisEngine.setRealTime(false);
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- ramp.input.set(targetValue);
-
- double time = synthesisEngine.getCurrentTime();
- int numLoops = 20;
- double increment = duration / numLoops;
- for (int i = 0; i < (numLoops + 1); i++) {
- double value = ramp.output.getValue();
- System.out.printf("i = %d, t = %9.5f, value = %8.4f\n", i, time, value);
- time += increment;
- synthesisEngine.sleepUntil(time);
- }
-
- synthesisEngine.stop();
- }
-
- public void checkContinuousRamp(double duration, double startValue, double targetValue)
- throws InterruptedException {
- ContinuousRamp ramp = new ContinuousRamp();
- synthesisEngine.add(ramp);
-
- ramp.current.set(startValue);
- ramp.input.set(startValue);
- ramp.time.set(duration);
-
- synthesisEngine.setRealTime(false);
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- assertEquals("start flat", ramp.input.getValue(), ramp.output.getValue());
-
- ramp.input.set(targetValue);
- double startTime = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(startTime + (duration / 2));
- assertEquals("ramping up", (targetValue + startValue) / 2.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + duration);
- assertEquals("ramping up", targetValue, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + duration + 0.1);
- assertEquals("flat again", targetValue, ramp.output.getValue());
-
- synthesisEngine.stop();
- }
-
- public void testContinuousRamp() throws InterruptedException {
- viewContinuousRamp(4.0, 0.0, 1.0);
- }
-
- public void testExponentialRamp() throws InterruptedException {
- ExponentialRamp ramp = new ExponentialRamp();
- synthesisEngine.add(ramp);
-
- double duration = 0.3;
- ramp.current.set(1.0);
- ramp.input.set(1.0);
- ramp.time.set(duration);
-
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- assertEquals("start flat", ramp.input.getValue(), ramp.output.getValue());
-
- ramp.input.set(8.0);
- double startTime = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(startTime + 0.1);
- assertEquals("ramping up", 2.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.2);
- assertEquals("ramping up", 4.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.3);
- assertEquals("ramping up", 8.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.4);
- assertEquals("flat again", 8.0, ramp.output.getValue());
- }
-
- public void testLinearRamp() throws InterruptedException {
- LinearRamp ramp = new LinearRamp();
- synthesisEngine.add(ramp);
-
- double duration = 0.4;
- ramp.current.set(0.0);
- ramp.input.set(0.0);
- ramp.time.set(duration);
-
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- assertEquals("start flat", ramp.input.getValue(), ramp.output.getValue());
-
- ramp.input.set(8.0);
- double startTime = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(startTime + 0.1);
- assertEquals("ramping up", 2.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.2);
- assertEquals("ramping up", 4.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.3);
- assertEquals("ramping up", 6.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.4);
- assertEquals("flat again", 8.0, ramp.output.getValue());
- }
-
- public void testExponentialRampConnected() throws InterruptedException {
- ExponentialRamp ramp = new ExponentialRamp();
- PassThrough pass = new PassThrough();
- synthesisEngine.add(ramp);
- synthesisEngine.add(pass);
-
- double duration = 0.3;
- ramp.current.set(1.0);
- pass.input.set(1.0);
- ramp.time.set(duration);
-
- // Send value through a connected unit.
- pass.input.set(1.0);
- pass.output.connect(ramp.input);
-
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- assertEquals("start flat", ramp.input.getValue(), ramp.output.getValue());
-
- pass.input.set(8.0);
- double startTime = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(startTime + 0.1);
- assertEquals("ramping up", 2.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.2);
- assertEquals("ramping up", 4.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.3);
- assertEquals("ramping up", 8.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.4);
- assertEquals("flat again", 8.0, ramp.output.getValue());
- }
-
- public void testLinearRampConnected() throws InterruptedException {
- LinearRamp ramp = new LinearRamp();
- PassThrough pass = new PassThrough();
- synthesisEngine.add(ramp);
- synthesisEngine.add(pass);
-
- double duration = 0.4;
- ramp.current.set(0.0);
- pass.input.set(0.0);
- ramp.time.set(duration);
-
- // Send value through a connected unit.
- pass.input.set(0.0);
- pass.output.connect(ramp.input);
-
- synthesisEngine.start();
- ramp.start();
- synthesisEngine.sleepUntil(synthesisEngine.getCurrentTime() + 0.01);
- assertEquals("start flat", ramp.input.getValue(), ramp.output.getValue());
-
- pass.input.set(8.0);
- double startTime = synthesisEngine.getCurrentTime();
- synthesisEngine.sleepUntil(startTime + 0.1);
- assertEquals("ramping up", 2.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.2);
- assertEquals("ramping up", 4.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.3);
- assertEquals("ramping up", 6.0, ramp.output.getValue(), 0.01);
- synthesisEngine.sleepUntil(startTime + 0.4);
- assertEquals("flat again", 8.0, ramp.output.getValue());
- }
-
-}
diff --git a/tests/com/jsyn/unitgen/TestUnitGate.java b/tests/com/jsyn/unitgen/TestUnitGate.java
deleted file mode 100644
index 14129aa..0000000
--- a/tests/com/jsyn/unitgen/TestUnitGate.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.unitgen;
-
-import junit.framework.TestCase;
-
-import com.jsyn.engine.SynthesisEngine;
-
-public class TestUnitGate extends TestCase {
-
- protected SynthesisEngine synthesisEngine;
- protected double time;
-
- public void checkAutoDisable(LinearRamp ramp, UnitGate envelope) throws InterruptedException {
- double tolerance = 0.01;
- Add adder = new Add();
- synthesisEngine.add(adder);
-
- envelope.output.connect(adder.inputA);
- if (ramp.getCircuit() != null) {
- ramp.output.connect(adder.inputB);
- }
-
- envelope.input.setAutoDisableEnabled(true);
- envelope.setEnabled(false);
-
- // set up so ramp value should equal time
- ramp.current.set(0.0);
- ramp.input.set(1.0);
- ramp.time.set(1.0);
-
- synthesisEngine.start();
- // pull from final adder
- adder.start();
-
- time = synthesisEngine.getCurrentTime();
- time += 0.1;
- synthesisEngine.sleepUntil(time);
- assertEquals("still idling", 0.0, envelope.output.getValue());
- assertEquals("ramp frozen at beginning", 0.0, ramp.output.getValue(), tolerance);
-
- // run multiple times to make sure we can retrigger the envelope.
- for (int i = 0; i < 3; i++) {
- double level = ramp.output.getValue();
- // Trigger the envelope using trigger()
- envelope.input.on();
- time += 0.1;
- level += 0.1;
- synthesisEngine.sleepUntil(time);
- assertEquals("ramp going up " + i, level, ramp.output.getValue(), tolerance);
- assertTrue("enabled at peak", envelope.isEnabled());
-
- envelope.input.off();
- time += 0.1;
- level += 0.1;
- synthesisEngine.sleepUntil(time);
- assertEquals("ramp going up more " + i, level, ramp.output.getValue(), tolerance);
- assertEquals("at bottom", 0.0, envelope.output.getValue(), 0.1);
-
- time += 0.2;
- synthesisEngine.sleepUntil(time);
- assertEquals("ramp frozen " + i, level, ramp.output.getValue(), tolerance);
- }
- }
-
-}
diff --git a/tests/com/jsyn/util/DebugSampleLoader.java b/tests/com/jsyn/util/DebugSampleLoader.java
deleted file mode 100644
index 23945b5..0000000
--- a/tests/com/jsyn/util/DebugSampleLoader.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2010 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.util;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.jsyn.JSyn;
-import com.jsyn.Synthesizer;
-import com.jsyn.data.FloatSample;
-import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.VariableRateDataReader;
-import com.jsyn.unitgen.VariableRateMonoReader;
-import com.jsyn.unitgen.VariableRateStereoReader;
-
-/**
- * Play a sample from a WAV file using JSyn.
- *
- * @author Phil Burk (C) 2010 Mobileer Inc
- */
-public class DebugSampleLoader {
- private Synthesizer synth;
- private VariableRateDataReader samplePlayer;
- private LineOut lineOut;
-
- private void test() throws IOException {
- // File sampleFile = new File("samples/cello_markers.wav");
- // File sampleFile = new File("samples/Piano_A440_PT.aif");
- File sampleFile = new File("samples/sine_400_loop_i16.wav");
- // File sampleFile = new File("samples/TwoDiffPitchedSines_F32_PT.wav");
- // File sampleFile = new File("samples/sine_400_u8.aif");
- // File sampleFile = new File("samples/sine_400_s8.aif");
- // File sampleFile = new File("samples/sine_400_ulaw.aif");
- // File sampleFile = new File("samples/sine_400_ulaw.wav");
-
- // File sampleFile = new File("samples/aaClarinet.wav");
- // File sampleFile = new File("samples/sine_400_mono.wav");
- // File sampleFile = new File("samples/sine_200_300_i16.wav");
- // File sampleFile = new File("samples/sine_200_300_i24.wav");
- // File sampleFile = new File("samples/M1F1-int16-AFsp.wav");
- // File sampleFile = new File("samples/M1F1-int24-AFsp.wav");
- // File sampleFile = new File("samples/M1F1-float32-AFsp.wav");
- // File sampleFile = new File("samples/M1F1-int16WE-AFsp.wav");
- // File sampleFile = new File("samples/M1F1-int24WE-AFsp.wav");
- // File sampleFile = new File("samples/M1F1-float32WE-AFsp.wav");
- // File sampleFile = new File("samples/sine_200_300_i16.aif");
- // File sampleFile = new File("samples/sine_200_300_f32.wavex");
- // File sampleFile = new File("samples/Sine32bit.aif");
- // File sampleFile = new File("samples/Sine32bit.wav");
- // File sampleFile = new File("samples/smartCue.wav");
-
- // URL sampleFile = new URL("http://www.softsynth.com/samples/Clarinet.wav");
-
- synth = JSyn.createSynthesizer();
-
- FloatSample sample;
- try {
- // Add an output mixer.
- synth.add(lineOut = new LineOut());
-
- // Load the sample and display its properties.
- SampleLoader.setJavaSoundPreferred(false);
- sample = SampleLoader.loadFloatSample(sampleFile);
- System.out.println("Sample has: channels = " + sample.getChannelsPerFrame());
- System.out.println(" frames = " + sample.getNumFrames());
- System.out.println(" rate = " + sample.getFrameRate());
- System.out.println(" loopStart = " + sample.getSustainBegin());
- System.out.println(" loopEnd = " + sample.getSustainEnd());
-
- if (sample.getChannelsPerFrame() == 1) {
- synth.add(samplePlayer = new VariableRateMonoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- } else if (sample.getChannelsPerFrame() == 2) {
- synth.add(samplePlayer = new VariableRateStereoReader());
- samplePlayer.output.connect(0, lineOut.input, 0);
- samplePlayer.output.connect(1, lineOut.input, 1);
- } else {
- throw new RuntimeException("Can only play mono or stereo samples.");
- }
-
- // Start synthesizer using default stereo output at 44100 Hz.
- synth.start();
-
- samplePlayer.rate.set(sample.getFrameRate());
-
- // We only need to start the LineOut. It will pull data from the
- // sample player.
- lineOut.start();
-
- // We can simply queue the entire file.
- // Or if it has a loop we can play the loop for a while.
- if (sample.getSustainBegin() < 0) {
- System.out.println("queue the sample");
- samplePlayer.dataQueue.queue(sample);
- } else {
- System.out.println("queueOn the sample");
- samplePlayer.dataQueue.queueOn(sample);
- synth.sleepFor(8.0);
- System.out.println("queueOff the sample");
- samplePlayer.dataQueue.queueOff(sample);
- }
-
- // Wait until the sample has finished playing.
- do {
- synth.sleepFor(1.0);
- } while (samplePlayer.dataQueue.hasMore());
-
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Stop everything.
- synth.stop();
- }
-
- public static void main(String[] args) {
- try {
- new DebugSampleLoader().test();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/tests/com/jsyn/util/TestFFT.java b/tests/com/jsyn/util/TestFFT.java
deleted file mode 100644
index c79157d..0000000
--- a/tests/com/jsyn/util/TestFFT.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.util;
-
-import junit.framework.TestCase;
-
-import com.softsynth.math.FourierMath;
-
-public class TestFFT extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void checkSingleSineDouble(int size, int bin) {
- double[] ar = new double[size];
- double[] ai = new double[size];
- double[] magnitudes = new double[size];
-
- double amplitude = 1.0;
- addSineWave(size, bin, ar, amplitude);
-
- FourierMath.transform(1, size, ar, ai);
- FourierMath.calculateMagnitudes(ar, ai, magnitudes);
-
- assertEquals("magnitude", 0.0, magnitudes[bin-1], 0.000001);
- assertEquals("magnitude", amplitude, magnitudes[bin], 0.000001);
- assertEquals("magnitude", 0.0, magnitudes[bin+1], 0.000001);
- /*
- for (int i = 0; i < magnitudes.length; i++) {
- System.out.printf("%d = %9.7f\n", i, magnitudes[i]);
- }
-*/
-
- }
-
- public void checkSingleSineFloat(int size, int bin) {
- float[] ar = new float[size];
- float[] ai = new float[size];
- float[] magnitudes = new float[size];
-
- double amplitude = 1.0;
- addSineWave(size, bin, ar, amplitude);
-
- FourierMath.transform(1, size, ar, ai);
- FourierMath.calculateMagnitudes(ar, ai, magnitudes);
-
- assertEquals("magnitude", 0.0f, magnitudes[bin-1], 0.000001);
- assertEquals("magnitude", amplitude, magnitudes[bin], 0.000001);
- assertEquals("magnitude", 0.0f, magnitudes[bin+1], 0.000001);
-/*
- for (int i = 0; i < magnitudes.length; i++) {
- System.out.printf("%d = %9.7f\n", i, magnitudes[i]);
- }
-*/
- }
-
- public void checkMultipleSine(int size, int[] bins, double[] amplitudes) {
- double[] ar = new double[size];
- double[] ai = new double[size];
- double[] magnitudes = new double[size];
-
- for(int i = 0; i<bins.length; i++) {
- addSineWave(size, bins[i], ar, amplitudes[i]);
- }
-
- FourierMath.transform(1, size, ar, ai);
- FourierMath.calculateMagnitudes(ar, ai, magnitudes);
-
- for(int bin = 0; bin<size; bin++) {
- System.out.printf("%d = %9.7f\n", bin, magnitudes[bin]);
-
- double amplitude = 0.0;
- for(int i = 0; i<bins.length; i++) {
- if ((bin == bins[i]) || (bin == (size - bins[i]))) {
- amplitude = amplitudes[i];
- break;
- }
- }
- assertEquals("magnitude", amplitude, magnitudes[bin], 0.000001);
- }
-
- }
-
- private void addSineWave(int size, int bin, double[] ar, double amplitude) {
- double phase = 0.0;
- double phaseIncrement = 2.0 * Math.PI * bin / size;
- for (int i = 0; i < size; i++) {
- ar[i] += Math.sin(phase) * amplitude;
- phase += phaseIncrement;
- }
- }
- private void addSineWave(int size, int bin, float[] ar, double amplitude) {
- double phase = 0.0;
- double phaseIncrement = 2.0 * Math.PI * bin / size;
- for (int i = 0; i < size; i++) {
- ar[i] += (float) (Math.sin(phase) * amplitude);
- phase += phaseIncrement;
- }
- }
-
- public void testSinglesDouble() {
- checkSingleSineDouble(32, 1);
- checkSingleSineDouble(32, 4);
- checkSingleSineDouble(64, 5);
- checkSingleSineDouble(256, 3);
- }
-
- public void testSinglesFloat() {
- checkSingleSineFloat(32, 1);
- checkSingleSineFloat(32, 4);
- checkSingleSineFloat(64, 5);
- checkSingleSineFloat(256, 3);
- }
-
- public void testMultipleSines32() {
- int[] bins = { 1, 5 };
- double[] amplitudes = { 1.0, 2.0 };
- checkMultipleSine(32, bins, amplitudes);
- }
-
- public void testMultipleSines64() {
- int[] bins = { 2, 4, 7 };
- double[] amplitudes = { 1.0, 0.3, 0.5 };
- checkMultipleSine(64, bins, amplitudes);
- }
-
- public void checkInverseFftDouble(int size, int bin) {
- double[] ar1 = new double[size];
- double[] ai1 = new double[size];
- double[] ar2 = new double[size];
- double[] ai2 = new double[size];
-
- double amplitude = 1.0;
- addSineWave(size, bin, ar1, amplitude);
-
- // Save a copy of the source.
- System.arraycopy(ar1, 0, ar2, 0, size);
- System.arraycopy(ai1, 0, ai2, 0, size);
-
- FourierMath.transform(1, size, ar1, ai1); // FFT
-
- FourierMath.transform(-1, size, ar1, ai1); // IFFT
-
- for (int i = 0; i < size; i++) {
- assertEquals(ar2[i], ar1[i], 0.00001);
- assertEquals(ai2[i], ai1[i], 0.00001);
- }
- }
-
- public void checkInverseFftFloat(int size, int bin) {
- float[] ar1 = new float[size];
- float[] ai1 = new float[size];
- float[] ar2 = new float[size];
- float[] ai2 = new float[size];
-
- double amplitude = 1.0;
- addSineWave(size, bin, ar1, amplitude);
-
- // Save a copy of the source.
- System.arraycopy(ar1, 0, ar2, 0, size);
- System.arraycopy(ai1, 0, ai2, 0, size);
-
- FourierMath.transform(1, size, ar1, ai1); // FFT
-
- FourierMath.transform(-1, size, ar1, ai1); // IFFT
-
- for (int i = 0; i < size; i++) {
- assertEquals(ar2[i], ar1[i], 0.00001);
- assertEquals(ai2[i], ai1[i], 0.00001);
- }
- }
-
- public void testInverseDouble() {
- checkInverseFftDouble(32, 1);
- checkInverseFftDouble(32, 2);
- checkInverseFftDouble(128, 17);
- checkInverseFftDouble(512, 23);
- }
-
- public void testInverseFloat() {
- checkInverseFftFloat(32, 1);
- checkInverseFftFloat(32, 2);
- checkInverseFftFloat(128, 17);
- checkInverseFftFloat(512, 23);
- }
-}
diff --git a/tests/com/jsyn/util/TestPseudoRandom.java b/tests/com/jsyn/util/TestPseudoRandom.java
deleted file mode 100644
index 20df465..0000000
--- a/tests/com/jsyn/util/TestPseudoRandom.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.util;
-
-import junit.framework.TestCase;
-
-public class TestPseudoRandom extends TestCase {
- PseudoRandom pseudoRandom;
- private int[] bins;
- private final static int BIN_SHIFTER = 8;
- private final static int BIN_COUNT = 1 << BIN_SHIFTER;
- private final static int BIN_MASK = BIN_COUNT - 1;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- pseudoRandom = new PseudoRandom();
- bins = new int[BIN_COUNT];
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testMath() {
- long seed = 3964771111L;
- int positiveInt = (int) (seed & 0x7FFFFFFF);
- assertTrue("masked random positive, " + positiveInt, (positiveInt >= 0));
- double rand = positiveInt * (1.0 / (1L << 31));
- assertTrue("not too low, " + rand, (rand >= 0.0));
- assertTrue("not too high, " + rand, (rand < 1.0));
- }
-
- public void testIntegerDistribution() {
- int scaler = 100;
- for (int i = 0; i < (bins.length * scaler); i++) {
- int rand = pseudoRandom.nextRandomInteger();
- int positiveInt = rand & 0x7FFFFFFF;
- assertTrue("masked random " + positiveInt, (positiveInt >= 0));
- int index = (rand >> (32 - BIN_SHIFTER)) & BIN_MASK;
- bins[index] += 1;
- }
- checkDistribution(scaler);
- }
-
- public void test01Distribution() {
- int scaler = 100;
- for (int i = 0; i < (bins.length * scaler); i++) {
- double rand = pseudoRandom.random();
- assertTrue("not too low, #" + i + " = " + rand, (rand >= 0.0));
- assertTrue("not too high, #" + i + " = " + rand, (rand < 1.0));
- int index = (int) (rand * BIN_COUNT);
- bins[index] += 1;
- }
- checkDistribution(scaler);
- }
-
- private void checkDistribution(int scaler) {
- // Generate running average that should stay near scaler
- double average = scaler;
- double coefficient = 0.9;
- for (int i = 0; i < (bins.length); i++) {
- average = (average * coefficient) + (bins[i] * (1.0 - coefficient));
- assertEquals("average at " + i, scaler, average, 0.2 * scaler);
- }
- }
-}
diff --git a/tests/com/jsyn/util/TestVoiceAllocator.java b/tests/com/jsyn/util/TestVoiceAllocator.java
deleted file mode 100644
index fd5ba0b..0000000
--- a/tests/com/jsyn/util/TestVoiceAllocator.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2009 Phil Burk, Mobileer Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.jsyn.util;
-
-import junit.framework.TestCase;
-
-import com.jsyn.instruments.SubtractiveSynthVoice;
-import com.jsyn.unitgen.UnitVoice;
-
-public class TestVoiceAllocator extends TestCase {
- VoiceAllocator allocator;
- int max = 4;
- private UnitVoice[] voices;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- voices = new UnitVoice[max];
- for (int i = 0; i < max; i++) {
- voices[i] = new SubtractiveSynthVoice();
- }
-
- allocator = new VoiceAllocator(voices);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testAllocation() {
- assertEquals("get max", max, allocator.getVoiceCount());
-
- int tag1 = 61;
- int tag2 = 62;
- int tag3 = 63;
- int tag4 = 64;
- int tag5 = 65;
- int tag6 = 66;
- UnitVoice voice1 = allocator.allocate(tag1);
- assertTrue("voice should be non-null", (voice1 != null));
-
- UnitVoice voice2 = allocator.allocate(tag2);
- assertTrue("voice should be non-null", (voice2 != null));
- assertTrue("new voice ", (voice2 != voice1));
-
- UnitVoice voice = allocator.allocate(tag1);
- assertTrue("should be voice1 again ", (voice == voice1));
-
- voice = allocator.allocate(tag2);
- assertTrue("should be voice2 again ", (voice == voice2));
-
- UnitVoice voice3 = allocator.allocate(tag3);
- @SuppressWarnings("unused")
- UnitVoice voice4 = allocator.allocate(tag4);
-
- UnitVoice voice5 = allocator.allocate(tag5);
- assertTrue("ran out so get voice1 as oldest", (voice5 == voice1));
-
- voice = allocator.allocate(tag2);
- assertTrue("should be voice2 again ", (voice == voice2));
-
- // Now voice 3 should be the oldest cuz voice 2 was touched.
- UnitVoice voice6 = allocator.allocate(tag6);
- assertTrue("ran out so get voice3 as oldest", (voice6 == voice3));
- }
-
- public void testOff() {
- int tag1 = 61;
- int tag2 = 62;
- int tag3 = 63;
- int tag4 = 64;
- int tag5 = 65;
- int tag6 = 66;
- UnitVoice voice1 = allocator.allocate(tag1);
- UnitVoice voice2 = allocator.allocate(tag2);
- UnitVoice voice3 = allocator.allocate(tag3);
- UnitVoice voice4 = allocator.allocate(tag4);
-
- assertTrue("voice 3 should start on", allocator.isOn(tag3));
- allocator.off(tag3);
- assertEquals("voice 3 should now be off", false, allocator.isOn(tag3));
-
- allocator.off(tag2);
-
- UnitVoice voice5 = allocator.allocate(tag5);
- assertTrue("should get voice3 cuz off first", (voice5 == voice3));
- UnitVoice voice6 = allocator.allocate(tag6);
- assertTrue("should get voice2 cuz off second", (voice6 == voice2));
- voice3 = allocator.allocate(tag3);
- assertTrue("should get voice1 cuz on first", (voice3 == voice1));
-
- voice1 = allocator.allocate(tag1);
- assertTrue("should get voice4 cuz next up", (voice1 == voice4));
- }
-}