packages feed

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}
	}
}