#ifndef ROTOR_NODES_AUDIO_ANALYSIS #define ROTOR_NODES_AUDIO_ANALYSIS #include "rotor.h" #include "vampHost.h" namespace Rotor { class Audio_analysis: public Audio_processor { public: Audio_analysis(){ //create_attribute("soname","Plugin library to use","Plugin library","vamp-example-plugins",{"horiz","vert","horizR","vertR"}); //create_attribute("id","ID of Plugin to use","Plugin ID","percussiononsets",{"horiz","vert","horizR","vertR"}); create_attribute("analyser","Analyser Plugin to use","Analyser plugin","barbeattracker",{"barbeattracker","segmenter"}); create_parameter("outputNo","number","Plugin output to use","Output number",0.0f); title="Audio analysis"; description="Analyse audio and output"; }; Audio_analysis(map &settings):Audio_analysis() { base_settings(settings); vector< pair< string, string>> sonames={ {"qm-vamp-plugins","qm-barbeattracker"} }; soname=find_setting(settings,"soname"); id=find_setting(settings,"id"); outputNo=find_setting(settings,"outputNo",0); }; ~Audio_analysis(){}; Audio_analysis* clone(map &_settings) { return new Audio_analysis(_settings);}; bool init(int _channels,int _bits,int _samples,int _rate); void cleanup(); void set_parameter(const std::string &key,const std::string &value){params[key]=ofToFloat(value);}; int process_frame(uint8_t *data,int samples_in_frame); const float output(const Time_spec &time) { if (analyser.features.size()) { auto i=analyser.features.upper_bound(time.time); //the first element in the container whose key is considered to go after k if (i!=analyser.features.end()){ float uk=i->first; i--; float lk=i->first; int ln=i->second; return (((time.time-lk)/(uk-lk))+ln); } } return 0.0f; } void print_features(); void print_summary(){ cerr<<"vamp plugin "< params; }; } #endif