view src/file_comparer.hpp @ 0:add35537fdbb tip

Initial import
author irh <ian.r.hobson@gmail.com>
date Thu, 25 Aug 2011 11:05:55 +0100
parents
children
line wrap: on
line source
//  Copyright 2011, Ian Hobson.
//
//  This file is part of gpsynth.
//
//  gpsynth is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  gpsynth is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with gpsynth in the file COPYING. 
//  If not, see http://www.gnu.org/licenses/.

// FileComparer - Compares sounds against a target set of audio features that
// have been retrieved from FeatureExtractor

#pragma once

#include "feature_extractor.hpp"

#include "boost/shared_ptr.hpp"

#include <map>
#include <string>
#include <vector>

namespace dsp {

struct FeatureComparerInterface {
  virtual ~FeatureComparerInterface() {}

  virtual void AnalyzeTarget() = 0;
  virtual Value Compare() = 0;
  virtual FeatureComparerInterface* Clone() const = 0;
  virtual void SetExtractor(FeatureExtractor* extractor) = 0;
  virtual int ID() const = 0;
};
  
typedef boost::shared_ptr<FeatureComparerInterface> FeatureComparerPtr; 


class FileComparer {
public:
  
  struct Feature {
    enum ID {
      Pitch,
      Energy,
      MFCCs,
      DeltaMFCCs,
      DoubleDeltaMFCCs,
      Magnitude,
      LogMagnitude,
      SpectralCentroid,
      SpectralSpread,
      SpectralFlux
    };
  };

private:
  std::string target_file_;
  Value target_duration_;
  std::vector<FeatureComparerPtr> features_;
  FeatureExtractor extractor_;
  std::map<std::string, Feature::ID> feature_names_;
  
public:
  // copy constructor
  FileComparer(const FileComparer& other);
  FileComparer(int window_size = 1024,
               int hop_size = 256);
  FileComparer(const std::string& feature_list,
               int window_size = 1024,
               int hop_size = 256);
  
  void SetTargetFile(const std::string& target_file);
  Value CompareFile(const std::string& file_path);
  void SetFeatureExtractorSettings(int window_size, int hop_size);
  
  Value TargetDuration() const { return target_duration_; }
  
  void EnableFeature(Feature::ID feature, bool enable = true);
  void EnableFeatures(const std::vector<Feature::ID>& features,
                      bool enable = true);
  void EnableFeatures(std::string feature_name_list, bool enable = true);
  void SetFeatures(const std::vector<Feature::ID>& features);
};

} // dsp namespace