// title: oneshot renderer // author: LFSaw // description: // render each synthdef in a given dictionary as one-shot sound file. // code: ( q = (); q.numChans = 1; q.sRate = 48000; q.dur = 2; q.dirname = thisProcess.nowExecutingPath.dirname; q.subDirname = q.dirname +/+ "%-%sec-%chan".format(q.sRate, q.dur, q.numChans); // load a dictionary of SynthDefs // should be of the form /* {|numChans = 2| ( // name: SynthDef(\name, {}) bdSimple: SynthDef(\bdSimple, {|out = 0, lFreq = 67, sustain = 0.5, attack = 0.01, amp=0.1, startFreq = 1000| var osc = SinOsc.ar(XLine.kr(startFreq, lFreq, attack), 0.5pi); var env = EnvGen.kr(Env.perc(attack, sustain), doneAction: 2) * amp; Out.ar(out, osc * env!numChans); }), // ... ) } */ q.synthDefs = (q.dirname +/+ ".." +/+ "oneShots/_oneShotEnv.scd").load.value(q.numChans); q.renderSound = {|q, nameOrSynthDef, dur = 1, amp = 1, out = 0, params, sRate = 48000, format = "int32", dirname, filename| var score; var args; var name, synthdef; nameOrSynthDef.isKindOf(SynthDef).if({ name = nameOrSynthDef.name; synthdef = nameOrSynthDef; }, { name = nameOrSynthDef.asSymbol; synthdef = q.synthDefs[name]; }); params = params ? (); dirname = dirname ?? q.dirname; filename = filename ?? {"%_%_%-%-%%.aiff".format(name, sRate, format, dur, params.asKeyValuePairs.inject("", {|current, next| current ++ "-" ++ next}), Date.getDate.asSortableString)}; args = [ \instrument, name, \amp, 1, \dur, Pseq([dur], 1), \sustain, Pseq([dur], 1), \legato, 1 ] ++ params.asKeyValuePairs; args.postln; score = Pbind(*args).asScore(dur); score.score.printAll; // add synthdef after g_new score.score = score.score.insert(1, [ 0, [\d_recv, synthdef.asBytes ] ] ); score.recordNRT( // oscFilePath: nil, outputFilePath: dirname +/+ filename, // inputFilePath: nil, sampleRate: sRate, headerFormat: "AIFF", sampleFormat: format, options: ServerOptions().numOutputBusChannels_(q.numChans), duration: dur.postln, ); } ) /* test rendering q[\renderSound].(q, \bdCrack, sRate: 44100, dur: 5) */ ///////////////////// render ( File.exists(q.subDirname).not.if{ q.subDirname.mkdir; }; q.synthDefs.keys.do{|name| ">>>>>>>>>>>>>> % <<<<<<<<<<<<<<".postf(name); q[\renderSound].(q, name, dirname: q.subDirname, format: "float32",sRate: q.sRate, dur: q.dur) } ) ///////////////////// normalise ( // normalise var normDirname = q.subDirname +/+ "../%-normalised".format(q.subDirname.basename); File.exists(normDirname).not.if{ normDirname.mkdir; }; (q.subDirname +/+ "*.aiff").pathMatch.do{|file| SoundFile.normalize(file, normDirname +/+ file.basename, newSampleFormat: "int32") } ) "asd/sad/d.ext".basename.splitext.first