예제 #1
0
 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)
예제 #2
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)
예제 #3
0
 def test_findfactor(self):
     self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
예제 #4
0
 def test_findfactor(self):
     self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
예제 #5
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)
예제 #6
0
def testfindfactor(data):
	if audioop.findfactor(data[1], data[1]) <> 1.0:
		return 0
	return 1
예제 #7
0
def testfindfactor(data):
    if verbose:
        print 'findfactor'
    if audioop.findfactor(data[1], data[1]) <> 1.0:
        return 0
    return 1
예제 #8
0
def testfindfactor(data):
    if verbose:
        print 'findfactor'
    if audioop.findfactor(data[1], data[1]) != 1.0:
        return 0
    return 1
예제 #9
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)
예제 #10
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))