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 77 78 79 80 81 82
|
+ SynthDef {
asSynthDef { ^this }
asDefName { ^name }
}
+ Object {
asSynthDef {
error("Cannot convert this object to a SynthDef:" + this);
this.dump;
^nil
}
asDefName {
^this.asSynthDef.name
}
}
+ String {
asDefName { ^this }
}
+ Symbol {
asDefName { ^this.asString }
}
+ Function {
/*
this is mainly for {}.play and Synth({ })
Synth({
SinOsc.ar
})
or:
Synth({
Out.ar(0,SinOsc.ar)
})
it inserts an Out only if it needs it
*/
asDefName { // won't work immediately for Synth.new
var def;
def = this.asSynthDef;
def.send(Server.default);
^def.name
}
asSynthDef { arg rates, prependArgs, outClass=\Out, fadeTime, name;
^GraphBuilder.wrapOut(name ?? { this.identityHash.abs.asString },
this, rates, prependArgs, outClass, fadeTime
);
}
play { arg target, outbus = 0, fadeTime = 0.02, addAction=\addToHead, args;
var def, synth, server, bytes, synthMsg;
target = target.asTarget;
server = target.server;
if(server.serverRunning.not) {
("server '" ++ server.name ++ "' not running.").warn; ^nil
};
def = this.asSynthDef(
fadeTime:fadeTime,
name: SystemSynthDefs.generateTempName
);
synth = Synth.basicNew(def.name, server);
// if notifications are enabled on the server,
// use the n_end signal to remove the temp synthdef
if(server.notified) {
OSCpathResponder(server.addr, ['/n_end', synth.nodeID], { |time, resp, msg|
server.sendMsg(\d_free, def.name);
resp.remove;
}).add;
};
synthMsg = synth.newMsg(target, [\i_out, outbus, \out, outbus] ++ args, addAction);
def.doSend(server, synthMsg);
^synth
}
}
|