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.

Deixe um comentário