- Se incorporó
- 16 Noviembre 2021
- Mensajes
- 436
No los voy a aburrir con detalles técnicos, en primera instancia me desperté un día con la idea de enviar datos a travez del sonido, para reproducir desde mi tel y recibir con el micro desde el pc, con el afán de experimentar.
Así que gracias a google y un link me salió un script plagio que puede simular a arturito ja
La idea base era la misma que en el tema de las fotos, hacer sonar los bits, es súper rudimentaria la cosa porque me quería sacar la curiosidad de encima nomás, así que cuento corto:
Dado un archivo x, pudiera ser el mismo test.pdf del post de las fotos, se leen todos los bits en grupos de 8 (bytes), obteniendo un rango 0-255 en unsigned, luego ésto pasa por un diccionario para generar un rango de frecuencias 30-255hz, que es arbitrario (no usen rangos de menos 20hz o mayores a 20khz con audífonos por su salud).
Una vez hecha la traducción, se le aplica una función sound_wave que genera en un rango de 0 a FRAMES_PER_SECOND la onda de sonido (función plagiada del link), entonces acá F_TIME tiene sentido que sea un número pequeño, de lo contrario si son 1 millón de bytes (1MB), se generarían 1 millón de segmentos F_TIME * FRAMES_PER_SECOND y la ram a la b... así que no intenten generar una lista en vez de la keyword yield de la función mencionada.
La función la explican acá en el artículo. Y las notas las pueden mirar acá, yo usé entre la octava 1 y la octava 4:
Pero básicamente según lo que entendí (porque no he terminado de leer), las notas pueden ser entendidas como frecuencias determinadas (muy por encima). Para hacerlo mas didactico el archivo de sonido generado se podría entender de la siguiente manera donde [nota] representa 1 byte del archivo, y donde dicha [nota] sería una lista con muchos valores reales (decimales), los que representarían la frecuencia a escribir para cada nota, por eso que si FRAMES_PER_SECOND fuera un valor muy grande, el archivo resultante sería grande (grande con G de gigas).
Para conseguir a arturito a modo de curiosidad, tienen que setear lo siguiente:
Pero ojo que con esos valores, un archivo de 1MB se convierte en +14 horas de audio ... con los valores originales 1MB se convierte en 1 hora y 30min aprox de audio.
Así que gracias a google y un link me salió un script plagio que puede simular a arturito ja
Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import math
import wave
FRAMES_PER_SECOND = 8000
# key: 8-bit int: frequency 29.x ~ 254.x hz
FREQUENCIES = {}
F_TIME = 0.005 # Time to sound per frequency
# Generate range of frequencies from 29.x to 254.x hz
step = (255-30) / 255
fi = 29 # Start frequency range
for i in range(256):
fi += step
FREQUENCIES[i] = fi * 1000
def read_file(file_path):
'''Read a file and return a bytearray'''
# Reads file
with open(file_path, 'rb') as f:
return bytearray(f.read())
def sound_wave(frequency, num_seconds):
for frame in range(round(num_seconds * FRAMES_PER_SECOND)):
time = frame / FRAMES_PER_SECOND
amplitude = math.sin(2 * math.pi * frequency * time)
yield round((amplitude + 1)/ 2 * 255)
bdata = read_file('ARCHIVO')
with wave.open('ARCHIVO-SALIDA.wav', mode='wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(1)
wf.setframerate(FRAMES_PER_SECOND)
total_bytes = len(bdata)
for i in range(len(bdata)):
f = FREQUENCIES[bdata[i]]
wf.writeframes(bytes( sound_wave(f, F_TIME) ))
# show progress
progress = (i * 100) / total_bytes
print(f"Progress: {round(progress, 2)}%", end='\r')
La idea base era la misma que en el tema de las fotos, hacer sonar los bits, es súper rudimentaria la cosa porque me quería sacar la curiosidad de encima nomás, así que cuento corto:
Dado un archivo x, pudiera ser el mismo test.pdf del post de las fotos, se leen todos los bits en grupos de 8 (bytes), obteniendo un rango 0-255 en unsigned, luego ésto pasa por un diccionario para generar un rango de frecuencias 30-255hz, que es arbitrario (no usen rangos de menos 20hz o mayores a 20khz con audífonos por su salud).
Una vez hecha la traducción, se le aplica una función sound_wave que genera en un rango de 0 a FRAMES_PER_SECOND la onda de sonido (función plagiada del link), entonces acá F_TIME tiene sentido que sea un número pequeño, de lo contrario si son 1 millón de bytes (1MB), se generarían 1 millón de segmentos F_TIME * FRAMES_PER_SECOND y la ram a la b... así que no intenten generar una lista en vez de la keyword yield de la función mencionada.
La función la explican acá en el artículo. Y las notas las pueden mirar acá, yo usé entre la octava 1 y la octava 4:
Pero básicamente según lo que entendí (porque no he terminado de leer), las notas pueden ser entendidas como frecuencias determinadas (muy por encima). Para hacerlo mas didactico el archivo de sonido generado se podría entender de la siguiente manera donde [nota] representa 1 byte del archivo, y donde dicha [nota] sería una lista con muchos valores reales (decimales), los que representarían la frecuencia a escribir para cada nota, por eso que si FRAMES_PER_SECOND fuera un valor muy grande, el archivo resultante sería grande (grande con G de gigas).
Código:
// sonido representando hola (4 bytes)
s = [
[nota] [nota] [nota] [nota]
]
Para conseguir a arturito a modo de curiosidad, tienen que setear lo siguiente:
Python:
FRAMES_PER_SECOND = 22000 # en adelante
F_TIME = 0.005 # hasta 0.01
Pero ojo que con esos valores, un archivo de 1MB se convierte en +14 horas de audio ... con los valores originales 1MB se convierte en 1 hora y 30min aprox de audio.