package com.teotigraphix.caustk.pattern; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.io.File; import java.io.IOException; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.teotigraphix.caustk.application.CaustkApplicationUtils; import com.teotigraphix.caustk.application.ICaustkApplication; import com.teotigraphix.caustk.controller.ICaustkController; import com.teotigraphix.caustk.core.CausticException; import com.teotigraphix.caustk.library.ILibraryManager; import com.teotigraphix.caustk.library.Library; import com.teotigraphix.caustk.pattern.Phrase.Scale; import com.teotigraphix.caustk.pattern.Phrase.Trigger; import com.teotigraphix.caustk.sequencer.ISystemSequencer.SequencerMode; import com.teotigraphix.caustk.tone.components.PatternSequencerComponent.Resolution; @Ignore public class TestPhrase { private Pattern pattern; private Part part1; private ICaustkApplication application; private ICaustkController controller; private ILibraryManager libraryManager; @Before public void setUp() throws Exception { // plain ole caustk app and config application = CaustkApplicationUtils.createAndRun(); controller = application.getController(); libraryManager = controller.getLibraryManager(); Library library = libraryManager.createLibrary("bazx"); assertTrue(library.getDirectory().exists()); File causticFile = new File( "src/test/java/com/teotigraphix/caustk/pattern/BL303A001.caustic"); controller.getLibraryManager().importPatterns(library, causticFile); controller.getLibraryManager().saveLibrary(library); controller.getLibraryManager().setSelectedLibrary(library); //controller.getMemoryManager().getSelectedMemoryBank().load(library); controller.getSoundSource().createScene(library.getScenes().get(1)); assertNull(controller.getPatternManager().getPattern()); pattern = controller.getPatternManager().playPattern(0); pattern.setLength(1); part1 = pattern.getPart(0); assertNotNull(part1); controller.getSystemSequencer().play(SequencerMode.PATTERN); } @After public void tearDown() throws Exception { application = null; controller = null; } @Test public void test_createLibrary() throws CausticException, IOException { } @Test public void test_triggerMap_setup() throws IOException { assertSame(part1, part1.getPhrase().getPart()); assertEquals(Scale.SIXTEENTH, part1.getPhrase().getScale()); assertEquals(Resolution.SIXTEENTH, part1.getPhrase().getResolution()); assertEquals(1, part1.getPhrase().getPosition()); assertEquals(1, part1.getPhrase().getLength()); assertEquals(16, part1.getPhrase().getStepCount()); } @Test public void test_length() { // add a selection at step 4 and 12, maintain through all Phrase phrase = part1.getPhrase(); phrase.triggerOn(3, 60, 0.5f, 1f, 0); phrase.triggerOn(11, 60, 0.5f, 1f, 0); assertTrue(phrase.isSelected(3)); assertFalse(phrase.isSelected(4)); assertTrue(phrase.isSelected(11)); assertEquals(1, phrase.getLength()); // change to [2] phrase.setLength(2); assertEquals(2, phrase.getLength()); assertEquals(32, phrase.getStepCount()); // change to [1] phrase.setLength(1); assertEquals(1, phrase.getLength()); assertEquals(16, phrase.getStepCount()); // change to [4] phrase.setLength(4); assertEquals(4, phrase.getLength()); assertEquals(64, phrase.getStepCount()); // test that setting a trigger and then removing it, really removes it phrase.triggerOn(32, 60, 1f, 1f, 0); assertTrue(phrase.isSelected(32)); // change to [2] phrase.setLength(2); assertEquals(2, phrase.getLength()); assertEquals(32, phrase.getStepCount()); // change to [8] phrase.setLength(8); assertEquals(8, phrase.getLength()); assertEquals(128, phrase.getStepCount()); // reassert that this trigger actually was removed when the length was truncated // assertFalse(phrase.isSelected(32)); assertTrue(phrase.isSelected(3)); assertFalse(phrase.isSelected(4)); assertTrue(phrase.isSelected(11)); } @Test public void test_position_viewtriggers() { Phrase phrase = part1.getPhrase(); // cannot set a position greater then the length phrase.setPosition(3); assertEquals(1, phrase.getPosition()); phrase.setPosition(-3); assertEquals(1, phrase.getPosition()); phrase.setLength(2); assertEquals(1, phrase.getPosition()); assertEquals(2, phrase.getLength()); assertEquals(32, phrase.getSteps().size()); // set a trigger that will appear in the position 2 view phrase.triggerOn(20, 42, 0f, 0f, 0); // position 1 view List<Trigger> steps = phrase.getViewSteps(); assertEquals(16, steps.size()); assertEquals(0, steps.get(0).getStep()); assertEquals(15, steps.get(15).getStep()); // position 2 view phrase.setPosition(2); steps = phrase.getViewSteps(); assertEquals(16, steps.size()); assertEquals(16, steps.get(0).getStep()); assertEquals(31, steps.get(15).getStep()); // test that we have the trigger 20 at 4 assertEquals(20, steps.get(4).getStep()); } @Test public void test_scale() { // TODO Impl unit test Phrase.setScale() } @Test public void test_Resolution() { // SIXTEENTH assertEquals(0f, Resolution.toBeat(0, Resolution.SIXTEENTH), 0f); assertEquals(1.0f, Resolution.toBeat(4, Resolution.SIXTEENTH), 0f); assertEquals(2.0f, Resolution.toBeat(8, Resolution.SIXTEENTH), 0f); assertEquals(3.0f, Resolution.toBeat(12, Resolution.SIXTEENTH), 0f); assertEquals(3.75f, Resolution.toBeat(15, Resolution.SIXTEENTH), 0f); assertEquals(0, Resolution.toStep(0f, Resolution.SIXTEENTH)); assertEquals(4, Resolution.toStep(1.0f, Resolution.SIXTEENTH)); assertEquals(8, Resolution.toStep(2.0f, Resolution.SIXTEENTH)); assertEquals(12, Resolution.toStep(3.0f, Resolution.SIXTEENTH)); // THIRTYSECOND assertEquals(0f, Resolution.toBeat(0, Resolution.THIRTYSECOND), 0f); assertEquals(0.5f, Resolution.toBeat(4, Resolution.THIRTYSECOND), 0f); assertEquals(1.0f, Resolution.toBeat(8, Resolution.THIRTYSECOND), 0f); assertEquals(1.5f, Resolution.toBeat(12, Resolution.THIRTYSECOND), 0f); assertEquals(0, Resolution.toStep(0f, Resolution.THIRTYSECOND)); assertEquals(4, Resolution.toStep(0.5f, Resolution.THIRTYSECOND)); assertEquals(8, Resolution.toStep(1.0f, Resolution.THIRTYSECOND)); assertEquals(12, Resolution.toStep(1.5f, Resolution.THIRTYSECOND)); assertEquals(3.875f, Resolution.toBeat(31, Resolution.THIRTYSECOND), 0f); assertEquals(4.0f, Resolution.toBeat(32, Resolution.THIRTYSECOND), 0f); // SIXTYFOURTH assertEquals(0f, Resolution.toBeat(0, Resolution.SIXTYFOURTH), 0f); assertEquals(0.25f, Resolution.toBeat(4, Resolution.SIXTYFOURTH), 0f); assertEquals(0.5f, Resolution.toBeat(8, Resolution.SIXTYFOURTH), 0f); assertEquals(0.75f, Resolution.toBeat(12, Resolution.SIXTYFOURTH), 0f); assertEquals(0, Resolution.toStep(0f, Resolution.SIXTYFOURTH)); assertEquals(4, Resolution.toStep(0.25f, Resolution.SIXTYFOURTH)); assertEquals(8, Resolution.toStep(0.5f, Resolution.SIXTYFOURTH)); assertEquals(12, Resolution.toStep(0.75f, Resolution.SIXTYFOURTH)); } @Test public void test_incDec_positon() { Phrase phrase = part1.getPhrase(); assertEquals(1, phrase.getPosition()); phrase.incrementPosition(); assertEquals(1, phrase.getPosition()); phrase.setLength(8); phrase.incrementPosition(); assertEquals(2, phrase.getPosition()); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); assertEquals(6, phrase.getPosition()); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); // would be 9 assertEquals(8, phrase.getPosition()); phrase.decrementPosition(); phrase.decrementPosition(); phrase.decrementPosition(); phrase.decrementPosition(); phrase.decrementPosition(); phrase.decrementPosition(); phrase.decrementPosition(); assertEquals(1, phrase.getPosition()); phrase.decrementPosition(); // would be 0 assertEquals(1, phrase.getPosition()); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); phrase.incrementPosition(); // 6 assertEquals(6, phrase.getPosition()); phrase.setLength(2); // lower length adjusts position assertEquals(2, phrase.getPosition()); phrase.incrementPosition(); assertEquals(2, phrase.getPosition()); } @Test public void test_isSelected() { Phrase phrase = part1.getPhrase(); assertEquals(16, phrase.getSteps().size()); for (Trigger trigger : phrase.getSteps()) { assertFalse(phrase.isSelected(trigger.getStep())); } phrase.triggerOn(4, 60, 0f, 0f, 0); phrase.isSelected(4); } @Test public void test_transpose() { // XXX For this simple algorithm to work, each keyboard key // MEUST be assigned the correct MIDI note integer 'keyPressed' Phrase phrase = part1.getPhrase(); int keyPressed = 72; int lastKeyPressed = 60; // root int semitones = keyPressed - lastKeyPressed; phrase.transpose(semitones); for (Trigger trigger : phrase.getSteps()) { assertEquals(72, trigger.getPitch()); } //------------- lastKeyPressed = keyPressed; keyPressed = 58; semitones = keyPressed - lastKeyPressed; assertEquals(-14, semitones); phrase.transpose(semitones); for (Trigger trigger : phrase.getSteps()) { assertEquals(58, trigger.getPitch()); } // back up to root C lastKeyPressed = keyPressed; keyPressed = 60; semitones = keyPressed - lastKeyPressed; assertEquals(2, semitones); phrase.transpose(semitones); for (Trigger trigger : phrase.getSteps()) { assertEquals(60, trigger.getPitch()); } } @Test public void test_triggerOnOff() { Phrase phrase = part1.getPhrase(); phrase.triggerOn(4, 65, 0.5f, 1f, 2); Trigger trigger = phrase.getStep(4); assertEquals(4, trigger.getStep()); assertEquals(65, trigger.getPitch()); assertEquals(0.5f, trigger.getGate(), 0f); assertEquals(1f, trigger.getVelocity(), 0f); assertEquals(2, trigger.getFlags()); assertTrue(phrase.isSelected(4)); assertTrue(trigger.isSelected()); // turn it off, should affect non of the trigger's properties phrase.triggerOff(4); assertEquals(4, trigger.getStep()); assertEquals(65, trigger.getPitch()); assertEquals(0.5f, trigger.getGate(), 0f); assertEquals(1f, trigger.getVelocity(), 0f); assertEquals(2, trigger.getFlags()); assertFalse(phrase.isSelected(4)); assertFalse(trigger.isSelected()); } @Test public void test_triggerGate() { Phrase phrase = part1.getPhrase(); Trigger step = phrase.getStep(0); assertEquals(0.25f, step.getGate(), 0f); assertEquals(0.3125f, PhraseUtils.incrementGate(phrase, step), 0f); assertEquals(0.3125f, step.getGate(), 0f); assertEquals("1.25", PhraseUtils.toStepDecimalString(step.getGate())); assertEquals(0.375f, PhraseUtils.incrementGate(phrase, step), 0f); assertEquals(0.4375f, PhraseUtils.incrementGate(phrase, step), 0f); assertEquals(0.5f, PhraseUtils.incrementGate(phrase, step), 0f); assertEquals("2.0", PhraseUtils.toStepDecimalString(step.getGate())); assertEquals(0.4375f, PhraseUtils.decrementGate(phrase, step), 0f); assertEquals(0.375f, PhraseUtils.decrementGate(phrase, step), 0f); assertEquals(0.3125f, PhraseUtils.decrementGate(phrase, step), 0f); assertEquals(0.25f, PhraseUtils.decrementGate(phrase, step), 0f); assertEquals("1.0", PhraseUtils.toStepDecimalString(step.getGate())); // XXX unit test the end maximum of a step gate step = phrase.getStep(15); //assertEquals(0.375f, PhraseUtils.incrementGate(phrase, step), 0f); } @Test public void test_triggerUpdate() { Phrase phrase = part1.getPhrase(); phrase.triggerOn(4, 65, 0.5f, 1f, 2); Trigger trigger = phrase.getStep(4); assertEquals(4, trigger.getStep()); assertEquals(65, trigger.getPitch()); assertEquals(0.5f, trigger.getGate(), 0f); assertEquals(1f, trigger.getVelocity(), 0f); assertEquals(2, trigger.getFlags()); assertTrue(phrase.isSelected(4)); assertTrue(trigger.isSelected()); phrase.triggerUpdate(4, 45, 0.5f, 1f, 2); trigger = phrase.getStep(4); assertEquals(4, trigger.getStep()); assertEquals(45, trigger.getPitch()); assertEquals(0.5f, trigger.getGate(), 0f); assertEquals(1f, trigger.getVelocity(), 0f); assertEquals(2, trigger.getFlags()); assertTrue(phrase.isSelected(4)); assertTrue(trigger.isSelected()); phrase.triggerUpdateGate(4, 4f); trigger = phrase.getStep(4); assertEquals(4, trigger.getStep()); assertEquals(45, trigger.getPitch()); assertEquals(4f, trigger.getGate(), 0f); assertEquals(1f, trigger.getVelocity(), 0f); assertEquals(2, trigger.getFlags()); assertTrue(phrase.isSelected(4)); assertTrue(trigger.isSelected()); } }