Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 18th, 2012  |  syntax: None  |  size: 16.51 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. var keys = jwerty.KEYS.keys;
  2. //get a list of the keys we can represent
  3. var keyskeys = Object.keys(keys);
  4. //have event listeners on all of them (the keys of the piano)
  5. var funcs = d3.dispatch.apply(null, keyskeys); //this is mandatory
  6.  
  7. var dial1, dial2, dial3;
  8.  
  9.  
  10. var time = new Date(), dt;
  11.  
  12. function randomXToY(minVal,maxVal,floatVal)
  13. {
  14.   var randVal = minVal+(Math.random()*(maxVal-minVal));
  15.   return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal);
  16. }
  17.  
  18. tributary.init = function(g) {
  19.   time = new Date();
  20.   dial1 = Disc()
  21.     .cx(150)
  22.     .cy(200)
  23.     .bpm(120)
  24.     .hitpoints(4)
  25.     .arc_color("#B9B9B9");
  26.  
  27. dial2 = Disc()
  28.     .cx(460)
  29.     .cy(200)
  30.     .bpm(120)
  31.     .hitpoints(8)
  32.     .arc_color("#B9B9B9");
  33.  
  34. dial3 = Disc()
  35.     .cx(759)
  36.     .cy(200)
  37.     .bpm(120)
  38.     .hitpoints(16)
  39.     .ininr(42)
  40.     .inr(77)
  41.     .outr(140)
  42.     .arcw(0.25872)
  43.     .fill("#ffffff")
  44.     .arc_color("#B9B9B9")
  45.     .active_fill("#0CC74F")
  46.     .stroke("#000000")
  47.     .arc_color("#A7A7A7")
  48.         .hit_color("#ff0000")
  49.         .marker_color("#000000")
  50.  
  51.         .stroke_width(3)
  52.     .ring_width(30)
  53.     .hit_radius(20)
  54.         .hit_font_size(40);
  55.  
  56.  
  57.   var d1g = g.append("g");
  58.   var d2g = g.append("g");
  59.   var d3g = g.append("g");
  60.   dial1(d1g);
  61.   dial2(d2g);
  62.   dial3(d3g);
  63.  
  64.   ///////// viz code
  65.   var n = 60;
  66.   var nx = 10;
  67.   var xx = 13;
  68.   var yy = 417;
  69.   var xsp = 98;
  70.   var ysp = 60;
  71.   var squarew = 33;
  72.   var strokew = 4;
  73.   var minrad = .3;
  74.   var maxrad = 4;
  75.   var ci = 0;
  76.   var sci = 0;
  77.   var colors = ["#FF5353", "#08B0CF", "#FF53EA", "#3DDA63"];
  78.   var highlight_color = "#ff0000";
  79.   var stroke_colors = ["#000000", "#7A7A7A", "#999999", "#FFFFFF"];
  80.   var range = d3.range(n);
  81.   var data = [];
  82.   range.forEach(function(d,i) {
  83.     d = {
  84.       ind: i,
  85.       w: squarew
  86.     };
  87.     data.push(d);
  88.   })
  89.  
  90. var defs = g.append('defs');
  91.  
  92. var gradient = defs.append('linearGradient')
  93.     .attr('id','g320')
  94.     .attr('gradientUnits','userSpaceOnUse')
  95.     .attr('x1','0%')
  96.     .attr('x2','0%')
  97.     .attr('y1','0%')
  98.     .attr('y2',141)    
  99.    
  100. var stop1 =   gradient.append('stop')
  101.         .attr('stop-color',"#68B4CF")
  102.             .attr('offset','0')
  103.         .attr('id','stop1');
  104.  
  105. var stop2 =   gradient.append('stop')
  106.         .attr('stop-color',"#4DE3AC")
  107.             .attr('offset','1')
  108.         .attr('id','stop2');
  109.            
  110.  
  111. var text = {"message":"Hello","amplitude":1.216,"segments":26.03,"change1":0,"functionName":"Sinus", "change2" : 16.3,"a":1,"b":1,"c":0};
  112. var boolFlag = false;
  113. var circleBoundaries = d3.scale.linear().domain([0, 1489]).range([0.79, 20]);
  114. var r = 195 / 2,
  115.         data = d3.range(361).map(function(i) {
  116.                        
  117.                         var returnedValue = 1;
  118.                         var val = circleBoundaries(returnedValue);
  119.                         return  val;   
  120.                        
  121.          });
  122.        
  123.   var svg = g
  124.     .data([data])
  125.         .append("g")
  126.     .attr("transform", "translate(" + 75 + "," + 234 + ")");
  127.      
  128.   var path = svg.append("path")
  129.     .attr("id", "area")
  130.     .attr('fill',"black")
  131.     .attr('transform',"translate(300,200)")
  132.     .attr("d", d3.svg.area.radial()
  133.     .innerRadius(function(d,i) {
  134.       return 50;
  135.     })
  136.     .outerRadius(function(d) {
  137.       return r * d;
  138.     })
  139.     .angle(function(d, i) { return i / 180 * Math.PI; }))
  140.    
  141.  
  142.  
  143.   var circles = g.selectAll("rect.viz")
  144.       .data(data);
  145.  
  146.  
  147.    //shrink and grow radius within random bounds
  148.   funcs.on("c", function(dur) {
  149.         g.select("#area")
  150.       .transition()
  151.       .duration(dur)
  152.       .attr('fill','#'+Math.floor(Math.random()*16777215).toString(16))
  153.      
  154.   })
  155.    
  156.    
  157.     funcs.on("r", function(dur) {
  158.         g.select("#area")
  159.       .transition()
  160.       .duration(dur)
  161.           .attr("d", d3.svg.area.radial()
  162.     .innerRadius(function(d,i) {
  163.       return 100;
  164.     })
  165.     .outerRadius(function(d) {
  166.       return r * d;
  167.     })
  168.     .angle(function(d, i) { return i / 180 * Math.PI; }))
  169.    
  170.      
  171.   })  
  172.      
  173.     funcs.on("e", function(dur) {
  174.         g.select("#area")
  175.       .transition()
  176.       .duration(dur)
  177.           .attr("d", d3.svg.area.radial()
  178.     .innerRadius(function(d,i) {
  179.       return 10;
  180.     })
  181.     .outerRadius(function(d) {
  182.       return r * d;
  183.     })
  184.     .angle(function(d, i) { return i / 180 * Math.PI; }))
  185.    
  186.      
  187.   })  
  188.      
  189.      
  190.     funcs.on("s", function(dur) {
  191.         g.select("#area")
  192.       .transition()
  193.       .duration(dur)
  194.           .attr("d", d3.svg.area.radial()
  195.     .innerRadius(function(d,i) {
  196.       return 10;
  197.     })
  198.     .outerRadius(function(d) {
  199.       return randomXToY(86,50);
  200.     })
  201.     .angle(function(d, i) { return i / 180 * Math.PI; }))
  202.    
  203.      
  204.   })        
  205.  
  206.    
  207.     /*
  208.   g.append("text")
  209.     .classed("display", true)
  210.     .attr("transform", "translate(" + [100, 425] + ")")
  211.     .style("font-size", 100)
  212.     .text("A")
  213.  
  214.     //basic action for any keypress is to display that key
  215.    
  216.     keyskeys.forEach(function(k) {
  217.       funcs.on(k, function() {
  218.             g.select("text.display").text(k);
  219.       })
  220.     })*/
  221.       /*
  222.   funcs.on("e", function() {
  223.         g.select("text").text("E");
  224.   })
  225.   funcs.on("n", function() {
  226.         g.select("text").text("N");
  227.   })
  228.   funcs.on("j", function() {
  229.         g.select("text").text("J");
  230.   })*/
  231. };
  232.  
  233. tributary.run = function(g,t) {
  234.   old_time = time;
  235.   time = new Date();
  236.   dt = time - old_time;
  237.  
  238.   dial1.spin(dt);
  239.   dial2.spin(dt);
  240.   dial3.spin(dt);
  241.  
  242.    
  243. };
  244.  
  245.  
  246.  
  247. tributary.trace = false;
  248.  
  249.  
  250.  
  251.  
  252. //we will tell the discs what keys are pressed through these events
  253. //var keyvent = d3.dispatch("down", "up");
  254. var keyvent = new Backbone.Model();
  255.  
  256. //util function to look up human readable key from keycode
  257. var findIt = function( targetObj, target ){
  258.         for(key in targetObj){
  259.         if(targetObj.hasOwnProperty(key)){
  260.                 if(targetObj[key] === target){
  261.                 return key;
  262.             }
  263.         }
  264.     }
  265.     return null;
  266. }
  267.  
  268.    
  269. d3.select(window).on("keydown", keydown);
  270. d3.select(window).on("keyup", keyup);
  271. function keydown() {
  272.     var evt = d3.event;
  273.         var key = findIt(keys, evt.keyCode);
  274.     if(key !== null) {
  275.       //keyvent.down(key);
  276.       keyvent.trigger("down", key);
  277.     }
  278. }
  279. function keyup() {
  280.     var evt = d3.event;
  281.         var key = findIt(keys, evt.keyCode);
  282.     if(key !== null) {
  283.       console.log("up", key);
  284.       //keyvent.up(key);
  285.       keyvent.trigger("up", key);
  286.     }
  287. }
  288.  
  289.  
  290. function Disc() {
  291.   //rotating disc "sequencer"
  292.  
  293.   var bpm = 120;
  294.   //beats per revolution
  295.   var bpr = 4;
  296.   //120 bpm with 4 bpr means 2 seconds per revolution
  297.  
  298.   var hitpoints = 4;
  299.  
  300.   var events = d3.dispatch("hit");
  301.  
  302.   //position
  303.   var cx = 150;
  304.   var cy = 150;
  305.  
  306.   //radii
  307.   var ininr = 42;
  308.   var inr = 77;
  309.   var outr = 140;
  310.   var midr;
  311.  
  312.   var arcw = 0.25872;
  313.  
  314.   //skin
  315.   var fill = "#ffffff";
  316.   var active_fill = "#0CC74F";
  317.   var stroke = "#000000";
  318.   var arc_color = "#0AE5F8";
  319.   var hit_color = "#ff0000";
  320.   var marker_color = "#000000";
  321.   var colors = d3.scale.category10();
  322.  
  323.   var stroke_width = 3;
  324.   var ring_width = 30;
  325.   var hit_radius = 20;
  326.   var hit_font_size = 40;
  327.  
  328.  
  329.  
  330.   //current angle
  331.   var Θ = 0.1;
  332.   //cycle angle, and old cycle angle for calculating hits
  333.   var Θr = 0.1
  334.   var oΘr = 0.1;
  335.  
  336.   //keep track of the time
  337.   var t, ot;
  338.  
  339.   //the group this disc belongs to
  340.   var g;
  341.  
  342.   var mspb;
  343.   var arc = d3.svg.arc();
  344.  
  345.   var hitters = [];
  346.  
  347.   var active = false;
  348.   var active_key = null;
  349.  
  350.   var disc = function(group) {
  351.    
  352.     g = group;
  353.    
  354.     //[ms]/[b] = 1 [m] / x [b] * [m] * 60 [s]/[m] * 1000[ms]/[s]
  355.     //so replace x with 120 to get ms/b for 120bpm
  356.     mspb = 60 * 1000 / bpm;
  357.    
  358.     midr = inr + (outr - inr)/2;
  359.      
  360.     arc.innerRadius(inr*1.04)
  361.       .outerRadius(outr*0.98);
  362.    
  363.     for(var i = 0; i < hitpoints; i++) {
  364.       hitters.push({});
  365.     }
  366.     //var hitdata = pie(hitters);
  367.     //console.log(hitdata)
  368.     hitters.forEach(function(d,i) {
  369.       var w = 2*Math.PI/hitpoints;//Math.abs(d.endAngle - d.startAngle) / 2;
  370.       var th = i * w;
  371.  
  372.       //var center = d.startAngle;// + w/2;
  373.       var center = th;
  374.       //console.log(center, w);
  375.       //setup arcs
  376.       d.startingAngle = center - w*arcw;
  377.       d.endingAngle = center + w*arcw;
  378.       d.centeringAngle = center;
  379.      
  380.       //hit angle (when angle passes this point, we hit)
  381.       d.hit = th;
  382.       d.w = w;
  383.       d.index = i;
  384.      
  385.       //d.hit = (hitpoints - i - 1) * 2*Math.PI/hitpoints;
  386.       //d.index = hitpoints - i - 1;
  387.       d.key = "";
  388.  
  389.     })
  390.    
  391.  
  392.     var mousedown = function() {
  393.       active = true;
  394.       g.select(".inner")
  395.         .style("fill", active_fill)
  396.     };
  397.     var mouseup = function() {
  398.       active = false;
  399.       g.select(".inner")
  400.         .transition()
  401.         .duration(100)
  402.         .style("fill", fill)
  403.     };
  404.     //we need to know if a key is being held down for recording
  405.     keyvent.on("down", function(key) {
  406.       active_key = key;    
  407.     });
  408.     keyvent.on("up", function(key) {
  409.       //set whatever cycle we are on to the active key
  410.       hitters.forEach(function(d, i) {
  411.           //see if we made a hit for each one of our hits;
  412.         //console.log(i, oΘr, d.hit, Θr)
  413.           if(Θr >= d.hit && Θr <= d.hit + d.w) {
  414.             //console.log("HIT!", d.index);
  415.             events.hit(d.index);
  416.             //console.log("or", oΘr, Θr, d.index, "hit", dhit);
  417.           } else if(d.index === 0 && oΘr > Θr) {
  418.             //console.log("cycle HIT!", d.index);
  419.             events.hit(d.index);
  420.             //console.log("or", oΘr, Θr, d.index, "hit", dhit);
  421.           }
  422.       });
  423.       active_key = null;
  424.  
  425.     });
  426.      
  427.     g.attr("pointer-events", "all")
  428.       .on("mousedown", mousedown)
  429.       .on("touchstart", mousedown)
  430.       .on("mouseup", mouseup)
  431.       .on("touchend", mouseup)
  432.    
  433.       g.append("circle")
  434.       .classed("ring", true)
  435.       .attr("r", midr)
  436.       .attr("cx", cx)
  437.       .attr("cy", cy)
  438.       .style("fill", fill)
  439.       .style("stroke", stroke)
  440.       .style("stroke-width", ring_width);
  441.    
  442.      g.append("circle")
  443.       .classed("inner", true)
  444.       .attr("r", ininr)
  445.       .attr("cx", cx)
  446.       .attr("cy", cy)
  447.       .style("fill", fill)
  448.       .style("stroke", stroke)
  449.       .style("stroke-width", stroke_width);
  450.    
  451.     g.selectAll("path.hits")
  452.       .data(hitters)
  453.       .enter()
  454.       .append("path")
  455.       .classed("hits", true)
  456.       .attr("transform", "translate(" + [cx,cy] + ")")
  457.       //.attr("d", arc)
  458.       .style("fill", function(d, i) {
  459.         //return colors(i);
  460.         return arc_color;
  461.       })
  462.      
  463.      
  464.     g.selectAll("circle.hits")
  465.       .data(hitters)
  466.       .enter()
  467.       .append("circle")
  468.       .classed("hits", true)
  469.       .style("fill", "#FFFFFF")
  470.       .style("stroke", "#000000")
  471.       .style("stroke-width", 2)
  472.       .attr("r", hit_radius)
  473.     g.selectAll("text.hits")
  474.       .data(hitters)
  475.       .enter()
  476.       .append("text")
  477.       .classed("hits", true)
  478.       .style("fill", "#000000")
  479.       .style("font-size", hit_font_size)
  480.       .attr("alignment-baseline", "central")
  481.       .attr("text-anchor", "middle")
  482.  
  483.    
  484.     /*  
  485.     g.selectAll("text.numbers")
  486.       .data(hitdata)
  487.       .enter()
  488.       .append("text")
  489.       .classed("numbers", true)
  490.       .text(function(d,i) {
  491.         return d.index;
  492.       })
  493.       .style("fill", "#ff0000")
  494.         */
  495.  
  496.      
  497.     g.append("circle")
  498.       .classed("mark", true)
  499.       .style("fill", marker_color)
  500.       .attr("r", 5)
  501.    
  502.   };
  503.  
  504.  
  505.   disc.update = function() {
  506.     //update representations
  507.     var th = -Math.PI/2;
  508.     g.select("circle.mark")
  509.       .attr("cx", cx + ininr * Math.cos(-Θ - th*2))
  510.       .attr("cy", cy + ininr * Math.sin(-Θ - th*2))
  511.      
  512.  
  513.     g.selectAll("path.hits")
  514.       .attr("d", arc)
  515.      
  516.     g.selectAll("text.hits")
  517.       .attr("transform", function(d,i) {
  518.         var x = cx + midr * Math.cos(d.centerAngle + th);
  519.         var y = cy + midr * Math.sin(d.centerAngle + th);
  520.         return "translate(" + [x,y] + ")";
  521.       })
  522.     .text(function(d) {
  523.                 return d.key;
  524.       })
  525.     g.selectAll("circle.hits")
  526.       .attr("transform", function(d,i) {
  527.         var x = cx + midr * Math.cos(d.centerAngle + th);
  528.         var y = cy + midr * Math.sin(d.centerAngle + th);
  529.         return "translate(" + [x,y] + ")";
  530.       })
  531.      
  532.      
  533.       /*g.selectAll("text.numbers")
  534.         .attr("transform", function(d,i) {
  535.         var x = cx + midr * Math.cos(d.centerAngle + th);
  536.         var y = cy + midr * Math.sin(d.centerAngle + th);
  537.         return "translate(" + [x,y] + ")";
  538.       })*/
  539.  
  540.   }
  541.  
  542.   disc.spin = function(dt) {
  543.     //ot = t;
  544.     //t += dt;
  545.     oΘ = Θ;
  546.     //spin the disc by dt (in miliseconds)
  547.     //we want to make bpr revolutions per beat
  548.     //so we need to calculate how much to rotate each update
  549.     Θ +=  (2*Math.PI) * dt / mspb / bpr;
  550.    
  551.     //see where in the cycle we are
  552.     oΘr = Θr;
  553.     Θr = Math.abs(Θ + Math.PI/2) % (2*Math.PI);
  554.     //console.log(Θr,oΘr);
  555.  
  556.     //console.log("or", oΘr, Θr);
  557.    
  558.     hitters.forEach(function(d, i) {
  559.         var th = -Θ -Math.PI/2
  560.         d.startAngle = th + d.startingAngle;
  561.         d.endAngle = th + d.endingAngle;
  562.             d.centerAngle = th + d.centeringAngle;
  563.             //see if we made a hit for each one of our hits;
  564.       //console.log(i, oΘr, d.hit, Θr)
  565.         if(d.hit > oΘr && d.hit <= Θr) {
  566.           //console.log("HIT!", d.index);
  567.           events.hit(d.index);
  568.           //console.log("or", oΘr, Θr, d.index, "hit", dhit);
  569.         } else if(d.index === 0 && oΘr > Θr) {
  570.           //console.log("cycle HIT!", d.index);
  571.           events.hit(d.index);
  572.           //console.log("or", oΘr, Θr, d.index, "hit", dhit);
  573.         }
  574.      
  575.     });
  576.    
  577.     events.on("hit", function(hit) {
  578.       //console.log("hit", hit, hitkeys[hit]);
  579.       if(active) {
  580.         //listen on keyboard events (if active) and assign
  581.         //letters to whatever hits happen
  582.         //also have erase
  583.         if(active_key === "space") {
  584.           hitters[hit].key = "";
  585.         }
  586.         else if(active_key !== null) {
  587.           //record a key if pressed
  588.           //hitkeys[hit] = active_key;
  589.           //console.log("save", hit, active_key);
  590.           hitters[hit].key = active_key;
  591.         }
  592.       }
  593.       if(hitters[hit].key !== "") {
  594.          //console.log(hit, hitters[hit].key)
  595.              funcs[hitters[hit].key](mspb);
  596.       }
  597.      
  598.      
  599.       g.selectAll("path.hits")
  600.         .filter(function(d) {
  601.           return d.index === hit;
  602.         })
  603.         .style("fill", hit_color)
  604.         .transition()
  605.         .duration(100)
  606.         .style("fill", arc_color);
  607.       /*
  608.       g.selectAll("circle.hits")
  609.         .filter(function(d) {
  610.           return d.index === hit;
  611.         })
  612.         .style("fill", hit_color)
  613.         .transition()
  614.         .duration(100)
  615.         .style("fill", fill);
  616.       */
  617.     })
  618.        
  619.     disc.update();
  620.   };
  621.  
  622.   disc.hitpoints = function(value) {
  623.     if (!arguments.length) { return hitpoints; }
  624.     hitpoints = value;
  625.     return disc;
  626.   };
  627.   disc.bpm = function(value) {
  628.     if (!arguments.length) { return bpm; }
  629.     bpm = value;
  630.     return disc;
  631.   };
  632.   disc.cx = function(value) {
  633.     if (!arguments.length) { return cx; }
  634.     cx = value;
  635.     return disc;
  636.   };
  637.   disc.cy = function(value) {
  638.     if (!arguments.length) { return cy; }
  639.     cy = value;
  640.     return disc;
  641.   };
  642.  
  643.  
  644.    //radii
  645.   disc.ininr = function(value) {
  646.     if (!arguments.length) { return ininr; }
  647.     ininr = value;
  648.     return disc;
  649.   };
  650.   disc.inr = function(value) {
  651.     if (!arguments.length) { return inr; }
  652.     inr = value;
  653.     return disc;
  654.   };
  655.   disc.outr = function(value) {
  656.     if (!arguments.length) { return outr; }
  657.     outr = value;
  658.     return disc;
  659.   };
  660.   disc.arcw = function(value) {
  661.     if (!arguments.length) { return arcw; }
  662.     arcw = value;
  663.     return disc;
  664.   };
  665.  
  666.   //skin
  667.   disc.fill = function(value) {
  668.     if (!arguments.length) { return fill; }
  669.     fill = value;
  670.     return disc;
  671.   };
  672.   disc.active_fill = function(value) {
  673.     if (!arguments.length) { return active_fill; }
  674.     active_fill = value;
  675.     return disc;
  676.   };
  677.   disc.stroke = function(value) {
  678.     if (!arguments.length) { return stroke; }
  679.     stroke = value;
  680.     return disc;
  681.   };
  682.   disc.arc_color = function(value) {
  683.     if (!arguments.length) { return arc_color; }
  684.     arc_color = value;
  685.     return disc;
  686.   };
  687.   disc.hit_color = function(value) {
  688.     if (!arguments.length) { return hit_color; }
  689.     hit_color = value;
  690.     return disc;
  691.   };
  692.   disc.marker_color = function(value) {
  693.     if (!arguments.length) { return marker_color; }
  694.     marker_color = value;
  695.     return disc;
  696.   };
  697.  
  698.   disc.stroke_width = function(value) {
  699.     if (!arguments.length) { return stroke_width; }
  700.     stroke_width = value;
  701.     return disc;
  702.   };
  703.   disc.ring_width = function(value) {
  704.     if (!arguments.length) { return ring_width; }
  705.     ring_width = value;
  706.     return disc;
  707.   };
  708.   disc.hit_radius = function(value) {
  709.     if (!arguments.length) { return hit_radius; }
  710.     hit_radius = value;
  711.     return disc;
  712.   };
  713.   disc.hit_font_size = function(value) {
  714.     if (!arguments.length) { return hit_font_size; }
  715.     hit_font_size = value;
  716.     return disc;
  717.   };
  718.  
  719.  
  720.   return disc;
  721.  
  722. }