{
   "labels" : [
      "processing"
   ],
   "id" : "1-4Wt",
   "is_private" : null,
   "code" : "/*\r\n//--processing code:\r\nimport oscP5.*;\r\nimport netP5.*;\r\nOscP5 oscP5;\r\n\r\nfinal int BUFFERSIZE= 2048;  //should correspond with fft size in supercollider\r\nfinal int BUFFERSIZE2= BUFFERSIZE/2; \r\n\r\nfloat[] fftArrayHi;\r\nfloat[] fftArrayMd;\r\nfloat[] fftArrayLo;\r\n\r\nvoid setup() {\r\n  size(1280, 768);\r\n  frameRate(60);\r\n  background(0);\r\n  noSmooth();\r\n\r\n  fftArrayHi= new float[BUFFERSIZE2];\r\n  fftArrayMd= new float[BUFFERSIZE2];\r\n  fftArrayLo= new float[BUFFERSIZE2];\r\n  for (int i= 0; i<BUFFERSIZE2; i++) {\r\n    fftArrayHi[i]= 0.0;\r\n    fftArrayMd[i]= 0.0;\r\n    fftArrayLo[i]= 0.0;\r\n  }\r\n\r\n  //--network\r\n  OscProperties properties= new OscProperties();\r\n  //properties.setRemoteAddress(\"127.0.0.1\", 57120);  //osc send port (to sc)\r\n  properties.setListeningPort(47120);               //osc receive port (from sc)\r\n  //properties.setSRSP(OscProperties.ON);  //unused\r\n  //properties.setDatagramSize(min(BUFFERSIZE*4, 8192));\r\n  properties.setDatagramSize(5136);  //5136 is the minimum \r\n  oscP5= new OscP5(this, properties);\r\n}\r\n\r\nvoid oscEvent(OscMessage msg) {\r\n  if (msg.checkAddrPattern(\"/fftArrayHi\")) {\r\n    for (int i= 0; i<BUFFERSIZE2; i++) {\r\n      fftArrayHi[i]= msg.get(i).floatValue();\r\n    }\r\n  } else if (msg.checkAddrPattern(\"/fftArrayMd\")) {\r\n    for (int i= 0; i<BUFFERSIZE2; i++) {\r\n      fftArrayMd[i]= msg.get(i).floatValue();\r\n    }\r\n  } else if (msg.checkAddrPattern(\"/fftArrayLo\")) {\r\n    for (int i= 0; i<BUFFERSIZE2; i++) {\r\n      fftArrayLo[i]= msg.get(i).floatValue();\r\n    }\r\n  }\r\n}\r\n\r\nvoid draw() {\r\n  background(0);\r\n  noFill();\r\n  for (int x= 0; x<BUFFERSIZE2; x++) {\r\n    stroke(fftArrayHi[x]*255.0, 0, 0);\r\n    line(x, height*0.1, x, height*0.3);\r\n    stroke(fftArrayMd[x]*255.0, 0, 0);\r\n    line(x, height*0.4, x, height*0.6);\r\n    stroke(fftArrayLo[x]*255.0, 0, 0);\r\n    line(x, height*0.7, x, height*0.9);\r\n  }\r\n}\r\n\r\n*/\r\n\r\n\r\n//--supercollider code\r\n\r\n(\r\nvar buffersize= 2048;\r\nvar buffersize2= buffersize.div(2);\r\nvar n= NetAddr(\"127.0.0.1\", 47120);\r\ns.options.memSize= 8192*4;\r\ns.waitForBoot{\r\n\tvar busHi= Bus.control(s, buffersize2);\r\n\tvar busMd= Bus.control(s, buffersize2);\r\n\tvar busLo= Bus.control(s, buffersize2);\r\n\tSynthDef(\\avTrkHi, {|in= 0, amp= 1, bus, freq= 5000|\r\n\t\tvar z= BHiPass.ar(Mix(InFeedback.ar(in, 2)*amp), freq);\r\n\t\tvar chain= FFT(LocalBuf(buffersize), z);\r\n\t\tArray.fill(buffersize2, {|i|\r\n\t\t\tvar a= Unpack1FFT(chain, buffersize, i);\r\n\t\t\tvar d= Demand.kr(chain>=0, 0, a);\r\n\t\t\tOut.kr(bus+i, d.min(1));\r\n\t\t});\r\n\t}).load;\r\n\tSynthDef(\\avTrkMd, {|in= 0, amp= 1, bus, freq= 1000|\r\n\t\tvar z= BBandPass.ar(Mix(InFeedback.ar(in, 2)*amp), freq);\r\n\t\tvar chain= FFT(LocalBuf(buffersize), z);\r\n\t\tArray.fill(buffersize2, {|i|\r\n\t\t\tvar a= Unpack1FFT(chain, buffersize, i);\r\n\t\t\tvar d= Demand.kr(chain>=0, 0, a);\r\n\t\t\tOut.kr(bus+i, d.min(1));\r\n\t\t});\r\n\t}).load;\r\n\tSynthDef(\\avTrkLo, {|in= 0, amp= 1, bus, freq= 100|\r\n\t\tvar z= BLowPass.ar(Mix(InFeedback.ar(in, 2)*amp), freq);\r\n\t\tvar chain= FFT(LocalBuf(buffersize), z);\r\n\t\tArray.fill(buffersize2, {|i|\r\n\t\t\tvar a= Unpack1FFT(chain, buffersize, i);\r\n\t\t\tvar d= Demand.kr(chain>=0, 0, a);\r\n\t\t\tOut.kr(bus+i, d.min(1));\r\n\t\t});\r\n\t}).load;\r\n\ts.sync;\r\n\tSynth(\\avTrkHi, [\\in, 0, \\amp, 0.3, \\bus, busHi]);\r\n\tSynth(\\avTrkMd, [\\in, 0, \\amp, 0.3, \\bus, busMd]);\r\n\tSynth(\\avTrkLo, [\\in, 0, \\amp, 0.3, \\bus, busLo]);\r\n\tRoutine.run({\r\n\t\tinf.do{\r\n\t\t\tvar fftArrayHi= busHi.getnSynchronous(buffersize2);\r\n\t\t\tvar fftArrayMd= busMd.getnSynchronous(buffersize2);\r\n\t\t\tvar fftArrayLo= busLo.getnSynchronous(buffersize2);\r\n\t\t\tn.sendMsg(\\fftArrayHi, *fftArrayHi);  //sending 1024 values\r\n\t\t\tn.sendMsg(\\fftArrayMd, *fftArrayMd);  //sending 1024 values\r\n\t\t\tn.sendMsg(\\fftArrayLo, *fftArrayLo);  //sending 1024 values\r\n\t\t\t(1/61).wait;  //a tiny bit faster than framerate\r\n\t\t};\r\n\t});\r\n\tCmdPeriod.doOnce({\r\n\t\tbusHi.free; busMd.free; busLo.free;\r\n\t});\r\n};\r\n)",
   "author" : "Fredrik Olofsson",
   "name" : "example fft sc->processing v2",
   "description" : "an extended version of http://sccode.org/1-4Ty\r\nthis one sends 3 streams of spectral data at the same time - high, mid and low filtered.\r\nnote: quite heavy on the cpu and sends a lot of data via osc (1024*3 values 61times/second).\r\nplay any sound on output bus 0 and 1 to test it.  e.g. {SoundIn.ar!2}.play\r\nupdated to work with sc3.9 and processing 3.3.6",
   "ancestor_list" : []
}
