summaryrefslogtreecommitdiff
path: root/rotord/src/nodes_audio_analysis.h
blob: 619b60aadb293fe75df46126fb9e8e610dd3141c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef ROTOR_NODES_AUDIO_ANALYSIS
#define ROTOR_NODES_AUDIO_ANALYSIS

#include "rotor.h"
#include "vampHost.h"

namespace Rotor {
#define VAMPHOST_Timeline 1
#define VAMPHOST_Timesteps 2
#define VAMPHOST_Valueline 3
#define VAMPHOST_Values 4
	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_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()) {					
						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;
							float v1,v2;
							v1=v2=0.0f;
							if (i->second.values.size()) v2=i->second.values[0];
							i--;
							float lk=i->first;
							int ln=i->second.number;
							if (i->second.values.size()) v1=i->second.values[0];
							switch (attributes["mode"]->intVal){
								case VAMPHOST_Timeline:
									return ((time.time-lk)+ln);
								case VAMPHOST_Timesteps:
									return (float)ln;
								case VAMPHOST_Valueline:
									return (((time.time-lk)*(v2-v1))+v1);
								case VAMPHOST_Values:
									return v1;
							}
						}
					}
					return 0.0f;
				}
				string get_features();
				void print_summary(){
					cerr<<"vamp plugin "<<id<<" of library "<<soname<<" found "<<analyser.features.size()<<" features "<<endl;
				};
			private:
				string soname,id;
				int outputNo;
				vampHost::Analyser analyser;
				map <string,float> params;
	};
}

#endif