Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Códigos detector de notas musicales en python, Ejercicios de Señales y Sistemas

Códigos para detector de notas musicales en python

Tipo: Ejercicios

2020/2021
En oferta
30 Puntos
Discount

Oferta a tiempo limitado


Subido el 08/02/2022

wolf-kill
wolf-kill 🇪🇨

1 documento

1 / 5

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
MAIN
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
pf3
pf4
pf5
Discount

En oferta

Vista previa parcial del texto

¡Descarga Códigos detector de notas musicales en python y más Ejercicios en PDF de Señales y Sistemas solo en Docsity!

MAIN

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 )) ######################################################################

Obtenga un índice mínimo / máximo dentro de FFT de las notas que nos interesan.

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 ))))

Asignar espacio para ejecutar una FFT.

buf = np.zeros(SAMPLES_PER_FFT, dtype=np.float32) num_frames = 0

Inicio de audio

stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels= 1 , rate=FSAMP, input=True, frames_per_buffer=FRAME_SIZE) stream.start_stream()

Crear función de ventana de Hanning

window = 0.5 * ( 1 - np.cos(np.linspace( 0 , 2 * np.pi, SAMPLES_PER_FFT, False)))

Imprimir texto inicial

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

Mueve el búffer hacia abajo y los nuevos datos en

buf[:-FRAME_SIZE] = buf[FRAME_SIZE:] buf[-FRAME_SIZE:] = np.fromstring(stream.read(FRAME_SIZE), np.int16)

Ejecuta el FFT en el búffer con ventana

fft = np.fft.rfft(buf * window)

Obtiene la frecuencia de respuesta máxima en el rango

freq = (np.abs(fft[imin:imax]).argmax() + imin) * FREQ_STEP

Obtiene el número de nota y la nota más cercana //NOTA REAL

n = freq_to_number(freq) n0 = int(round(n))

Salida de consola una vez que tengamos un búfer lleno

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()