package synth;

import java.util.HashMap;
import java.util.Map;

import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;

public class SynthJingle
{
	final int speed = 200;
	final static int PAUSE = -100;
	final Synthesizer synth;
	final MidiChannel chan;
	
	static final Map<Character,Integer> NOTES = new HashMap<Character, Integer>();
	static {
		regNote('C', 60); regNote('D', 62); regNote('E', 64);
		regNote('F', 65); regNote('G', 67); regNote('0', PAUSE);
	}
	
	//final String SONG = "C2E2G202C2E2G202E1E1D1E1F2D2E1E1D1E1F2D2E2D2C202";
	final String SONG = "E1E1E2E1E1E2E1G1C1D1E4" + "F1F1F1F1F1E1E2E1D1D1E1D2G2"
			+ "E1E1E2E1E1E2E1G1C1D1E4" + "F1F1F1F1F1E1E2G1G1F1D1C4";
	
	SynthJingle() throws Exception {
		synth = MidiSystem.getSynthesizer();
		synth.open();
		chan = synth.getChannels()[0];
	}
	
	public static void main(String[] args) throws Exception {
		SynthJingle inst = new SynthJingle();
		inst.play();
		inst.chan.allNotesOff();
		inst.synth.close();
	}
	
	static void regNote(char ch, int note) {
		NOTES.put(Character.valueOf(ch), Integer.valueOf(note));
	}
	
	void play() throws Exception {
		for (int i = 0; i < SONG.length()-1; i+=2) {
			playNote(NOTES.get(Character.valueOf(SONG.charAt(i))).intValue(),
					SONG.charAt(i+1) - 48);
		}
	}
	
	void playNote(int note, int dur) throws Exception {
		if (note > PAUSE) chan.noteOn(note, 64);
		Thread.sleep(dur * (long)speed);
		if (note > PAUSE) chan.noteOff(note);
	}
}
