Cómo extender señales digitales de alta frecuencia (p. ej., MIDI) al rango de audio

Tengo curiosidad acerca de la posibilidad de sonificar datos MIDI, que tiene una tasa de bits de 31250. El rango de audición humana se extiende a unos 20 kHz, lo que significa que los bits más rápidos de la señal estarían cerca de la parte superior de este rango: no ideal para mis propósitos Imagino estirar la señal y luego pasar el resultado a un pequeño altavoz.

No estoy seguro de si existe un término más preciso para esta operación que "estiramiento" (no estoy muy familiarizado con el procesamiento de señales digitales). En cualquier caso, puedo proporcionar un ejemplo concreto de lo que quiero decir:

00101110100001 >> estirar por 2 >> 0000110011111100110000000011

No es improbable, el sonido resultante parecerá bastante atonal/ruidoso, y eso está bien para mí. Me imagino que podría realizar esta tarea con Arduino, pero me pregunto si esto podría hacerse con un diseño de circuito inteligente. Por ejemplo, ¿algo parecido a usar un IC contador 4018 dividido por N? Reconozco que el 4018 no es exactamente lo que busco, ya que este actúa sobre una señal de reloj estrictamente periódica.

¿Algunas ideas?

Entonces, ¿esencialmente desea hacer audible un flujo de bits aleatorio de alta frecuencia (solo algunos datos binarios)? Para reducir la velocidad, a) extenderá su duración, por ejemplo, durará 1 segundo de bits a 31 250 b/s, digamos 3 segundos, o b) algunos de los datos se desecharán, digamos 2 de cada cada 3 bits. ¿Tienes alguna preferencia? Si se reproduce literalmente como bits, sin más procesamiento, sonará como un ruido "blanco" aleatorio.
Gracias por ese análisis sucinto @gbulmer. Estoy buscando específicamente la opción A (ampliar la duración). Sospecho que la opción B podría realizarse utilizando un 4018.
Extender la duración, para que todos los bits finalmente se reproduzcan, requerirá memoria. Eso podría deberse a que los datos MIDI se pueden leer y volver a leer, por ejemplo, desde un dispositivo de almacenamiento. De lo contrario, la 'línea de retraso' necesita suficiente almacenamiento para contener los datos. Entonces, ¿cuánto tiempo estás pensando en una pieza de datos MIDI? Cinco minutos a 31250b/s (casi 4kB/s) = 1144kB, es decir, más de 1 MB.
en realidad es bastante gracioso... Intenté abrir un archivo MID (aunque no es un flujo MIDI adecuado) como RAW en un editor de audio (como 8 bits con signo, 11.025 kHz), y hace una especie de archivo estructurado (ruidoso). ) suena ;-)
¿Tal vez busque en la modulación por cambio de frecuencia (FSK), o vea si puede encontrar un viejo módem de teléfono acústico BEL 103 o un equipo de radio de paquetes de radioaficionado? Esto al menos sonaría más "musical" que el ruido blanco, podrías escuchar las marcas y los bits de espacio con mayor claridad. (De lo contrario, solo escuchará las transiciones 0-1 y 1-0). De acuerdo, ahora está haciendo "ruido de módem" en lugar de ruido blanco, pero es su proyecto...
Los bits más rápidos de la señal serían 15.625Khz, pero fuera de los escenarios artificiales, la señal tendrá suficiente contenido para ser audible como un chirrido incluso sin ningún ajuste de frecuencia.

Respuestas (3)

Dado que los datos MIDI parecen ser una serie de bytes de datos de 8 bits enviados por un UART estándar, puede usar un microcontrolador para recibir los datos a la velocidad MIDI estándar y retransmitirlos a una velocidad en baudios más baja. Esto supone que hay suficientes lagunas en los datos para que no sobrecargue el búfer de recepción.

Esto probablemente requeriría un microcontrolador con dos UART, ya que los UART que he usado no permiten diferentes velocidades de transmisión y recepción.

Los datos MIDI son muy intermitentes; probablemente podría reducir la velocidad en baudios en un factor de 10 y no perder una cantidad significativa de datos, incluso con solo unos pocos cientos de bytes de búfer. Cualquier pequeño micro podría hacer esto; simplemente golpee la señal de salida en lugar de usar un segundo UART.

Entonces, esencialmente, desea hacer audible un flujo de bits aleatorio de alta frecuencia (solo algunos datos binarios). Si se reproduce literalmente como bits, sin más procesamiento, sonará como un ruido "blanco" aleatorio.

Para reducir la velocidad, ya sea:

  1. extender su duración, por ejemplo, 1 segundo de bits a 31,250b/s durará, digamos 3 segundos, o
  2. tirar algunos de los datos a la basura. Digamos que 2 de cada 3 bits lo pondrán en un rango audible

Para una manera simple, pero interesante, de tirar bits, podría usar una técnica utilizada en algunos 'dispositivos de escucha de murciélagos'. Usan un registro de desplazamiento, inicializado con un solo '1' y el resto son '0'.

La salida de los registros de desplazamiento se retroalimenta a la entrada, y la salida controlaría el audio. El reloj para el registro de desplazamiento es la señal. Entonces, una secuencia de '1' en la señal se fusionará en 1/2 reloj, y una secuencia de '0' se fusionará en 1/2 reloj.

Por lo tanto, tiende a conservar los cambios. Al elegir cuidadosamente la longitud del registro de desplazamiento, puede dividir por una cantidad adecuada.

Para extender la duración, de modo que todos los bits finalmente se reproduzcan, se requerirá memoria. Eso podría deberse a que los datos MIDI se pueden leer y volver a leer, por ejemplo, desde un dispositivo de almacenamiento.

De lo contrario, la 'línea de retraso' necesita suficiente almacenamiento para contener los datos. Cinco minutos a 31250b/s (casi 4kB/s) = 1144kB, es decir, más de 1 MB.

Sería sencillo hacer algo así con cualquier dispositivo con suficiente RAM, como un R-Pi o un BeagleBone negro. Podría hacerse usando una MCU, como un Arduino, con la adición de algo de almacenamiento externo. No use la memoria Flash para el almacenamiento a menos que planee usarla raramente, o el almacenamiento externo sea mucho más grande que una 'pista', porque la memoria Flash eventualmente se agotará.

¿Qué tal algo como un flip-flop 4027 JK configurado para alternar su salida (J & K en alto)? Esto reduciría efectivamente la frecuencia máxima posible a la mitad. El resultado usando su ejemplo sería: 00101110100001 >> flip-flop >> 00110000111110 No es el mismo flujo de bits por ningún tramo de la imaginación, pero sospecho que realmente no está buscando precisión aquí ...

En realidad, estoy buscando preservar la fidelidad del flujo de bits. Reconozco que el resultado final solo sonará como ruido, de todos modos.