/**
*
Chirps & Clicks
*by Benito
*Like crickets and woodpeckers, maybe.
*- Mouse Y-axis controls pitch level of chirps.
*- Mouse X-axis controls pan of chirps.
*- Press keys to initiate swells of clicks.
*/
import net.beadsproject.beads.core.*;
import net.beadsproject.beads.data.*;
import net.beadsproject.beads.events.*;
import net.beadsproject.beads.ugens.*;
AudioContext ac;
Compressor comp;
Panner blurppan;
BiquadFilter blurpfilt;
Envelope panenv;
Envelope clicker;
float clickval = 0;
float[] scale = {1, 1.125, 1.2, 1.25, 45f/32, 1.5, 5f/3, 7f/4};
void setup() {
size(400, 400);
ac = new AudioContext();
Bead blurper = new Bead() {
int currnote = scale.length;
int count = 0;
float basevel = 1;
boolean clicking = false;
public void messageReceived(Bead mess) {
if(count % 3 == 0) {
int target = 29 - mouseY * 30 / height;
float vel = 1;
if(count % 6 == 0) vel = 1.5;
if(target > currnote) {
currnote++;
blurp(currnote, basevel * vel);
basevel = 1;
} else if (target < currnote) {
currnote--;
blurp(currnote, basevel * vel);
basevel = 1;
} else if (count % 6 == 0) {
blurp(currnote, basevel * vel);
basevel *= .9;
}
}
//clicking
if(count % 6 == 0) {
if(clickval > 0) clicking = true;
}
if(clicking && (count % 2 == 0 || count % 6 == 2)) {
clicker.clear();
clicker.addSegment(1 * clickval, .3);
clicker.addSegment(-.3 * clickval, .4);
clicker.addSegment(.2 * clickval, .5);
clicker.addSegment(-.6 * clickval, .3);
clicker.addSegment(.25 * clickval, .45);
clicker.addSegment(-.12 * clickval, .65);
clicker.addSegment(0, 2);
clickval -= .03;
if(clickval <= 0) {
clicking = false;
clickval = 0;
}
}
count++;
}
};
Clock clock = new Clock(ac, 41);
clock.setTicksPerBeat(1);
clock.addMessageListener(blurper);
ac.out.addDependent(clock);
blurpfilt = new BiquadFilter(ac, 1, BiquadFilter.BUTTERWORTH_LP);
blurpfilt.setFrequency(600);
panenv = new Envelope(ac, -.2);
blurppan = new Panner(ac, panenv);
blurppan.addInput(blurpfilt);
clicker = new Envelope(ac, 0);
Panner clickpan = new Panner(ac, .6);
clickpan.addInput(clicker);
comp = new Compressor(ac, 2);
comp.setRatio(4);
comp.addInput(blurppan);
comp.addInput(clickpan);
Gain mg = new Gain(ac, 2, .4);
mg.addInput(comp);
ac.out.addInput(mg);
ac.start();
}
void blurp(int note, float vel) {
Envelope env = new Envelope(ac, 0);
env.addSegment(0, .1);
env.addSegment(vel, 20);
env.addSegment(vel, 10);
env.addSegment(.3 * vel, 20);
env.addSegment(0, 20);
OnePoleFilter opf = new OnePoleFilter(ac, 20);
opf.addInput(env);
float freqf = 218 * pow(2, note / scale.length) * scale[note % scale.length] + 2;
Envelope freq = new Envelope(ac, freqf * .87 - 1);
freq.addSegment(freqf * .985, 40);
freq.addSegment(freqf, 40);
WavePlayer saw = new WavePlayer(ac, freq, Buffer.SAW);
Gain g = new Gain(ac, 1, opf);
g.addInput(saw);
env.addSegment(0, 10, new KillTrigger(g));
blurpfilt.addInput(g);
}
void draw() {
background(0);
}
void mouseMoved() {
panenv.clear();
panenv.addSegment((float)mouseX / width * 1.5 - .85, 300);
}
void keyPressed() {
clickval += 1f / (clickval + 1);
if(key == ESC) {
key = 0;
}
}