Skip to content

Instantly share code, notes, and snippets.

@halzate93
Created September 10, 2015 03:36
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 halzate93/f95583c8b70b195029f0 to your computer and use it in GitHub Desktop.
Save halzate93/f95583c8b70b195029f0 to your computer and use it in GitHub Desktop.
A simple looping drum machine for processing with a synthetizer.
//The MIT License (MIT) - See Licence.txt for details
//Copyright (c) 2013 Mick Grierson, Matthew Yee-King, Marco Gillies
//Modified by Hector Alzate 2015
Maxim maxim;
WavetableSynth waveform;
int playhead;
int[] notes = {
0, 0, 0, 12, 12, 12, 10, 10, 10, 7, 7, 7, 6, 6, 3, 3
};
float fc, res, attack, release;
Slider dt, dg, a, r, f, q, v;
MultiSlider seq;
float[] wavetable = new float[514];
Button[] drums = new Button[5], clear = new Button[5];
AudioPlayer[] players = new AudioPlayer[5];
boolean[][] beats = new boolean[5][64];
Toggle toggle;
AudioPlayer metro;
boolean useMeter = true;
void setup()
{
size(600, 600);
maxim = new Maxim(this);
waveform = maxim.createWavetableSynth(128);
// name, value, min, max, pos.x, pos.y, width, height
dt = new Slider("delay time", 1, 0, 100, 50, 10, 200, 40, HORIZONTAL);
dg = new Slider("delay amnt", 1, 0, 100, 50, 60, 200, 40, HORIZONTAL);
a = new Slider("attack", 1, 0, 100, 50, 110, 200, 40, HORIZONTAL);
r = new Slider("release", 20, 0, 100, 50, 160, 200, 40, HORIZONTAL);
f = new Slider("filter", 20, 0, 100, 50, 210, 200, 40, HORIZONTAL);
q = new Slider("res", 20, 0, 100, 50, 260, 200, 40, HORIZONTAL);
v = new Slider("volume", 100, 0, 100, 50, 310, 200, 40, HORIZONTAL);
seq = new MultiSlider(notes.length, 0, 256, 20, 370, width/18/2, 180, UPWARDS);
for(int i=0; i<notes.length; i++){
seq.set(i, (notes[i]/12f) * 256);
}
metro = maxim.loadFile("mtr.wav");
metro.setLooping(false);
players[0] = maxim.loadFile("bd1.wav");
players[1] = maxim.loadFile("csh.wav");
players[2] = maxim.loadFile("hh1.wav");
players[3] = maxim.loadFile("sn2.wav");
players[4] = maxim.loadFile("clp.wav");
for(int i = 0; i < players.length; i++){
players[i].setLooping(false);
}
drums[0] = new Button("drum", width/2 + 10, 10, 100, 80);
clear[0] = new Button("clear", width/2 + 120, 10, 100, 80);
drums[1] = new Button("crash", width/2 + 10, 100, 100, 80);
clear[1] = new Button("clear", width/2 + 120, 100, 100, 80);
drums[2] = new Button("hihat", width/2 + 10, 190, 100, 80);
clear[2] = new Button("clear", width/2 + 120, 190, 100, 80);
drums[3] = new Button("snare", width/2 + 10, 280, 100, 80);
clear[3] = new Button("clear", width/2 + 120, 280, 100, 80);
drums[4] = new Button("clap", width/2 + 10, 370, 100, 80);
clear[4] = new Button("clear", width/2 + 120, 370, 100, 80);
toggle = new Toggle("metronome", width/2 + 10, 460, 210, 90);
frameRate(32);
for (int i = 0; i < 514 ; i++) {
wavetable[i]=((float)i/514)-0.5;
}
waveform.waveTableSize(514);
waveform.loadWaveTable(wavetable);
}
void draw()
{
background(200);
waveform.play();
if (f.get()!=0) {
fc=f.get()*100;
waveform.setFilter(fc, res);
}
if (dt.get()!=0) {
waveform.setDelayTime((float) dt.get()/50);
}
if (dg.get()!=0) {
// delay effect not implemented in java/ android yet....
//waveform.setDelayAmount((int)dg.get()/100);
}
if (q.get() !=0 ) {
res=q.get() / 50;
println("res "+res);
waveform.setFilter(fc, res);
}
if (a.get()!= 0) {
attack=a.get()*10;
}
if (r.get() !=0 ) {
release=r.get()*10;
}
if (v.get() >= 0 ) {
waveform.volume(v.get()/100f);
}
useMeter = toggle.get();
if(useMeter && playhead%16==0){
metro.cue(0);
metro.play();
}
dt.display();
dg.display();
a.display();
r.display();
f.display();
q.display();
v.display();
seq.display();
for(int i = 0; i < drums.length; i++){
drums[i].display();
clear[i].display();
}
toggle.display();
playhead ++;
if (playhead%4==0) {
waveform.ramp(0.5,attack);
//waveform.ramp(1, attack);
waveform.setFrequency(mtof[notes[playhead/4%16]+30]);
}
if(playhead%2 == 0){
for(int i = 0; i < drums.length; i++){
if(beats[i][playhead/2%64]){
players[i].cue(0);
players[i].play();
}
}
}
if (playhead%4==1) {
waveform.ramp(0.5, release);
}
}
void mousePressed()
{
// waveform.ramp(0.5,1);
dt.mousePressed();
dg.mousePressed();
a.mousePressed();
r.mousePressed();
f.mousePressed();
q.mousePressed();
v.mousePressed();
seq.mousePressed();
for(int i = 0; i < drums.length; i++){
if(drums[i].mousePressed()){
if(!beats[i][playhead/2%64]){
players[i].cue(0);
players[i].play();
beats[i][playhead/2%64] = true;
}
}
if(clear[i].mousePressed()){
beats[i] = new boolean[64];
}
}
toggle.mousePressed();
}
void mouseDragged()
{
dt.mouseDragged();
dg.mouseDragged();
a.mouseDragged();
r.mouseDragged();
f.mouseDragged();
q.mouseDragged();
v.mouseDragged();
seq.mouseDragged();
//waveform.filterCutoff(200+mouseX,10);
}
void mouseReleased()
{
for (int i=0;i<notes.length;i++) {
notes[i]=(int) Math.floor(seq.get(i)/256*12);
}
for(int i = 0; i < drums.length; i++){
drums[i].mouseReleased();
clear[i].mouseReleased();
}
// waveform.ramp(0.,1000);
toggle.mouseReleased();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment