package jmsltestsuite;
import java.util.Vector;

import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.MusicShape;
import com.softsynth.jmsl.score.*;
import com.softsynth.jmsl.score.transcribe.*;
import com.softsynth.jmsl.util.TimeSignature;

/** 
JMSL's com.softsynth.jmsl.score.transcribe package enables the transcription of arbitrary MusicShape data into common music notation.

 * This test plays with beat division setup
 * 
@author Nick Didkovsky, (c) 2002 Nick Didkovsky, All Rights reserved. */

public class TranscribeScore6 {

	static boolean USE_DEFAULT_BEAT_DIVISION_SCHEME = false;

	public static void setupCustomBeatDivisionSchemeList() {
		// 16ths
		BeatDivisionScheme b = new BeatDivisionScheme();
		b.setTimeSpan(1.0);
		b.setMinTimeSpan(0.25);
		b.setMinRequired(0);
		b.setNumberOfDivisions(4);
		b.setConformToBeat(true);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th note triplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(3);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr note triplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(3);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// half note triplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(3);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th quintuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(5);
		b.setNumberOfDivisions(5);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th quintuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(5);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr quintuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(5);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th sextuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(4);
		b.setNumberOfDivisions(6);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th sextuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(6);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th septuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(7);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th septuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(7);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr septuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(7);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th nontuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(9);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th nontuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(9);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr nontuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(9);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th 11-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(11);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th 11-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(11);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr 11-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(11);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 16th 13-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(1);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(13);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// 8th 13-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(2);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(13);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

		// qtr 13-tuplet
		b = new BeatDivisionScheme();
		b.setTimeSpan(4);
		b.setMinTimeSpan(b.getTimeSpan());
		b.setMinRequired(2);
		b.setNumberOfDivisions(13);
		BeatDivisionSchemeList.addBeatDivisionScheme(b);

	}

	public static void main(String args[]) {
		JMSL.clock.setAdvance(0.1);
		MusicShape s = new MusicShape(4);

		//    s.add(0.2651801,   35,    0.5, 0.065507166);
		s.add(0.2651801, 79.5, 0.5, 0.065507166);
		//  s.add(0.2651801,   86.5,  0.5, 0.065507166);
		//  s.add(0.3306872,   79.5,  0.5, 0.250009289);
		//  s.add(0.3306872,   35,    0.5, 0.250009289);
		s.add(0.3306872, 86.5, 0.5, 0.250009289);

		Score score = new Score(1);
		score.addMeasure();

		if (USE_DEFAULT_BEAT_DIVISION_SCHEME) {
			BeatDivisionSchemeList.defaultSetup();
		}
		else {
			TranscribeScore6.setupCustomBeatDivisionSchemeList();
		}

		Transcriber.setFillBeatWithNote(false);
		Transcriber transcriber = new Transcriber();
		transcriber.setExtendLastHoldTime(false);
		transcriber.setScore(score);
		transcriber.setSourceMusicShape(s);

		Vector tsVector = new Vector();
		tsVector.addElement(new TempoTimeSignatureHolder(new Tempo(60), new TimeSignature(4, 4)));

		transcriber.setTempoTimeSignatures(tsVector);

		try {
			score.setCurrentStaffNumber(0);
			transcriber.transcribe();
		}
		catch (ElementMissedException e) {
			e.printStackTrace();
			System.out.println("ERROR: " + e);
			System.exit(0);
		}
		catch (SearchPathListExpansionException e) {
			e.printStackTrace();
			System.out.println("ERROR: " + e);
			System.exit(0);
		}

		final ScoreFrame f = new ScoreFrame();
		f.addScore(score);
	//	f.loadPrefs();
		f.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				f.quit();
			}
		});
	//	f.pack();
		f.setVisible(true);

	}

}