import enum # Cada nota tiene un valor, un tipo, un modificador y una octava # El valor es un enum de eNotas, cada nota tiene un valor de 1 a 12, yendo de Do a Si en semitonos # El tipo es un enum de tipoNota, cada tipo tiene un valor de 1 a 48, yendo de Redonda a Semicorchea (con puntillo o no) # El modificador es un enum de modificador, cada modificador tiene un valor de 1 a 3, siendo 1 sostenido, 2 bemol y 3 ninguno # La octava es un entero de 0 a 8, siendo 4 la octava central del piano class eNotas(enum.Enum): DO = 1 RE = 3 MI = 5 FA = 6 SOL = 8 LA = 10 SI = 12 SILENCIO = 8 class tipoNota(enum.Enum): ##Redonda, Blanca, Negra, Corchea, Semicorchea R = 1, 4 B = 2, 2 N = 4, 1 C = 8, 0.5 S = 16, 0.25 ## Redonda, Blanca, Negra, Corchea, Semicorchea con puntillo RP = 3, 6 BP = 6, 3 NP = 12, 1.5 CP = 24, 0.75 SP = 48, 0.375 class modificador(enum.Enum): ##Sostenido SS = 1 ##Bemol BE = 2 ##Ninguno NO = 3 class Nota(): ##Por defecto las notas no tienen modificador y la octava es la 4 def __init__(self, nota: eNotas, tipo: tipoNota, modificador = modificador.NO, octava = 4): self.nota = nota self.tipo = tipo self.modificador = modificador self.octava = octava def duracion(self): return self.tipo.value[1] # Calcula y devuelve la frecuencia de la nota aplicando la formula def frec(self): expo = self.octava * 12 + (self.nota.value - 58) if self.modificador == modificador.SS: expo += 1 if self.modificador == modificador.BE: expo -= 1 return int(440 * ((2 ** (1 / 12)) ** expo))