Deseja alternar entre as estações de rádio da mesma maneira que em San Andreas?

A trilha sonora do GTA ficou famosa por uma boa seleção de músicas e inserções engraçadas. A Rockstar fez um excelente trabalho ao criar estações de rádio para este jogo - a propósito, as músicas de Vice City e San Andreas podem até ser compradas como CDs.
Para torná-la mais agradável - e para aprender alguma coisa, decidi invadir o rádio para receber rádios de jogos.
A idéia é que você pode girar o botão do receptor e alternar entre estações virtuais, como faria com um receptor real. O software se tornou o principal obstáculo - eu gostaria que cada estação virtual tocasse sua própria música, mesmo quando não a ouvisse. Mais uma vez, como no mundo real.
Vamos começar!
1. Equipamento
Eu adoraria usar algo como o Arduino para esse projeto, com equipamentos portáteis e embutidos, já que a arquitetura dessas placas é muito mais simples do que a dos computadores de placa única.

Mas reproduzir dezenas de arquivos simultaneamente requer cérebros poderosos, então decidi pelo Raspberry Pi. Já o usei para outros projetos e me sinto confiante ao trabalhar com ele. E eu escolhi o Python como a linguagem de programação, simplesmente porque eu tinha esse humor. Existem outras razões?
2. Misturador de software Python
Depois disso, precisei escolher uma biblioteca para Python que pudesse:
- Trabalhe com várias fontes de áudio.
- Deu uma interface de alto nível para trabalhar com eles.
Para construir um rádio virtual, eu preciso fazer o upload de vários arquivos de uma só vez e controlar o volume da reprodução. De fato, na realidade, isso acontece: cada estação é uma fonte de áudio e o botão de sintonia muda o volume dessas fontes, do ponto de vista do ouvinte.
Depois de testes duros e longos de várias opções (pygame-mixer, python-sounddevice, puredata com um patch para o mixer), decidi pelo swmixer. Ele até sabe como reproduzir arquivos transmitidos sem carregá-los em toda a memória, o que foi muito conveniente para mim, porque eu queria que cada estação combinasse todas as músicas em um arquivo. Eu tive que bifurcar esta biblioteca e corrigir o erro nela, porque ela não era mais suportada.
Decidi usar o Raspberry Pi 3, pois o modelo 2B de alguma forma fixou a saída de áudio. Não entendendo por que isso está acontecendo, mas apenas estando satisfeito com o fato de tudo funcionar no novo quadro, passei para o próximo passo.
3. Sensor de ângulo de alto nível (DUP) (confira pyKY040)

A melhor biblioteca para Python da época para o KY040 DUP era uma biblioteca chamada
KY040 , mas não
atendia às minhas necessidades, além disso, eu queria tentar criar meu próprio primeiro módulo real para Python, por isso escrevi
pyKY040 .
Fornece:
- Kolbek para aumentar o valor.
- Retorno de chamada para diminuir.
- Kolbek em mudança.
- Cliques no botão de retorno de chamada.
Configurações:
- Modo de escala (o contador interno muda dentro dos limites de X para Y, passado como argumento para as funções de retorno de chamada).
- Modo de escala de toque (X a Y, depois X novamente).
- Definir o tamanho do passo na balança.
Ele me permitiu delegar a lógica do DUP e me concentrar no que acontece quando interajo com ele.
No código principal, as seguintes linhas pertencem ao 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. Rádio virtual (código)
Agora eu podia reproduzir arquivos e tinha uma interface para trabalhar com o DUP. É hora de escrever código para o rádio virtual.
Funciona como uma banda de rádio virtual. Em certas frequências virtuais (ou agudas), você pode ouvir o som - esses são canais swmixer. Uma mistura de duas fontes de áudio é ouvida entre os dois agudos.
Chn 1 Chn 2 Chn 3 Chn 4 Chn n | | | | | |--------------|--------------|--------------|-------------| <---------------------------------------------------------->
A frequência virtual é na verdade apenas um número inteiro que aumenta ou diminui dependendo da sua interação com o DUP.
Para deixar mais liberdade ao calcular o volume durante a alternância entre dois agudos, esse processo é processado por uma única função que retorna o volume de uma determinada estação para um determinado agudo. Até agora, esse valor varia linearmente, mas pode ser alterado criando uma curva de volume mais ruidosa e instável.
VOLUME /-\ /-\ /- | --\ /-- | --\ -- | --\ /-- | -- | --\ /-- | | -\ /- | | --\ /-- | | --\ /-- | | --\ /-- | | /-- | | /-- --\ | | /-- --\ | | /-- --\ | | /- -\ | | /-- --\ | -\ | /-- --\ | /- --\ | /-- --\ | /-- ------------------------------------------------------- | vfreq |
Se aplicarmos este exemplo ao canal n-1, ele cruza o canal n, resultando em uma mistura de áudio dessas duas fontes.
No pseudo-código, fica assim:
( ) -> [ -> [ ( ) , 0 ] ] ->
Todos os detalhes estão no código. Comece no final do arquivo em que os retornos de chamada para o DUP são descritos e siga a trilha.
5. Corte a caixa do rádio
O doador era o rádio do meu avô, Optalix TO100. Fora da França, acredito que não será fácil encontrá-lo. Por cerca
de 20 €, você pode obter um receptor compacto e vintage que pode levar consigo na sua bolsa.
DUP
Por si só, o DUP subiu apenas para que fosse possível fechar o gabinete - mas depois de conectar os fios dos jumpers, o design acabou sendo muito grande. Eu tive que remover os conectores de plástico originais e substituí-los por termorretráteis para que eles pudessem ser dobrados.


Aqueles DUP que eu comprei não tinham um fio - eu tive que improvisar anexando-os ao estojo usando papelão e cola termoplástica. Clay decide, como sempre.


Raspberry pi
Mudei o conector de energia para o gabinete, em vez de conectar o cabo diretamente ao Pi - como resultado, eu poderia escolher como colocar o computador no gabinete, sem pensar em onde exatamente o conector de alimentação deveria ser conectado ao gabinete.


Usei um cabo com conectores micro-USB "mãe" e "pai", mas para liberar mais espaço, descasquei o cabo e soldado diretamente ao Pi - mais ao PP2 e menos ao conector aterrado (outra opção é o PP5). E certifique-se de colar mais para não quebrar.

Orador
Alto-falante - 5W original do receptor TO100. Ele está conectado a um amplificador, conectado a um plugue de áudio de 3,5 mm, conectado a um
DAC USB barato .

Tudo está conectado através de uma placa de prototipagem e está pronto para fechar para sempre.

