hsc3-db-0.9: sclang/Utilities.sc
+ String {
toUpper {
^this.collect({|c| c.toUpper});
}
}
+ Symbol {
toUpper {
^this.asString.toUpper.asSymbol;
}
}
+ Object {
findMethodR { |n|
/* ^this.class.findMethod(n); */
var m = this.findMethod(n);
if (m.notNil, {
^m;
}, {
var p = this.superclass;
if (p.notNil, {
^p.findMethodR(n);
}, {
^nil
});
});
}
supportsRate { |r|
^(this.class.findMethodR(r) != nil);
}
supportedRates {
^['ar', 'kr', 'dr', 'ir', 'new'].select({|r| this.supportsRate(r)});
}
inputNames { |r|
var n = this.class.findMethodR(r).argNames;
^n.reject({|e| ['this','mul','add'].includes(e)});
}
inputDefault { |r, nm|
var m = this.class.findMethodR(r);
var n = m.argNames;
var i = n.detectIndex({|e| e == nm});
^m.prototypeFrame[i];
}
inputDefaults { |r|
var n = this.inputNames(r);
^n.collect({|e| e.inputDefault});
}
numberOfOutputs { |r|
var n = this.new.init.size;
if(n==0) {^1} {^n};
}
ugenDB {
var nm = this.name.asString;
var rr = this.supportedRates;
var dr = (audio: 'AR', control: 'KR', scalar: 'IR', demand: 'DR').at(this.new.rate);
var r = rr[0];
var n = this.inputNames(r);
var o = this.numberOfOutputs;
^[nm, rr, dr, n.collect({|e| [e.asString, this.inputDefault(r,e)]}), o]
}
ugenDBHaskell {
var db = this.ugenDB;
var rr = db[1].reject({|e| e == 'new'}).collect({|e| e.toUpper});
var ii = db[3].collect({|e|
var nm = e[0];
var df = if (e[1] == nil) {0.0} {e[1]};
"I " ++ nm.asCompileString ++ " (" ++ df ++ ")";
});
^"U " ++ db[0].asCompileString ++ " " ++ rr.asString ++ " " ++ db[2].asString ++ " " ++ ii.asString ++ " " ++ db[4].asString;
}
}
+ Object {
allSubClassesOf {
var u = this.subclasses;
if(u.size == 0) {^[]} {^u ++ u.collect({|e| e.allSubClassesOf}).flatten}
}
}