Gravando com duas interfaces ao mesmo tempo | O Gravador sem Cabeça #2

Bora continuar o que começamos na postagem anterior. Eu recomendo muito você ler antes a parte #1, mas vou te dar uma colher de chá.
Contexto
Eu quero saber se com um Raspberry Pi 3B sem tela, eu:
Consigo gravar de uma interface de áudio usando arecord?- Consigo gravar de duas interfaces de áudio simultaneamente usando arecord?
- Consigo usar um serviço web pra disparar a gravação?
- Consigo conectar e enviar os comandos acima diretamente no pi como um hot spot?
Hoje vamos atacar o item #2
Mão na massa
Eu tenho uma Boss GT1. Uma delícia. Pequena, leve e boa o suficiente®. O mais importante é: ela é uma interface de áudio USB.
Tu é braba!
Bora plugar no pi e ver o que acontece.
No primeiro artigo dessa série vimos como listar as interfaces de captura com o arecord
raphaelpaiva@hr:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 3: GT1 [GT-1], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
Que coisa linda! Surgiu a placa 3 e agora com um nome que faz sentido. Me faz pensar por que diabos a Behringer tem o nome CODEC 🤔.
Eu sou preguiçoso. Vamos tentar o mesmo comando que funcionou antes, mas trocando só a interface:
raphaelpaiva@hr:~ $ arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S16_LE -r 44100 -c 2 opa.wav
Recording WAVE 'opa.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
arecord: set_params:1343: Sample format non available
Available formats:
- S32_LE
Rapaz. Seria S32 32bit? No manual diz 24, mas quem sou eu pra reclamar 😅?
Beleza, então. S32_LE será!
raphaelpaiva@hr:~ $ arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S32_LE -r 44100 -c 2 opa.wav
Recording WAVE 'opa.wav' : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo
Uhuuu 🎉!
De tão empolgado, esqueci até de plugar a guitarra, mas tava num efeito barulhento.
Que bonitinho esse ruído psicodélico!
Show! Agora preciso ver se eu consigo gravar com as duas interfaces ao mesmo tempo.
Pra isso, eu vou precisar executar os dois comandos ao mesmo tempo na linha de comando.
No Linux, se você colocar um & logo após um comando, ele vai ser invocado e jogado pro fundo. Em outras palavras, o programa vai estar executando, mas o terminal estará liberado pra rodar outro comando.
Vamos tomar vantagem disso fazendo o seguinte: COMANDO_PRA_GRAVAR_DA_GT1 & COMANDO_PRA_GRAVAR_DA_BEHRINGER.
Repare o & no meio de um comando e outro. Isto vai fazer com que o primeiro comando seja invocado, jogado pro fundo e logo em seguida o segundo comando seja invocado.
Isso é rodar ao mesmo tempo? Não, mas pros nossos propósitos aqui, é bom o suficiente.
Lembrando que isso é um protótipo. Eu só quero ver se funciona. Eu não faria assim numa situação de desenvolvimento de produto. Vamos ver isso no futuro.
Vamos modificar um pouco os comandos também pra cada um ir para o seu arquivo separado. A gravação da GT1 vai para o arquivo gt1.wav e a da Behringer pro beh.wav.
Vai ficar assim:
COMANDO_PRA_GRAVAR_DA_GT1: arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S32_LE -r 44100 -c 2 gt1.wav
COMANDO_PRA_GRAVAR_DA_BEHRINGER: arecord -Dhw:CARD=CODEC,DEV=0 -d 5 -f S16_LE -r 44100 -c 2 beh.wav
Como eu não tenho 3 instrumentos disponíveis, eu vou fazer o seguinte:
Na Behringer:
- Vou falar no microfone.
- Vou tocar na ponta do cabo com o pé. Vai fazer um ruído de “mau contato”.
Na GT1:
- Vou tocar um acorde na guitarra.
Pois bem:
raphaelpaiva@hr:~ $ arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S32_LE -r 44100 -c 2 gt1.wav & arecord -Dhw:CARD=CODEC,DEV=0 -d 5 -f S16_LE -r 44100 -c 2 beh.wav
[2] 19853
Recording WAVE 'gt1.wav' : Signed 32 bit Little Endian, Rate 44100 Hz, Recording WAVE 'beh.wav' : Signed 16 bit Little Endian, StereoRate 44100 Hz, Stereo
[1] Done arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S32_LE -r 44100 -c 2 gt1.wav
[2]+ Done arecord -Dhw:CARD=GT1,DEV=0 -d 5 -f S32_LE -r 44100 -c 2 gt1.wav
A saída ficou um pouco confusa dessa vez, mas o importante é vermos que na terceira linha temos duas informações:
Recording WAVE 'gt1.wav' : Signed 32 bit Little Endian, Rate 44100 HzRecording WAVE 'beh.wav' : Signed 16 bit Little Endian, StereoRate 44100 Hz, Stereo
Ou seja: estamos gravando o arquivo gt1.wav com 32bit e o beh.wav com 16bit, que são indicativos de que cada arquivo está com os parâmetros certos.
Vamos ver como ficou cada arquivo:
beh.wav
Caso seu browser não carregue, clique aqui.
gt1.wav
Caso seu browser não carregue, clique aqui.
Conclusão
Parece que funcionou!
Então o arecord me permite gravar, ao mesmo tempo, de várias interfaces ao mesmo tempo, é só chamar ele várias vezes.
Pode ser, com ênfase no pode, que tenhamos problemas de sincronização com vários áudios, mas cruzaremos essa ponte quando chegarmos nela.
Mas na hora de gravar com a banda eu não vou ter uma linha de comando disponível e nem seria prático.
Na próxima publicação, vamos montar uma aplicação web bem simples pra fazer exatamente o que fizemos hoje, sem precisar de uma linha de comando.