From 741fb4b9e135cfb161a749db88713229038577bb Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Thu, 5 Sep 2013 17:55:35 +0100 Subject: making act segmenter --- rotord/src/libavwrapper.h | 3 ++ rotord/src/nodes_audio_analysis.cpp | 8 ++--- rotord/src/nodes_audio_analysis.h | 72 +++++++++++++++++++++++++------------ rotord/src/rendercontext.cpp | 7 ++-- rotord/src/rotor.cpp | 1 + rotord/src/rotor.h | 8 +++-- 6 files changed, 66 insertions(+), 33 deletions(-) (limited to 'rotord/src') 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 &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()) { @@ -67,12 +47,58 @@ namespace Rotor { void print_summary(){ cerr<<"vamp plugin "< 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 &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 &_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 &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 &_settings) { return new Act_segmenter(_settings);}; + void cleanup(){ + Vamp_node::cleanup(); + cerr<<"act segmenter custom cleanup"< processors; processors.push_back(audio_thumb); - vector analysers=graph.find_nodes("audio_analysis"); - for (auto a: analysers) { - processors.push_back(dynamic_cast(a)); + for (auto a: graph.nodes) { + if (dynamic_cast(a.second)){ + processors.push_back(dynamic_cast(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 '"<intVal<<")"<intVal<<")"<init(find_setting(settings,p.first,0.0f)); - cerr<<"setting parameter '"<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: -- cgit v1.2.3