{
   "labels" : [
      "jazz",
      "guitar",
      "moog",
      "pluck",
      "bossa",
      "bossa nova",
      "insensatez",
      "chords"
   ],
   "id" : "1-55l",
   "is_private" : null,
   "code" : "//based on Andrea Valle class for jazz chords originally posted here: https://gist.github.com/vanderaalle/4a638991d313b20fc638f172e3b29add\r\n\r\n//also available here: https://gist.github.com/zepadovani/9f6f714a5dec827be2e0ad11a9e4a552\r\n\r\n//Class: (see bossa nova example below)\r\n\r\nPopChord {\r\n\tvar <>symbol, <>root, <>name, <>structure, <>transp ;\r\n\tclassvar <>symbols ;\r\n\tclassvar <>decay, <>release ;\r\n\r\n\t*initClass {\r\n\t\tvar t ;\r\n\t\tdecay = 0.5;\r\n\t\trelease = 0.5 ;\r\n\t\tsymbols = () ;\r\n\t\tt = \" CM M Cmaj\t{0,4,7}\r\nCm C- Cmin\t{0,3,7}\r\nC+ Caug CM#5 CM+5 C5+\t{0, 4, 8}\r\nC° Cº Cdim Cmb5 Cm˚5 Cmº5\t{0, 3, 6}\r\nC7 Cdom7\t{0, 4, 7, 10}\r\nCM7 C7M CMa7 Cj7 Cmaj7 C7+\t{0, 4, 7, 11}\r\nCmM7 Cm7M Cm#7 C−M7 Cminmaj7 Cm7+\t{0, 3, 7, 11}\r\nCm7 C-7 Cmin7\t{0, 3, 7, 10}\r\nC+M7 C+7M Caugmaj7 CM7#5 CM7+5 C7M#5 C7M5+\t{0, 4, 8, 11}\r\nC+7 Caug7 C7#5 C7+5\t{0, 4, 8, 10}\r\nCØ CØ7 Cø Cø7 Cmin7dim5 Cm7b5 Cm7°5 C−7b5 C−7°5\t{0, 3, 6, 10}\r\nCo7 C°7 Cdim7\t{0, 3, 6, 9}\r\nC7b5 Cdom7dim5\t{0, 4, 6, 10}\r\nCM9 Cmaj9 C7M9 C7M(9) CM7(9)\t{0, 4, 7, 11, 14}\r\nC9 Cdom9 C79 C7(9)\t{0, 4, 7, 10, 14}\r\nCmM9 C−M9 Cminmaj9 Cm7M(9) CmM7(9)\t{0, 3, 7, 11, 14}\r\nCm9 C−9 Cmin9 Cm7(9)\t{0, 3, 7, 10, 14}\r\nC+M9 Caugmaj9\t{0, 4, 8, 11, 14}\r\nC+9 C9#5 Caug9\t{0, 4, 8, 10, 14}\r\nCØ9\t{0, 3, 6, 10, 14}\r\nCØ9b9\t{0, 3, 6, 10, 13}\r\nCº9 C°9 Cdim9\t{0, 3, 6, 9, 14}\r\nC°b9 Cºb9 Cdimb9\t{0, 3, 6, 9, 13}\r\nC4\t{0, 4, 7, 5}\r\nC11 Cdom11\t{0, 4, 7, 10, 14, 17}\r\nC4+ C+4\t{0, 4, 7, 6}\r\nC7(11)\t{0, 4, 7, 10, 17}\r\nCM11 Cmaj11\t{0, 4, 7, 11, 14, 17}\r\nCmM11 C−M11 Cminmaj11\t{0, 3, 7, 11, 14, 17}\r\nCm4\t{0, 3, 7, 5}\r\nCm7(11)\t{0, 3, 7, 10, 17}\r\nCm11 C−11 Cmin11\t{0, 3, 7, 10, 14, 17}\r\nC+M11 Caugmaj11\t{0, 4, 8, 11, 14, 17}\r\nC+11 C11#5 Caug11\t{0, 4, 8, 10, 14, 17}\r\nCØ11\t{0, 3, 6, 10, 13, 17}\r\nC°11 Cº11\t{0, 3, 6, 9, 13, 16}\r\nCM13 Cmaj13\t{0, 4, 7, 11, 14, 17, 21}\r\nC13 Cdom13\t{0, 4, 7, 10, 14, 17, 21}\r\nCmM13 C−M13 Cminmaj13\t{0, 3, 7, 11, 14, 17, 21}\r\nCm13 C−13 Cmin13\t{0, 3, 7, 10, 14, 17, 21}\r\nC+M13 Caugmaj13\t{0, 4, 8, 11, 14, 17, 21}\r\nC+13 C13#5 Caug13\t{0, 4, 8, 10, 14, 17, 21}\r\nCØ13\t{0, 3, 6, 10, 14, 17, 21}\r\nC6 CM6\t{0,4,7,9}\r\nC-6 CM-6 C6- CM6-\t{0,4,7,8}\r\nCm6 Cminmaj6\t{0,3,7,9}\r\nCm-6 Cm6-\t{0,3,7,8}\r\nC7#9  C7(#9)\t{0, 4, 7, 10, 15}\r\nC7b9  C7(b9)\t{0, 4, 7, 10, 13}\r\nC7#11 C7(#11)\t{0, 4, 7, 10, 19}\r\nC7b11 C7(b11)\t{0, 4, 7, 10, 17}\r\nC7b13 C7(b13)\t{0, 4, 7, 10, 20}\"\r\n\t\t.split($\\n)\r\n\t\t.collect{|i| i.split($\\t)}.collect{|i|\r\n\t\t\t[\r\n\t\t\t\ti[0].split($\\ ).collect{|j|\r\n//\t\t\t\t\t(j != \"C\").if({\r\n\t\t\t\t\t\tj.replace(\"C\", \"\").asSymbol\r\n\r\n//\t\t\t\t})\r\n\t\t\t\t},\r\n\t\t\t\ti[1].replace(\"{\", \"[\").replace(\"}\", \"]\").interpret\r\n\r\n\t\t\t]\r\n\t\t}.collect{|ch|\r\n\t\t\tch[0].do{|key|\r\n\t\t\t\tsymbols[key] = ch[1]\r\n\t\t\t}\r\n\t\t};\r\n//\t\tt[0].add(\" \");\r\n/*\t\tt.postln;\r\n\t\tsymbols.postln;*/\r\n\r\n\t}\r\n\r\n\t*new { arg symbol;\r\n\t\t^super.new.initC(symbol)\r\n\t}\r\n\r\n\t*audio {\r\n\r\n\t\tServer.local.waitForBoot{\r\n\t\t\tSynthDef(\\piano, {|note = 60, vol = -6, decay, release|\r\n\t\t\t\tOut.ar(0,\r\n\t\t\t\t\tMdaPiano.ar(note.midicps, decay:decay, release:release)* vol.dbamp*Line.kr(1,1,6, doneAction:2))\r\n\t\t\t}).add\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t~getbass = {arg symbol ;\r\n\r\n\tvar hasdifbass,bass;\r\n\thasdifbass = symbol.includes($/);\r\n\tbass = ~getRoot.(symbol.split($/).at(1);\r\n\tbass;\r\n\t}*/\r\n\tinitC { arg aSymbol ;\r\n\t\tvar data, sus, add ;\r\n\t\tvar hasOtherBass=false, bass, bassString, bassIsLetter=false;\r\n\t\tvar numBassDict;\r\n\t\tnumBassDict = Dictionary.with(*[\r\n\t\t\t\"4\".asSymbol->5,\r\n\t\t\t\"4+\".asSymbol->6,\r\n\t\t\t\"+4\".asSymbol->6,\r\n\t\t\t\"5-\".asSymbol->6,\r\n\t\t\t\"-5\".asSymbol->6,\r\n\t\t\t\"5°\".asSymbol->6,\r\n\t\t\t\"5º\".asSymbol->6,\r\n\t\t\t\"5\".asSymbol->7,\r\n\t\t\t\"5+\".asSymbol->8,\r\n\t\t\t\"+5\".asSymbol->8,\r\n\t\t\t\"6\".asSymbol->9,\r\n\t\t\t\"7-\".asSymbol->9,\r\n\t\t\t\"-7\".asSymbol->9,\r\n\t\t\t\"7°\".asSymbol->9,\r\n\t\t\t\"7º\".asSymbol->9,\r\n\t\t\t\"6+\".asSymbol->10,\r\n\t\t\t\"+6\".asSymbol->10,\r\n\t\t\t\"7\".asSymbol->10,\r\n\t\t\t\"7+\".asSymbol->11,\r\n\t\t\t\"+7\".asSymbol->11,\r\n\t\t\t\"9-\".asSymbol->1,\r\n\t\t\t\"-9\".asSymbol->1,\r\n\t\t\t\"9\".asSymbol->2,\r\n\t\t\t\"9\".asSymbol->2,\r\n\t\t\t\"9+\".asSymbol->3,\r\n\t\t\t\"+9\".asSymbol->3,\r\n\t\t\t\"-10\".asSymbol->3,\r\n\t\t\t\"10-\".asSymbol->3,\r\n\t\t\t\"10\".asSymbol->4,\r\n\t\t\t\"+10\".asSymbol->5,\r\n\t\t\t\"10+\".asSymbol->5,\r\n\t\t\t\"11-\".asSymbol->4,\r\n\t\t\t\"-11\".asSymbol->4,\r\n\t\t\t\"11\".asSymbol->5,\r\n\t\t\t\"11+\".asSymbol->6,\r\n\t\t\t\"+11\".asSymbol->6,\r\n\t\t\t\"13-\".asSymbol->8,\r\n\t\t\t\"-13\".asSymbol->8,\r\n\t\t\t\"13\".asSymbol->9,\r\n\t\t\t\"13+\".asSymbol->10,\r\n\t\t\t\"+13\".asSymbol->10,\r\n\t\t]);\r\n\r\n\t\tsymbol = aSymbol ;\r\n\t\ttransp = 60 ;\r\n\t\tdata =  this.getRoot(symbol.asString) ;\r\n\t\thasOtherBass = symbol.asString.includes($/);\r\n\t\troot = data[0] ;\r\n\t\tname = data[1];\r\n\t\t//\t\thasOtherBass.postln;\r\n\t\thasOtherBass.if({\r\n\t\t\tstructure = symbols[symbol.asString.split($/).at(0).replace(name.asString, \"\")\r\n\t\t\t\t.replace(\"sus\", \"@\").split($@)[0]\r\n\t\t\t\t.replace(\"add\", \"@\").split($@)[0]\r\n\t\t\t\t.asSymbol] ;\r\n\t\t\tbassString = (symbol.asString.split($/).at(1));\r\n\t\t\t((bassString.at(0).ascii >= 65) && (bassString.at(0).ascii <= 71)).if({\r\n\t\t\t\tbassIsLetter = true;\r\n\t\t\t});\r\n\t\t\tbassIsLetter.if({\r\n\t\t\t\tbass =  this.getRoot(bassString)[0] - root;\r\n\t\t\t},{\r\n\t\t\t\tbass = numBassDict.at(bassString.asSymbol);\r\n\t\t\t}\r\n\t\t\t);\r\n\t\t},{\r\n\t\t\tstructure = symbols[symbol.asString.replace(name.asString, \"\")\r\n\t\t\t\t.replace(\"sus\", \"@\").split($@)[0]\r\n\t\t\t\t.replace(\"add\", \"@\").split($@)[0]\r\n\t\t\t\t.asSymbol] ;\r\n\t\t}\r\n\t\t) ;\r\n//\t\tstructure.postln;\r\n\t\tstructure = structure.collect({arg i; i.asInteger});\r\n\t\tsus = this.processSus(symbol) ;\r\n\t\tif (sus.notNil) {\r\n\t\t\tstructure.remove(3) ;\r\n\t\t\tstructure.remove(4) ;\r\n\t\t\tstructure.add(sus.asInteger)\r\n\t\t} ;\r\n\t\tadd = this.processAdd(symbol) ;\r\n\t\tif (add.notNil) {\r\n\t\t\tstructure.add(add.asInteger)\r\n\t\t} ;\r\n\r\n\t\tif (bass.notNil) {\r\n\t\t\tstructure = [bass] ++ structure;\r\n\t\t} ;\r\n\r\n\r\n\t\t//\r\n\t}\r\n\r\n\tprocessSus {|symbol|\r\n\t\tvar sus = nil ;\r\n\t\tif (symbol.asString.contains(\"sus\")){\r\n\t\t\tsus = symbol.asString.replace(\"sus\", \"@\").split($@)[1];\r\n\t\t\tcase\r\n\t\t\t{sus == \"\"}{sus = 5}\r\n\t\t\t{sus == [4]}{sus = 5}\r\n\t\t\t{sus == [2]}{sus = 2}\r\n\t\t} ;\r\n\t\t^sus\r\n\t}\r\n\r\n\tprocessAdd {|symbol|\r\n\t\tvar add = nil ;\r\n\t\tvar base ;\r\n\t\tvar dict = (\\9: 14, \\11: 17, \\13: 21) ;\r\n\t\tif (symbol.asString.contains(\"add\")){\r\n\t\t\tadd = symbol.asString.replace(\"add\", \"@\").split($@)[1];\r\n\t\t\tbase = dict[add.replace(\"b\", \"\").replace(\"#\", \"\").asSymbol] ;\r\n\t\t\tadd.postln ;\r\n\t\t\tcase {add.split($b)[1].notNil}{\r\n\t\t\t\tadd = base-1 ;\r\n\t\t\t\t\"flatten\".postln\r\n\t\t\t}\r\n\t\t\t{add.split($#)[1].notNil}{\r\n\t\t\t\tadd = base+1 ;\r\n\t\t\t\t\"sharpen\".postln\r\n\t\t\t}\r\n\t\t\t{(add.split($#)[1].isNil) && (add.split($b)[1].isNil) }\r\n\t\t\t{add = base;\r\n\t\t\t\t\"no alt\".postln\r\n\t\t\t}\r\n\t\t} ;\r\n\t\t^add\r\n\t}\r\n\r\n\t// c = C('CMadd9') ; // c.structure\r\n\r\n\tgetRoot  { arg symbol ;\r\n\t\tvar chr, act, root, rootName, alt ;\r\n\t\tvar noteBase = (\\C:0,\\D:2,\\E:4,\\F:5,\\G:7,\\A:9,\\B:11) ;\r\n\t\tname = symbol[0] ;\r\n\t\troot = noteBase[name.asSymbol] ;\r\n\t\tif ([$b, $#].includes(symbol[1]) ){\r\n\t\t\tname = name++symbol[1] ;\r\n\t\t\troot = root + [-1,1][[$b, $#].indexOf(symbol[1])]\r\n\t\t} ;\r\n\t\t^[root, name.asSymbol] ;\r\n\t}\r\n\r\n\tplay {|vol = -9|\r\n\t\t(transp+structure+root).do{|i|\r\n\t\t\tSynth(\\piano,  [\\note, i, \\vol, vol, \\decay, decay, \\release, release])\r\n\t\t}\r\n\t}\r\n\r\n\tchordPitches {arg oct=4, men=0;\r\n\t\tvar last;\r\n\t\tvar sum = 0;\r\n\t\tvar out;\r\n\t\tout = (structure.collect({arg i,j;\r\n\t\t\t(j == 0).if({\r\n\t\t\t\tlast = i;\r\n\t\t\t},{\r\n\t\t\t\t(i < last).if({\r\n\t\t\t\t\tsum = sum + 12;\r\n\t\t\t\t\tlast = i;\r\n\t\t\t\t\ti = i + sum;\r\n\t\t\t\t},{\r\n\t\t\t\t\ti = i + sum;\r\n\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t\ti - men\r\n\t\t})) + root + 12 + (oct*12);\r\n\t\t^out\r\n\t}\r\n\r\n\r\n}\r\n\r\n/*\r\n(\r\nSynthDef(\\moogpluck, {arg outbus=0, freq=440, filter=3, amp=1,coef=0.5,dur=2,legato=1,mix=0,pan=0;\r\n\tvar pluck,moog,noteOff,out;\r\n\tpluck =\tPluck.ar(PinkNoise.ar,1,0.2,freq.reciprocal,dur*legato,coef);\r\n\tmoog = MoogFF.ar(pluck, (freq*filter),2);\r\n\tout = SelectX.ar(mix,[LPF.ar(pluck,2500),moog]);\r\n\tnoteOff = DetectSilence.ar(out,doneAction:2);\r\n\tOut.ar(outbus, Pan2.ar(out,pan));\r\n}).add;\r\n)\r\n\r\n(\r\n{var chordnotes,bass,up;\r\n\t// https://www.youtube.com/watch?v=PHIe9B5plDI :))\r\n\tvar insensatez = \"Bm7 F#/A# Am6 E7/G# G6 C7M/G C#m7/5- F#7(b13) Bm7 D7/A G#º G7M Em7(9) Bm7 D7/A C#7/G# G7M/5- F#7(b13) Bm7 Bm7 F#/A# Am6 E7/G# G6 C7M C#m7/5- F#7(b13) Bm7 D7/A G#º G7M Em7(9) Bm7 D7/A C#7/G# G7M/5- F#7(b13) Bm7\";\r\n\tvar beatmul = (1!18 ++ 1.2 ++ 1!18 ++ 1.2).flat + ({(0.01).rand2}!insensatez.size);\r\n\tvar upswing = 0.02;\r\n\tvar insensatezsplit = insensatez.split($ );\r\n\tvar insensatezChords = insensatezsplit.collect({arg i; PopChord(i)});\r\n\r\n\tinf.do({arg j;\r\n\t\tinsensatezsplit[j.mod(insensatezsplit.size)].post;\r\n\t\t\"\\t\".post;\r\n\t\tchordnotes = insensatezChords[j.mod(insensatezsplit.size)].chordPitches(2);\r\n\r\n\t\tchordnotes.midiname.postln;\r\n\t\tchordnotes = chordnotes;\r\n\t\tbass= [chordnotes[0]] ++ [chordnotes[1]] ++ [chordnotes[0]];\r\n\t\tup= [chordnotes[0]] ++ [chordnotes.copyToEnd(2)] ++ [chordnotes.copyToEnd(2)];\r\n\r\n\t\tPbind(\\instrument, \\moogpluck,\r\n\t\t\t\\freq, Pseq((bass).midicps,1),\r\n\t\t\t\\amp, Pwhite(-2.0,0,3).dbamp,\r\n\t\t\t\\dur, Pseq([0.5,0.5,1]*beatmul[j.mod(insensatezsplit.size)],1),\r\n\t\t\t\\legato,2,\r\n\t\t\t\\pan, Pwhite(-0.1,-0.3,3),\r\n\t\t\t\\mix, Pwhite(0.2,0.3,3),\r\n\t\t).play;\r\n\r\n\t\tPbind(\\instrument, \\moogpluck,\r\n\t\t\t\\freq, Pseq(up.midicps,1),\r\n\t\t\t\\amp, Pwhite(-10,-8,3).dbamp,\r\n\t\t\t\\dur,Pseq(([0.5,0.75,0.75]*beatmul[j.mod(insensatezsplit.size)]),1) + Pwhite(0 - upswing,upswing,3),\r\n\t\t\t\\coef,0.2,\r\n\t\t\t\\legato,6,\r\n\t\t\t\\mix, Pwhite(0.7,0.8,3),\r\n\t\t\t\\pan, Pwhite(0.1,0.3,3)\r\n\t\t).play;\r\n\r\n\t\t(2*beatmul[j.mod(insensatezsplit.size)]).wait;\r\n\t});\r\n}.fork\r\n)\r\n)*/",
   "author" : "zepadovani",
   "name" : "Bossa Nova + PopChord class",
   "description" : "",
   "ancestor_list" : []
}
