Cleaned code, added comments for better understanding

main
fosanz 11 months ago
parent 99df0948b6
commit 8f82c447e9

@ -1,6 +1,10 @@
import enum import enum
from math import exp, log
# 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): class eNotas(enum.Enum):
DO = 1 DO = 1
RE = 3 RE = 3
@ -26,20 +30,6 @@ class tipoNota(enum.Enum):
CP = 24, 0.75 CP = 24, 0.75
SP = 48, 0.375 SP = 48, 0.375
## Silencios
XR = 1, 4
XB = 2, 2
XN = 4, 1
XC = 8, 0.5
XS = 16, 0.25
## Silencios con puntillo
XRP = 3, 6
XBP = 6, 3
XNP = 12, 1.5
XCP = 24, 0.75
XSP = 48, 0.375
class modificador(enum.Enum): class modificador(enum.Enum):
##Sostenido ##Sostenido
SS = 1 SS = 1
@ -64,6 +54,7 @@ class Nota():
return self.tipo.value[1] return self.tipo.value[1]
# Calcula y devuelve la frecuencia de la nota aplicando la formula
def frec(self): def frec(self):
expo = self.octava * 12 + (self.nota.value - 58) expo = self.octava * 12 + (self.nota.value - 58)

@ -1,5 +1,3 @@
import time
from pydub import AudioSegment
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.style.use("bmh") plt.style.use("bmh")
@ -9,6 +7,10 @@ from Notas import Nota, eNotas, tipoNota, modificador
class Instrumento(threading.Thread): class Instrumento(threading.Thread):
# Notas: Lista de notas a reproducir
# Velocidad: Velocidad de reproduccion (bpm = 1/vel * 60) (1 = 1 negra por segundo)
# Volumen: Volumen de reproduccion (0 (silencio) - 1 (maximo))
# Barrier: Barrier para sincronizar los threads
def __init__(self, notas: list, velocidad: int, volumen: float, barrier=None): def __init__(self, notas: list, velocidad: int, volumen: float, barrier=None):
super().__init__() super().__init__()
self.notas = notas self.notas = notas
@ -20,7 +22,10 @@ class Instrumento(threading.Thread):
self.stream.start() self.stream.start()
def beep(self, nota: Nota, velocidad: int): def beep(self, nota: Nota, velocidad: int):
# Calculate the duration of the beep in seconds
duration = nota.duracion() * velocidad duration = nota.duracion() * velocidad
# Calculate the frequency
f = nota.frec() f = nota.frec()
# Generate the time values for the samples # Generate the time values for the samples
@ -33,6 +38,7 @@ class Instrumento(threading.Thread):
audio = wave * (2**15 - 1) / np.max(np.abs(wave)) audio = wave * (2**15 - 1) / np.max(np.abs(wave))
audio = audio.astype(np.float32) audio = audio.astype(np.float32)
# Apply volume
audio = audio * self.volumen audio = audio * self.volumen
# Play the audio # Play the audio
@ -41,10 +47,12 @@ class Instrumento(threading.Thread):
def run(self): def run(self):
# Wait for all threads to be ready # Wait for all threads to be ready
self.barrier.wait() self.barrier.wait()
# Play the notes one by one
for nota in self.notas: for nota in self.notas:
self.beep(nota, self.velocidad) self.beep(nota, self.velocidad)
def close(self): def close(self):
# Close the stream
self.stream.close() self.stream.close()
@ -102,13 +110,21 @@ if __name__ == "__main__":
Nota(eNotas.DO, tipoNota.B, octava=3)] Nota(eNotas.DO, tipoNota.B, octava=3)]
#Create the barrier
barrier = threading.Barrier(2) barrier = threading.Barrier(2)
#Create the threads
instrumento1 = Instrumento(melodia, 0.5, 1, barrier) instrumento1 = Instrumento(melodia, 0.5, 1, barrier)
instrumento2 = Instrumento(acompañamiento, 0.5, 0.5, barrier) instrumento2 = Instrumento(acompañamiento, 0.5, 0.5, barrier)
#Barrier to ensure that both threads start at the same time
#Start both threads
instrumento1.start() instrumento1.start()
instrumento2.start() instrumento2.start()
#Wait for both threads to finish
instrumento1.join() instrumento1.join()
instrumento2.join() instrumento2.join()
#Close the streams
instrumento1.close() instrumento1.close()
instrumento2.close() instrumento2.close()
Loading…
Cancel
Save

Powered by INFORMATICA.FP.EDU.ES.