/** * 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; }