Beep music

Ao escutar músicas, gravações e som dos vídeos, é comum propagar o som através de alto-falantes ou fones de ouvido. Eles basicamente convertem um sinal elétrico em ondas sonoras através da vibração de uma membrana.

Ao longo do desenvolvimento da informática, quando ainda não estava nas funções de um computador tocar música, o único som que saía dessas máquinas era através de um alto-falante dentro do gabinete, ligado diretamente à placa mãe. Implementado inicial em 1981 nos PCs da IBM, ainda era do tipo mecânico (os mais recentes são piezoelétricos).

Chamado de "PC speaker", sua função principal é a de dar um retorno ao usuário quanto ao funcionamento correto ou não de dispositivos de hardware ou software. Muito comum de ser usado durante o início de funcionamento de um PC, existem até tabelas de beeps emitidos e erros conforme cada fabricante de placa mãe.

No início do desenvolvimento de jogos eletrônicos para computadores, muitas empresas usavam esse alto-falante para emitir efeitos sonoros ou mesmo simular sons polifônicos. A LucasArts fez uso da técnica nos anos 1990 em vários de seus games. Esse uso do alto-falante do PC para saída de áudio complexo tornou-se menos comum com a introdução da Sound Blaster e outras placas de som, assim como os arquivos do tipo MIDI, WAV e MP3.

Beep Music

Pode-se incluir a emissão de um beep dentro de um programa, para alertá-lo de algum erro, por exemplo. Mas também é possível emitir um beep em diferentes frequências, assim como controlar sua duração. Combinando-se vários sons e ritmos, seguindo uma organização ao longo do tempo, obtém-se música!

Para fazer o seu computador tocar essa música de beeps, primeiramente ele deve possuir o alto-falante. Você pode abrir o gabinete e procurar na placa mãe algo com essa aparência:

PC speaker

Verifique se o módulo "pcspkr" está rodando (o comando "lsmod | grep pcspkr" deve retornar alguma coisa), se ele não está no arquivo "/etc/modprobe.d/blacklist.conf" (se estiver, comentar a linha que contém "pcspkr") ou se teve algum erro em seu carregamento ("sudo grep pcspkr /var/log/dmesg").

No Linux, pode-se instalar o programa que controla os beeps através do comando "apt-get install beep". Os parâmetros basicamente são esses:

  • -f N, onde N entre 0 e 20000 é a frequência, em Hz (se não informado, o padrão é 750 Hz)
  • -l N, onde N é a duração do beep, em milissegundos

Mais detalhes estão no manual do comando beep. O comando também possui parâmetros para especificar um atraso (delay), mas nos exemplos a seguir será utilizado o comando "wait" seguido do número de segundos.

Nota musical é um termo empregado para designar o elemento mínimo de um som, formado por um único modo de vibração do ar, geralmente dada em Hertz (Hz). A correspondência entre o nome da nota musical (com a respectiva letra definida pelo sistema de notação alfabética) e a frequência segue na tabela abaixo:

Nota Cifra Freq.
C 261
D 293
Mi E 330
F 349
Sol G 392
A 440
Si B 493

As frequências dessas notas foram obtidas a partir da Tabela de Frequências, Períodos e Comprimentos de Onda da ECA/USP, que serve de referência para incrementar a lista com sustenidos, bemóis e outras oitavas (acima ou abaixo).

É possível executar uma música inteira com apenas um comando, mas isso funciona bem para trechos curtos. Para facilitar a introdução das frequências, tempos de duração das notas e pausas, esses valores escritos em um arquivo a parte. Esse arquivo tem o nome informado como parâmetro de entrada no script principal, que vem a seguir:

#!/bin/bash
# Script que toca musicas usando o beep conforme a frequência
 
arquivo=$1
echo "Tocando" $arquivo

# Ler arquivo e guardar informações em vetores
notas=( $(cut -d ',' -f1 $arquivo ) )
duracao=( $(cut -d ',' -f2 $arquivo ) )
pausas=( $(cut -d ',' -f3 $arquivo ) )
 
# Frequências das notas musicais
c3=261
c_sus3=277
d3=293
d_sus3=311
e3=329
f3=349
f_sus3=369
g3=392
g_sus3=415
a3=440
a_sus3=466
b3=494
c4=523
c_sus4=554
d4=587
 
# Tempos
#um=1000
#meio=$(expr $um / 2)
#quarto=$(expr $um / 4)
 
# Verifica se está usando frequência ou nota musical
char1=$(head -1 $arquivo | awk '{print$1}' | cut -c1)
# Loop para tocar todas as frequências do vetor notas, com respectivas duração e pausa
i=0
if [ `echo $char1 | grep [a-zA-Z]` ]; then
	#Cifra
	for nota in "${notas[@]}"; do
	    echo $nota
	    beep -f ${!nota} -l ${duracao[$i]}
	    sleep ${pausas[$i]}
	    i=$((i+1))
	done
elif [ $char1 -le 9 ]; then
	#Frequência
	for nota in "${notas[@]}"; do
	    echo $nota
	    beep -f $nota -l ${duracao[$i]}
	    sleep ${pausas[$i]}
	    i=$((i+1))
	done
fi

O arquivo com a música deve seguir uma "partitura" de três linhas: a primeira contém as cifras (conforme valores informados no script), a segunda tem a duração de cada nota (em milissegundos) e a terceira são as pausas após cada nota (em segundos; se não tiver pausa, usar zero). Por exemplo, um trecho de "Seven Nation Army - White Stripes" foi codificada conforme segue (contribuição de Ricardo Vilela):

b3,500,0.25
b3,250,0
d4,250,0
b3,250,0
a3,500,0
g3,1000,0
f_sus3,500,0.5
b3,500,0.25
b3,250,0
d4,250,0
b3,350,0
a3,500,0
g3,1000,0
f_sus3,500,0.5

Copie o script principal, salve como "musica.sh" e permita sua execução (comando "chmod +x musica.sh"). Copie também as linhas com a "partitura" e salve no arquivo "seven_nation_army-white_stripes.csv" na mesma pasta. Finalmente, execute como:

./musica.sh seven_nation_army-white_stripes.csv

O resultado foi gravado usando um celular e segue abaixo:

 

Note que o script também funciona se a primeira coluna já tiver os valores de frequência (em Hz) em vez da cifra - o primeiro caractere do arquivo é verificado para saber se é uma letra (cifra) ou número (frequência). Nessa outra música, o arquivo de entrada ficaria assim:

392,350,0.1
392,350,0.1
392,350,0.1
311.1,250,0.1
466.2,25,0.1
392,350,0.1
311.1,250,0.1
466.2,25,0.1
392,700,0.1
587.32,350,0.1
587.32,350,0.1
587.32,350,0.1
622.26,250,0.1
466.2,25,0.1
369.99,350,0.1
311.1,250,0.1
466.2,25,0.1
392,700,0.1
784,350,0.1
392,250,0.1
392,25,0.1
784,350,0.1
739.98,250,0.1
698.46,25,0.1
659.26,25,0.1
622.26,25,0.1
659.26,50,0.4
415.3,25,0.2
554.36,350,0.1
523.25,250,0.1
493.88,25,0.1
466.16,25,0.1
440,25,0.1
466.16,50,0.4
311.13,25,0.4
369.99,350,0.1
311.13,250,0.1
392,25,0.1
466.16,350,0.1
392,250,0.1
466.16,25,0.1
587.32,700,0.1
784,350,0.1
392,250,0.1
392,25,0.1
784,350,0.1
739.98,250,0.1
698.46,25,0.1
659.26,25,0.1
622.26,25,0.1
659.26,50,0.4
415.3,25,0.2
554.36,350,0.1
523.25,250,0.1
493.88,25,0.1
466.16,25,0.1
440,25,0.1
466.16,50,0.4
311.13,25,0.2
392,350,0.1
311.13,250,0.1
466.16,25,0.1
392.00,300,0.15
311.13,250,0.1

Segue o exemplo acima, da música "Imperial March" de Star Wars:

 

Segue também o link de outra música pronta, do Super Mário Bros., para você treinar (clique no link para baixar o arquivo CSV).

Compôs alguma música nesse formato? Compartilhe através do espaço de comentários! =)

Obs: caso queira desativar esse "maravilhoso" sinal sonoro de seu computador, edite o arquivo "/etc/inputrc" para descomentar a linha "set bell-style none" e comentar as outras que contenham "bell". Também use o comando "modprobe -r pcspkr" e depois crie/edite o arquivo "/etc/modprobe.d/blacklist" para incluir a seguinte linha: blacklist pcspkr. Talvez precise usar "snd_pcsp" em vez de "pcspkr".

Fontes (e mais músicas)

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.
  • Muito loucoooooooo!!!

    Cara, vc fez todos esses passos pra executar essas musicas? Que trampo!

    • Vinicius Roggério da Rocha

      Eu acertei o script para facilitar o trabalho de composição. Assim só precisa se preocupar com as notas, durações e intervalos, sem pensar em programação – e também acho que ficou mais elegante.

      Aproveite seus dotes musicais e faça uma composição em “beep music” rsrs

      E parabéns pelo aniversário! []’s