# -*- coding: utf-8 -*-
# Fréquence d'une note selon diapason et octave
# v.3

'''
pour connaître la fréquence d'une note version 3
------------------------------------------------
l'octave 4 est celui du diapason la fréq est direct
l'octave supérieur à 4 la fréq est multipliée par 2
l'octave inférieur à 4 la fréquence est divisée par 2
'''
from math import log10
#----------------------------------------------------variables globales dans les fonctions
# note = ""              # note demandée
diap = 440               # le diapason au choix
# octave = 0             # hauteur de l'octave demandé
#---------------------------------------------------------------variables pour les calculs
octv = 0                 # pour le calcul de la hauteur de l'octave
i = 0                    # tiens un compteur !
demiton = 0              # pour le calcul
freq = 0                 # mettere la fréquence a zéro (déclaration inutile)
#------------------------------------------------------------------------Question Diapason
def question_d() :
    global diap          # déclaration de la variable globale pour le retour
    diap = input("Quel diapason entre 430 et 450 Hertz  ? = ")
    try :
        diap = int(diap)
        if diap < 430 or diap > 450 :
            print("Diapason hors limite!", end = '\t' )
            question_d() # tourniquet pour diapason hors limite
#            print()
    except :
        diap = "440"
        diap = int(diap)
        print("le diapason doit être un nombre!", end = '\t' )
        question_d()    # tourniquet pour diapason hors chiffre
#        print()
    return
#----------------------------------------------------------------------------Question Note
def question_n() :
    global note           # note demandée
    global demiton        # nombre de demi-ton depuis le la
    note = input("Entrer la note désirée ? = ").lower()
    if note == "la" or note == "a" : #--------------------------------------------octave 3
        demiton = 0
    elif note == "la#" or note == "sib" or note == "a#" or note == "bb" :
        demiton = 1
    elif note == "si" or note == "dob" or note == "b" or note == "cb" :
        demiton = 2
    elif note == "si#" or note == "do" or note == "b#" or note == "c" : #---------octave 4
        demiton = 3
    elif note == "do#" or note == "reb" or note == "réb" or note == "c#" or note == "db" :
        demiton = 4
    elif note == "re" or note == "ré" or note == "d" :
        demiton = 5
    elif note == "re#" or note == "ré#" or note == "mib" or note == "d#" or note == "eb" :
        demiton = 6
    elif note == "mi" or note == "fab" or note == "e" or note == "fb" :
        demiton = 7
    elif note == "mi#" or note == "fa" or note == "e#" or note == "f" :
        demiton = 8
    elif note == "fa#" or note == "solb" or note == "f#" or note == "gb" :
        demiton = 9
    elif note == "sol" or note == "g" :
        demiton = 10
    elif note == "sol#" or note == "lab" or note == "g#" or note == "ab" :
        demiton = 11
    else :
        demiton = 12
#--------------------------------------------------------------Contrôle de la réponse Note
    while demiton == 12 :
        print(note, "n'est pas une note!", end = '\t' )
        question_n()
        continue          # Tourniquet pour réponse note hors limite

    return
#--------------------------------------------------------------------------Question Octave
def question_o() :
    global freq           # déclaration pour le retour
    global octave
#    print()
    octave = input("Numéro de l'octave entre -2 et 9 ? = ")
    try :
        octave = int(octave)
    except :
        octave = "4"
        octave = int(octave)
                          # contrôle de la réponse octave
    while octave < -2 or octave > 9 :
        print("votre chiffre est en dehors des limites!")
        octave = int(input("Numéro de l'octave entre -2 et 9 ? = "))
        continue          # Tourniquet pour réponse d'octave hors limite

    if demiton >= 3 :     # la+1=la#--la+2=si--la+3=do alors octave 4
        octv = octave - 1 # pour rester dans l'octave 3
    else :
        octv = octave     # demi ton inférieur à trois déjà dans l'octave 3

    octv =  octv - 4      # ramener l'octave numéro quatre du diapason à zéro

    if octv != 0 :        # si l'octave n'est pas zéro
        if octv > 0 :     # si l'octave est plus grand que zéro on multiplie la fréquence
            for i in range(1, octv + 1):
                freq = freq * 2
        else :            # si l'octave est plus petit que zéro on divise la fréquence
            octv = -octv  # on inverse le signe négatif pour la fonction range()
            for i in range(1, octv + 1):
                freq = freq / 2
    return octave, freq
#---------------------------------------------------------------------------main Programme
question_d()
print()
question_n()
freq = (10**(log10(2)/12))** demiton * diap
print()
question_o()
#----------------------------------------------------------------------------------réponse
print()
print()
print("Pour diapason à ", diap, "Hertz", end=' ')
print("la fréquence du", note.title(), octave, "est de ", round(freq,3), "Hertz")
print()
print(freq)
#-----------------------------------------------------------------------------------Sortie
print()
print("----------------------")
bye = (input ("Entrer pour Sortir...!"))
