@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) {

    }
  }