@Override public void render(double timestamp) { Objects.requireNonNull(this.model); try { int beatNum = (int) Math.round((timestamp / 60.0) * model.getTempo()); for (Link link : model.getLinks(beatNum)) { if (link.getPlayIteration() == model.getIteration()) { model.setCurrentTime(link.getLinkedBeat() * 60.0 / model.getTempo()); model.setIteration(model.getIteration() + 1); return; } } if (beatNum != this.lastBeat) { this.playNotes(beatNum); this.lastBeat = beatNum; } } catch (InvalidMidiDataException e) { } }