{
   "labels" : [
      "orchestra",
      "violins",
      "basses",
      "cellos",
      "basoons",
      "clarinets",
      "oboes"
   ],
   "code" : "// Orchestral Sound texture v1\r\n\r\n(\r\ns.options.numBuffers = 1024 * 32;\r\n//increase the memory available to the server\r\ns.options.memSize = 8192 * 128;\r\n)\r\n//boot the server\r\ns.boot;\r\n\r\n\r\n\r\n//LOAD SAMPLES //////////////////////////////////////////////////////////////////\r\n\r\n// VIOLINS 1 \r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/1st Violins/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"1st-violins-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~violins_1st_sus_lowest_note = tmp_array[0][\\midi];\r\n~violins_1st_sus_buffers = Array.newClear();\r\n~violins_1st_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~violins_1st_sus_buffers   = ~violins_1st_sus_buffers.add(item[\\buffer]);\r\n  ~violins_1st_sus_midinotes = ~violins_1st_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n// VIOLINS 2\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/2nd Violins/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"2nd-violins-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~violins_2nd_sus_lowest_note = tmp_array[0][\\midi];\r\n~violins_2nd_sus_buffers = Array.newClear();\r\n~violins_2nd_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~violins_2nd_sus_buffers   = ~violins_2nd_sus_buffers.add(item[\\buffer]);\r\n  ~violins_2nd_sus_midinotes = ~violins_2nd_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n\r\n// CELLO \r\n\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/Celli/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"celli-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~celli_sus_lowest_note = tmp_array[0][\\midi];\r\n~celli_sus_buffers = Array.newClear();\r\n~celli_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~celli_sus_buffers   = ~celli_sus_buffers.add(item[\\buffer]);\r\n  ~celli_sus_midinotes = ~celli_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n// BASSES \r\n\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/Basses/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"basses-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~basses_sus_lowest_note = tmp_array[0][\\midi];\r\n~basses_sus_buffers = Array.newClear();\r\n~basses_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~basses_sus_buffers   = ~basses_sus_buffers.add(item[\\buffer]);\r\n  ~basses_sus_midinotes = ~basses_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n// OBOES \r\n\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/Oboes/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"oboes-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~oboes_sus_lowest_note = tmp_array[0][\\midi];\r\n~oboes_sus_buffers = Array.newClear();\r\n~oboes_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~oboes_sus_buffers   = ~oboes_sus_buffers.add(item[\\buffer]);\r\n  ~oboes_sus_midinotes = ~oboes_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n// BASSON \r\n\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/Bassoons/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"bassoons-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~bassoons_sus_lowest_note = tmp_array[0][\\midi];\r\n~bassoons_sus_buffers = Array.newClear();\r\n~bassoons_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~bassoons_sus_buffers   = ~bassoons_sus_buffers.add(item[\\buffer]);\r\n  ~bassoons_sus_midinotes = ~bassoons_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n// CLARINETS \r\n\r\n(\r\nvar tmp_buffers;\r\nvar tmp_array;\r\nvar path;\r\n\r\n// 1. load samples from a folder extracting only one channel from the stereo files\r\npath = PathName(\"/home/nicola/Musica/samples/Sonatina Symphonic Orchestra/Samples/Clarinets/\");\r\npath.entries.do{\r\n\t|item|\r\n\tif( item.fileName.contains(\"clarinets-sus-\"),\r\n\t\t{\r\n\t\t\t//item.fileName.postln;\r\n\t\t\t//item.fullPath.postln;\r\n\t\t\ttmp_buffers = tmp_buffers.add( Buffer.readChannel(s, item.fullPath, channels:1));\r\n\r\n\t\t},{\t//do nothing\r\n\t\t}\r\n\t);\r\n};\r\n\r\n// 2. create an array of dictionaries\r\ntmp_array = Array.newClear();\r\n\r\ntmp_buffers.do{\r\n  |item, index|\r\n  var d = Dictionary.new;\r\n  var string = PathName(item.path).fileNameWithoutExtension;\r\n  var output = string.findRegexp(\"[abcdefgABCDEFG]#?[0123456789]\");\r\n  var noteNameAll = output[0][1];\r\n  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;\r\n  var noteName = noteNameAll[0].asString;\r\n  var isSharp = noteNameAll.contains(\"#\"); // boolean\r\n  //[noteNameAll, noteName, octNumber, isSharp].postln;\r\n  var midiNumber = (octNumber +1) * 12;\r\n  switch( noteName,\r\n    \"c\", { midiNumber = midiNumber+0; },\r\n    \"d\", { midiNumber = midiNumber+2; },\r\n    \"e\", { midiNumber = midiNumber+4; },\r\n    \"f\", { midiNumber = midiNumber+5; },\r\n    \"g\", { midiNumber = midiNumber+7; },\r\n    \"a\", { midiNumber = midiNumber+9; },\r\n    \"b\", { midiNumber = midiNumber+11; },\r\n  );\r\n  if(isSharp, {midiNumber = midiNumber + 1;});\r\n  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;\r\n  d.add(\\midi -> midiNumber.asInteger);\r\n  d.add(\\note -> noteNameAll);\r\n  d.add(\\buffer -> item);\r\n  tmp_array = tmp_array.add(d);\r\n};\r\n\r\ntmp_array.sortBy(\\midi);\r\n\r\n~clarinets_sus_lowest_note = tmp_array[0][\\midi];\r\n~clarinets_sus_buffers = Array.newClear();\r\n~clarinets_sus_midinotes = Array.newClear();\r\n\r\ntmp_array.do{\r\n  |item, index|\r\n  [index, item.values].postln;\r\n  ~clarinets_sus_buffers   = ~clarinets_sus_buffers.add(item[\\buffer]);\r\n  ~clarinets_sus_midinotes = ~clarinets_sus_midinotes.add(item[\\midi]);\r\n};\r\n)\r\n\r\n\r\n// SYNTH DEFS\r\n\r\n(\r\nSynthDef(\\play_orchestra, {\r\n\t|out=0,amp=0.5, gate=1, buf, rate=1.0,pan=0.0, atk=0.01, dcy=0.2, sus=0.7, rel=0.1|\r\n\tvar sig, env;\r\n\tenv = EnvGen.ar(Env.adsr(atk, dcy, sus, rel), gate, doneAction:2);\r\n\tsig = Mix.ar(PlayBuf.ar(2, buf, BufRateScale.ir(buf)*rate, 1, doneAction:0));\r\n\tsig = sig * amp * env;\r\n\tOut.ar(out, Pan2.ar(sig, pan));\r\n}).add;\r\n)\r\n\r\n// a synth to play buffers in a granular way\r\n// NOTE: you will need buffers to be loaded as MONO !!!\r\n(\r\nSynthDef(\\grain_buffer, {\r\n\t|out=0, gate=1, amp=0.9, buf, atk=5, rel=5, rate=1, pan=0.0|\r\n    var sig, env;\r\n\r\n\tvar density = LFNoise0.kr(25).range(1, 5);\r\n\tvar trigger = Impulse.kr( density );\r\n\tvar pos = 0.5 + TRand.kr(trigger, -0.35, 0.35);\r\n\tvar length = 1 + TRand.kr(trigger, 0.25, 0.35);\r\n\r\n\tenv = EnvGen.kr(Env.asr(atk, 1, rel, -4), gate, doneAction:2);\r\n\r\n    sig = GrainBuf.ar(2,\r\n\t\ttrigger,\r\n\t\tlength,\r\n\t\tbuf,\r\n\t\trate,\r\n\t\tpos,\r\n\t\t2,\r\n\t\tpan: pan);\r\n\r\n\tsig = sig * amp * env;\r\n\tOut.ar(out, sig);\r\n}).add;\r\n)\r\n\r\n\r\n(\r\nSynthDef(\\verb, {\r\n\t|out=0, mix=0.6, room=0.8, damp=0.6|\r\n    var in;\r\n    in = In.ar(out, 2);\r\n\tin = FreeVerb.ar(in, mix, room, damp);\r\n\tOut.ar(out, Pan2.ar(in));\r\n}).add;\r\n)\r\n\r\n// PATTERNS\r\n\r\n~root = 0; // also try to use 5, 7 and 9\r\n\r\n(\r\n~violins_1st_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwrand([5,6,7],[1,0.5, 0.125].normalizeSum, inf),\r\n\t\\degree, Pxrand([1, 4, 5], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~violins_1st_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~violins_1st_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~violins_1st_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.05, 0.1, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.25].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.8, 0.2,inf)\r\n);\r\n\r\n~violins_2nd_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwhite(5,6,inf).round(1),\r\n\t\\degree, Pxrand([1, 4, 5], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~violins_2nd_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~violins_2nd_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~violins_2nd_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.05, 0.1, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.25].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.2, 0.8,inf)\r\n);\r\n\r\n~celli_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwrand([3, 4], [0.25, 1].normalizeSum, inf),\r\n\t\\degree, Pseq([1], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~celli_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~celli_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~celli_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.1, 0.2, inf),\r\n\t\\dur, Pwhite(2,7, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.125].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.3, 0.3,inf)\r\n);\r\n\r\n~basses_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, 3,\r\n\t\\degree, Pseq([1], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~basses_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~basses_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~basses_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.1, 0.2, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.125].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, 0.0\r\n);\r\n\r\n~oboes_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwhite(5,6,inf).round(1),\r\n\t\\degree, Pwrand([1,5],[0.3, 0.6], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~oboes_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~oboes_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~oboes_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.1, 0.2, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.25].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.2, 0.8,inf)\r\n);\r\n\r\n~clarinets_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwhite(5,6,inf).round(1),\r\n\t\\degree, Pwrand([1,5],[0.3, 0.6], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~clarinets_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~clarinets_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~clarinets_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.2, 0.3, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.25].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.8, 0.2,inf)\r\n);\r\n\r\n~bassoons_sus_pattern = Pbind(\r\n\t\\instrument, \\grain_buffer,\r\n\t\\scale, Scale.major,\r\n\t\\root, Pfunc({~root}),\r\n\t\\octave, Pwhite(4,5,inf).round(1),\r\n\t\\degree, Pwrand([1,5],[0.3, 0.6], inf)-1,\r\n\t\\index, Pfunc { |e| ((e.use{ ~midinote.()} - ~bassoons_sus_lowest_note-1)/3).floor },\r\n\t\\buf, Pindex(~bassoons_sus_buffers, Pkey(\\index)),\r\n\t\\rate, (Pfunc{ |e| e.use {~midinote.()}} - Pindex(~bassoons_sus_midinotes, Pkey(\\index))).midiratio,\r\n\t\\amp, Pwhite(0.1, 0.2, inf),\r\n\t\\dur, Pwhite(4,8, inf),\r\n\t\\type, Pwrand([\\note, \\rest], [1,0.25].normalizeSum, inf),\r\n\t\\atk, Pkey(\\dur) * 0.6,\r\n\t\\rel, Pkey(\\atk),\r\n\t\\out, 0,\r\n\t\\pan, Pwhite(-0.4, 0.4,inf)\r\n);\r\n)\r\n\r\n(\r\n~ensamble = Pfx(Ppar([\r\n\t~violins_1st_sus_pattern,\r\n\t~violins_2nd_sus_pattern,\r\n\t~oboes_sus_pattern,\r\n\t~clarinets_sus_pattern,\r\n\t~bassoons_sus_pattern,\r\n\t~celli_sus_pattern,\r\n\t~basses_sus_pattern\r\n],inf), \\verb).asEventStreamPlayer;\r\n)\r\n\r\n// play \r\n~ensamble.play;\r\n~ensamble.stop;",
   "is_private" : null,
   "id" : "1-5bz",
   "name" : "Orchestral Sound texture v1",
   "author" : "nicolaariutti",
   "description" : "I've used samples from the SSO (https://github.com/peastman/sso).",
   "ancestor_list" : []
}
