
def comb(decay_factor, delay_samples, samples):
    new_samples = samples.copy()
    for i in range(len(samples) - delay_samples):
        new_samples[i + delay_samples] += new_samples[i] * decay_factor
    return new_samples

def all_pass(decay_factor, delay_samples, samples):
    new_samples = [0] * len(samples)

    for i in range(len(samples)):
        new_samples[i] = samples[i]
        if i - delay_samples >= 0:
            new_samples[i] += -decay_factor * new_samples[i - delay_samples]
        if i - delay_samples >= 1:
            new_samples[i] += decay_factor * new_samples[i + 20 - delay_samples]

    return new_samples


# float[] allPassFilterSamples = new float[samplesLength];
# float decayFactor = 0.131f;

# //Applying algorithm for All Pass Filter
# for(int i=0; i<samplesLength; i++)
# 	{
# 	allPassFilterSamples[i] = samples[i];

# 	if(i - delaySamples >= 0)
# 		allPassFilterSamples[i] += -decayFactor * allPassFilterSamples[i-delaySamples];

# 	if(i - delaySamples >= 1)
# 		allPassFilterSamples[i] += decayFactor * allPassFilterSamples[i+20-delaySamples];
# 	}


# //Calculating delay in samples from the delay in Milliseconds. Calculated from number of samples per millisecond
# 		int delaySamples = (int) ((float)delayinMilliSeconds * (sampleRate/1000));
		
# 		float[] combFilterSamples = Arrays.copyOf(samples, samplesLength);
	
# 		//Applying algorithm for Comb Filter
# 		for (int i=0; i<samplesLength - delaySamples; i++)
# 		{
# 			combFilterSamples[i+delaySamples] += ((float)combFilterSamples[i] * decayFactor);
# 		}
# 	return combFilterSamples;