Skip to content

Instantly share code, notes, and snippets.

@emkay
Last active June 28, 2016 00:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emkay/2f30bb7b4d2b7586678f4053416463e0 to your computer and use it in GitHub Desktop.
Save emkay/2f30bb7b4d2b7586678f4053416463e0 to your computer and use it in GitHub Desktop.
requirebin sketch
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
const drummer = require('drummer')()
const kick = drummer.kick
const snare = drummer.snare
const hihat = drummer.hihat
function bar (time) {
if (time >= 20) return
kick.hit(0 + time)
hihat.hit(0 + time)
hihat.hit(0.25 + time)
kick.hit(0.5 + time)
snare.hit(0.5 + time)
hihat.hit(0.5 + time)
hihat.hit(0.75 + time)
kick.hit(1 + time)
hihat.hit(1 + time)
hihat.hit(1.25 + time)
kick.hit(1.5 + time)
snare.hit(1.5 + time)
hihat.hit(1.5 + time)
hihat.hit(1.75 + time)
kick.hit(2 + time)
hihat.hit(2 + time)
hihat.hit(2.25 + time)
kick.hit(2.5 + time)
snare.hit(2.5 + time)
hihat.hit(2.5 + time)
snare.hit(2.75 + time)
return bar(time + 3)
}
bar(0)
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
module.exports = Hihat
function Hihat (context, opts) {
this.context = context
}
Hihat.prototype.hit = function hit (time) {
const context = this.context
const fundamental = 40
const ratios = [2, 3, 4.16, 5.43, 6.79, 8.21]
const now = context.currentTime + time
const gain = context.createGain()
const bandpass = context.createBiquadFilter()
bandpass.type = 'bandpass'
bandpass.frequency.value = 10000
const highpass = context.createBiquadFilter()
highpass.type = 'highpass'
highpass.frequency.value = 7000
bandpass.connect(highpass)
highpass.connect(gain)
gain.connect(context.destination)
ratios.forEach((ratio) => {
const oscillator = context.createOscillator()
oscillator.type = 'square'
oscillator.frequency.value = fundamental * ratio
oscillator.connect(bandpass)
oscillator.start(now)
oscillator.stop(now + 0.3)
})
gain.gain.setValueAtTime(0.00001, now)
gain.gain.exponentialRampToValueAtTime(1, now + 0.02)
gain.gain.exponentialRampToValueAtTime(0.3, now + 0.03)
gain.gain.exponentialRampToValueAtTime(0.00001, now + 0.3)
}
},{}],2:[function(require,module,exports){
module.exports = Kick
function Kick (context, opts) {
opts = opts || {}
this.context = context
this.type = opts.type || 'sine'
}
Kick.prototype.hit = function hit (time, opts) {
opts = opts || {}
const oscillator = this.context.createOscillator()
const gain = this.context.createGain()
const totalTime = time + this.context.currentTime
oscillator.type = this.type
oscillator.connect(gain)
gain.connect(this.context.destination)
oscillator.frequency.setValueAtTime(150, totalTime)
gain.gain.setValueAtTime(1, time)
oscillator.frequency.exponentialRampToValueAtTime(0.01, totalTime + 0.5)
gain.gain.exponentialRampToValueAtTime(0.01, totalTime + 0.5)
oscillator.start(totalTime)
oscillator.stop(totalTime + 0.5)
}
},{}],3:[function(require,module,exports){
var window = require('global/window');
var Context = window.AudioContext || window.webkitAudioContext;
if (Context) module.exports = new Context;
},{"global/window":4}],4:[function(require,module,exports){
(function (global){
if (typeof window !== "undefined") {
module.exports = window;
} else if (typeof global !== "undefined") {
module.exports = global;
} else {
module.exports = {};
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9hdWRpby1jb250ZXh0L25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG59IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge307XG59XG4iXX0=
},{}],5:[function(require,module,exports){
module.exports = Snare
function Snare (context, opts) {
opts = opts || {}
this.context = context
}
Snare.prototype.createBuffer = function createBuffer () {
const bufferSize = this.context.sampleRate
const buffer = this.context.createBuffer(1, bufferSize, this.context.sampleRate)
let output = buffer.getChannelData(0)
for (let i = 0; i < bufferSize; i++) {
output[i] = Math.random() * 2 - 1
}
return buffer
}
Snare.prototype.hit = function hit (time) {
const noise = this.context.createBufferSource()
noise.buffer = this.createBuffer()
const noiseFilter = this.context.createBiquadFilter()
noiseFilter.type = 'highpass'
noiseFilter.frequency.value = 1000
noise.connect(noiseFilter)
const noiseEnvelope = this.context.createGain()
noiseFilter.connect(noiseEnvelope)
noiseEnvelope.connect(this.context.destination)
const oscillator = this.context.createOscillator()
oscillator.type = 'triangle'
const oscEnvelope = this.context.createGain()
oscillator.connect(oscEnvelope)
oscEnvelope.connect(this.context.destination)
noiseEnvelope.gain.setValueAtTime(1, time)
noiseEnvelope.gain.exponentialRampToValueAtTime(0.01, time + 0.2)
noise.start(time)
oscillator.frequency.setValueAtTime(100, time)
oscEnvelope.gain.setValueAtTime(0.7, time)
oscEnvelope.gain.exponentialRampToValueAtTime(0.01, time + 0.1)
oscillator.start(time)
oscillator.stop(time + 0.2)
noise.stop(time + 0.2)
}
},{}],"drummer":[function(require,module,exports){
const context = require('audio-context')
const Kick = require('./kick')
const Snare = require('./snare')
const Hihat = require('./hihat')
function Drummer (options) {
options = options || {}
if (!(this instanceof Drummer)) return new Drummer(options)
const kick = new Kick(context, options.kick)
const snare = new Snare(context, options.snare)
const hihat = new Hihat(context, options.hihat)
return {
kick,
snare,
hihat,
context
}
}
module.exports = Drummer
},{"./hihat":1,"./kick":2,"./snare":5,"audio-context":3}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImhpaGF0LmpzIiwia2ljay5qcyIsIm5vZGVfbW9kdWxlcy9hdWRpby1jb250ZXh0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2F1ZGlvLWNvbnRleHQvbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCJzbmFyZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJtb2R1bGUuZXhwb3J0cyA9IEhpaGF0XG5cbmZ1bmN0aW9uIEhpaGF0IChjb250ZXh0LCBvcHRzKSB7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbn1cblxuSGloYXQucHJvdG90eXBlLmhpdCA9IGZ1bmN0aW9uIGhpdCAodGltZSkge1xuICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0XG4gIGNvbnN0IGZ1bmRhbWVudGFsID0gNDBcbiAgY29uc3QgcmF0aW9zID0gWzIsIDMsIDQuMTYsIDUuNDMsIDYuNzksIDguMjFdXG4gIGNvbnN0IG5vdyA9IGNvbnRleHQuY3VycmVudFRpbWUgKyB0aW1lXG4gIGNvbnN0IGdhaW4gPSBjb250ZXh0LmNyZWF0ZUdhaW4oKVxuXG4gIGNvbnN0IGJhbmRwYXNzID0gY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKVxuICBiYW5kcGFzcy50eXBlID0gJ2JhbmRwYXNzJ1xuICBiYW5kcGFzcy5mcmVxdWVuY3kudmFsdWUgPSAxMDAwMFxuXG4gIGNvbnN0IGhpZ2hwYXNzID0gY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKVxuICBoaWdocGFzcy50eXBlID0gJ2hpZ2hwYXNzJ1xuICBoaWdocGFzcy5mcmVxdWVuY3kudmFsdWUgPSA3MDAwXG5cbiAgYmFuZHBhc3MuY29ubmVjdChoaWdocGFzcylcbiAgaGlnaHBhc3MuY29ubmVjdChnYWluKVxuICBnYWluLmNvbm5lY3QoY29udGV4dC5kZXN0aW5hdGlvbilcblxuICByYXRpb3MuZm9yRWFjaCgocmF0aW8pID0+IHtcbiAgICBjb25zdCBvc2NpbGxhdG9yID0gY29udGV4dC5jcmVhdGVPc2NpbGxhdG9yKClcbiAgICBvc2NpbGxhdG9yLnR5cGUgPSAnc3F1YXJlJ1xuICAgIG9zY2lsbGF0b3IuZnJlcXVlbmN5LnZhbHVlID0gZnVuZGFtZW50YWwgKiByYXRpb1xuICAgIG9zY2lsbGF0b3IuY29ubmVjdChiYW5kcGFzcylcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KG5vdylcbiAgICBvc2NpbGxhdG9yLnN0b3Aobm93ICsgMC4zKVxuICB9KVxuXG4gIGdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjAwMDAxLCBub3cpXG4gIGdhaW4uZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDEsIG5vdyArIDAuMDIpXG4gIGdhaW4uZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMywgbm93ICsgMC4wMylcbiAgZ2Fpbi5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDAwMSwgbm93ICsgMC4zKVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBLaWNrXG5cbmZ1bmN0aW9uIEtpY2sgKGNvbnRleHQsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuICB0aGlzLnR5cGUgPSBvcHRzLnR5cGUgfHwgJ3NpbmUnXG59XG5cbktpY2sucHJvdG90eXBlLmhpdCA9IGZ1bmN0aW9uIGhpdCAodGltZSwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICBjb25zdCBvc2NpbGxhdG9yID0gdGhpcy5jb250ZXh0LmNyZWF0ZU9zY2lsbGF0b3IoKVxuICBjb25zdCBnYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKVxuICBjb25zdCB0b3RhbFRpbWUgPSB0aW1lICsgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lXG5cbiAgb3NjaWxsYXRvci50eXBlID0gdGhpcy50eXBlXG4gIG9zY2lsbGF0b3IuY29ubmVjdChnYWluKVxuICBnYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKVxuXG4gIG9zY2lsbGF0b3IuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKDE1MCwgdG90YWxUaW1lKVxuICBnYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoMSwgdGltZSlcbiAgb3NjaWxsYXRvci5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAxLCB0b3RhbFRpbWUgKyAwLjUpXG4gIGdhaW4uZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDEsIHRvdGFsVGltZSArIDAuNSlcblxuICBvc2NpbGxhdG9yLnN0YXJ0KHRvdGFsVGltZSlcbiAgb3NjaWxsYXRvci5zdG9wKHRvdGFsVGltZSArIDAuNSlcbn1cbiIsInZhciB3aW5kb3cgPSByZXF1aXJlKCdnbG9iYWwvd2luZG93Jyk7XG5cbnZhciBDb250ZXh0ID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0O1xuaWYgKENvbnRleHQpIG1vZHVsZS5leHBvcnRzID0gbmV3IENvbnRleHQ7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG59IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge307XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OWhkV1JwYnkxamIyNTBaWGgwTDI1dlpHVmZiVzlrZFd4bGN5OW5iRzlpWVd3dmQybHVaRzkzTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcFppQW9kSGx3Wlc5bUlIZHBibVJ2ZHlBaFBUMGdYQ0oxYm1SbFptbHVaV1JjSWlrZ2UxeHVJQ0FnSUcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnZDJsdVpHOTNPMXh1ZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnWjJ4dlltRnNJQ0U5UFNCY0luVnVaR1ZtYVc1bFpGd2lLU0I3WEc0Z0lDQWdiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQm5iRzlpWVd3N1hHNTlJR1ZzYzJVZ2UxeHVJQ0FnSUcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnZTMwN1hHNTlYRzRpWFgwPSIsIm1vZHVsZS5leHBvcnRzID0gU25hcmVcblxuZnVuY3Rpb24gU25hcmUgKGNvbnRleHQsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxufVxuXG5TbmFyZS5wcm90b3R5cGUuY3JlYXRlQnVmZmVyID0gZnVuY3Rpb24gY3JlYXRlQnVmZmVyICgpIHtcbiAgY29uc3QgYnVmZmVyU2l6ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlXG4gIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgYnVmZmVyU2l6ZSwgdGhpcy5jb250ZXh0LnNhbXBsZVJhdGUpXG4gIGxldCBvdXRwdXQgPSBidWZmZXIuZ2V0Q2hhbm5lbERhdGEoMClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlclNpemU7IGkrKykge1xuICAgIG91dHB1dFtpXSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5TbmFyZS5wcm90b3R5cGUuaGl0ID0gZnVuY3Rpb24gaGl0ICh0aW1lKSB7XG4gIGNvbnN0IG5vaXNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpXG4gIG5vaXNlLmJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKClcblxuICBjb25zdCBub2lzZUZpbHRlciA9IHRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKVxuICBub2lzZUZpbHRlci50eXBlID0gJ2hpZ2hwYXNzJ1xuICBub2lzZUZpbHRlci5mcmVxdWVuY3kudmFsdWUgPSAxMDAwXG4gIG5vaXNlLmNvbm5lY3Qobm9pc2VGaWx0ZXIpXG5cbiAgY29uc3Qgbm9pc2VFbnZlbG9wZSA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKClcbiAgbm9pc2VGaWx0ZXIuY29ubmVjdChub2lzZUVudmVsb3BlKVxuICBub2lzZUVudmVsb3BlLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKVxuXG4gIGNvbnN0IG9zY2lsbGF0b3IgPSB0aGlzLmNvbnRleHQuY3JlYXRlT3NjaWxsYXRvcigpXG4gIG9zY2lsbGF0b3IudHlwZSA9ICd0cmlhbmdsZSdcblxuICBjb25zdCBvc2NFbnZlbG9wZSA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKClcbiAgb3NjaWxsYXRvci5jb25uZWN0KG9zY0VudmVsb3BlKVxuICBvc2NFbnZlbG9wZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbilcblxuICBub2lzZUVudmVsb3BlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMSwgdGltZSlcbiAgbm9pc2VFbnZlbG9wZS5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMSwgdGltZSArIDAuMilcbiAgbm9pc2Uuc3RhcnQodGltZSlcblxuICBvc2NpbGxhdG9yLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSgxMDAsIHRpbWUpXG4gIG9zY0VudmVsb3BlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMC43LCB0aW1lKVxuICBvc2NFbnZlbG9wZS5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMSwgdGltZSArIDAuMSlcbiAgb3NjaWxsYXRvci5zdGFydCh0aW1lKVxuXG4gIG9zY2lsbGF0b3Iuc3RvcCh0aW1lICsgMC4yKVxuICBub2lzZS5zdG9wKHRpbWUgKyAwLjIpXG59XG4iLCJjb25zdCBjb250ZXh0ID0gcmVxdWlyZSgnYXVkaW8tY29udGV4dCcpXG5jb25zdCBLaWNrID0gcmVxdWlyZSgnLi9raWNrJylcbmNvbnN0IFNuYXJlID0gcmVxdWlyZSgnLi9zbmFyZScpXG5jb25zdCBIaWhhdCA9IHJlcXVpcmUoJy4vaGloYXQnKVxuXG5mdW5jdGlvbiBEcnVtbWVyIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEcnVtbWVyKSkgcmV0dXJuIG5ldyBEcnVtbWVyKG9wdGlvbnMpXG4gIGNvbnN0IGtpY2sgPSBuZXcgS2ljayhjb250ZXh0LCBvcHRpb25zLmtpY2spXG4gIGNvbnN0IHNuYXJlID0gbmV3IFNuYXJlKGNvbnRleHQsIG9wdGlvbnMuc25hcmUpXG4gIGNvbnN0IGhpaGF0ID0gbmV3IEhpaGF0KGNvbnRleHQsIG9wdGlvbnMuaGloYXQpXG5cbiAgcmV0dXJuIHtcbiAgICBraWNrLFxuICAgIHNuYXJlLFxuICAgIGhpaGF0LFxuICAgIGNvbnRleHRcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERydW1tZXJcbiJdfQ==
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
const drummer = require('drummer')()
const kick = drummer.kick
const snare = drummer.snare
const hihat = drummer.hihat
function bar (time) {
if (time >= 20) return
kick.hit(0 + time)
hihat.hit(0 + time)
hihat.hit(0.25 + time)
kick.hit(0.5 + time)
snare.hit(0.5 + time)
hihat.hit(0.5 + time)
hihat.hit(0.75 + time)
kick.hit(1 + time)
hihat.hit(1 + time)
hihat.hit(1.25 + time)
kick.hit(1.5 + time)
snare.hit(1.5 + time)
hihat.hit(1.5 + time)
hihat.hit(1.75 + time)
kick.hit(2 + time)
hihat.hit(2 + time)
hihat.hit(2.25 + time)
kick.hit(2.5 + time)
snare.hit(2.5 + time)
hihat.hit(2.5 + time)
snare.hit(2.75 + time)
return bar(time + 3)
}
bar(0)
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"drummer": "1.0.0"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment