/*
ManualTestSoundTMS9919B.java
(c) 2011-2014 Edward Swartz
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
*/
package v9t9.audio.sound.test;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import v9t9.audio.sound.ClockedSoundVoice;
import v9t9.audio.sound.EnhancedNoiseGeneratorVoice;
import v9t9.audio.sound.EnhancedToneGeneratorVoice;
import v9t9.audio.sound.EnhancedVoice;
import v9t9.audio.sound.NoiseGeneratorVoice;
import v9t9.audio.sound.SoundVoice;
import v9t9.common.sound.TMS9919BConsts;
import v9t9.common.sound.TMS9919Consts;
/**
* @author ejs
*
*/
public class ManualTestSoundTMS9919B extends BaseSoundTest {
@Test
public void testTonesSimple() {
EnhancedToneGeneratorVoice toneVoice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(toneVoice);
toneVoice.setFrequency(110);
generate(toSamples(TimeUnit.SECONDS, 1), toneVoice);
toneVoice.setFrequency(440);
generate(toSamples(TimeUnit.SECONDS, 1), toneVoice);
toneVoice.setFrequency(880);
generate(toSamples(TimeUnit.SECONDS, 1), toneVoice);
}
@Test
public void testTonesVolumes() {
EnhancedToneGeneratorVoice toneVoice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(toneVoice);
toneVoice.setFrequency(110);
for (int vol = 0; vol < 256; vol+=4) {
toneVoice.setVolume(vol);
generate(toSamples(TimeUnit.MILLISECONDS, 50), toneVoice);
}
}
@Test
public void testEnvelope() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
voice.getEffectsController().setADSR(TMS9919BConsts.OP_ATTACK, 2);
voice.getEffectsController().setADSR(TMS9919BConsts.OP_DECAY, 4);
voice.getEffectsController().setADSR(TMS9919BConsts.OP_HOLD, 10);
voice.getEffectsController().setADSR(TMS9919BConsts.OP_RELEASE, 10);
voice.getEffectsController().setSustain(64);
for (int hz = 110; hz < 880; hz *= 2) {
voice.setFrequency(hz);
voice.setVolume(128);
generate(toSamples(TimeUnit.SECONDS, 2), voice);
}
}
@Test
public void testVibrato() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
EnhancedToneGeneratorVoice voice2 = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice2);
vibrato(1, 8, voice, voice2);
vibrato(15, 8, voice, voice2);
vibrato(1, 1, voice, voice2);
vibrato(15, 15, voice, voice2);
vibrato(8, 8, voice, voice2);
}
@Test
public void testVibratoPeriodicNoise() {
EnhancedNoiseGeneratorVoice voice = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice);
EnhancedNoiseGeneratorVoice voice2 = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice2);
vibrato(15, 8, voice, voice2);
vibrato(15, 15, voice, voice2);
vibrato(8, 8, voice, voice2);
}
@Test
public void testVibratoWhiteNoise() {
EnhancedNoiseGeneratorVoice voice = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice);
voice.setNoiseControl(TMS9919Consts.NOISE_FEEDBACK_WHITE);
EnhancedNoiseGeneratorVoice voice2 = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice2);
voice2.setNoiseControl(TMS9919Consts.NOISE_FEEDBACK_WHITE);
vibrato(1, 8, voice, voice2);
vibrato(15, 15, voice, voice2);
vibrato(8, 8, voice, voice2);
}
/**
* @param i
* @param j
*/
private void vibrato(int amount, int rate, EnhancedVoice... voices) {
System.out.println("rate="+rate+"; amount="+amount);
for (EnhancedVoice voice : voices)
voice.getEffectsController().setVibrato(amount, rate);
for (int hz = 110; hz < 880; hz *= 2) {
for (int i = 0; i < voices.length; i++) {
ClockedSoundVoice voice = ((ClockedSoundVoice) voices[i]);
if (voice instanceof NoiseGeneratorVoice)
voice.setFrequency(8 * (hz << i));
else
voice.setFrequency(hz << i);
voice.setVolume(128);
}
generate(toSamples(TimeUnit.SECONDS, 1), voices);
}
}
@Test
public void testTremolo() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
voice.setBalance((byte) -100);
EnhancedToneGeneratorVoice voice2 = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice2);
voice2.setBalance((byte) 100);
tremolo(1, 8, voice, voice2);
tremolo(15, 8, voice, voice2);
tremolo(1, 3, voice, voice2);
tremolo(8, 3, voice, voice2);
tremolo(15, 15, voice, voice2);
}
@Test
public void testTremoloPeriodicNoise() {
EnhancedNoiseGeneratorVoice voice = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice);
voice.setBalance((byte) -100);
EnhancedNoiseGeneratorVoice voice2 = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice2);
voice2.setBalance((byte) 100);
tremolo(1, 8, voice, voice2);
tremolo(15, 8, voice, voice2);
tremolo(1, 3, voice, voice2);
}
@Test
public void testTremoloWhiteNoise() {
EnhancedNoiseGeneratorVoice voice = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice);
voice.setNoiseControl(TMS9919Consts.NOISE_FEEDBACK_WHITE);
voice.setBalance((byte) -100);
EnhancedNoiseGeneratorVoice voice2 = new EnhancedNoiseGeneratorVoice("simple");
setupVoice(voice2);
voice2.setNoiseControl(TMS9919Consts.NOISE_FEEDBACK_WHITE);
voice2.setBalance((byte) 100);
tremolo(1, 3, voice, voice2);
tremolo(8, 3, voice, voice2);
tremolo(15, 15, voice, voice2);
}
/**
* @param voice
*/
protected void tremolo(int amount, int rate, EnhancedVoice... voices) {
System.out.println("amount="+amount+"; rate="+rate);
for (EnhancedVoice voice : voices)
voice.getEffectsController().setTremolo(amount, rate);
for (int hz = 110; hz < 880; hz *= 2) {
for (int i = 0; i < voices.length; i++) {
if (voices[i] instanceof NoiseGeneratorVoice)
((ClockedSoundVoice) voices[i]).setFrequency(16 * (hz << i));
else
((ClockedSoundVoice) voices[i]).setFrequency(hz << i);
((SoundVoice) voices[i]).setVolume(128);
}
generate(toSamples(TimeUnit.SECONDS, 1), voices);
}
}
@Test
public void testWaveform() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
voice.setFrequency(440);
voice.setVolume(128);
for (int wave = 0; wave < 8; wave++) {
voice.getEffectsController().setWaveform(wave);
generate(toSamples(TimeUnit.SECONDS, 2), voice);
}
EnhancedToneGeneratorVoice voice2 = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice2);
voice2.setFrequency(1402);
voice2.setVolume(128);
for (int wave = 0; wave < 8; wave++) {
voice.getEffectsController().setWaveform(wave);
voice2.getEffectsController().setWaveform(7 - wave);
generate(toSamples(TimeUnit.SECONDS, 2), voice, voice2);
}
}
@Test
public void testSweep() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
EnhancedToneGeneratorVoice voice2 = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice2);
voice.setFrequency(440);
voice2.setFrequency(262);
int period = voice.getPeriod();
int period2 = voice2.getPeriod();
voice.setVolume(128);
voice2.setVolume(128);
// up
voice.getEffectsController().setSweepTarget(period / 2);
voice.getEffectsController().setSweepTime(3000);
voice2.getEffectsController().setSweepTarget(period2 / 2);
voice2.getEffectsController().setSweepTime(3000);
generate(toSamples(TimeUnit.SECONDS, 3), voice, voice2);
// back
voice.getEffectsController().setSweepTarget(period);
voice.getEffectsController().setSweepTime(1000);
voice2.getEffectsController().setSweepTarget(period2);
voice2.getEffectsController().setSweepTime(1000);
generate(toSamples(TimeUnit.SECONDS, 1), voice, voice2);
// down
voice.getEffectsController().setSweepTarget(period * 2);
voice.getEffectsController().setSweepTime(2000);
voice2.getEffectsController().setSweepTarget(period2 * 2);
voice2.getEffectsController().setSweepTime(2000);
generate(toSamples(TimeUnit.SECONDS, 2), voice, voice2);
}
@Test
public void testBalance() {
EnhancedToneGeneratorVoice voice = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice);
EnhancedToneGeneratorVoice voice2 = new EnhancedToneGeneratorVoice("simple", 0);
setupVoice(voice2);
voice.setFrequency(440);
voice.setVolume(128);
voice2.setFrequency(110);
voice2.setVolume(128);
for (int pan = -128; pan < 128; pan++) {
voice.setBalance((byte) pan);
voice2.setBalance((byte) (255 - pan));
generate(toSamples(TimeUnit.MILLISECONDS, 25), voice, voice2);
}
}
}