package micromod.resamplers; /** The linear resampler implements linear interpolation resampling. Linear interpolation prevents nasty harmonics being added to the sound during resampling. Technically, linear interpolation is not very good - but sound quality is a very subjective thing, and this resampler certainly has a low end "kick" that the FIR resampler certainly lacks(probably cause it ain't supposed to be there :) As as extra bonus, it's pretty fast! */ public class LinearResampler implements Resampler { public LinearResampler() { System.out.println(" Linear Resampler 0.2 initialised."); } public void resample( short[] inputBuf, int samplePos, int subSamplePos, int step, int subStep, short[] outputBuf, int position, int length ) { int end=position+length-1, gradient, yintercept, temp; step = (step<<FIXED_POINT_SHIFT)+subStep; // Perform linear interploation gradient=inputBuf[samplePos+1]-inputBuf[samplePos]; yintercept=inputBuf[samplePos] << FIXED_POINT_SHIFT; while( position <= end ) { outputBuf[position++] = (short) (gradient*subSamplePos+yintercept >> FIXED_POINT_SHIFT); subSamplePos += step; if( subSamplePos > FIXED_POINT_BITMASK ) { samplePos += subSamplePos >> FIXED_POINT_SHIFT; subSamplePos &= FIXED_POINT_BITMASK; temp = inputBuf[samplePos]; gradient = inputBuf[samplePos+1]-temp; yintercept = temp << FIXED_POINT_SHIFT; } } } public int getCushionSize() { // Need 1 sample. return 1; } }