package com.mpcmaid.audio;

import java.io.IOException;

import javax.sound.midi.Sequence;
import javax.sound.midi.Track;

import junit.framework.TestCase;

public class SlicerTest extends TestCase {
	private static final int AVERAGE_ENERGY_WINDOW = 43;

	private static final int OVERLAP_RATIO = 1;

	private static final int WINDOW_SIZE = 1024;

	private static final int MIDI_PPQ = 96;

	protected void setUp() throws Exception {
		final Sample sample = Sample.open(getClass().getResourceAsStream("myLoop.WAV"));
		slicer = new Slicer(sample, WINDOW_SIZE, OVERLAP_RATIO, AVERAGE_ENERGY_WINDOW);
		slicer.extractMarkers();
		markers = slicer.getMarkers();
		System.out.println(slicer);
	}

	private Slicer slicer;

	private Markers markers;

	public void testMarkers() {
		assertEquals("Slicer: 3.8424037s (169450 samples), 9 markers", slicer.toString());
		System.out.println(markers);

		assertEquals(9, markers.size());

		assertFalse(markers.isUnset());

		Marker marker = markers.getSelectedMarker();
		assertEquals(0, marker.getLocation());
		System.out.println(marker);

		markers.selectMarker(4);
		assertEquals(4, markers.getSelectedMarkerIndex());
		assertEquals(79872, markers.getSelectedMarkerLocation());
		assertEquals(79872, markers.getSelectedMarker().getLocation());

		assertEquals(0, markers.getRangeFrom(0).getFrom());

		final LocationRange range3 = markers.getRangeFrom(3);
		System.out.println(range3);
		final LocationRange range4 = markers.getRangeFrom(4);
		System.out.println(range4);

		assertEquals(3.8424037, markers.getDuration(), 0.000001);
		assertEquals(124.92, markers.getTempo(), 0.01);

		// remove
		markers.deleteSelectedMarker();
		assertEquals(8, markers.size());
		assertEquals(3, markers.getSelectedMarkerIndex());

		final LocationRange range3bis = markers.getRangeFrom(3);
		assertEquals(range3.getFrom(), range3bis.getFrom());
		assertEquals(range4.getTo(), range3bis.getTo());

		// last range extends up to the Frame Length
		final LocationRange range7 = markers.getRangeFrom(7);
		assertEquals(169450, range7.getTo());
		System.out.println(range7);

		final int[] midiTicks = { 0, 32, 97, 129, 190, 222, 288, 320, 381, 413, 478, 510, 575, 607, 673, 705, 705 };
		try {
			final Sequence midiSequence = markers.exportMidiSequence(null, MIDI_PPQ);
			final Track track = midiSequence.getTracks()[0];
			assertEquals(17, track.size());
			for (int i = 0; i < track.size(); i++) {
				// System.out.println(track.get(i).getTick());
				assertEquals(midiTicks[i], track.get(i).getTick());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		assertEquals(3, markers.getSelectedMarkerIndex());
		markers.insertMarker();
		assertEquals(4, markers.getSelectedMarkerIndex());
		assertEquals(73727, markers.getLocation(4));
	}

}