/** *

Chirps & Clicks

*

by Benito

*

Like crickets and woodpeckers, maybe.

* */ 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; } }