private final void parseIfNeeded() throws FileNotFoundException {
		if (this.lastParsedMidi != this.midi) {
			if (this.midi != null) {
				if (!this.midi.exists()) {
					throw new FileNotFoundException();
				}
				try {
					createMidiMap();
					decodeMidiMap();
				} catch (final IOException e) {
					this.lastParsedMidi = null;
					synchronized (this) {
						notifyAll();
					}
					e.printStackTrace();
					this.io.handleException(ExceptionHandle.CONTINUE, e);
					return;
				} catch (final DecodingException e) {
					this.lastParsedMidi = null;
					this.io.printError(e.toString(), false);
					return;
				} catch (final ParsingException e) {
					this.lastParsedMidi = null;
					this.io.printError(e.toString(), false);
					return;
				}
			}
		} else if (this.lastParsedMidi == null) {
			throw new IllegalStateException("Nothing parsed");
		}
		if (Thread.currentThread().isInterrupted()) {
			return;
		}
		this.lastParsedMidi = this.midi;
	}