freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
415
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

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:

frecuencias-notas-musicales.jpeg

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 o_O... con los valores originales 1MB se convierte en 1 hora y 30min aprox de audio.
 

Gsus

Miembro Activo
Se incorporó
19 Agosto 2022
Mensajes
28
Buena! hace tiempo quería hacer algo parecido, me acordaba del atari 800XL con Casetera que teníamos en la casa, en aquella época entendí que en el audio se modulan los datos y que se podían copiar los juegos con un equipo común y corriente con doble casetera.

A pesar de que pensé que ese tipo de tecnología murió con los módems que se usaban para conectarse a internet por la linea telefónica, me dí cuenta de que actualmente la aplicacion Smart Switch usa un método similar cuando busca al otro teléfono para empezar la transferencia, se comunican por audio, se configuran y luego usa el wifi para la tranferencia de datos.
 
Upvote 0

wurrzag

Ciclista Jipi
Se incorporó
30 Mayo 2006
Mensajes
8.926
Buena! hace tiempo quería hacer algo parecido, me acordaba del atari 800XL con Casetera que teníamos en la casa, en aquella época entendí que en el audio se modulan los datos y que se podían copiar los juegos con un equipo común y corriente con doble casetera.

A pesar de que pensé que ese tipo de tecnología murió con los módems que se usaban para conectarse a internet por la linea telefónica, me dí cuenta de que actualmente la aplicacion Smart Switch usa un método similar cuando busca al otro teléfono para empezar la transferencia, se comunican por audio, se configuran y luego usa el wifi para la tranferencia de datos.
En atari tenias datos en audio (casetera) y Video (en VHS)
Por eso al colocarlos en equipos estandar se escuchaba/veia ruido blanco... aunque en la casetera tenia un truco, solo una de las pistas (canales, lados) llevaba datos, la otra quedaba sin uso y se aprovechaba para colocar musica en la carga de los juegos...

En los 80s la radio de la universad de chile quedaba en las noches pirateando si mal no recuerdo
 
Upvote 0
Subir