public final Map<Integer, String> titles() {
		synchronized (this) {
			while ((this.lock > 0) || (this.lockRead > 0)) {
				try {
					wait();
				} catch (final InterruptedException e) {
					Thread.currentThread().interrupt();
					return null;
				}
			}
			++this.lockRead;
		}
		try {
			parseIfNeeded();
			return new HashMap<>(this.titles);
		} catch (final FileNotFoundException e) {
			this.io.printError("Selected midi does not exist", true);
			return null;
		} finally {
			synchronized (this) {
				--this.lockRead;
				notifyAll();
			}
		}

	}