



Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Códigos para detector de notas musicales en python
Tipo: Ejercicios
1 / 5
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!




En oferta
import sys from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5 import uic # llama al archivo creado en Qt Designer import time import publicador # llama a publicador.py con sus variables globales y función: PublicaNota() --> numeroMIDI, frecHz, notaProxima, distNotaProxima class Proceso(QObject): # frec 7Hz def init(self): super(Proceso, self).init() def procesoPub(self): publicador.PublicaNota() class Ventana(QMainWindow): # 60Hz --> 100Hz def init(self): super(Ventana, self).init() uic.loadUi("Proyecto_Parcial1.ui", self) #P1: mostraba la GUI Proyecto_Parcial1.ui #Usamos multihilos Qt self.hilo = QThread() self.proceso = Proceso() self.proceso.moveToThread(self.hilo) self.boton.clicked.connect(self.hilo.start) self.hilo.started.connect(self.proceso.procesoPub) #P2: Comienza el programa principal "publicador.py" self.timer = QTimer() self.timer.setInterval( 10 ) # cada 10ms se actualiza la ventana (100Hz) self.timer.timeout.connect(self.actualizaVentana) self.timer.start() def actualizaVentana(self): #Recibe los datos: numeroMIDI, frecHz, notaProxima, distNotaProxima #el numero MIDI varia de 39 a 65 pub_numeroMIDI = "%.2f" % (publicador.numeroMIDI) #tomamos solo 2 decimales self.numMIDI.setText(str(pub_numeroMIDI)) #actualizamos etiqueta MIDI
pub_frecHz = "%.2f" % (publicador.frecHz) self.frecuencia.setText(str(pub_frecHz)) #actualizamos etiqueta frec Hz self.notaProx.setText(str(publicador.notaProxima)) #actualizamos etiqueta Nota Prox distNP = "%.2f" % (publicador.distNotaProxima) self.distNotaP.setText(str(distNP)) #actualizamos etiqueta distancia a la nota prox self.verticalSlider.setValue((publicador.numeroMIDI)* 10 ) #actualizamos slider #P1: mostraba la GUI ProyectoParcial1.ui def run(): app = QApplication(sys.argv) programa = Ventana() programa.show() sys.exit(app.exec_()) if name == 'main': run() #inicia el programa
def note_name(n): return NOTE_NAMES[n % NOTE_MIN % len(NOTE_NAMES)] + str(int(n / 12 - 1 )) ######################################################################
def note_to_fftbin(n): return number_to_freq(n) / FREQ_STEP imin = max( 0 , int(np.floor(note_to_fftbin(NOTE_MIN - 1 )))) imax = min(SAMPLES_PER_FFT, int(np.ceil(note_to_fftbin(NOTE_MAX + 1 ))))
buf = np.zeros(SAMPLES_PER_FFT, dtype=np.float32) num_frames = 0
stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels= 1 , rate=FSAMP, input=True, frames_per_buffer=FRAME_SIZE) stream.start_stream()
window = 0.5 * ( 1 - np.cos(np.linspace( 0 , 2 * np.pi, SAMPLES_PER_FFT, False)))
print('sampling at', FSAMP, 'Hz with max resolution of', FREQ_STEP, 'Hz') print() def PublicaNota(): while stream.is_active(): #T0: ojo: Hemos calculado que el tiempo de cada iteracion es 0.1431541443 seg osea 6.98 Hz de frec start_time = time() #T0: para calcular tiempo de cada iteracion
buf[:-FRAME_SIZE] = buf[FRAME_SIZE:] buf[-FRAME_SIZE:] = np.fromstring(stream.read(FRAME_SIZE), np.int16)
fft = np.fft.rfft(buf * window)
freq = (np.abs(fft[imin:imax]).argmax() + imin) * FREQ_STEP
n = freq_to_number(freq) n0 = int(round(n))
global num_frames #declara a num_frames como variable global para poder utilizarla fuera del while() y de la funcion "PublicaNota()" num_frames += 1 #Resultado global numeroMIDI, frecHz, notaProxima, distNotaProxima numeroMIDI, frecHz, notaProxima, distNotaProxima = n, freq, note_name(n0), (n-n0) #global ResMidi, ResFrec, ResNota, ResDist #ResMidi, ResFrec, ResNota, ResDist = n, freq, note_name(n0), (n-n0) if num_frames >= FRAMES_PER_FFT: # Despues de 16 frames analizados por FFT se mostrara la nota print('Num MIDI {:7.2f} Frec: {:7.2f} Hz Nota prox: {:>3s} {:+.2f}'.format( numeroMIDI, frecHz, notaProxima, distNotaProxima )) global varPub #variable enviada varPub = numeroMIDI #print("Varible publicada: %s" % str(varPub) ) #devuelve numeroMIDI, frecHz, notaProxima, distNotaProxima #PEND: No avanza el programa si se activa RETURN por eso debemos trabajar con variable sglobales commo "varPub" elapsed_time = time() - start_time #T0: para calcular tiempo de cada iteracion print("Elapsed time: %0.10f seconds." % elapsed_time) #T0: para calcular tiempo de cada iteracion: media 0.1431541443 seg osea 6.98 Hz de frec if name == 'main': #se ejecuta solo se llama desde este file PublicaNota()