{
   "code" : "q = ();\r\n\r\nq.maxRecLength = 10; //in seconds\r\nq.numChans = 2;\r\n\r\nq.maxRecLengthSamples = q.maxRecLength * s.sampleRate;\r\nq.recLengthSamples = 0;\r\n\r\nq.recBuf = Buffer.alloc(s, q.maxRecLengthSamples, 2);\r\nq.playbackBuf = nil!10;\r\nq.player = nil!10;\r\n\r\n/*\r\nq.recBuf.updateInfo; // */\r\n\r\n(\r\nSynthDef(\\looprRecorder, {|inBus = 0, recBuf = 0, gate = 1|\r\n\tvar inSignal;\r\n\tvar trigGate = 1-gate; // TODO: make automatic stop (when maxRecLength is reached) trigger as well\r\n\r\n\t// the signal to be recorded\r\n\tinSignal = In.ar(inBus, q.numChans);\r\n\r\n\t// send time used for recording back to language\r\n\tSendTrig.kr(\r\n\t\ttrigGate,\r\n\t\t0,\r\n\t\tLine.kr(0, q.maxRecLengthSamples, q.maxRecLengthSamples)\r\n\t);\r\n\r\n\t// release synth when recGate closes\r\n\tFreeSelf.kr(trigGate);\r\n\r\n\tRecordBuf.ar(inSignal, recBuf, 0, recLevel: 1, preLevel: 0, doneAction: 2);\r\n}).add;\r\n\r\n\r\n\r\nSynthDef(\\looprPlayer, {|buf = 0, loop = 1, out = 0|\r\n\r\n\tOut.ar(out, PlayBuf.ar(q.numChans, buf, loop:loop));\r\n}).add;\r\n\r\n)\r\n\r\n(\r\nq.startRec = {|q, idx = 0, from|\r\n\tq.recTo = idx;\r\n\tq.recorder = Synth(\\recorder, [\\inBus, Ndef(\\sound).bus.index, \\recBuf, q.recBuf], 0, \\addToTail);\r\n\r\n\tOSCFunc({ arg msg, time;\r\n\t\tq.recLength = msg[3];\r\n\t\tq.recLengthSamples = (q.recLength * s.sampleRate).trunc;\r\n\t\tq.playbackBuf[q.recTo] = Buffer.alloc(s, q.recLengthSamples, q.numChans, {|buf|\r\n\t\t\tq.recBuf.copyMsg(buf, 0, 0, q.recLengthSamples);\r\n\t\t})\r\n\r\n\t},'/tr', s.addr, nil, [q.recorder.nodeID, 0]).oneShot;\r\n\r\n};\r\n\r\n\r\nq.stopRec = {|q, idx|\r\n\tidx.notNil.if{\r\n\t\tq.recTo = idx;\r\n\t};\r\n\tq.recorder.set(\\gate, 0);\r\n};\r\n\r\nq.playBack = {|q, idx = 0|\r\n\tq.player[idx] = Synth(\\playback, [\\buf, q.playbackBuf[idx]])\r\n};\r\n\r\nq.stopBack = {|q, idx = 0|\r\n\tq.player[idx].free;\r\n};\r\n\r\n\r\n)\r\n\r\n\r\nq.startRec(1)\r\nq.stopRec(1)\r\n\r\n\r\nq.playBack(1)\r\nq.stopBack(1)\r\n\r\nq.playBack(0)\r\nq.stopBack(0)",
   "id" : "1-57d",
   "is_private" : null,
   "labels" : [
      "looper",
      "synthdef"
   ],
   "ancestor_list" : [],
   "description" : "variable length looping engine",
   "author" : "LFSaw",
   "name" : "loopr"
}
