/**
*
BirdBass Cave
*by Benito
*Granularly deployed chirps with ominous bassiness.
*- Press keys to initiate chirps and bass swells.
*- Mouse X-axis controls base pitch level of chirps.
*- Mouse Y-axis controls spread of chirp pitches.
*/
import net.beadsproject.beads.core.*;
import net.beadsproject.beads.data.*;
import net.beadsproject.beads.events.*;
import net.beadsproject.beads.ugens.*;
AudioContext ac;
Compressor comp;
Envelope amount;
RandomPWM basspwm;
Envelope bassfreq, basslev;
float[] scale = {1, 9f/8, 6f/5, 5f/4, 45f/32, 3f/2, 5f/3, 7f/4};
void setup() {
size(400, 400);
ac = new AudioContext();
Clock clock = new Clock(ac, 20);
clock.setTicksPerBeat(1);
ac.out.addDependent(clock);
amount = new Envelope(ac, 0);
ac.out.addDependent(amount);
basslev = new Envelope(ac, 0);
bassfreq = new Envelope(ac, 110 / 3);
WavePlayer basssin = new WavePlayer(ac, bassfreq, Buffer.SINE);
basspwm = new RandomPWM(ac, RandomPWM.RAMPED_NOISE, 5000, 20000, 1);
Gain bassy = new Gain(ac, 1, basspwm);
bassy.addInput(basssin);
Gain bg = new Gain(ac, 1, basslev);
bg.addInput(bassy);
comp = new Compressor(ac);
comp.setRatio(4);
comp.addInput(bg);
Bead blooper = new Bead() {
public void messageReceived(Bead mess) {
float spread = ((float)mouseX / width) * 10;
int base = (int)((float)mouseY / height * 30) + 15;
int num = (int)(random(0, amount.getValue()) + .4);
for(int i = 0; i < num; i++) {
Envelope env = new Envelope(ac, 0);
int note = base + (int)random(-spread, spread);
float freqf = 53.5 * pow(2, note / scale.length) * scale[note % scale.length] + 1.5;
Envelope freq2 = new Envelope(ac, freqf * 1.9);
freq2.addSegment(freqf * 1.9, i * 15.2);
freq2.addSegment(freqf, 60);
WavePlayer sine2 = new WavePlayer(ac, freq2, Buffer.SINE);
WavePlayer sine1 = new WavePlayer(ac, freqf, Buffer.SINE);
Gain mult = new Gain(ac, 1, sine2);
mult.addInput(sine1);
Gain g = new Gain(ac, 1, env);
g.addInput(mult);
comp.addInput(g);
float sign = (note % 2) - .5;
freq2.addSegment(0, i * 15.2);
env.addSegment(sign, 20);
env.addSegment(sign * .4, 30);
env.addSegment(0, 150);
env.addSegment(0, 50, new KillTrigger(g));
}
}
};
clock.addMessageListener(blooper);
Reverb verb = new Reverb(ac);
verb.addInput(comp);
Gain mg = new Gain(ac, 1, .4);
mg.addInput(comp);
mg.addInput(verb);
ac.out.addInput(mg);
ac.start();
}
void draw() {
background(0);
}
void keyPressed() {
amount.clear();
float newval = amount.getValue();
newval += 1.5 / (.5 + newval);
amount.addSegment(newval, 300);
amount.addSegment(0, 1500);
bassfreq.clear();
int bassnote = (key % (scale.length * 3));
float newbassfreq = 110f / 3 * scale[bassnote % scale.length] * pow(2, bassnote / scale.length);
println(bassnote + " " + newbassfreq + " " + scale[bassnote % scale.length]);
bassfreq.addSegment(newbassfreq, 350);
basslev.clear();
basslev.addSegment(2, 1500);
basslev.addSegment(0, 5500);
if(key == 27) key = 0;
}