{
   "code" : "(\r\nq = ();\r\nq.numChans = 1;\r\nq.sRate = 48000;\r\nq.dur = 2;\r\nq.dirname = thisProcess.nowExecutingPath.dirname;\r\nq.subDirname = q.dirname +/+ \"%-%sec-%chan\".format(q.sRate, q.dur, q.numChans);\r\n// load a dictionary of SynthDefs\r\n// should be of the form\r\n/*\r\n{|numChans = 2|\r\n(\r\n// name: SynthDef(\\name, {})\r\nbdSimple: SynthDef(\\bdSimple, {|out = 0, lFreq = 67, sustain = 0.5, attack = 0.01, amp=0.1, startFreq = 1000|\r\n\r\n\t\t\tvar osc = SinOsc.ar(XLine.kr(startFreq, lFreq, attack), 0.5pi);\r\n\t\t\tvar env = EnvGen.kr(Env.perc(attack, sustain), doneAction: 2) * amp;\r\n\r\n\t\t\tOut.ar(out, osc * env!numChans);\r\n\t\t}), // ...\r\n\r\n)\r\n}\r\n*/\r\nq.synthDefs = (q.dirname +/+ \"..\" +/+ \"oneShots/_oneShotEnv.scd\").load.value(q.numChans);\r\n\r\nq.renderSound = {|q, nameOrSynthDef, dur = 1, amp = 1, out = 0, params, sRate = 48000, format = \"int32\", dirname, filename|\r\n\tvar score;\r\n\tvar args;\r\n\tvar name, synthdef;\r\n\r\n\r\n\tnameOrSynthDef.isKindOf(SynthDef).if({\r\n\t\tname = nameOrSynthDef.name;\r\n\t\tsynthdef = nameOrSynthDef;\r\n\t}, {\r\n\t\tname = nameOrSynthDef.asSymbol;\r\n\t\tsynthdef = q.synthDefs[name];\r\n\t});\r\n\r\n\r\n\tparams = params ? ();\r\n\tdirname = dirname ?? q.dirname;\r\n\tfilename = filename ?? {\"%_%_%-%-%%.aiff\".format(name, sRate, format, dur, params.asKeyValuePairs.inject(\"\", {|current, next| current ++ \"-\" ++ next}), Date.getDate.asSortableString)};\r\n\r\n\r\n\r\n\targs = [\r\n\t\t\\instrument, name,\r\n\t\t\\amp, 1,\r\n\t\t\\dur, Pseq([dur], 1),\r\n\t\t\\sustain, Pseq([dur], 1),\r\n\t\t\\legato, 1\r\n\t] ++ params.asKeyValuePairs;\r\n\targs.postln;\r\n\tscore = Pbind(*args).asScore(dur);\r\n\tscore.score.printAll;\r\n\t// add synthdef after g_new\r\n\tscore.score = score.score.insert(1,\r\n\t\t[ 0, [\\d_recv, synthdef.asBytes ] ]\r\n\t);\r\n\r\n\tscore.recordNRT(\r\n\t\t// oscFilePath: nil,\r\n\t\toutputFilePath: dirname +/+ filename,\r\n\t\t// inputFilePath: nil,\r\n\t\tsampleRate: sRate,\r\n\t\theaderFormat: \"AIFF\",\r\n\t\tsampleFormat: format,\r\n\t\toptions: ServerOptions().numOutputBusChannels_(q.numChans),\r\n\t\tduration: dur.postln,\r\n\t);\r\n}\r\n)\r\n\r\n/* test rendering\r\nq[\\renderSound].(q, \\bdCrack, sRate: 44100, dur: 5)\r\n*/\r\n\r\n///////////////////// render\r\n(\r\nFile.exists(q.subDirname).not.if{\r\n\tq.subDirname.mkdir;\r\n};\r\nq.synthDefs.keys.do{|name|\r\n\t\">>>>>>>>>>>>>> % <<<<<<<<<<<<<<\".postf(name);\r\n\tq[\\renderSound].(q, name, dirname: q.subDirname, format: \"float32\",sRate: q.sRate, dur: q.dur)\r\n}\r\n)\r\n\r\n///////////////////// normalise\r\n( // normalise\r\nvar normDirname = q.subDirname +/+ \"../%-normalised\".format(q.subDirname.basename);\r\n\r\nFile.exists(normDirname).not.if{\r\n\tnormDirname.mkdir;\r\n};\r\n\r\n(q.subDirname +/+ \"*.aiff\").pathMatch.do{|file|\r\n\tSoundFile.normalize(file, normDirname +/+ file.basename, newSampleFormat: \"int32\")\r\n}\r\n)\r\n\r\n\r\n\"asd/sad/d.ext\".basename.splitext.first",
   "id" : "1-5bq",
   "is_private" : null,
   "labels" : [
      "nrt",
      "multichannel",
      "mono",
      "oneshot",
      "renderer",
      "samplepack",
      "generator"
   ],
   "description" : "render each synthdef in a given dictionary as one-shot sound file.",
   "ancestor_list" : [],
   "author" : "LFSaw",
   "name" : "oneshot renderer"
}
