#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Beat tracking example
# Appunti: buono per un video u po' psichedelico ci va:
#       <lora:bb3l15:1> an abstract circuit board design with orange yellow green and purple squares over red background in the style of bb3l15
#       su modello colorful_v30 (https://civitai.com/images/3024879?modelVersionId=188803&prioritizedUserIds=913950&period=AllTime&sort=Most+Reactions&limit=20 )

#   <lora:Ink_scenery:1> black  background, sketch    jungle scenery, path, dense su sd 1.5
# Wilson  <lora:Ink_scenery:1> black  background, sketch    jungle  setting

import os
import numpy as np
import librosa
import random
import math
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

def plotting_stuffs():

    plt.figure(figsize=(15, 17))
    t = librosa.frames_to_time(range(rms.size), hop_length=flength)
    ax = plt.subplot(3, 1, 1)
    librosa.display.waveshow(wave, alpha=0.5)
    plt.plot(t, rms[0], color="r")
    plt.plot(t, trms, color="b")
    plt.ylim((-1, 1))
    plt.title("Wave&Featurres")
    plt.show()

    x = np.linspace(0,1,100)
    y = sig(x)

    plt.plot(x, y)
    plt.show()


    plt.hist(rms[0], color = 'red', edgecolor = 'black',        bins = 10)
    plt.show()
    plt.hist(cent[0], color = 'blue', edgecolor = 'black',        bins = int(cent.max()/100))
    plt.show()
    plt.hist(zcr[0], color = 'green', edgecolor = 'black',        bins = 10)
    plt.show()


    plt.figure(figsize=(150, 17))

    t = librosa.frames_to_time(range(zcr.size), hop_length=flength)
    ax = plt.subplot(3, 1, 1)
    plt.xticks(np.arange(0, 12103, step=1))
    plt.plot(t, zcr[0], color="r")
    plt.ylim((zcr.min(), zcr.max()))
    plt.title("ZCR")
    plt.show()


def f(t):
    return 1.0025+0.002*np.sin(1.25*3.14*t/30)
    #return x ** 2

def sig(x):
 return 1/(1 + np.exp(-12*(x-0.431)))

def transformXYrandom(x):
 return random.random()*10*x-5;

strength_min = 0.4
strength_max = 0.73


# Assuming that into "generated" directoruy U've already create "project_name" subfolder
#audio_input_file = '/home/lalo/data/studio_suono/ardourprojects/space/export/star_r1_sessione_20240310_msub07.wav'
audio_input_file = "/home/luca-conte/Musica/ardour_projects/end_titles/export/end_titles_draft_r1_sessione.wav"
#audio_input_file = '/home/lalo/data/studio_grafica/deforum/wilson_r1_mm_sample2.wav'
#audio_input_file = '/home/lalo/data/studio_suono/spx/231104_001_m01.wav'
#audio_input_file = '/home/lalo/data/studio_grafica/deforum/eucrasy_r1_sample.wav'
#audio_input_file = '/home/lalo/data/studio_grafica/deforum/eucrasy_r1.wav'
#audio_input_file = '/home/lalo/data/studio_grafica/deforum/eucrasy_short_r1.wav'
#audio_input_file = '/home/lalo/data/studio_suono/231014_002_mastered_r2_clip.WAV'
#audio_input_file = 'C:/Users/LucaConte/Music/lc_music/wilson_r1_mm.wav'


#    Store the sampling rate as `sr`

fps = 24

flength = 22050//fps
#audio frame size is 22050/30=735



wave, sr = librosa.load(audio_input_file)
rms = librosa.feature.rms(y=wave, frame_length=flength, hop_length=flength)
zcr = librosa.feature.zero_crossing_rate(y=wave,frame_length=flength,hop_length=flength)
#rms = librosa.feature.rms(y=wave, frame_length=735, hop_length=735)
cent = librosa.feature.spectral_centroid(y=wave, sr=sr,n_fft=flength, hop_length=flength)
duration = int(math.ceil(librosa.get_duration(y=wave, sr=sr)))

frames = duration * fps 




print("RMS SIZE: " + str(len(rms[0])))
print("Rms min/max: " + str(rms.min()) + "/" + str(rms.max()))
print("CEN SIZE: " + str(len(cent[0])))
print("Cent min/max: " + str(cent.min()) + "/" + str(cent.max()))
print("TOTAL FRAMES: " + str(frames))
print("Audio duration in secs: " + str(duration))
#
# sr.len /22050 = duration
# rms.len * 30 = duration
# rms[i] mi da la potenza media del frame iesimo
trms= rms[0]

m = interp1d([min(trms), max(trms)], [strength_min, strength_max])
c = interp1d([cent.min(), cent.max()], [-0.5, 0.5])

# Creating the sctipt file (the real unique aoutput of this script)
try:
    print("")
    print("------RMS---------")
    print("")

    for frame in range(len(rms[0])):
        print(str(frame) + ":(" + str(trms[frame]) + "),", end="")

    print("")
    print("-------CENTROIDS--------")
    print("")

    for frame in range(cent.size):
        print(str(frame) + ":(" + str(cent[0][frame]) + "),", end="")

    print("")
    print("-----TRANSFORM----------")
    print("")

    for frame in range(cent.size):
        print(str(frame) + ":(" + str(transformXYrandom(1)) + "),", end="")

    print("")
    print("-----ZERO CROSSING RATE----------")
    print("")

    for frame in range(zcr.size):
        print(str(frame) + ":(" + str(zcr[0][frame]) + "),", end="")

    print("RMS SIZE: " + str(len(rms[0])))
    print("Rms min/max: " + str(rms.min()) + "/" + str(rms.max()))
    print("Rms mean: " + str(np.mean(rms[0])))
    print("CEN SIZE: " + str(len(cent[0])))
    print("Cent min/max: " + str(cent.min()) + "/" + str(cent.max()))
    print("TOTAL FRAMES: " + str(frames))
    print("Audio duration in secs: " + str(duration))
except:
    print(exception)


plotting_stuffs()

