TECLADO MUSICAL (PASO A PASO) CON PYTHON Y «pydub».

Hace un par de semanas, estuvimos viendo el modo de generar tonos de audio haciendo uso de la librería «pydub» (la cual instalamos mediante el comando «pip install pydub«). Lo que hoy nos proponemos hacer es poner en practica los conocimientos adquiridos entonces para crear un sencillo teclado musical (usando «tkinter«) de dos octavas como el que mostramos a continuación:

Como siempre, lo primero que haremos es importar los recursos que vamos a necesitar, recordando que debemos instalar previamente tanto la librería «pydub» como el software «ffmpeg«:

Importados los recursos que vamos a emplear, pasaremos a crear nuestro teclado, empezando por definir sus dimensiones, título y color:

A continuación, procedemos a introducir los distintos elementos de nuestro teclado, empezando por las teclas blancas (usando la función «Button»):

Pasando a continuación a hacer los mismo con las teclas negras:

A partir de ahora, nuestra labor será la de hacer que nuestro teclado emita un sonido para cada tecla, pudiendo a su vez variar una serie de características tales como la duración de cada nota, el tipo de onda, la amplitud de esta, el volumen y el desvanecido tanto inicial como final. Para poder estableces tales parámetros, necesitaremos incluir una serie de elementos en nuestra interfaz:

En este bloque, nos hemos encargado de introducir los elementos gráficos. Concretamente un «Entry» para establecer la duración en milisegundos de cada nota (para lo cual también hemos creado la variable «self.duration«) que establecemos en 1000 como valor predeterminado), un «comboBox» en el que mostraremos las posibles formas de onda que podrá adoptar nuestro sonido (las cuales se almacenan en la variable «self.WaveForms«) y cuatro «sliders» con los que podremos regular el volumen, la amplitud (ganancia) y el desvanecido inicial y final (para estos parámetros crearemos también las respectivas variables). Si ejecutamos ahora obtenemos el siguiente resultado:

A su vez, nos hemos asegurado que en le campo «DURATION:» únicamente puedan introducirse valores enteros, para lo que hemos creado la variable «validatecommand» y la función «self.valid_duration()«:

Ya tenemos los elementos mediante los cuales podemos configurar la sonoridad de nuestro teclado, ahora hace falta hacerlo sonar. Para ello crearemos una función a la que hemos llamado «self.make_tone()» que generará nuestra nota en función del tipo de onda, duración y frecuencia (la cual será única para cada tecla y que definiremos más adelante):

A su vez, para evitar que al tocar una nota la ventana se nos pueda quedar congelada, usaremos una nueva función «self.init_task()» que ejecutará (con un «Thread«) la función anterior como un subproceso en paralelo:

Esta es la función que conectaremos directamente con cada uno de los «Button» correspondientes a cada tecla y que tomará como argumento, ahora sí, el valor correspondiente a la frecuencia de cada nota. Valor que especificaremos a través de la correspondiente función «lambda()» tanto para las teclas blancas como para las negras:

Y con ello tendríamos creado nuestro sencillo teclado musical cuyo código completo podéis consultar en el siguiente enlace:

https://github.com/antonioam82/MusicKeyBoard-/blob/main/KeyBoard.py

Saludos.

COMBINAR AUDIO Y VÍDEO EN PYTHON, CON «mhmovie».

A lo largo de las muchas entradas del blog, hemos elaborado gran cantidad de programas y usado un buen número de funciones y métodos encargados de generar distintos tipos de archivos. Dentro de estos, han estado, como no podía ser de otro modo, los archivos de audio y de vídeo (por separado) en sus distintos formatos. No obstante, en ocasiones, es posible que queramos que nuestro programa nos genere un archivo multimedia en el que se incorpore vídeo y audio (en un solo archivo). Para hacer esa labor más sencilla contamos con una librería, basada en el software «ffmpeg«, llamada «mhmovie«, que instalaremos de modo sencillo, con el comando «pip» que ya conocemos:

A su vez, y dado que como hemos señalado más arriba, «mhmovie» funciona con el software de «ffmpeg«, que duda cabe que necesitaremos tener este instalado, previamente, en nuestra computadora. Dicha instalación la hicimos en su momento, para hacer uso de la librería «pydub«, para lo cual, nos fue de gran ayuda un videotutorial que volvemos a dejar a continuación:

Tutorial para la descarga de «ffmpeg» en Windows.

Bien, una vez que tengamos instalado todo lo necesario para la ocasión, vamos a pasar a crear nuestro archivo de audio y vídeo, partiendo de dos archivos (uno de vídeo, de nombre «temp_video.avi» y otro de audio llamado «temp_audio.wav«) creados previamente y de igual duración, los cuales tendremos alojados en nuestro directorio de ejecución:

Así, empezaremos abriendo nuestro editor, e importando nuestra librería «mhmovie«:

Tras ello, pasaremos a cargar, por separado los archivos de partida, haciendo uso de los métodos «.music()» (para el archivo de audio, al que asignaremos la variable «aud«) y «.movie()» (para el caso de la parte de vídeo, que asignaremos a la variable «vid«):

Cargados ambos archivos, pasaremos a combinarlos simplemente mediante la suma de sus correspondientes variables asociadas («aud» y «vid«). Asociando el resultado de la operación a una nueva variable de nombre «result«:

Hecha esta última operación ya solo nos falta guardar el contenido de «result» en un archivo (con la misma extensión que el archivo de vídeo usado). Para ello utilizaremos la función «.save()» a la que, naturalmente, pasaremos el nombre que queramos para nuestro nuevo archivo:

Una vez completada esta sencilla secuencia de pasos, aparecerá nuestro archivo de vídeo con audio (al que hemos llamado «ResultVideo.avi«) en nuestro directorio de ejecución, tal y como se ve en la imagen:

Así, con este sencillo procedimiento que nos proporciona «mhmovie» y «ffmpeg«, ya nunca tendremos dificultades para crear un archivo de vídeo con audio incorporado.

Saludos.

INTRODUCCIÓN AL ANÁLISIS Y TRATAMIENTO DE AUDIOS CON PYTHON Y «librosa».

Hola y bienvenidos, una semana más, a vuestro blog sobre programación en lenguaje «Python». En esta ocasión, vamos a hacer una breve introducción al análisis y tratamiento de la información contenida en archivos de audio, haciendo uso de una librería creada con ese propósito: «librosa«, siendo este artículo, el primero de una nueva serie dedicada a ello.

Así, para empezar nuestros análisis, lo primero será instalar la referida librería en nuestro equipo. Para lo cuál, podremos hacer uso del comando «pip«, que ya empleamos en ocasiones anteriores:

Una vez instalada «librosa«, pasaremos a cargar nuestro audio, que para ser leído, deberá ser en un formato sin compresión de datos (tipo «wav» o «ogg«). No obstante, en este caso vamos a hacer uso del archivo de audio que viene incluido como ejemplo, con la librería y al que podemos acceder con «librosa.util.example_audio_file()«. Al contenido de este audio de prueba le asignaremos el nombre «filename«:

Antes de continuar, hemos de tener en cuenta que el tipo de información con la que vamos a trabajar, es el correspondiente a una señal de audio digital para cuya obtención se ha partido de una señal analógica (continua) de la cuál se han tomado una serie de muestras, cuya secuencia constituirá la señal digital:

Ejemplo de muestreo digital a partir de una señal analógica.

Es precisamente con esta serie de muestras (que se expresará como un array unidimensional de valores en coma flotante) , con las que vamos a trabajar (variable «y«). Por otra parte, la mayor o menor pérdida de información de audio, producida en el proceso de digitalización del audio analógico, vendrá dada por la cantidad de muestras tomadas (a mayor número de muestras, menor pérdida de información). Para la mediación de este aspecto se emplea el «sampling rate» (o «frecuencia de muestreo«) que mide el número de muestras por segundo de audio, y que en nuestro caso, obtendremos con la variable «sr«, y mediremos en hercios («Hz«):

A su vez, partiendo del número de muestras (longitud de «y«) y la frecuencia de muestreo («sr«), podemos obtener, también, la duración, en segundos, de nuestro audio, mediante la división de la primera por la segunda:

A su vez, a partir de esta información, podemos igualmente obtener el «tempo«, que medido en «beats» (latidos o pulsiones) por segundo, expresa la velocidad de reproducción del audio:

Por otra parte, además de obtener datos numéricos de las señales de audio, también podemos realizar representaciones gráficas de las mismas, para lo cual usaremos «matplotlib«, y «librosa.display()«:

Como se ve en este primer ejemplo, hemos cargado nuestro audio de prueba («audiofile«) en modo «mono» (que es el que usará «librosa» por defecto) y especificando el tiempo de duración, en segundos, de nuestra serie temporal (en este caso hemos seleccionado los 10 primeros segundos de audio). Una vez cargado nuestro audio, pasamos a crear la gráfica en la que lo vamos a representar (esto lo haremos con «plt.figure()» y «plt.subplot()«), para, a continuación, proceder a plasmar en la gráfica, los datos de audio contenidos en las variables «y» y «sr«:

El mismo tipo de representación, podemos llevar a cabo con el mismo audio en «estéreo» (dos canales de audio). Solo que en este caso introduciremos «mono = False«:

Introducido este código obtendremos la representación de los primeros 10 segundos de nuestro audio de prueba, en estéreo:

También podemos emplear «librosa.display» para superponer en una misma representación gráfica, más de un parámetro del audio. Así, si por ejemplo quisiéramos visualizar conjuntamente el armónico y la percusión de nuestro audio de prueba:

En este caso, partiendo de la misma señal de audio («y«) hemos extraído tales datos (que hemos almacenado en las variables «y_harm» y «y_perc«) con «librosa.effects.hpss()«, para después representarlos conjuntamente en nuestra gráfica (dando al valor de «y_perc» una coloración rojiza). Hecho ello obtendremos nuestra gráfica:

Y hasta aquí esta breve introducción a esta interesante herramienta de análisis de audio, cuyas características y funcionalidades iremos viendo, en detalle en futuras entradas del blog.

El código correspondiente al ejemplo para la representación de estas tres gráficas lo tenéis disponible en el siguiente enlace:

https://github.com/antonioam82/ejercicios-python/blob/master/librosa_display_waveplot.py

Saludos.