diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-09-05 17:55:35 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-09-05 17:55:35 +0100 |
| commit | 741fb4b9e135cfb161a749db88713229038577bb (patch) | |
| tree | 08bc9925659cbcac45162bacf31dc6336d4f60b4 /rotord/src | |
| parent | a2e1bf3495b7bfefdaedb8fc737e969ab06df079 (diff) | |
making act segmenter
Diffstat (limited to 'rotord/src')
| -rwxr-xr-x | rotord/src/libavwrapper.h | 3 | ||||
| -rw-r--r-- | rotord/src/nodes_audio_analysis.cpp | 8 | ||||
| -rw-r--r-- | rotord/src/nodes_audio_analysis.h | 72 | ||||
| -rw-r--r-- | rotord/src/rendercontext.cpp | 7 | ||||
| -rwxr-xr-x | rotord/src/rotor.cpp | 1 | ||||
| -rwxr-xr-x | rotord/src/rotor.h | 8 |
6 files changed, 66 insertions, 33 deletions
diff --git a/rotord/src/libavwrapper.h b/rotord/src/libavwrapper.h index 6ae6bd2..7f3d549 100755 --- a/rotord/src/libavwrapper.h +++ b/rotord/src/libavwrapper.h @@ -33,6 +33,9 @@ //http://dranger.com/ffmpeg/ //the mnost up to date tutorial? +//https://github.com/lbrandy/ffmpeg-fas/tree/master +//try this! + #ifndef UINT64_C #define UINT64_C(c) (c ## ULL) #endif diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp index 925858f..c997cae 100644 --- a/rotord/src/nodes_audio_analysis.cpp +++ b/rotord/src/nodes_audio_analysis.cpp @@ -90,7 +90,7 @@ namespace Rotor{ } XML.addValue("data",vdata); } - bool Audio_analysis::init(int _channels,int _bits,int _samples, int _rate) { + bool Vamp_node::init(int _channels,int _bits,int _samples, int _rate) { //need these to make sense of data channels=_channels; bits=_bits; @@ -104,15 +104,15 @@ namespace Rotor{ //maybe neater to contain it in terms of headers etc } - int Audio_analysis::process_frame(uint8_t *data,int samples_in_frame) { + int Vamp_node::process_frame(uint8_t *data,int samples_in_frame) { analyser.process_frame(data,samples_in_frame); return 1; } - void Audio_analysis::cleanup() { + void Vamp_node::cleanup() { analyser.cleanup(); //print_features(); } - string Audio_analysis::get_features(){ + string Vamp_node::get_features(){ string data; for (auto i: analyser.features) { data=data+" ["+ofToString(i.second.number)+":"+ofToString(i.first); diff --git a/rotord/src/nodes_audio_analysis.h b/rotord/src/nodes_audio_analysis.h index d192d26..ee98c3b 100644 --- a/rotord/src/nodes_audio_analysis.h +++ b/rotord/src/nodes_audio_analysis.h @@ -9,31 +9,11 @@ namespace Rotor { #define VAMPHOST_Timesteps 2 #define VAMPHOST_Valueline 3 #define VAMPHOST_Values 4 - class Audio_analysis: public Audio_processor { + class Vamp_node: public Audio_processor { + //base class for vamp plugin hosts 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_attribute("mode","Data output mode","Mode","timeline",{"timeline","timesteps","valueline","values"}); - create_parameter("outputNo","number","Plugin output to use","Output number",0.0f); - title="Audio analysis"; - description="Analyse audio and output"; - }; - Audio_analysis(map<string,string> &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<string,string> &_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()) { @@ -67,12 +47,58 @@ namespace Rotor { void print_summary(){ cerr<<"vamp plugin "<<id<<" of library "<<soname<<" found "<<analyser.features.size()<<" features "<<endl; }; - private: + protected: string soname,id; int outputNo; + private: vampHost::Analyser analyser; map <string,float> params; }; + class Audio_analysis: public Vamp_node { + //vamp node that allows the user to choose a plugin + 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_attribute("mode","Data output mode","Mode","timeline",{"timeline","timesteps","valueline","values"}); + create_parameter("outputNo","number","Plugin output to use","Output number",0.0f); + title="Audio analysis"; + description="Analyse audio and output"; + }; + Audio_analysis(map<string,string> &settings):Audio_analysis() { + base_settings(settings); + soname=find_setting(settings,"soname"); + id=find_setting(settings,"id"); + outputNo=find_setting(settings,"outputNo",0); + }; + ~Audio_analysis(){}; + Audio_analysis* clone(map<string,string> &_settings) { return new Audio_analysis(_settings);}; + private: + }; + class Act_segmenter: public Vamp_node { + //vamp node that applies a ruleset to manage a set of acts via a cycler + public: + Act_segmenter(){ + create_parameter("outputNo","number","Plugin output to use","Output number",0.0f); + create_parameter("acts","number","Number of acts defined","Acts",0.0f); + title="Act manager"; + description="Applies a ruleset to manage acts based on segments"; + }; + Act_segmenter(map<string,string> &settings):Act_segmenter() { + base_settings(settings); + soname="qm-vamp-plugins"; + id="qm-segmenter"; + outputNo=find_setting(settings,"outputNo",0); + }; + ~Act_segmenter(){}; + Act_segmenter* clone(map<string,string> &_settings) { return new Act_segmenter(_settings);}; + void cleanup(){ + Vamp_node::cleanup(); + cerr<<"act segmenter custom cleanup"<<endl; + } + private: + }; } #endif diff --git a/rotord/src/rendercontext.cpp b/rotord/src/rendercontext.cpp index d160527..47113c1 100644 --- a/rotord/src/rendercontext.cpp +++ b/rotord/src/rendercontext.cpp @@ -17,9 +17,10 @@ void Render_context::runTask() { state=ANALYSING_AUDIO; vector<Audio_processor*> processors; processors.push_back(audio_thumb); - vector<Node*> analysers=graph.find_nodes("audio_analysis"); - for (auto a: analysers) { - processors.push_back(dynamic_cast<Audio_processor*>(a)); + for (auto a: graph.nodes) { + if (dynamic_cast<Audio_processor*>(a.second)){ + processors.push_back(dynamic_cast<Audio_processor*>(a.second)); + } } if (load_audio(graph.audio_filename,processors)) { graph.audio_loaded=true; diff --git a/rotord/src/rotor.cpp b/rotord/src/rotor.cpp index 616e128..87874d8 100755 --- a/rotord/src/rotor.cpp +++ b/rotord/src/rotor.cpp @@ -26,6 +26,7 @@ Node_factory::Node_factory(){ add_type("difference_matte",new Difference_matte()); //nodes_audio_analysis.h add_type("audio_analysis",new Audio_analysis()); + add_type("act_segmenter",new Act_segmenter()); //nodes_maths.h add_type("comparison",new Comparison()); //TODO: alias to symbols add_type("arithmetic",new Arithmetic()); //TODO: alias to symbols diff --git a/rotord/src/rotor.h b/rotord/src/rotor.h index 20089b8..6c030ec 100755 --- a/rotord/src/rotor.h +++ b/rotord/src/rotor.h @@ -199,13 +199,13 @@ namespace Rotor { for (auto a: attributes){ if (find_setting(settings,a.first,"")!="") { attributes[a.first]->init(find_setting(settings,a.first,"")); - cerr<<"setting attribute '"<<a.first<<"'' to "<<find_setting(settings,a.first,"")<<" (index: "<<attributes[a.first]->intVal<<")"<<endl; + cerr<<"setting attribute '"<<a.first<<"' to "<<find_setting(settings,a.first,"")<<" (index: "<<attributes[a.first]->intVal<<")"<<endl; } } for (auto p: parameters){ if (find_setting(settings,p.first,"")!="") { parameters[p.first]->init(find_setting(settings,p.first,0.0f)); - cerr<<"setting parameter '"<<p.first<<"'' to "<<find_setting(settings,p.first,0.0f)<<endl; + cerr<<"setting parameter '"<<p.first<<"' to "<<find_setting(settings,p.first,0.0f)<<endl; } } } @@ -214,7 +214,9 @@ namespace Rotor { p.second->get(time); } } - virtual void set_parameter(const std::string &key,const std::string &value){}; + void set_parameter(const std::string &key,const std::string &value){ + if (parameters.find(key)!=parameters.end()) parameters[key]->value=ofToFloat(value); + }; }; class Signal_node: public Node{ public: |
