Escreva um programa para tocar a popular rima infantil inglesa.
(Este arquivo está licenciado sob a licença Unported Creative Commons Attribution-Share Alike 3.0 . Atribuição: Helix84 na Wikipedia em inglês ; Blahedo na Wikipedia em inglês .)
Alguns artigos da Wikipedia que podem ser úteis:
- Twinkle Twinkle Little Star (possui um clipe de áudio com o que a saída do seu programa deve soar)
- Símbolos musicais modernos (para aprender sobre a notação musical usada acima)
- Nota # Frequência das notas (hertz) (a fórmula para calcular a frequência de cada nota)
Algumas diretrizes para o seu envio:
Seu programa deve usar a placa de som do computador. Se sua linguagem de programação não tiver acesso conveniente ao hardware de áudio, seu programa deverá criar um arquivo de saída em algum formato padrão, como WAV ou MIDI.
Seu programa deve realmente gerar sua saída. Por exemplo, a incorporação do arquivo Ogg Vorbis da Wikipedia não seria permitida.
A qualidade do áudio deve ser aceitável. No mínimo, a música deve ser facilmente reconhecível. De preferência, deve soar bem também.
O foco deve estar no tamanho do código, na qualidade do som ou em ambos (explique qual você decidiu). Soluções elegantes também seriam ótimas. Diverta-se!
Este é um código de golfe , então o código mais curto vence
Respostas:
QBasic (56)
O foco está na reminiscência :)
(Não possui um QBasic para testar isso)
fonte
JavaScript (
214212211 caracteres)Abra o Safari, Opera ou Google Chrome no JavaScript Shell e digite o código abaixo:
Desminificado para facilitar a leitura (mesmo assim, pode ser difícil de entender):
Com vários outros caracteres, ele também pode funcionar no Firefox, mas você pode alterar a
audio/wav
parte para salvar pelo menos o arquivo WAV.fonte
open(...)
paraAudio(...).play()
(mais 8 caracteres) para usar o reprodutor de áudio embutido do Firefox.C # (comprimento: LOL)
Portanto, o que eu fiz aqui foi implementar o suporte para gerar um arquivo .wav a partir da string usada para a solução QBasic em C # (oitava única, sem acidentes). A ênfase estava em:
unsafe
blocos de códigofonte
FromDigits["LOL",36]==28101
Isso não parecer LOL <sub> 36 </ sub> bytes ...Python (259)
fonte
import ttls
?C, 277 caracteres
Perl, 203 caracteres
Convenientemente, o padrão da OSS é
/dev/dsp
8kHz mono u8; tudo o que faço aqui é abrir o dispositivo e gravar amostras computadas.fonte
j,f;main(i){char b[8000];f=open("/dev/dsp",1);for(i=24;i--;write(f,b,j))for(j=0;j<8000;j++)b[j]=(i%4&&j/400%20==9?1:1+sinf(j*powf(2,("@BDEGIG@BDEGBDEG@BDEGIG@"[i]-64)/12.)))*127;}
PowerShell: 207
Código de golfe:
Ungolfed, com comentários:
Não é a versão de melhor som da música de todos os tempos, mas funciona.
fonte
n{
vez den {
?C - 520
Colisão.
Por que usar o hardware do século passado, como alto-falantes e fones de ouvido? Este excelente código permite que você toque a música em um hardware moderno: uma unidade de disquete!
Nenhum requesito especial:
-lm
/dev/fd0
, para exibir o dispositivo ou executar como superusuárioDobra um pouco as regras, mas vamos considerar por um segundo a unidade de disquete como um dispositivo de som e o controlador IDE como uma placa de som integrada.
fonte
HyperCard 2.2 - 113
Uso: Inicie o HyperCard, digite ⌘M para abrir a Caixa de Mensagens, cole o código acima e pressione enter.
harpsichord
pode ser substituído porflute
ouboing
para obter sons diferentes.fonte
harpsichord
->flute
-6 remover o espaço entre o instrumento e citações -1 total de -7C, 96 caracteres
Produz dados de áudio mono não assinados e brutos de 8 bits no estilo clássico de bytebeat . As taxas de amostragem recomendadas para reprodução estão entre 8 e 16 kHz; alterar a taxa de amostragem altera o andamento e o tom.
Para compilar e reproduzir no Linux, salve o código acima
twinkle.c
e execute os seguintes comandos:Algumas notas sobre como o código funciona:
O truque geral usado para composições de bytebeat como essa é que
putchar()
assume um valor inteiro, mas apenas imprime os oito bits baixos. Assim,putchar(t)
ondet
existe um contador crescente, gera uma onda dente de serra, e a frequência da onda pode ser alterada multiplicando-set
por um valor adequado.!!(t>>9&7|!(-t>>12&7))
produz o padrão de repetição de 6 + 1 nota. Especificamente,!!(t>>9&7)
avalia para0
quandot>>9 & 7 == 0
e para o1
contrário. Assim, produz um intervalo de 512 amostras na forma de onda a cada 4096 amostras, enquanto!(-t>>12&7)
elimina cada oitavo intervalo.96+"#d|dOE3#dOE3dOE3"[t>>13&15]
gera a melodia: o código ASCII de cada caractere na sequência mais 96 fornece a frequência relativa da nota correspondente. Na verdade, os valores são as frequências aproximadas em Hz das notas da afinação de concerto na terceira / pequena oitava, ou seja, com A correspondente a 220. No entanto, uma vez que o tom de base com o qual esses valores são multiplicados é de cerca de 64 Hz (quando tocado a 16 kHz ou 32 Hz quando reproduzido a 8 kHz), precisamos reduzir o resultado em cinco oitavas>>5
para obter a frequência novamente em uma faixa razoável.Ps. Se você quiser experimentar esse código em um bytebeat player baseado em JavaScript, substitua
[t>>13&15]
por.charCodeAt(t>>13&15)
.fonte
Python
317305301Esta é minha solução, usando apenas bibliotecas python padrão:
E aqui está um pouco mais de espaço em branco para facilitar a leitura:
fonte
Mathematica, 86 caracteres
fonte
Arduino, 688
Ligue a campainha na saída 11. Concentrei-me principalmente na qualidade , mas também no comprimento do código.
fonte
"ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "
remover espaço?int beats[] =
remover espaço?for (long
remover espaço?11, LOW
remover espaço?note, int
remover espaço?i], duration
remover espaço?11, OUTPUT
remover espaço?ffeeddc "
é para algum tipo de atraso, que você não precisa no final ebeats[] =
não tem motivos para ter um espaço. Além disso, você deve criar uma versão concentrada no comprimento do código, apenas para o que importa!bash + say + gunzip, 136 bytes
say
, é claro, sendo o comando de conversão de texto em fala do OS X. Isso é ... idiota. Sim, vamos com idiota.Os 117 bytes são, é claro, um fluxo gzip contendo caracteres não imprimíveis. Aqui está um despejo xxd do script, incluindo os caracteres:
Explicação
Os 117 bytes são o seguinte script compactado:
É isso mesmo, eu apenas fiz um monte de
say
vozes diferentes dizerem "o". Para descobrir quais, escrevi um script usando aubionotes para obter uma estimativa rápida e suja do tom de cada voz, depois fiz muitas tentativas e erros ao encontrar os que soam mais corretos.Pensei em tentar jogar isso manualmente, mas há tanta repetição que achei que o Zopfli faria um trabalho mais curto, então tomei o caminho mais fácil.
fonte
SmileBASIC, 45 bytes
fonte
Powershell,
120117 bytes[Console]::beep
, observe rótulos e frequências inspirados em IsziIdeia principal :
A
,C
,D
,E
,F
,G
.double duration
.$_-band7
) de cada um dos blocos de utilizações como índice da matriz frequências (A->1
,C->3
,D->4
...)(0,110,0,65,73,82,87,98)[$_-band7]*4
vez do Iszi(0,440,0,262,294,330,349,392)[$_-band7]
.[console]::Beep
não é o instrumento musical mais preciso, então pode ser um pouco falso :)Explicação : Para cada caractere da sequência de melodia
ccggaaGffeeddCggffeeDggffeeDccggaaGffeeddC
, o script:[console]::beep
para tocar a notafonte