def test_findfactor(self): self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0) self.assertEqual(audioop.findfactor(bytearray(datas[2]), bytearray(datas[2])), 1.0) self.assertEqual(audioop.findfactor(memoryview(datas[2]), memoryview(datas[2])), 1.0) self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]), 0.0)
def echocancel(outputdata, inputdata): """Try to identify an echo and remove it. Should contain 2-byte samples""" pos = audioop.findmax(outputdata, 800) out_test = outputdata[pos*2:] in_test = inputdata[pos*2:] ipos, factor = audioop.findfit(in_test, out_test) factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], out_test) prefill = '\0'*(pos+ipos)*2 postfill = '\0'*(len(inputdata) - len(prefill) - len(outputdata)) outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill return audioop.add(inputdata, outputdata, 2)
def test_findfactor(self): self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
def test_findfactor(self): self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0) self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]), 0.0)
def testfindfactor(data): if audioop.findfactor(data[1], data[1]) <> 1.0: return 0 return 1
def testfindfactor(data): if verbose: print 'findfactor' if audioop.findfactor(data[1], data[1]) <> 1.0: return 0 return 1
def testfindfactor(data): if verbose: print 'findfactor' if audioop.findfactor(data[1], data[1]) != 1.0: return 0 return 1
def test_findfactor(self): self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0) self.assertEqual(audioop.findfactor(b"\0" * len(datas[2]), datas[2]), 0.0)
def find_division_start(fullpath, bpm, beats_per): """Identify the start of the beats, by finding segments that fit together""" reader = AudioReader.open(fullpath) # This doesn't find the exact time of the max, but don't need it. max_value = 0 max_time = 0 while True: data = reader.raw_read() if data is None: break data_max = audioop.max(data, reader.raw_width()) if data_max > max_value: max_value = data_max max_time = reader.current_time() before = max_time - Shifter.beats_to_ms(bpm, beats_per) after = max_time + 2 * Shifter.beats_to_ms(bpm, beats_per) if before < 0: after += -before before = 0 if after > reader.duration(): before -= after - reader.duration() after = reader.duration() if before < 0: if beats_per < 2: raise RuntimeError('This audio file is too short to be divided by beats.') else: reader.close() return Shifting.find_division_start(filepath, bpm, int(beats_per / 2)) reader.seek_time(0) reader2 = ConvertReader(reader, set_raw_width=2, set_channels=1) region = reader2.raw_random_read(before, after) # both in bytes raw_length = 2 * int(len(region) / 6) beat_length = int(2 * Shifter.beats_to_ms(bpm, 1) * reader2.sampling_rate() / 1000.0) print "Around max: " + str(before) + " - " + str(after) + ": " + str(raw_length) min_factor = 0 min_ii = 0 # First determine time within a beat for ii in xrange(beat_length / 200): factor = audioop.findfactor(region[200*ii:200*ii+raw_length], region[200*ii+raw_length:200*ii+2*raw_length]) if factor < min_factor: print "Samp: At " + str(ii) + " " + str(factor) min_factor = factor min_ii = ii # Second, determine which beat to use min_factor = 0 min_jj = 0 for jj in xrange(beats_per): factor = audioop.findfactor(region[jj*beat_length+200*min_ii:jj*beat_length+200*min_ii+raw_length], region[jj*beat_length+200*min_ii+raw_length:jj*beat_length+200*min_ii+2*raw_length]) print "Beat: At " + str(jj) + " " + str(factor) if factor < min_factor: min_factor = factor min_jj = jj print "Best: Beat: " + str(min_jj) + ", Samp: " + str(100*min_ii) start_time = before + (min_jj*beat_length*2 + 100*min_ii) * 1000.0 / reader2.sampling_rate() reader2.close() return math.fmod(start_time, Shifter.beats_to_ms(bpm, beats_per))