// waveformAnalyzer.ck is a ChucK patch to analyze // the wav files from the spring 2016 sonic survey // D. Parson // USAGE: // chuck waveformAnalyzer.ck:WAVEFILE // UPDATED VERSION January 2018 for file names like // WAVEFORM_FREQ_GAINOSC_GNOISE_RANDOM.wav generated for csc558 // spring 2018, see genwav.py & generated ChucK sound-creating files. string filename ; FFT fft ; Centroid cent; // Flux flux; RMS rms ; RollOff roff25; RollOff roff50; RollOff roff75; 512 => int fftbuffersize ; float fevtcentroid ; // float fevtflux ; float fevtrms; float fevtroll25 ; float fevtroll50 ; float fevtroll75 ; float fevtmagnitudes[]; float sndrate ; if (me.args()) { me.arg(0) => filename; SndBuf soundbuf => blackhole; filename => soundbuf.read; // Load named wav file into buffer, // run for 0.5 second, // perform analysis. soundbuf => fft =^ cent => blackhole ; fftbuffersize * 2 => fft.size ; Windowing.hann(fftbuffersize * 2) => fft.window ; // fft =^ flux => blackhole; fft =^ rms => blackhole; fft =^ roff25 => blackhole; fft =^ roff50 => blackhole; fft =^ roff75 => blackhole; .25 => roff25.percent; .5 => roff50.percent; .75 => roff75.percent; 0.5::second => now ; cent.upchuck().fval(0) => fevtcentroid ; // flux.upchuck().fval(0) => fevtflux ; rms.upchuck().fval(0) => fevtrms ; roff25.upchuck().fval(0) => fevtroll25 ; roff50.upchuck().fval(0) => fevtroll50 ; roff75.upchuck().fval(0) => fevtroll75 ; fft.upchuck().fvals() @=> fevtmagnitudes ; (1::second / 1::samp) * soundbuf.rate() => sndrate; // <<< "ARRAY", fevtmagnitudes.cap() >>>; <<< "INSTANCE" >>> ; <<< filename+".una.txt", fevtcentroid, fevtrms, fevtroll25, fevtroll50, fevtroll75 >>>; for (0 => int i ; i < fevtmagnitudes.cap() ; i++) { <<< fevtmagnitudes[i] >>>; } .25::second => now ; } else { <<< "ERROR, no input file. " >>>; }