Hacer una estación de radio de GTA: San Andreas

¿Le gustaría cambiar entre las estaciones de radio como lo hizo en San Andreas?



La banda sonora de GTA se ha hecho famosa por una buena selección de música e inserciones divertidas. Rockstar hizo un excelente trabajo al crear estaciones de radio para este juego; por cierto, la música de Vice City y San Andreas incluso se puede comprar como sets de CD.

Para que su escucha sea más agradable, y para aprender algo, decidí piratear la radio para que recibiera radios de juegos.

La idea es que puede girar la perilla del receptor y cambiar entre estaciones virtuales, como lo haría con un receptor real. El software se convirtió en el principal obstáculo: me gustaría que cada estación virtual reproduzca su propia música, incluso cuando no la escucho. De nuevo, como en el mundo real.

¡Empecemos!


1. Equipamiento


Me encantaría usar algo como Arduino para tal proyecto, con equipos portátiles e integrados, ya que la arquitectura de estas placas es mucho más simple que la de las computadoras de una sola placa.



Pero reproducir docenas de archivos simultáneamente requiere cerebros poderosos, así que me decidí por la Raspberry Pi. Ya lo he usado para otros proyectos, y me siento seguro al trabajar con él. Y elegí Python como el lenguaje de programación, simplemente porque tenía mucho humor. ¿Hay alguna otra razón? ..

2. Mezclador de software Python


Después de eso, necesitaba elegir una biblioteca para Python que pudiera:
  • Trabaja con múltiples fuentes de audio.
  • Dio una interfaz de alto nivel para trabajar con ellos.

Para construir una radio virtual, solo necesito cargar varios archivos a la vez y controlar el volumen de reproducción. De hecho, en realidad esto sucede: cada estación es una fuente de audio, y el botón de sintonización cambia el volumen de estas fuentes, desde el punto de vista del oyente.

Después de una prueba larga y dura de varias opciones (pygame-mixer, python-sounddevice, puredata con un parche para el mezclador), me decidí por swmixer. Incluso sabe cómo reproducir archivos en tiempo real sin cargarlos en toda la memoria, lo cual fue muy conveniente para mí, porque quería que cada estación combinara toda la música en un solo archivo. Tuve que bifurcar esta biblioteca y corregir el error en ella, porque ya no era compatible.

Decidí usar el Raspberry Pi 3, ya que el modelo 2B de alguna manera sujetó la salida de audio. No entendiendo por qué sucede esto, pero simplemente estando satisfecho de que todo funciona en el nuevo tablero, pasé al siguiente paso.

3. Sensor de ángulo de alto nivel (DUP) (consulte pyKY040)




La mejor biblioteca para Python en ese momento para KY040 DUP era una biblioteca llamada KY040 , pero no se ajustaba a mis necesidades, además, quería intentar crear mi propio primer módulo real para Python, por eso escribí pyKY040 .

Proporciona:
  • Kolbek para aumentar el valor.
  • Devolución de llamada para disminuir.
  • Kolbek sobre el cambio.
  • Clics de botón de devolución de llamada.

Configuraciones:
  • Modo de escala (el contador interno cambia dentro de los límites de X a Y, pasado como argumento a las funciones de devolución de llamada).
  • Modo de escala de anillo (X a Y, luego X nuevamente).
  • Establecer el tamaño del paso en la escala.

Me permitió delegar la lógica del DUP y concentrarme en lo que sucede cuando interactúo con él.

En el código principal, las siguientes líneas pertenecen al DUP:

tuning_encoder = pyky040.Encoder(CLK=17, DT=27, SW=22) tuning_encoder.setup(scale_min=MIN_VFREQ, scale_max=MAX_VFREQ, step=1, chg_callback=vfreq_changed) tuning_thread = threading.Thread(target=tuning_encoder.watch) volume_encoder = pyky040.Encoder(CLK=5, DT=6, SW=13) volume_encoder.setup(scale_min=0, scale_max=10, step=1, inc_callback=inc_global_volume, dec_callback=dec_global_volume, sw_callback=toggle_mute) global_volume_thread = threading.Thread(target=volume_encoder.watch) tuning_thread.start() global_volume_thread.start() 


4. Radio virtual (código)


Ahora podía reproducir archivos y obtuve una interfaz para trabajar con DUP. Es hora de escribir código para la radio virtual.

Funciona como una banda de radio virtual. En ciertas frecuencias virtuales (o agudos) puede escuchar el sonido, estos son canales swmixer. Se escucha una mezcla de dos fuentes de audio entre los dos agudos.

 Chn 1 Chn 2 Chn 3 Chn 4 Chn n | | | | | |--------------|--------------|--------------|-------------| <---------------------------------------------------------->   


La frecuencia virtual es en realidad solo un número entero que aumenta o disminuye según su interacción con el DUP.

Para dejar más libertad al calcular el volumen durante el cambio entre dos agudos, este proceso es procesado por una sola función que devuelve el volumen de una estación dada para un agudo dado. Hasta ahora, este valor varía linealmente, pero se puede cambiar haciendo una curva de volumen más ruidosa e inestable.

 VOLUME /-\ /-\ /- | --\ /-- | --\ -- | --\ /-- | -- | --\ /-- | | -\ /- | | --\ /-- | | --\ /-- | | --\ /-- | | /-- | | /-- --\ | | /-- --\ | | /-- --\ | | /- -\ | | /-- --\ | -\ | /-- --\ | /- --\ | /-- --\ | /-- ------------------------------------------------------- | vfreq |       


Si aplicamos este ejemplo al canal n-1, se cruza con el canal n, dando como resultado una mezcla de audio de estas dos fuentes.

En pseudocódigo, se ve así:

    ( ) ->       [ ->       [     (  )     ,    0      ] ] ->    


Todos los detalles están en el código. Comience al final del archivo donde se describen las devoluciones de llamada para el DUP y luego siga el rastro.

5. Hackear la carcasa de la radio


El donante era la radio de mi abuelo, Optalix TO100. Fuera de Francia, creo que no será fácil encontrarlo. Por unos 20 € puede obtener un receptor moderno, compacto y vintage que puede llevar con usted en su bolso.

DUP


Por sí mismos, el DUP subió solo para que fuera posible cerrar la carcasa, pero después de conectar los cables de puente, el diseño resultó ser demasiado grande. Tuve que quitar los conectores de plástico originales y reemplazarlo con termocontraíble para que pudiera doblarse.





Los DUP que compré yo mismo no tenían un hilo: tuve que improvisar uniéndolos a la caja con cartón y pegamento termoplástico. Clay decide, como siempre.





Raspberry pi


Moví el conector de alimentación al gabinete, en lugar de enchufar el cable directamente al Pi; como resultado, pude elegir cómo colocar la computadora en el gabinete, sin pensar dónde exactamente se debe conectar el conector de alimentación al gabinete.





Utilicé un cable con conectores micro-USB "madre" y "padre", pero para liberar más espacio, deshice el cable y lo soldeé directamente a Pi, más a PP2 y menos al conector que está conectado a tierra (otra opción es PP5). Y asegúrese de pegar más para no romperse.



Orador


Altavoz - 5W original del receptor TO100. Está conectado a un amplificador, que está conectado a un conector de audio de 3,5 mm, que está conectado a un DAC USB barato .



Todo está conectado a través de una placa de prototipos y está listo para cerrarse para siempre.



Source: https://habr.com/ru/post/es419661/


All Articles