def one_song_fft(pcm1, song_name, subset=None):
    # fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(10, 4))
    fig, axs = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 2]}, figsize=(10, 6))

    pcm1 = pcm.into_mono(pcm1)[0:len(pcm1) / 2]

    if subset:
        pcm1 = pcm1[subset[0]: subset[1]]

    x = [i / 44100.0 for i in range(0, len(pcm1))]
    y = pcm1

    axs[0].plot(x, y, color='#006600', lw=0.05, antialiased=True)
    axs[0].set_ylabel("Amplitude")
    axs[0].set_xlabel("Time (Seconds)")

    fft = np.fft.fft(pcm1)
    fft = fft[0:len(fft)/2]
    x = [pcm.frequency_at_fft_index(i, len(fft)) for i in range(0, len(fft))]

    axs[1].set_ylim([-30000, 30000])
    axs[1].set_xlim([0, 22000])
    axs[1].plot(x, fft, color='#cc0000', lw=0.1, antialiased=True)
    axs[1].set_ylabel("Amplitude")
    axs[1].set_xlabel("Frequency (Hz)")

    fig.tight_layout()

    if subset:
        file_path = 'graphs/one_song_fft_' + song_name + '_subset' + '.png'
    else:
        file_path = 'graphs/one_song_fft_' + song_name + '.png'
    print file_path
    plt.savefig(file_path)
    def calculate(self, pcm_data):
        # calculates the time domain zero crossings
        pcm_mono = pcm.into_mono(pcm_data)

        maximum = 0
        summ = 0

        for sample in pcm_mono:
            summ += abs(sample)
            maximum = max(maximum, abs(sample))

        return (summ / float(maximum)) / len(pcm_mono)
    def calculate(self, pcm_data):
        sample_pack_size = 1024

        pcm_mono = pcm.into_mono(pcm_data)
        pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size)

        rolloffs = []
        for sample_pack in pcm_sample_packs:
            rolloffs.append(pcm.roll_off(sample_pack))

        rolloff_sd = stats.standard_deviation(rolloffs)

        return rolloff_sd
    def calculate(self, pcm_data):
        sample_pack_size = 1024

        pcm_mono = pcm.into_mono(pcm_data)
        pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size)

        centroids = []
        for sample_pack in pcm_sample_packs:
            centroids.append(pcm.centroid(sample_pack))

        centroid_sd = stats.standard_deviation(centroids)

        return centroid_sd
    def calculate(self, pcm_data):
        sample_pack_size = 1024

        pcm_mono = pcm.into_mono(pcm_data)
        pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size)

        centroids = []
        for sample_pack in pcm_sample_packs:
            centroids.append(pcm.centroid(sample_pack))

        centroid_avg = stats.average(centroids)

        return centroid_avg
    def calculate(self, pcm_data):
        # calculates the time domain zero crossings
        pcm_mono = pcm.into_mono(pcm_data)

        noise = 0

        for i in range(1, len(pcm_mono)):
            sign1 = 1 if pcm_mono[i] > 0 else 0
            sign0 = 1 if pcm_mono[i - 1] > 0 else 0

            noise += abs(sign1 - sign0)

        return noise
    def calculate(self, pcm_data):
        sample_pack_size = 1024

        pcm_mono = pcm.into_mono(pcm_data)
        pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size)

        fluxes = []
        for i in range(1, len(pcm_sample_packs)):
            fluxes.append(pcm.spectral_flux(pcm_sample_packs[i - 1], pcm_sample_packs[i]))

        fluxes_sd = stats.standard_deviation(fluxes)

        return fluxes_sd
def one_song_fft_sub(pcm1, song_name, subset):

    fig, axs = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 2]}, figsize=(10, 6))

    pcm1 = pcm.into_mono(pcm1)[0:len(pcm1) / 2]

    pcm1 = pcm1[subset[0]: subset[1]]

    x = [i / 44100.0 for i in range(0, len(pcm1))]
    y = pcm1

    # insert zeros
    i = 0
    while i < len(x):
        x.insert(i, 0.0)
        i += 2

    axs[0].plot(x, y, color='#006600', lw=1)
    # axs[0].bar(x, y, color='#006600', width=0.00001, linewidth=0)
    axs[0].set_ylabel("Amplitude")
    axs[0].set_xlabel("Time (Seconds)")

    fft = np.fft.fft(pcm1)
    fft = fft[0:len(fft)/2]
    x = range(0, len(fft))

    # axs[1].set_ylim([-30000, 30000])
    # axs[1].set_xlim([0, 22000])
    axs[1].bar(x, fft, color='#cc0000', antialiased=True)
    axs[1].set_ylabel("Amplitude")
    axs[1].set_xlabel("Frequency Index")

    fig.tight_layout()

    file_path = 'graphs/one_song_fft_' + song_name + '_subset' + '.png'
    print file_path
    plt.savefig(file_path)
 def calculate(self, pcm_data):
     pcm_mono = pcm.into_mono(pcm_data)
     return bpm.determine_bpm(pcm_mono)