public void play() {
		try {
			Synthesizer synth = MidiSystem.getSynthesizer();
			synth.open();
			final MidiChannel[] mc = synth.getChannels();
			Instrument[] instr = synth.getDefaultSoundbank().getInstruments();
			synth.loadInstrument(instr[80]);
			long initial = System.currentTimeMillis();
			float tempoFactor = 60000/getTempo();
			for(Note n:getNotes()) {
				long elapsed = System.currentTimeMillis() - initial;
				if(Math.round(n.getArrivalTime()*tempoFactor) > elapsed) {
					try {
						Thread.sleep(Math.round(n.getArrivalTime()*tempoFactor) - elapsed);
					} catch (InterruptedException e) {}
				}
				for(int pitch : n.getPitch()) {
					mc[0].noteOn(pitch,75);
				}
				try {
					Thread.sleep(Math.round(n.getDuration()*tempoFactor));
				} catch (InterruptedException e) {}
				for(int pitch : n.getPitch()) {
					mc[0].noteOff(pitch);
				}
			}
		} catch (MidiUnavailableException e) {}
	}