srecord noeq AudioHaarFeature(IAudioSample sample, double start, double end) { double factor = 1; bool alternatePhase; // sample 90° phase shift? *(IAudioSample *sample, DoubleRange r) { start = r.start; end = r.end; } double mid() { ret (start+end)/2; } double get(int channel) { double value; if (alternatePhase) { double quarter = start+(end-start)*.25, threeQuarters = start+(end-start)*.75; value = sample.sampleSum(channel, start, end) - sample.sampleSum(channel, quarter, threeQuarters)*2; } else { double mid = mid(); value = sample.sampleSum(channel, start, mid) - sample.sampleSum(channel, mid, end); } ret mul_optFor1(factor, value); } Channels get() { ret mapChannels get(sample.channels()); } Complex getComplex(int channel) { alternatePhase = true; double re = get(channel); alternatePhase = false; double im = get(channel); ret complex(re, im); } Channels getComplex() { ret mapChannels getComplex(sample.channels()); } }