{
   "author" : "56228375",
   "name" : "drum sequencer to drive external midi device or software like ableton",
   "description" : "Simple drum machine in supercollider (with presets!). Even if the code is not very sophisticated, it offers some possibilities not widely available in commercial sequencers, like arbitrary polyrhythms and some control over generated timing and amplitude variations. Swing is not implemented, but most likely one can use the approach from the pattern guide. Why search the net for drum loops in your preferred tempo if you can easily generate them yourself?",
   "ancestor_list" : [],
   "labels" : [
      "pattern",
      "percussion",
      "midi",
      "drum machine",
      "preset",
      "general midi",
      "drum loops"
   ],
   "is_private" : null,
   "id" : "1-5da",
   "code" : "(\r\ns.waitForBoot({\r\n\tvar gen, swingify;\r\n\tvar presets;\r\n\tvar composite;\r\n\t\r\n\tif (MIDIClient.initialized.not) { MIDIClient.init; };\r\n\t\r\n\t// update to connect to your own midi keyboard here\r\n\t~midiout = MIDIOut.newByName(\"INTEGRA-7\", \"INTEGRA-7 MIDI 1\");\r\n\t\r\n\t~percmap = (\r\n\t\t\\laser: 27,\r\n\t\t\\whip: 28,\r\n\t\t\\scratchpush: 29,\r\n\t\t\\scratchpull: 30,\r\n\t\t\\stickclick: 31,\r\n\t\t\\metronomeclick:32,\r\n\t\t\\metronomebell:34,\r\n\t\t\\bassdrum:35,\r\n\t\t\\kickdrum:36,\r\n\t\t\\snarecrossstick:37,\r\n\t\t\\snaredrum:38,\r\n\t\t\\handclap:39,\r\n\t\t\\electricsnaredrum:40,\r\n\t\t\\floortom2:41,\r\n\t\t\\hihatclosed:42,\r\n\t\t\\floortom1:43,\r\n\t\t\\hihatfoot:44,\r\n\t\t\\lowtom:45,\r\n\t\t\\hihatopen:46,\r\n\t\t\\lowmidtom:47,\r\n\t\t\\highmidtom:48,\r\n\t\t\\crashcymbal:49,\r\n\t\t\\hightom:50,\r\n\t\t\\ridecymbal:51,\r\n\t\t\\chinacymbal:52,\r\n\t\t\\ridebell:53,\r\n\t\t\\tambourine:54,\r\n\t\t\\splashcymbal:55,\r\n\t\t\\cowbell:56,\r\n\t\t\\crashcymbal2:57,\r\n\t\t\\vibraslap:58,\r\n\t\t\\ridecymbal2:59,\r\n\t\t\\highbongo:60,\r\n\t\t\\lowbongo:61,\r\n\t\t\\congadeadstroke:62,\r\n\t\t\\conga:63,\r\n\t\t\\tumba:64,\r\n\t\t\\hightimbale:65,\r\n\t\t\\lowtimbale:66,\r\n\t\t\\highagogo:67,\r\n\t\t\\lowagogo:68,\r\n\t\t\\cabasa:69,\r\n\t\t\\maracas:70,\r\n\t\t\\whistleshort:71,\r\n\t\t\\whistlelong:72,\r\n\t\t\\guiroshort:73,\r\n\t\t\\guirolong:74,\r\n\t\t\\claves:75,\r\n\t\t\\highwoodblock:76,\r\n\t\t\\lowwoodblock:77,\r\n\t\t\\cuicahigh:78,\r\n\t\t\\cuicalow:79,\r\n\t\t\\trianglemute:80,\r\n\t\t\\triangleopen:81,\r\n\t\t\\shaker:82,\r\n\t\t\\sleighbell:83,\r\n\t\t\\belltree:84,\r\n\t\t\\castagnets:85,\r\n\t\t\\surdudeadstroke:86,\r\n\t\t\\surdu:87,\r\n\t\t\\snaredrumrod:91,\r\n\t\t\\oceandrum:92,\r\n\t\t\\snaredrumbrush:93\r\n\t);\r\n\t\r\n\tgen = {\r\n\t\t| pattern=\"x.x.\",\r\n\t\tinstrument=\\kickdrum,\r\n\t\tmidiout=nil,\r\n\t\trepeat=1,\r\n\t\tdivision=8,\r\n\t\tmidichannel=9,\r\n\t\tamplitudeerrors=0,\r\n\t\ttimingerrors=0,\r\n\t\tpercmap = nil|\r\n\t\t\r\n\t\tPn(\r\n\t\t\tPbind(\r\n\t\t\t\t\\type, \\midi,\r\n\t\t\t\t\\midicmd, \\noteOn,\r\n\t\t\t\t\\midiout, midiout,\r\n\t\t\t\t\\chan, midichannel,\r\n\t\t\t\t\\midinote, Prout({\r\n\t\t\t\t\tpattern.do({\r\n\t\t\t\t\t\t| character |\r\n\t\t\t\t\t\tif (character != $.) {\r\n\t\t\t\t\t\t\tpercmap[instrument].yield;\r\n\t\t\t\t\t\t} {\r\n\t\t\t\t\t\t\tRest(0).yield;\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}),\r\n\t\t\t\t\\amp, Prout({\r\n\t\t\t\t\tpattern.do({\r\n\t\t\t\t\t\t| character |\r\n\t\t\t\t\t\tif (character == $X) {\r\n\t\t\t\t\t\t\t(0.8 + (amplitudeerrors/2.0).rrand(amplitudeerrors/2.0.neg)).yield;\r\n\t\t\t\t\t\t} {\r\n\t\t\t\t\t\t\tif (character == $x) {\r\n\t\t\t\t\t\t\t\t(0.5 + (amplitudeerrors/2.0).rrand(amplitudeerrors/2.0.neg)).yield;\r\n\t\t\t\t\t\t\t} {\r\n\t\t\t\t\t\t\t\t0.yield;\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}),\r\n\t\t\t\t\\dur, Prout({\r\n\t\t\t\t\tvar durations = pattern.collectAs({1.0/division}, Array);\r\n\t\t\t\t\tvar totalduration = pattern.size * (1.0/division);\r\n\t\t\t\t\tvar durations_with_errors = durations.collect({\r\n\t\t\t\t\t\t| dur |\r\n\t\t\t\t\t\tdur + (timingerrors/2.0).rrand(timingerrors/2.0.neg);\r\n\t\t\t\t\t}).normalizeSum * totalduration;\r\n\t\t\t\t\tdurations_with_errors.do({ |el|\r\n\t\t\t\t\t\tel.yield;\r\n\t\t\t\t\t});\r\n\t\t\t})),\r\n\t\t\trepeat);\r\n\t};\r\n\t\r\n\t\r\n\tpresets = (\r\n\t\t\\ummtss : [\r\n\t\t\t[\"x.X.\", \\kickdrum, 4],\r\n\t\t\t[\".x.x\", \\hihatclosed, 4],\r\n\t\t],\r\n\t\t\r\n\t\t\\billiejean : [\r\n\t\t\t[\"X.......X.......\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\thefunkydrummer : [\r\n\t\t\t[\"X.X...X...X..X..\", \\kickdrum, 8],\r\n\t\t\t[\"....X..X.X.XX..X\", \\snaredrum, 8],\r\n\t\t\t[\"XXXXXXX.XXXXX.XX\", \\hihatclosed, 8],\r\n\t\t\t[\".......X.....X..\", \\hihatopen, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\impeachthepresident : [\r\n\t\t\t[\"X......XX.....X.\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.XXX...X.X.\", \\hihatclosed, 8],\r\n\t\t\t[\"..........X.....\", \\hihatopen, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\whentheleveebreaks : [\r\n\t\t\t[\"XX.....X..XX....\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.\", \\hihatclosed,8],\r\n\t\t],\r\n\t\t\r\n\t\t\\walkthisway : [\r\n\t\t\t[\"X......XX.X.....\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"..X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t\t[\"X...............\", \\hihatopen, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\itsanewday : [\r\n\t\t\t[\"X.X.......XX...X\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\papawastoo : [\r\n\t\t\t[\"X......XX.X....X\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"....X...X.X.X.XX\", \\hihatclosed, 8],\r\n\t\t\t[\"....X...........\", \\tambourine, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\thebigbeat : [\r\n\t\t\t[\"X..X..X.X.......\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"....X.......X...\", \\handclap, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\ashleysroachclip : [\r\n\t\t\t[\"X.X...X..XX.....\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X...X.X.\", \\hihatclosed, 8],\r\n\t\t\t[\"..........X.....\", \\hihatopen, 8],\r\n\t\t\t[\"XxXxXxXxXxXxXxXx\", \\tambourine, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\takemetothemardigras : [\r\n\t\t\t[\"X.........X..X..X..X......X.....\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X.......X..X.X..X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.XXX.X.X.XXX...X.XXX.X.X...\", \\hihatclosed, 8],\r\n\t\t\t[\"..............................X.\", \\hihatopen, 8],\r\n\t\t\t[\"X.X..X...X..X...X.X..X...X..X...\", \\highagogo, 8],\r\n\t\t\t[\"....X..X..X..X.X....X..X..X..X.X\", \\lowagogo, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\syntheticsubstitution : [\r\n\t\t\t[\"X.X....X.XXX...XX.X....X.XXX...X\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X.......X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t\t[\"..................X.............\", \\hihatopen, 8]\r\n\t\t],\r\n\t\t\r\n\t\t\\amenbrother : [\r\n\t\t\t[\"X.X.......XX....X.X.......XX....X.X.......X.......XX......X.....\", \\kickdrum, 8],\r\n\t\t\t[\"....X..X.X..X..X....X..X.X..X..X....X..X.X....X..X..X..X.X....X.\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.\", \\ridecymbal, 8],\r\n\t\t\t[\"..........................................................X.....\", \\hihatopen, 8]\r\n\t\t],\r\n\t\t\r\n\t\t\\apache : [\r\n\t\t\t[\"X.........X.....X.X.......X.....X.X.......X.....X.X.......X.....\", \\kickdrum, 8],\r\n\t\t\t[\"....X....X..X..X....X....X..X..X....X....X..X..X....X....X..X..X\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t\t[\"X.........X.....X.XX..........X...X.............X.....XX...X..X.\", \\conga, 8],\r\n\t\t\t[\"....X..X.X..X..X....X..X.XX.XX..X..XX..X.XX..XX....XX.......XX..\", \\congadeadstroke, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\rock1 : [\r\n\t\t\t[\"X.X...X.X.X...X.\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.\", \\hihatclosed, 8]\r\n\t\t],\r\n\t\t\r\n\t\t\\techno1 : [\r\n\t\t\t[\"X...X...X...X.X.\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\".........X......\", \\hihatclosed, 8],\r\n\t\t\t[\"...X...X...X...X\", \\hihatopen, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\hiphop1 : [\r\n\t\t\t[\"X......X..X..X.X\", \\kickdrum, 8],\r\n\t\t\t[\"....X.......X...\", \\snaredrum, 8],\r\n\t\t\t[\"X.X.X.X.X.X.X.X.\", \\hihatclosed, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\sonclave : [\r\n\t\t\t[\"X..XX..XX..XX..X\", \\kickdrum, 8],\r\n\t\t\t[\"X..X..X...X.X...\", \\stickclick, 8],\r\n\t\t\t[\"XXXXXXXXXXXXXXXX\", \\ridecymbal2, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\rumba : [\r\n\t\t\t[\"X..XX..XX..XX..X\", \\kickdrum, 8],\r\n\t\t\t[\"X..X...X..X.X...\", \\stickclick, 8],\r\n\t\t\t[\"XXXXXXXXXXXXXXXX\", \\ridecymbal2, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\bossanova : [\r\n\t\t\t[\"X..XX..XX..XX..X\", \\kickdrum, 8],\r\n\t\t\t[\"X..X..X...X..X..\", \\stickclick, 8],\r\n\t\t\t[\"XXXXXXXXXXXXXXXX\", \\ridecymbal2, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\soukous : [\r\n\t\t\t[\"X...X...X...X.X.\", \\kickdrum, 8],\r\n\t\t\t[\"X..X..X.X..X..X.\", \\stickclick, 8],\r\n\t\t\t[\"X..X..X..XX.....\", \\lowagogo, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\gahu : [\r\n\t\t\t[\"X...X...X...X.X.\", \\kickdrum, 8],\r\n\t\t\t[\"..XX..XX..XX..XX\", \\stickclick, 8],\r\n\t\t\t[\"X..X..X...X...X.\", \\lowagogo, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\shiko : [\r\n\t\t\t[\"X...X.X.X...X.X.\", \\kickdrum, 8],\r\n\t\t\t[\"..XX..XX..XX..XX\", \\stickclick, 8],\r\n\t\t\t[\"X...X.X...X.X...\", \\lowagogo, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\phasingshiko : [\r\n\t\t\t[\"X...X.X.X...X.X.\", \\kickdrum, 8],\r\n\t\t\t[\"..XX..X.X..XX..XX\", \\stickclick, 8],\r\n\t\t\t[\"X...X.X...X.X...\", \\lowagogo, 8],\r\n\t\t],\r\n\t\t\r\n\t\t\\poly : [\r\n\t\t\t[\"X.X.x.X.x.X.\", \\kickdrum, 6],\r\n\t\t\t[\"X.X.X.x.\", \\hihatclosed, 4],\r\n\t\t\t[\"X..X....x.X..x\", \\stickclick, 7],\r\n\t\t],\r\n\t\t\r\n\t);\r\n\t\r\n\tcomposite = Ppar(presets[\\ashleysroachclip].collect({|el|\r\n\t\tgen.(\r\n\t\t\tpattern: el[0],\r\n\t\t\tinstrument: el[1],\r\n\t\t\tmidiout: ~midiout,\r\n\t\t\trepeat: inf,\r\n\t\t\tdivision: el[2],\r\n\t\t\tmidichannel: 9,\r\n\t\t\tamplitudeerrors:0.1,\r\n\t\t\ttimingerrors: 0.02,\r\n\t\t\tpercmap: ~percmap);\r\n\t}));\r\n\t~player = composite.play;\r\n\t\r\n});\r\n)"
}
