Ejemplo n.º 1
0
  @Override
  public void finishExperiment(boolean saveData, File storageBaseDir) throws IOException {
    super.finishExperiment(saveData, storageBaseDir);

    if (!saveData) deleteTempFiles();
    else {
      File storageDir = getSensorDataStorage(storageBaseDir, this.getClass().getSimpleName());
      if (!moveTempFilesToExperimentDir(storageDir)) throw new IOException();
      experimentData.setAudioFileName(audioFileName);
      experimentData.saveExperimentData(storageDir);
    }
    audioFile = null;
  }
Ejemplo n.º 2
0
  /**
   * runs key and bpm detector on
   *
   * @filename, optionally writes tags
   * @param filename
   * @return
   */
  public boolean analyzeTrack(String filename, boolean writeTags) {
    String wavfilename = "";
    AudioData data = new AudioData();
    File temp = null;
    File temp2 = null;
    try {
      temp = File.createTempFile("keyfinder", ".wav");
      temp2 = File.createTempFile("keyfinder2", ".wav");
      wavfilename = temp.getAbsolutePath();
      // Delete temp file when program exits.
      temp.deleteOnExit();
      temp2.deleteOnExit();
      decodeAudioFile(new File(filename), temp, 44100);
      decodeAudioFile(temp, temp2);
    } catch (Exception ex) {
      Logger.getLogger(TrackAnalyzer.class.getName())
          .log(Level.WARNING, "error while decoding" + filename + ".");
      if (temp.length() == 0) {
        logDetectionResult(filename, "-", "-", false);
        temp.delete();
        temp2.delete();
        return false;
      }
    }

    KeyDetectionResult r;
    try {
      data.loadFromAudioFile(temp2.getAbsolutePath());
      r = k.findKey(data, p);
      if (r.globalKeyEstimate == Parameters.key_t.SILENCE) {
        System.out.println("SILENCE");
      }
    } catch (Exception ex) {
      Logger.getLogger(TrackAnalyzer.class.getName()).log(Level.SEVERE, null, ex);
      logDetectionResult(filename, "-", "-", false);
      deleteTempFiles(temp, temp2);
      return false;
    }

    String formattedBpm = "0";
    if (!c.noBpm) {
      // get bpm
      if (c.hiQuality) {
        try {
          // decodeAudioFile(new File(filename), temp, 44100);
          // @todo hiquality stuff
        } catch (Exception ex) {
          Logger.getLogger(TrackAnalyzer.class.getName())
              .log(
                  Level.WARNING,
                  "couldn't decode " + filename + " for hiquality bpm detection.",
                  ex);
        }
      }
      double bpm = BeatRoot.getBPM(wavfilename);
      if (Double.isNaN(bpm) && !c.hiQuality) {
        try {
          // bpm couldn't be detected. try again with a higher quality wav.
          Logger.getLogger(TrackAnalyzer.class.getName())
              .log(Level.WARNING, "bpm couldn't be detected for " + filename + ". Trying again.");
          decodeAudioFile(new File(filename), temp, 44100);
          bpm = BeatRoot.getBPM(wavfilename);
          if (Double.isNaN(bpm)) {
            Logger.getLogger(TrackAnalyzer.class.getName())
                .log(Level.WARNING, "bpm still couldn't be detected for " + filename + ".");
          } else {
            Logger.getLogger(TrackAnalyzer.class.getName())
                .log(Level.INFO, "bpm now detected correctly for " + filename);
          }
        } catch (Exception ex) {
          logDetectionResult(filename, "-", "-", false);
        }
      } else if (Double.isNaN(bpm) && c.hiQuality) {
        Logger.getLogger(TrackAnalyzer.class.getName())
            .log(Level.WARNING, "bpm couldn't be detected for " + filename + ".");
      }
      if (!Double.isNaN(bpm)) {
        formattedBpm = new DecimalFormat("#.#").format(bpm).replaceAll(",", ".");
      }
    }
    System.out.printf(
        "%s key: %s BPM: %s\n", filename, Parameters.camelotKey(r.globalKeyEstimate), formattedBpm);

    boolean wroteTags = false;
    if (c.writeTags) {
      wroteTags = updateTags(filename, formattedBpm, Parameters.camelotKey(r.globalKeyEstimate));
    }
    logDetectionResult(
        filename, Parameters.camelotKey(r.globalKeyEstimate), formattedBpm, wroteTags);
    deleteTempFiles(temp, temp2);
    return true;
  }