import wave, struct, array
import library

debug = True

diplo1 = wave.open('Diplo - Revolution (feat. Faustix & Imanos and Kai)-114311164.wav', 'rb')
diplo2 = wave.open('1-OhioTurnpike.wav','rb')
diplo_output = wave.open('output.wav','wb')

nchannels = diplo1.getnchannels()
sampwidth = diplo1.getsampwidth()
framerate = diplo1.getframerate()
nframes = diplo1.getnframes()

if debug:
    print "nchannels: %s" % nchannels
    print "sampwidth: %s" % sampwidth
    print "framerate: %s" % framerate
    print "nframes: %s" % nframes

def get_samples(pos):
    diplo.setpos(pos)
    frame = diplo.readframes(1)
    left = frame[0:2]
    right = frame[2:4]
    left_sample = struct.unpack("<h", left)[0]
    right_sample = struct.unpack("<h", right)[0]
    return (left_sample, right_sample)

#for pos in range(nframes):
#samples = [get_samples(pos) for pos in range(nframes)]
#if debug:
    #print samples

#left_samples = [sample[0] for sample in samples]
#if debug:
    #print left_samples

#right_samples = [sample[1] for sample in samples]
#if debug:
    #print right_samples

#print "Unique samples on the left: %s" % len(set(left_samples))
#print "Unique samples on the right: %s" % len(set(right_samples))
#diplo.rewind()

def extract_stuff(diplo,n=-1):
    if n < 0:
        n = diplo.getnframes()
    frames = diplo.readframes(n)
    assert (len(frames)/4) == n

    samples = array.array('h', frames)

    left_samples = []
    right_samples = []

    for index, elem in enumerate(samples):
        if index % 2 == 0:
            left_samples.append(elem)
        else:
            right_samples.append(elem)

    return left_samples

seconds = 44100 * 10
left_samples1 = extract_stuff(diplo1,seconds)
left_samples2 = extract_stuff(diplo2,seconds)
left_samples_replacement = []
g1 = library.grouper(8,left_samples1)
g2 = list( library.window(8,left_samples2) )

for index, frame in enumerate(g1):
    candidate = frame
    lower = 5
    upper = 7
    similar = []

    for similar_index, similar_frame in enumerate(g2):
        s = library.similarity(frame,similar_frame)
        if lower <= s <= upper:
            print "{:4}{:4} {}\t{:4}\t{}".\
                    format(s, index,frame,similar_index,similar_frame)
            candidate = similar_frame
            break
    left_samples_replacement.extend(candidate)
left_samples_replacement_frame = bytearray(b+128 for b in left_samples_replacement)

diplo_output.setsampwidth(2)
diplo_output.setframerate(44100)
diplo_output.setnchannels(1)
diplo_output.writeframes(left_samples_replacement_frame)
diplo_output.close()