Um banquinho e um servidor

Há uns tempos ganhei um par de servidores. Dois Dell PowerEdge 1950, sendo que o melhor deles tinha dois Xeons a 3.0GHz lá dentro — hardware que já teve o seu auge, mas que hoje é essencialmente um aquecedor barulhento. É extremamente ruidoso, gasta muita energia para o que consegue processar comparado com qualquer coisa moderna, e para piorar: não tem entrada nem saída de áudio, nem dá para usar uma placa gráfica nele.

Nem sequer faz um beep. No terminal, digite: echo -e “\a” para enviar um sinal ASCII. Ou instale a ferramenta beep (sudo apt install beep no Debian ou Ubuntu). Com beep dá até para usar parâmetros como: beep -f 300 -l 200 para selecionar uma frequência de 300Hz e duração de 200 millissegundos.

A pergunta óbvia era: o que fazer com isto? Sem placa gráfica, processar vídeo ou imagem seria muito lento e gastaria muita eletricidade. A resposta menos óbvia foi: transformá-lo numa fonte de som ao vivo.

Servidores não têm placa de som, mas têm portas serial — e uma porta serial, no fundo, não passa de um pino que sobe e desce entre dois níveis de tensão a um ritmo que se controla por software. Se conseguisse controlar esse ritmo com precisão suficiente, talvez desse para o usar como uma espécie de DAC (conversor digital-analógico) muito rudimentar — de 1 bit — e ligar isso a um aparelho que amplificasse o sinal.

A vontade era que o som final não fosse somente o tom gerado pela porta serial, mas a mistura dele com o próprio ruído do servidor — as ventoinhas, o zumbido interno — como se a máquina fosse, ela própria, um instrumento ao vivo. Ventoinhas é eufemismo nesse caso, os PowerEdge tem 8 pequenas turbinas que operam em média a 4000 rpm, mas que podem chegar a 15000 rpm.

Os primeiros testes

Antes de soldar seja o que for, testei a ideia diretamente na linha TX da porta serial:

sudo stty -F /dev/ttyS0 9600 cs8 -cstopb -parenb
while true; do printf '\x55'; done | sudo tee /dev/ttyS0 >/dev/null

Com um osciloscópio no pino, apareceu uma onda quadrada de cerca de 10V pico a pico, com ciclos de 200 microssegundos — exatamente o que se esperava de um byte alternado 01010101 a 9600 baud. A prova de conceito estava feita: dava para gerar sinal com aquilo.

O circuito

O passo seguinte foi construir uma interface segura entre a porta serial e um jack de 1/4″. A ideia é simples: atenuar os ~10V da RS-232 até um nível de linha razoável, e garantir que não passa nenhuma tensão contínua perigosa para o amplificador.

DB9 TX (pino 3) ──[10k]──┬──[1uF]──── TIP do jack
│
[1k]
│
DB9 GND (pino 5) ─────────┴────────── SLEEVE do jack

Um divisor resistivo de 10k/1k baixa o sinal para cerca de 1V pico a pico, um condensador em série bloqueia qualquer deriva de tensão contínua. Devia ter usado também um transformador de isolamento de áudio 600:600Ω entre a saída e o jack para evitar os problemas de ground loop que surgem naturalmente quando se ligam dois aparelhos com ligações à terra independentes (o servidor e o amplificador), mas por enquanto ainda não senti falta dele.

O software

Gerar uma onda quadrada fixa é fácil. Gerar qualquer coisa mais interessante exige outra abordagem: modulação por densidade de pulsos (PDM). Em vez de enviar bytes fixos, um modulador sigma-delta de primeira ordem converte cada amostra de áudio (entre -1 e 1) num único bit, cuja densidade ao longo do tempo aproxima a forma de onda desejada. Empacotam-se 8 desses bits por byte, e escreve-se o resultado diretamente para o descritor de ficheiro da porta serial.

O programa (servnoise.c) acabou com quatro modos:

  • tone — um tom fixo, para verificar a fiação
  • telemetry — o tom segue, ao vivo, a temperatura e a carga do CPU
  • noise — ruído branco filtrado
  • popcorn — o modo mais elaborado, descrito a seguir

Afinar ao ouvido

A dada altura usei um afinador no smartphone para medir o zumbido real que as ventoinhas do servidor produzem: por volta dos 932Hz — que, por coincidência feliz, é praticamente um Bb5 na afinação padrão. Em vez de competir com esse zumbido, o tom gerado nos modos tone e telemetry ficou afinado a 233Hz (Bb3, duas oitavas abaixo), para se sentar por baixo do som do servidor em vez de lhe fazer frente.

A estrutura do popcorn

O modo popcorn gera estalos curtos e irregulares — como milho a estourar — com durações e espaçamentos escolhidos aleatoriamente dentro de conjuntos fixos. Mas o que o torna interessante é a estrutura maior por cima disso: um ciclo de 255 segundos onde, entre os 2:00 e os 3:00 minutos, o padrão aperta (estalos mais curtos, mais próximos entre si), com dois pequenos “avisos” aleatórios nos primeiros dois minutos — rajadas curtas do padrão rápido, como uma prévia do que aí vem — e 15 segundos de silêncio no fim de cada ciclo, só para deixar claro a quem está a ouvir que o padrão acabou de dar a volta.

Um imprevisto no fim

Ao instalar o serviço para arrancar automaticamente no boot, apareceu um erro inesperado: “System has not been booted with systemd as init system”. Afinal este servidor onde instalei Linux MX (meu predileto) corre um SysV init tradicional — nada de systemctl por aqui. A solução foi um script de init clássico com start-stop-daemon, e agora o servnoise arranca sozinho assim que o servidor chega ao ecrã de login.

Tudo isso (systemd e init) está no Github: https://github.com/refotografia/Server-Noise-Thing

O nome

“Um banquinho e um violão” é uma frase que ficou associada ao minimalismo da Bossa Nova — bastava isso, um banquinho e um violão, para tocar.

A minha versão troca o violão por um servidor.

Projeto Caixa Preta • Intercalando vídeos

Precisava construir um vídeo alternando entre duas gravações produzidas por percursos completamente diferentes. De um lado, uma Axis P1354 gravando diretamente em H.264, a 1280×720 e 30 fps, registando o que acontecia sobre a mesa da instalação. Do outro, o sinal de vídeo proveniente de um DVD Player, manipulado sobre essa mesma mesa, capturado por um Doctor Video e gravado em 720×480. Mais do que juntar duas resoluções diferentes, interessava-me colocar em diálogo dois pontos de vista sobre o mesmo acontecimento: um mostrando os gestos, os dispositivos e o espaço da instalação; o outro mostrando a imagem que circulava entre esses dispositivos.

O primeiro passo foi preparar os dois ficheiros, recortando apenas os trechos que seriam utilizados na montagem.

ffmpeg -ss 00:00:30 -t 120 -i axis.mkv \
-c copy axis_trim.mkv
ffmpeg -ss 00:00:55 -t 120 -i doctor.mp4 \
-c copy doctor_trim.mp4

Em seguida, normalizei os parâmetros para que ambos pudessem ser utilizados no mesmo projeto. O Doctor Video gravava em 720×480 e apresentava uma taxa de quadros algo irregular, por isso optei por convertê-lo para 30 fps e inseri-lo num quadro de 1280×720 através de um pad, preservando a resolução original da imagem em vez de a ampliar artificialmente.

ffmpeg -i doctor_trim.mp4 \
-vf "fps=30,pad=1280:720:(ow-iw)/2:(oh-ih)/2:black" \
-c:v libx264 -crf 20 -preset slow \
-c:a aac -b:a 192k \
doctor_720p30.mp4

Embora a gravação da Axis já estivesse em 1280×720 e 30 fps, também a recodifiquei para que os dois ficheiros partilhassem os mesmos parâmetros de vídeo e áudio.

ffmpeg -i axis_trim.mkv \
-vf "scale=1280:720,fps=30" \
-c:v libx264 -crf 20 -preset slow \
-c:a aac -b:a 192k \
axis_720p30.mp4

A montagem foi feita alternando segmentos de cinco segundos de cada vídeo. Em vez de criar dezenas de pequenos ficheiros intermédios, utilizei o filtro trim para selecionar cada trecho e o filtro concat para reuni-los numa única sequência.

À medida que a descrição da montagem crescia, tornou-se evidente que já não fazia sentido mantê-la diretamente na linha de comandos. Foi então que descobri a opção -filter_complex_script, que permite guardar toda a lógica do filtro num ficheiro de texto separado. O ficheiro alterna.flt passou a conter toda a sequência de cortes e concatenações.

Um pequeno trecho desse ficheiro tem este aspeto:

[0:v]trim=start=0:end=5,setpts=PTS-STARTPTS[v0];
[0:a]atrim=start=0:end=5,asetpts=PTS-STARTPTS[a0];
[1:v]trim=start=0:end=5,setpts=PTS-STARTPTS[v1];
[1:a]atrim=start=0:end=5,asetpts=PTS-STARTPTS[a1];
...
[v0][a0][v1][a1]...[v23][a23]
concat=n=24:v=1:a=1[v][a]

Com isso, a execução da montagem reduziu-se a um comando bastante simples:

ffmpeg \
-i axis_720p30.mp4 \
-i doctor_720p30.mp4 \
-filter_complex_script alterna.flt \
-map "[v]" \
-map "[a]" \
-c:v libx264 \
-crf 20 \
-c:a aac \
alternado.mp4

O resultado é um vídeo em que a imagem alterna ritmicamente entre dois fluxos distintos. A gravação da Axis documenta o que acontece sobre a mesa da instalação, enquanto o Doctor Video preserva o próprio conteúdo do circuito de vídeo manipulado durante a performance. A montagem permite que o espectador oscile continuamente entre observar o dispositivo em funcionamento e observar a imagem produzida por esse mesmo dispositivo.

Mais uma vez, chamou-me a atenção como o FFmpeg acaba por ocupar um lugar improvável no meu processo artístico. Embora seja visto sobretudo como uma ferramenta de conversão e transcodificação, revela-se igualmente útil como instrumento de montagem, experimentação e composição.

Projeto Caixa Preta • Testes de câmaras

Para realizar um teste de gravação de vídeo da câmera Axis 210, inicialmente foi necessário descobrir qual endereço IP ela estava utilizando na rede local. Para isso, foi utilizada o arp-scan em um computador com Linux MX, executando uma varredura na rede local para identificar os dispositivos conectados. Entre os dispositivos encontrados, foi possível localizar a câmera Axis.

Após acessar a interface web da câmera através do navegador, foram consultadas as configurações de vídeo e streaming numa página que dá exemplos de HTML para fazer o embed do vídeo numa página da web.

A partir dessas informações, foi possível identificar o endereço RTSP utilizado pela câmera para disponibilizar o fluxo de vídeo. Nesta versão da Axis 210, o fluxo é disponibilizado através do endereço:

rtsp://192.168.1.65:554/mpeg4/media.amp

Com o endereço RTSP identificado, foi utilizado o FFmpeg para capturar e gravar o fluxo de vídeo diretamente em um arquivo MP4. O comando executado foi:

ffmpeg -i rtsp://user:password@192.168.1.65:554/mpeg4/media.amp -c copy recording.mp4

Nesse comando, o parâmetro especifica a fonte de vídeo RTSP, enquanto instrui o FFmpeg a copiar o fluxo de vídeo recebido sem recodificação, reduzindo o uso de processamento e preservando a qualidade original do stream. Usei Ctrl +C no terminal para interromper a gravação 24 segundos depois. O resultado foi a criação do arquivo, contendo a gravação do vídeo capturado pela câmera através da rede local, esse arquivo foi enviado ao Youtube e está disponível aqui:

São apenas 20 quadros por segundo e resolução 640×480 pixels, mas o flicker do LED vermelho ficou lindo!!!

Vou usar essa câmara para gravar o que vai ocorrer em uma escultura que estou criando, a idéia é usar algo bem simples e leve, que possa estar em qualquer computador, o ffmpeg me veio a mente porque é meu software preferido!

Festival Zer01, La Rochelle

Nessa semana que antecede a Páscoa, vim com um grupo do Mestrado em Media Arts da Universidade do Minho (do qual sou aluno) para o Festival Zer01 em La Rochelle na França – um festival de arte híbrida e cultural digital. A semana de atividades aqui é parte de um BIP do Erasmus. BIP é Blended Intensive Program, um tipo de atividade de curta duração que permite o encontro de alunos de 5 ou mais escolas num determinado evento. Aqui um bom link que explica o que pode ser um BIP.

As atividades desse BIP compunham uma parte das atividades do Festival e essa parte foi intitulada Campus e aconteceu num casarão histórico em La Rochelle: Maison Henry II. Cada aluno que se candidata a participar do BIP precisa explicar o que vai fazer, apresentar, etc e tanto a instituição que envia o aluno, como a instituição que recebe o aluno, precisam validar essa apresentação e/ou atividade. Alguns criaram uma nuvem!

Junto ao Carlos A. Correia, eu vim a La Rochelle apresentar a performance de O Outro que Bate. A Maison Henry II fica a uns 50 metros da catedral de La Rochelle e dali podemos ouvir os sinos e assim fazer uma versão local da performance. A foto abaixo o Carlos fez durante um ensaio nosso aqui.

A organização do festival também preparou uma série de atividades para os participantes do Campus. Entre elas algumas conversas com artistas que estavam terminando de montar suas obras aqui para o festival. Em especial, a conversa com os artistas canadenses Peter Van Haaften e Michael Montanaro foi muito interessante, falamos de detalhes técnicos de instalações em geral, de como tornar certas obras mais integradas aos espaços onde estão sendo mostradas e falamos também de questões sobre como preparar certas obras para transporte e montagem em locais distantes. Com tantos festivais diferentes de arte digital nos cinco continentes, obras de grandes formatos precisam ser pensadas também levando em consideração seu transporte marítimo, por exemplo.

Antes da minha apresentação, aproveitei alguns detalhes que vieram à tona no ensaio e os dias aqui para refinar ainda mais o meu looper/sequencer em PureData (algumas atualizações já estão no meu Github, mas as de ontem à noite ainda não).

Adicionei ainda maneiras de misturar sons de diversas partes do patch e um sequenciador de baixo e outro de cliques. Preparei samples do som da chuva, dos sinos da Catedral da Sé e da Igreja de São Vicente em Braga. E depois fiquei treinando usar o “instrumento”.

Nossa apresentação correu bem e aqui tem um pequeno trecho gravado pela Diana Gil:


No fim foi uma semana muito intensa aprendendo palavras em línguas novas, pronuncia para nomes irlandeses, sobre a proximidade da Roménia e do Brasil, etc. Foi também um ótimo momento para repensar estratégias para o Piso, para minhas atividades em Braga e na mundo académico. E ainda descobri o Hydra, um sintetizador de vídeo que roda no browser ou num editor de texto chamado Pulsar-Edit. Em breve, um pouco mais sobre isso!

A bateria analógica do Eko Madrigale

Aos poucos foi ficando evidente que o orgão inteiro era volumoso demais para os espaço que eu tenho disponível. As idéias foram se acumulando e eu acabei optando por explorar maneiras de usar as partes mais interessantes dele.

Ainda com o órgão em funcionamento, usei um fio ligado a um aplificador para detectar de quais placas vinham quais sinais de áudio. Fui fazendo minhas anotações e analisando as possibilidades.

A parte da bateria é bem simples: uma placa gera uma série de pulsos em ritmos que podem ser modificados através de botões, uma outra placa serve apenas para aplicar um envelope aos pulsos, dando a eles um som específico de um instrumento.

A placa com tons de verde gera os pulsos e a placa castanha produz os envelopes. Achei 7 entradas na placa castanha e liguei um soquete banana a cada uma delas. Na placa verde localizei os ritmos e juntei fios a eles.

Fiz ainda uma série de experiências e percebi que são necessárias duas entradas distintas para criar o som de certos instrumentos. Encontrei também alguns pontos onde é possível fazer um bending desse circuito que gera pulsos.

Reduzi bastante as partes que usei para alimentar o circuito. Achei um DVD no lixo com uma fonte maneira e acabei por eliminar um 7805 e um transformador enorme. Coube tudo lá dentro e agora esquenta menos. De fora ficou a placa de uma bateria de criança que resolvi adicionar, mas isso ainda está sendo trabalhado, para que os pulsos disparem essa bateria também.

Julho e Agosto foram meses muito quentes aqui e acabei escondido na garagem fazendo essa e outra traquinagens. Para curtir os primeiros momentos com essa drum machine analógica, gravei uma faixa ruidosa que carinhosamente entitulei Onde de Calor.

Captura sonora

Tenho me divertido no mundo dos sons ultimamente e resolvi colocar em uso um gravador que eu tinha de época em que fazia vídeos de casamentos.

O gravador é simples, um Zoom H1n, e tem apenas uma entrada TRS 3.5mm. Queria explorar o mundo inaudível das ondas electromagnéticas com ele.

O primeiro microfone que fiz com uma bobina tirada de uma televisão que encontrei no lixo. Liguei a bobina num pré-amplificador, soldei tudo dentro de uma caixa, com pilhas, um cabo estéreo etc.

Com o tempo, percebi que essa caixa era ótima, mas um podia acomodar mais ideias. Criei uma bifurcação na entrada do pré-amplificador para poder trocar de microfone mais facilmente.

Inclusive descobri que podia usar elementos piezo conectados a essa caixinha!

Depois fui em busca de outras bobinas para fazer outros microfones eletromagnéticos. Achei uns eletroimãs que eu desmontei, separei algum cobre de uma outra bobina de TV, achei um pedaço de ferrite e fiz uma bobina pequena.

Comecei a ouvir os ruídos dos diversos aparelhos aqui de cada, da minha TV, do meu aquecedor, do roteador, do mostrador digital do forno elétrico, do telefone, dos carregadores de celular. As bobinas maiores captam o ruído de todo o dispositivo. Com as bobinas menores consigo isolar um ruído específico de uma parte dos dispositivos. Essa exploração é uma delícia.