summaryrefslogtreecommitdiff
path: root/rotord
diff options
context:
space:
mode:
authorComment <tim@gray.(none)>2013-03-11 17:22:48 +0000
committerComment <tim@gray.(none)>2013-03-11 17:22:48 +0000
commitb8d793ccd8c98dfb5edb7808f6e67cb913d7967a (patch)
tree962389c9e506565b65352fb775854feb680a7357 /rotord
parente0b956174a509b2fb3698383017a264e92665347 (diff)
signal graph rendering
Diffstat (limited to 'rotord')
-rw-r--r--rotord/01.xml11
-rw-r--r--rotord/rotor.cpp3
-rwxr-xr-xrotord/rotor.h30
3 files changed, 34 insertions, 10 deletions
diff --git a/rotord/01.xml b/rotord/01.xml
index e6c8697..830c3a3 100644
--- a/rotord/01.xml
+++ b/rotord/01.xml
@@ -4,10 +4,13 @@
</node>
<node ID="02" type="audio_analysis" soname="qm-vamp-plugins" id="qm-segmenter" output="signal">segmenter
</node>
- <node ID="03" type="==" output="signal">outputs 0 except when signal first passes a new integer: then 1
- <signal_input from="01">signal to analyse</signal_input>
+ <node ID="03" type="divide" amount="2.0" output="signal">signal divide
+ <signal_input from="01">signal to divide</signal_input>
</node>
- <node ID="04" type="signal_output">outputs data when changed
- <signal_input from="03">signal to output</signal_input>
+ <node ID="04" type="==" output="signal">outputs 0 except when signal first passes a new integer: then 1
+ <signal_input from="03">signal to analyse</signal_input>
+ </node>
+ <node ID="05" type="signal_output">outputs data when changed
+ <signal_input from="04">signal to output</signal_input>
</node>
</patchbay>
diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp
index 7f22a5f..28dab1e 100644
--- a/rotord/rotor.cpp
+++ b/rotord/rotor.cpp
@@ -313,7 +313,7 @@ bool Render_context::load_graph(string filename){
graph.nodes[nodeID]->create_signal_input(xml.getValue("signal_input","",i2));
string fromID=xml.getAttribute("signal_input","from","",i2);
if (graph.nodes.find(fromID)!=graph.nodes.end()) {
- if (!graph.nodes[nodeID]->inputs[i2]->connect(graph.nodes[fromID])){
+ if (!graph.nodes[nodeID]->inputs[i2]->connect((Signal_node*)graph.nodes[fromID])){
cerr << "Rotor: graph loader cannot connect input " << i2 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
return false;
}
@@ -377,6 +377,7 @@ bool Render_context::load_graph(string filename){
Node_factory::Node_factory(){
//for now, statically load prototype map in constructor
add_type("audio_analysis",new Audio_analysis());
+ add_type("divide",new Signal_divide());
add_type("==",new Is_new_integer());
add_type("signal_output",new Signal_output());
} \ No newline at end of file
diff --git a/rotord/rotor.h b/rotord/rotor.h
index 96db4f7..c4f5c38 100755
--- a/rotord/rotor.h
+++ b/rotord/rotor.h
@@ -140,7 +140,7 @@ namespace Rotor {
};
class Signal_node: public Node{
public:
- virtual float get_output(const float &time) {};
+ virtual float get_output(const float &time) { return 0.0f; };
/*{ //default is to pass through first input, if disconnected returns 0
cerr << "getting output for " << type << "," << ID << endl;
@@ -179,6 +179,23 @@ namespace Rotor {
return t;
}
};
+ class Signal_divide: public Signal_node {
+ //divides incoming signal by a fixed amount
+ public:
+ Signal_divide(){};
+ Signal_divide(map<string,string> &settings) {
+ base_settings(settings);
+ divide_amount=ofToFloat(check(settings,"amount"));
+ };
+ Signal_divide* clone(map<string,string> &_settings) { return new Signal_divide(_settings);};
+ float get_output(const float &time) {
+ if (inputs[0]->connection) {
+ return (((Signal_node*)inputs[0]->connection)->get_output(time))/divide_amount;
+ }
+ return 0.0f;
+ }
+ float divide_amount;
+ };
class Is_new_integer: public Signal_node {
//does this require knowing what the framerate is?
//for now, assume 25
@@ -191,10 +208,13 @@ namespace Rotor {
Is_new_integer* clone(map<string,string> &_settings) { return new Is_new_integer(_settings);};
float get_output(const float &time) {
if (inputs[0]->connection) {
- //cerr << "== checking: " << ((int)(((Signal_node*)(inputs[0]->connection))->get_output(time))) << ">" <<((int)(((Signal_node*)(inputs[0]->connection))->get_output(time-.04))) << " ?" << endl;
- if (((int)(((Signal_node*)(inputs[0]->connection))->get_output(time)))>((int)(((Signal_node*)(inputs[0]->connection)))->get_output(time-.04))) return 1.0f;
+ float s1=(((Signal_node*)(inputs[0]->connection))->get_output(time));
+ float s2=(((Signal_node*)(inputs[0]->connection))->get_output(time-.04));
+ if (((int)s1)>((int)s2)) {
+ return 1.0f;
+ }
}
- else return 0.0f;
+ return 0.0f;
}
};
class Signal_output: public Signal_node {
@@ -225,7 +245,7 @@ namespace Rotor {
return type_map[settings["type"]]->clone(settings);
}
}
- else return NULL;
+ return NULL;
};
private:
unordered_map<string,Node*> type_map;