import pyaudio as pd 
import librosa
import msvcrt
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.fftpack import fft
from trojzvuky import f0_finder_mic, typ_obrat_matcher, obrat_checker3

'''Skript pro analýzu akordů v reálném čase. Nahrávání se spustí a po cca sekundových blocích je vstup mikrofonu analyzován.
Nahrává se po rámcích se 1024 vzorky s f_vz = 44.1 kHz. Délku nahrávacího bloku je možné měnit změnou hodnoty na 26. řádku.'''

obrat_sept = ["septakord", "sekundakord", "terckvartakord", "kvintsextakord"]
obrat = ["kvintakord", "kvartsextakord", "sextakord"]
def nahravani(pocet_tonu):
    format = pd.paInt16
    sr = 44100
    N = 43*1024
    audio = pd.PyAudio()
    stream = audio.open(format=format, channels=1, rate=sr, input=True, frames_per_buffer=1024)
    osa = np.arange(0, 20000.5, 0.2) 
    frames = []
    data = 0
    print("Nahrávání se spouští. Ukončíte jej stisktnutím libovolné klávesy")
    while True:
        while len(frames) <= 43: #Možnost regulovat délku nahrávacího cyklu
            data = stream.read(1024)
            frames.append(data)           
        bin = b''.join(frames)
        vystup = np.frombuffer(bin, dtype=np.int16)
        rms = librosa.feature.rms(y=vystup)
        hlasitost = sum([sum(podhlasitost) for podhlasitost in rms])
        frames.clear()
        if hlasitost < 500:
            print('###')
            if msvcrt.kbhit():
                print("Nahrávání ukončeno...")
                break
            continue
        spektrum = fft(vystup)/len(vystup)
        osa = librosa.times_like(vystup,sr=44100)
        N=len(spektrum)
        p, tony, tony2, _ = f0_finder_mic(spektrum, sr, N, osa, pocet_tonu)
        
        if pocet_tonu == 1 or pocet_tonu == 2:
            print(tony)
        elif pocet_tonu == 3:
            popis = obrat_checker3(p)
            if popis[1]==None:
                print("")
            else:
                print(f"Akord: {tony2[popis[1]]}{popis[0][:3]}\tObrat:{obrat[popis[1]]}\tOktáva:{tony[0][-1]}\n")
        elif pocet_tonu == 4:
            popis = typ_obrat_matcher(p)
            if popis[1] == 0:
                print("Nedefinováno")
            else:
                print(f"Akord: {tony2[popis[2]]}{popis[3]}\tObrat:{obrat_sept[popis[2]]}\tOktáva:{tony[0][-1]}\n")
        else:
            print("Překročen zadaný počet tónů") 
        if msvcrt.kbhit():
            break

    print("Nahrávání ukončeno...")
    stream.stop_stream()
    stream.close()
    audio.terminate()
nahravani(2)