El Video (AUDIO) Correcto #9 - Convirtiendo CD a FLAC
Hola de nuevo a todos, el día de hoy vamos a ver cómo extraer nuestros audios de CD's originales y convertirlos a FLAC. Al inicio pensé en hacer alugan clase de programa para hacerlo, pero cómo probablemente solo uno de cada mil personas va a convertir sus discos (incluso a estas alturas, habrá quienes no los conozcan), decidí solo mostrar cual es el método que uso actualmente.
Para poder hacer la copia de los discos, vamos a usar MediaGo de SONY, aunque es un programa relativamente viejo, aun al día de hoy funciona y tiene la virtud de que las funciones que requieren de internet, aun funcionan. Para no adelantarnos, vamos a ir en orden y lo primero que haremos es descargar el instalador de Media Go. Una vez lo descargamos, lo instalamos y lo ejecutamos.
Una vez que el programa está listo, simplemente insertaremos nuestro CD. De lado izquierdo aparecerá en una ficha llamada "CD de audio"; hacemos clic en ella y podremos ver el contenido del CD.
Antes de continuar, haremos clic en el menú "Herramientas>>Preferencias" y se abrirá un dialogo con los ajustes del programa.
Hacemos clic en "Importación de CD" y en la caja de selección de la opción "Usar pistas usando el formato" seleccionaremos la opción FLAC. Hacemos clic en aceptar y los ajustes estarán listos.
Para comenzar la copia, simplemente hacemos clic en el botón "Importar CD". La copia comenzará y al finalizar, podremos escuchar nuestro archivos.
La razón principal para usar "Media Go" es simple: Ya tiene todo lo necesario; cuando importa los archivos, se conecta a la base de datos Gracenote y obtiene todos los datos que puedan ser relevantes a la hora de identificar una canción.
Y bien, por ahora es casi todo...
He hablado de las cosas que son necesarias para poder oír audio en buena calidad (y no hablo de esos "audiofilos mugorosos" que le rebanan los bordes al los CD's para mejorar la calidad del audio), ya mencione los audifonos, los archivos de audio y la última cosa que es importante mencionar; y eso es el dispositivo que se va a encargar de reproducir el archivo.
Muchos de los celulares, simplemente contienen la "placa de audio" mas genérica que se pude encontrar, aun en los dispositivos de gama media, la mayor parte de ellos tendrán dicha placa que solo es capaz de reproducir hasta 32000Hz (si bien nos va); aunque parezca redundante; si conectamos unos audífonos de calidad superior al puerto 3.5mm del teléfono y este solo pude decodificar hasta cierta calidad, estaremos desperdiciando el hardware. Identificar si un teléfono es capaz de reproducir audio en alta calidad no es sencillo, ya que muchas veces es un dato que no es relevante a la hora de vender (siempre se verá primero la RAM y el CPU) pero si es posible, buscar el logotipo "Hi res audio" ayuda.
Aun si el equipo no cuenta con el logotipo, hay otras formas de saber si lo es.
![]() |
| LDAC ayuda a transmitir audio en alta calidad por Bluetooth |
Y bien, por ahora es todo, en el siguiente post veremos cómo leer los metadatos de los archivos FLAC en C# y varios lenguajes mas.
Los leo luego.
El Video (AUDIO) Correcto #8 - WAV VS FLAC
Hola de nuevo a todos, el día de hoy vamos a continuar con un poco más sobre el audio de buena calidad.
En el post anterior vimos cómo es importante tener un par de audífonos de la calidad adecuada para poder disfrutar de la música cómo es debido. Pero, no solo se trata de los audífonos, hay otros elementos que son importantes a la hora de disfrutar del audio de buena calidad.
En este post nos concentraremos en el archivo de audio en si. En reiteradas ocasiones he dicho que los archivos FLAC ofrecen una calidad superior al MP3, incluso en alguno de los post anteriores hice el comparativo, en twitter (o ahora X), mucha gente dijo que los archivos FLAC si bien tienen una calidad mejor que el MP3, también se pierde mucha de la información que conforma la música, y esto es cierto o no, dependiendo de cómo se configura la compresión, cual es el origen del cual vamos a crear nuestro FLAC y algunos otros factores. Pero por lo general, si se configura bien, los archivos FLAC no tendrán ninguna perdida y para probarlo, vamos a hacer la misma prueba que hicimos hace tiempo; vamos a comparar FLAC contra WAV. ¿Por qué WAV? te estarás preguntando, simple, es el contenedor que se usa para el audio sin compresión, por lo que su tamaño será significativamente mayor al de los otros.
![]() |
| Archivo WAV copiado desde un CD ORIGINAL |
![]() |
| Archivo FLAC creado desde un CD ORIGINAL |
Las pruebas.
El Video (AUDIO) Correcto #7 - Un poco mas sobre el audio.
Hola de nuevo a todos, el día de hoy vamos a ver un poco mas sobre los archivos FLAC.
![]() |
| imagen tomada de: https://www.revistagadgets.com/2017/04/04/audio-hi-res-la-nueva-linea-audifonos-pioneer/ |
Cómo muchos de ustedes sabrán, me gusta mucho oír música (música de verdad y no "regeton"), pero siempre había usado equipo de "baja calidad" (y solo por nombrarlo de alguna manera). Pero no hace mucho tiempo, visité un lugar donde se exponían diferente sistemas de audio, desde los mas sencillos; cómo bocina bluetooth; hasta los mas complejos; llámese audio de estudio.
Dentro del mismo lugar había un apartado para los audífonos, de inmediato fui a revisar, y había varios para probar. Cada uno tenia la ficha que describía cuales eran sus características, pero hacían un fuerte énfasis en la frecuencia de respuesta de cada uno.
Primero probé los que ofrecían una respuesta de 20 hasta 20000Hz, justo cómo la mayor parte de audífonos son, la calidad era aceptable, mucho de los audífonos que he tenido cumplían con esa frecuencia y todo parecía aceptable. Los siguientes tenían una respuesta de 20 hasta 32000Hz, la misma calidad que los audífonos que siempre usaba, y justo cómo los anteriores, todo funcionaba bien, y a mi gusto, nada podía superar la calidad. En la siguiente mesa había unos audífonos con una respuesta de 20 hasta 40000Hz... había vivido engañado todo el tiempo, siempre me habían dicho que el oído humano no era capaz de oír frecuencias mas allá de los 32000Hz, pero al momento de probar esos, de inmediato me di cuenta que, si bien es cierto que el oído humano está limitado a ciertas frecuencias, el hecho es que cada persona es diferente y hay quienes alcanzan un rango auditivo mayor al de otros. En mi caso es muy difícil decir hasta "donde puedo escuchar", ya que nunca he hecho un estudio que sirva para eso, pero no había duda de que esos audífonos "sonaban mejor" que los otros, por lo que decidí conseguir unos.
Finalmente cosegui unos audifonos edifier w820nb plus que cuestan poco y tienen la calidad superior a los que ya tenía.
Pero para poder disfrutar de un buen audio, no solo basta con tener los audífonos, también hay que tener un dispositivo compatible y los archivos de audio adecuados. Por fortuna para mi, aun soy de la vieja escuela y tengo mi colección de discos guardados. Normalmente lo que hacia era utilizar mi reproductor de CD (si, en 2023 aun sigo usándolo), pero el inconveniente que encontré, es que la única salida que tiene, es el plug tradicional de 3.5 mm, mientras que los audífonos soportan bluetooth y USB-C.Cumplimos 7 años -_-!!!!
Hola de nuevo a todos, el dia de hoy solo escribo para recordar que un dia cómo hoy pero de hace siete años, nació el blog de Xwork. Si bien es que ha habido altas y bajas; sobre todo bajas hablando del blog; solo quiero decir que ya estoy trabajando para continuar con el plan de un post al mes.
En tiempos recientes, he tenido que atender otros asuntos y contrario a lo que se podria pensar, basados en el estado del blog; realmente estoy disfrutando el momento y por eso es que lo he descuidado, pero cómo todo, estoy tratando de encontrar el balance entre haer lo que debo y lo que me gusta (que casí van de la mano).
Por eso nuevamente quiero agradecer a todos los que visitan y recordarles que sigan al pendiente que esto seguirá mientras no haya ningun impedimento.
![]() |
| Hay varios proyectos listos, solo hay que esperar un poco |
Saludos y nos seguimos leyendo.
Vamos a programar #101 - Operaciones a nivel de bits en Python y tablas de verdad.
Hola de nuevo a todos, el día de hoy vamos a ver mas operaciones a nivel de bits.
Hace algunos días alguien me pregunto que si era posible usar operaciones a nivel de bits en Python, la respuesta sencilla es: si. Pero ¿Cómo es que trabaja cada una y cuales son las que están disponibles? Anteriormente vimos cómo es posible usarlos en C# y si bien son esencialmente lo mismo, vale la pena revisarlas por separado. En este post veremos las operaciones disponibles SOLO para Python.
En Python disponemos de las siguientes operaciones:
- Or (o) "|"
- XOr (o exclusivo) "^"
- And (y) "&"
- Shift left (desplazamiento a la izquierda) "<<"
- Shift right (desplazamiento a la derecha) ">>"
- Not (inverso) "~"
Or "|"
- Verdadero O Verdadero = Verdadero
- Verdadero O Falso = Verdadero
- Falso O Verdadero = Verdadero
- Falso O Falso = Falso
- 1|1 = 1
- 1|0 = 1
- 0|1 = 1
- 0|0 = 0
XOr "^"
- Verdadero OEx Verdadero = Falso
- Verdadero OEx Falso = Verdadero
- Falso OEx Verdadero = Verdadero
- Falso OEx Falso = Falso
- 1^1 = 0
- 1^0 = 1
- 0^1 = 1
- 0^0 = 0
And "&"
- Verdadero Y Verdadero = Verdadero
- Verdadero Y Falso = Falso
- Falso Y Verdadero = Falso
- Falso Y Falso = Falso
- 1&1 = 1
- 1&0 = 0
- 0&1 = 0
- 0&0 = 0
Shift Left "<<"
- 76 << 2 = 304
- 1001100 << 10 = 100110000
MiNum = 76
print (MiNum)
print("{:b}".format(MiNum))
MiNum <<= 0b10
print(MiNum)
print("{:b}".format(MiNum))Shift Right ">>"
- 76 >> 4 = 4
- 1001100 >> 100 = 100
MiNum = 76
print (MiNum)
print("{:b}".format(MiNum))
MiNum >>= 0b100
print(MiNum)
print("{:b}".format(MiNum))Not "~"
Inútil apps #5 - Visualizer V3 (parte 3)
| MARCA | Valor |
|---|---|
| R1,R4,R9,R10 | 10k |
| R2,R5 | 1k |
| R3,R6 | 200k |
| R7,R8 | 680 |
| C1,C2 | 10uF |
| D1,D2 | 1N4007 |
| U1 | LM358 |
| U2,U3 | LM3915 |
| LED1,LED2,LED3,...,LED20 | Diodo LED 5mm |
| POT1 | Potenciómetro 100k |
| BUCK1 | Buck converter |
- AUDIOINR
- Sirve para conectar el audio, el canal derecho es recomendado, en el pin que tiene forma de cuadrado o PIN1 conectamos la parte positiva del audio, el pin 2 no se conecta y el pin 3 va al negativo del audio.
- AUDIOINL
- Igual que el anterior, sirve para conectar el audio de entrada, el canal izquierdo es el recomendado.
- H1
- Comparte las conexiones del pin 1 y tres de los pines "AUDIOINR", pero además, en este se encuentra la salida regulada del audio que se conecta a una entrada del LM358.
- H2
- Comparte las conexiones del pin 1 y tres de los pines "AUDIOINL", pero además, en este se encuentra la salida regulada del audio que se conecta a una entrada del LM358.
- H3
- Es la entrada de 5v
- H4
- Es la entrada de 12v
- U5 y U4
- Son los jumpers para seleccionar el modo punto o barra del LM3615
Cumplimos 6 años.
Un día cómo hoy pero del 2016, nació el blog de Xwork y cómo cada año hay que celebrar; pero no en esta ocasión. Hoy solo rendiremos tributo a los que se adelantaron en el camino y solo esperan a que nos reunamos con ellos en la nada.
Att Xwork. Nos seguimos leyendo.
Inutil apps #5 - Visualizer V3 (parte 2)
Hola de nuevo a todos, el día de hoy vamos a continuar con más de Visualizer V3. En el post anterior, vimos cómo amplificar la señal de audio para que el nivel de las luces no dependa totalmente del volumen del audio, el día de hoy vamos a ver cómo hacer las pantallas de LEDs usando el viejo y confiable LM3915.
Las conexiones a seguir son realmente simples, para ello primero veamos el diagrama siguiente:
Las conexiones son:
- Pin 1 - Salida de LED.
- Pin 2 - Tierra.
- Pin 3 - VCC (3 ~ 35V).
- Pin 4 - Divisor bajo
- Pin 5 - Input
- Pin 6 - Divisor alto.
- Pin 7 - Referencia de salida.
- Pin 8 - Ajuste de referencia.
- Pin 9 - Selector de modo.
- Pin 10 ~ Pin 18 - Salida de LED's
En el post anterior vimos una de la aplicaciones de los amplificadores operacionales, en ese caso lo usamos cómo amplificador, pero es posible usarlo cómo comparador y el LM3915 hace uso de ese comportamiento.
Si observas detenidamente , todas las salidas son las salidas de los amplificadores operacionales, mientras que las entradas "positivas" se conectan a una serie de resistencias que van desde el pin 4 al pin 6, si recuerdas bien, esta configuración es un divisor resistivo y usarse resistencias del mismo valor en cada paso, tendremos que el voltaje será proporcional y será determinado por los valores que se usen en los pines 4 y 6. Así que si conectamos el pin 4 a tierra y el pin 6 a 5v, tendremos en cada paso 0.5v.
En la entrada negativa tendremos el voltaje que se aplique al pin 5, que en nuestro caso, será el voltaje proporcional al nivel de sonido. La forma en que se usa es: cuando a un amplificador operacional se le aplica un voltaje mayor en la entrada negativa, la salida de este tendrá un voltaje igual al aplicado a la entrada negativa, en caso contrario (si el voltaje es mayor en la entrada positiva), la salida tendrá el voltaje de la entrada positiva.
Si tomamos en cuenta quu aplicamos un voltaje de 5v en el pin 5 y el pin 6 esta conectado a 5v, eso implica que todos los led prenderán, pero además eso aplica también para cuando el voltaje es mayor a 5v (valga la redundancia). Ahora si por ejemplo; aplicamos 2.7v al pin 5 mientras los pin 4 y 6 siguen conectados igual, del primero al quinto LED son los que cumplen la condición de tener un voltaje mayor en la entrada negativa por lo que se encenderían.
Y bien, por ahora es todo, en el siguiente y ultimo post, agregamos los componentes adicionales y pondré a disposición de cualquiera los diagramas para la fabricación de los PCB, que recalco, ya han sido probadas y están listas para usarse.
Los leo luego.
Inutil apps #5 - Visualizer V3 (parte 1).
Hola de nuevo a todos, despues de un tiempo de ausencia, es hora de retormar el curso y crear un poco de contenido para el blog. En esta ocasion vamos a hacer mejoras para las luces audio-ritmicas que en algun momento hice. Si bien funcionan bien, había algunos detalles por arreglar para que funcionanran de manera adecuada. El proyecto se va a dividir en dos partes en donde detallaré cómo es que funciona, pero ademas pondré a disposicion de cualquiera que quiera ordenar las placas PCB, los archivos gerber del diagrama que veremos. Este a diferencia del velocimetro, ya esta probado, por lo que puedes encargarlos sin el temor de que algo funcione mal.
Si hacemos un poco de memoria (o revisamos el post), veremos que todo funciona cómo es debido, pero tiene un problema un tanto grave: ¡¡No tiene control de volumen!!, por lo que los niveles que se muestran en las luces, dependen directamente del nivel de volumen de la fuente de sonido, pero no solo eso, además el sonido tenía que estar amplificado para poder ver algo. Al inicio lo pensé así por la sencilla razón que no tengo un amplificador grande; y eso fue hasta hace poco.
Ahora cómo el sistema de sonido es mas grande, al subir un poco el volumen , este ya alcanza un nivel considerable de ruido y aun así no se alcanza a iluminar todas las luces del diseño pasado. La solución es simple, debemos de amplificar por separado el audio para las luces. Para poder conseguir esa tarea, vamos a usar un amplificador operacional.
Para esta tarea cualquier amplificador operacional funciona, pero en mi caso voy a usar el circuito integrado LM358.
Para poder usarlo, debemos de hacer las conexiones cómo sigue:
Cómo podrás observar, usamos tres resistencias. R3 sirve para establecer a tierra cómo referencia entre la señal que ingresamos, R1 y R2 se utilizan para establecer la ganancia que va a tener. Hay que tener en cuenta que este tipo de conexión conocida cómo "non inverting" sirve para amplificar la ganancia de la señal (hay varios tipos de configuraciones, pero eso esta fuera del tema del post), pero además existe una formula que nos sirve para calcular la ganancia.
Tomando en cuenta que los voltajes de salida en los conectores de audio de la mayoría de los dispositivos esta en un rango de hasta 2.2v, debemos de tratar de elevarlo al menos diez veces. En la practica he tenido problemas asumiendo esto, debido a que no poseo un osciloscopio, me resulta difícil obtener una medición exacta, pero podemos aquí usar una ganancia de 200, aunque parezca algo exagerado, debemos de tener en cuenta la amplificación no va a ir mas allá del voltaje de entrada que le demos al amplificador, por lo que si lo alimentamos con 12v, en el peor de los casos, tendremos 11.7v aproximadamente cómo máximo a la salida (eso dependiendo del amplificador, pero una vez mas, es un tema que merece un post a parte). Pero además 2.2v es el máximo por lo que tener al mínimo el volumen podemos esperar valores en el rango de los milivolts y si por ejemplo; tenemos 0.01v, al amplificarlo 200 veces, tendremos 2v
Ahora veamos los cálculos.
Y después simplemente resolvemos:
Es recomendable que se usen valores en el rango de los kilo ohms para R1 de esta forma evitamos algunos problemas, pero además, también es recomendable mantener la ganancia no tan alta, una ganancia de 300x es aceptable, pero hay que tener en cuenta que dependiendo del tipo de señal de entrada, del propio circuito integrado y otros factores, se puede introducir "ruido" o distorsión que normalmente no son deseables, pero para este tipo de proyecto, no afecta tanto.
Antes de continuar veamos un ejemplo donde tenemos el valor de R1 que es 100k; y R2 que es 50k; y solo queremos saber cual es la guanacia:
Sabiendo lo anterior, podemos hacer las conexiones al lm358 tomando en cuenta cuales son los pines.
- El pin 4 se conecta a tierra.
- El pin 8 se conecta a VCC, en nuestro caso 12v
- El pin 3 es la entrada, aquí conectaremos nuestra señal de audio.
- Entre el pin 1 y 2 conectaremos R2 .
- Entre el pin 2 y tierra, conectaremos R1.
- El pin 1 es la salida amplificada.
Y bien, por ahora es todo, si bien no hemos aprendido la capacidad real de los amplificadores operacionales, este post sirve cómo una aproximación a ellos. Recuerda que aquí no trato de enseñar los fundamentos de la electrónica, pero a lo mejor en el futuro, hago una explicación mas profunda de todo lo que se puede hacer. Recuerda que en el siguiente post publicaré la parte de las luces, pero además publicaré los esquemas para que puedas fabricar tu propia versión.
Los leo luego.
Vamos a programar #100 - Speedometer M. Versión Final.
Hola de nuevo a todos, el día de hoy empezaremos a ver la versión final del velocímetro.
Este proyecto fue iniciado mas o menos por el 2018 y ha sufrido una serie de cambios a lo largo del tiempo, si bien la última versión que fue publicada funcionaba bien, poco a poco se fueron agregando funciones para hacerlo funcionar de manera optima con el mínimo de hardware posible (de ahí que nunca le agregue ningún tipo de botón). Finalmente, tras días de pruebas y pruebas, he decidido finalizar con este proyecto porque finalmente ha alcanzado el nivel de confiabilidad para poder usarse en el día a día.
Primero que nada, veamos el código que hace funcionar a "Speeedometer M"
// Incluir la libreria para la pantalla
#include <LiquidCrystal.h>
// Pines usados en la pantalla extraido de los ejemplos incluidos en la libreria
const int rs = 13, en = 12, d4 = 11, d5 = 10, d6 = 9, d7 = 8;
// iniciar el objeto LiquidCrystal
LiquidCrystal lcd(rs , en , d4 , d5 , d6 , d7);
// Este es el valor que debes de modificar para que funcione correctamente
// Puedes ver instrucciones en https://xworkforall.blogspot.mx/2018/03/vamos-programar-49.html
const float Llanta = 1.9572;
//Algunas variables
const int HallSensor1 = 3;
const int LED1 = 7;
const int LED2 = 6;
const int LED3 = 5;
int Vuelta = 0;
unsigned long OldTime = 0;
float Distancia = 0.0;
float Speed = 0.0;
int ledState = LOW;
int VoltSensor = 0;
float BattVolt = 0.0;
// v=99.99
char BuffVelocity[15];
//d=999.99
char BuffDistance[15];
//R=999999
char BuffRevolution[15];
//V=4.2
char BuffBattery[15];
//Incializar todo
void setup() {
//Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("@XWork");
pinMode(HallSensor1, INPUT);
attachInterrupt(digitalPinToInterrupt(HallSensor1) , GetVelocity , LOW);
pinMode(LED1 , OUTPUT);
pinMode(LED2 , OUTPUT);
pinMode(LED3 , OUTPUT);
}
// Calcular la velocidad
void GetVelocity() {
if (millis() - OldTime > 70) {
Speed = Llanta / ((float)( millis() - OldTime) / 1000) * 3.6;
OldTime = millis();
Distancia = Distancia + Llanta / 1000;
Vuelta += 1;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
}
}
//Bucle principal
void loop() {
VoltSensor = analogRead(A5);
BattVolt = (VoltSensor * (10.0 / 1023.0));
dtostrf(Speed , 5 , 2 , BuffVelocity);
dtostrf(Distancia , 6 , 2, BuffDistance);
sprintf(BuffRevolution , "R=%6d", Vuelta);
dtostrf(BattVolt , 5 , 1, BuffBattery);
lcd.setCursor(0, 0);
lcd.print("d=");
lcd.setCursor(2 , 0);
lcd.print(BuffDistance);
lcd.setCursor(9, 0);
lcd.print("v=");
lcd.setCursor(11, 0);
lcd.print(BuffVelocity);
lcd.setCursor(0,1);
lcd.print(BuffRevolution);
lcd.setCursor(9,1);
lcd.print("V=");
lcd.print(BuffBattery);
digitalWrite(LED1 , ledState);
digitalWrite(LED2 , ledState);
digitalWrite(LED3 , ledState);
if ((millis() - OldTime) > 3000){
ledState = LOW;
Speed = 0.0;
}
}







































