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:

NotaCifraFreq.
C261
D293
MiE330
F349
SolG392
A440
SiB493

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:

480,200,0
1568,200,0
1568,200,0
1568,200,0
739.99,200,0
783.99,200,0
783.99,200,0
783.99,200,0
369.99,200,0
392,200,0
369.99,200,0
392,200,0
392,400,0
196,400,0
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
83.99,200,0
880,200,0
830.61,200,0
880,200,0
987.77,400,0
880,200,0
783.99,200,0
698.46,200,0
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
783.99,200,0
880,200,0
830.61,200,0
880,200,0
987.77,400,0.2
1108,10,0
1174.7,200,0
1480,10,0
1568,200,0.2
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
783.99,200,0
783.99,200,0
739.99,200,0
783.99,200,0
880,200,0
830.61,200,0
880,200,0
987.77,400,0
880,200,0
783.99,200,0
698.46,200,0
659.25,200,0
698.46,200,0
784,200,0
880,400,0
784,200,0
698.46,200,0
659.25,200,0
587.33,200,0
659.25,200,0
698.46,200,0
784,400,0
698.46,200,0
659.25,200,0
587.33,200,0
523.25,200,0
587.33,200,0
659.25,200,0
698.46,400,0
659.25,200,0
587.33,200,0
493.88,200,0
523.25,200,0.4
349.23,400,0
392,200,0
329.63,200,0
523.25,200,0
493.88,200,0
466.16,200,0
440,200,0
493.88,200,0
523.25,200,0
880,200,0
493.88,200,0
880,200,0
1760,200,0
440,200,0
392,200,0
440,200,0
493.88,200,0
783.99,200,0
440, 200,0
783.99,200,0
1568,200,0
392,200,0
349.23,200,0
392,200,0
440,200,0
698.46,200,0
415.2,200,0
698.46,200,0
1396.92,200,0
349.23,200,0
329.63,200,0
311.13,200,0
329.63,200,0
659.25,200,0
698.46,400,0
783.99,400,0
440,200,0
493.88,200,0
523.25,200,0
880,200,0
493.88,200,0
880,200,0
1760,200,0
440,200,0
392,200,0
440,200,0
493.88,200,0
783.99,200,0
440,200,0
783.99,200,0
1568,200,0
392,200,0
349.23,200,0
392,200,0
440,00,0
698.46,200,0
659.25,200,0
698.46,200,0
739.99,200,0
783.99,200,0
392,200,0
392,200,0
392,200,0
392,200,0
196,200,0
196,200,0
196,200,0
185,200,0
196,200,0
185,200,0
196,200,0
207.65,200,0
220,200,0
233.08,200,0
246.94,0.4

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”.

Atualização: existe um projeto para python, o Musical Beeps, disponível no GitHub que adota a mesma ideia, e não precisa do alto-falante interno. Usando arquivos com a nota musical e o tempo de execução, é possível emitir os beeps pela caixa de som normal. Para explorar a combinação usando diferentes instrumentos, fica aqui a ideia para usar esses arquivos como entrada para plataformas como o Online Sequencer.

Fontes (e mais músicas)

Compartilhe :)

6 comments

    1. 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

    1. Dá uma olhada nesse link, tem umas opções interessantes para testar: https://stackoverflow.com/questions/27079534/how-to-start-a-system-beep-from-the-built-in-pc-speaker-using-a-batch-file

      Se quiser fazer algo mais elaborado, o prompt de comando do Windows é meio limitado. Nesse caso, talvez o mais interessante fosse usar uma linguagem de programação como o python, que tem a biblioteca winsound que trabalha com isso – veja mais nesse link: https://stackoverflow.com/questions/6537481/python-making-a-beep-noise

    1. Oi Júlio,
      Tem como fazer com outras músicas além dos exemplo. Precisa pegar a cifra da música para o script converter cada nota musical em frequência, além do tempo de execução de cada uma. Só precisa lembrar que a música na cifra é para algum instrumento, e como essas música tem alguém cantando, pode não ficar reconhecível para quem escute só os beeps (já que só vai ouvir a batida).

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.