import ddf.minim.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.analysis.*; // see http://code.compartmental.net/tools/minim/ AudioInput in; WaveformRenderer waveform; LowPassSP lpf; Calibrator cal; //SineWave sinus; int help,calibrate; void setup() { size(512, 512); frameRate(5); help=0; // open input Minim.start(this); in = Minim.getLineIn(Minim.STEREO, 512); //sinus=new SineWave(440,0.5,in.sampleRate()); //in.add(sinus); //add calibrator: removes adc offset cal= new Calibrator(4.0,in.sampleRate()); calibrate=100; //setzt wartezeit zum einschwingen in.addEffect(cal); //add anti-alias-filter lpf= new LowPassSP(20000.0,in.sampleRate()); in.addEffect(lpf); //add skope waveform = new WaveformRenderer(in.sampleRate()); in.addListener(waveform); } void draw() { //draw osci waveform.draw(); //startup cal-filter if(calibrate>0){ fill(64,64,64,190); rect(0,0,width,height); stroke(0); fill(0); rect(width/2-50,height/2+30,90,10); float u=log(cal.getPowerA()); fill(255,255,0); text("calibrating...",width/2-50,height/2+20); rect(width/2-50,height/2+30,-10*u,10); calibrate--; if(u<-9.0)calibrate=0; } else{ cal.setFreq(0.5); } //display help message if(help>0){ noStroke(); fill(0,0,0,160); rect(width/2-150,height/2-150,300,300); fill(255); String t="f/F ......anti alias filter\ng/G ......common gain\na/A .....display A\nb/B ......display B\nr/R .....sample rate\nl/L .....trigger level\n+ ......slope positiv\n- ......slope negative\nESC ......quit"; text(t,width/2-100,height/2-100); help--; } } void stop() { in.close(); super.stop(); } void keyPressed(){ float tl; switch(key){ case '?': case 'h': case 'H': help=100; case '+': waveform.setTriggerSlope(1.0); break; case '-': waveform.setTriggerSlope(-1.0); break; case 'a': waveform.setDisplayA(false); break; case 'A': waveform.setDisplayA(true); break; case 'b': waveform.setDisplayB(false); break; case 'B': waveform.setDisplayB(true); break; case 't': waveform.setSkip(constrain(waveform.getSkip()-1,1,1000)); lpf.setFreq(20000.0/waveform.getSkip()); break; case 'T': waveform.setSkip(constrain(waveform.getSkip()+1,1,1000)); lpf.setFreq(20000.0/waveform.getSkip()); break; case 'r': waveform.setRate(constrain(waveform.getRate()*0.9,1,44100)); lpf.setFreq(20000.0/waveform.getSkip()); break; case 'R': waveform.setRate(constrain(waveform.getRate()*1.1,1,44100)); lpf.setFreq(20000.0/waveform.getSkip()); break; case 's': break; //in.removeSignal(sinus);break; case 'S': break; //in.add(sinus);break; case 'l': tl=waveform.getTriggerLevel(); if(tl>=0.0){ tl*=0.96; if(tl<0.00001)tl=-0.00001; } else{ tl*=1.04; } waveform.setTriggerLevel(constrain(tl,-1.0,1.0)); break; case 'L': tl=waveform.getTriggerLevel(); if(tl>=0.0){ tl*=1.04; } else{ tl*=0.96; if(tl>-0.00001)tl=0.00001; } waveform.setTriggerLevel(constrain(tl,-1.0,1.0)); break; case 'f': in.removeEffect(lpf); break; case 'F': in.addEffect(lpf); break; case 'g': waveform.setGainCommon(false); break; case 'G': waveform.setGainCommon(true); break; default: break; } }