Created
September 10, 2015 03:36
-
-
Save halzate93/f95583c8b70b195029f0 to your computer and use it in GitHub Desktop.
A simple looping drum machine for processing with a synthetizer.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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