Este é o Desafio Semanal # 1. Tema: Processamento de Áudio
Sua tarefa é escrever um programa que grave um arquivo de áudio em disco (em um formato de sua escolha), que contenha o código Morse para 2015
, ou seja,
..--- ----- .---- .....
Você é livre para escolher qualquer tipo de som para os segmentos, como uma onda senoidal de frequência única, um acorde, ruído, algum instrumento (por exemplo, usando arquivos MIDI), desde que audível. No entanto, existem algumas restrições no tempo:
- Segmentos curtos precisam ter pelo menos 0,2 segundos de duração.
- Os segmentos longos precisam ter pelo menos três vezes o tamanho dos segmentos curtos.
- Quebras entre segmentos dentro de um dígito devem ter o mesmo comprimento que segmentos curtos.
- Quebras entre dígitos devem ter o mesmo comprimento que segmentos longos.
- Cada segmento e intervalo pode se desviar em até 10% do comprimento médio desse tipo de segmento / intervalo.
- O arquivo de áudio inteiro não pode exceder 30 segundos.
Os intervalos não precisam ficar completamente silenciosos, mas os segmentos Morse devem ser audivelmente mais altos que os intervalos.
Observe que você precisa escrever um arquivo de áudio. Você não pode apenas tocar o som, por exemplo, usando bipes do sistema. Você tem permissão para usar qualquer tipo de biblioteca para lidar com o formato de arquivo e a geração de áudio, mas não deve usar recursos internos para a codificação Morse.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Por favor, considere vincular a um upload do arquivo de áudio resultante (no SoundCloud ou similar), para que as pessoas possam conferir o resultado sem precisar executar seu código. Se você fizer o upload para o SoundCloud, ative os downloads na guia Permissões da faixa.
Se sua saída usar um formato de arquivo bastante incomum, adicione algumas informações sobre como reproduzi-la e / ou convertê-la para um formato mais comum e carregá-la.
Exemplo de faixa
Esta é uma faixa de exemplo gerada manualmente que está em conformidade com as especificações e usa ruído para os segmentos Morse (ruído de fundo do microfone, para ser mais preciso). Aqui está um link para o SoundCloud se o player incorporado não funcionar para você.
Detalhes da recompensa
Atribuirei a recompensa ao envio mais curto em uma linguagem de programação de áudio , ou seja, uma linguagem projetada para sintetizar som. Essa lista não está completa, portanto, fique à vontade para usar outra linguagem de programação de áudio, se você souber uma. Se você não tiver certeza se algum idioma que deseja usar é classificado como idioma de programação de áudio, entre em contato nos comentários ou no bate-papo , e podemos discutir isso.
Observe que seu envio ainda precisa cumprir todas as regras - em particular, ele precisa gravar um arquivo, o que pode não ser possível em todas as linguagens de programação de áudio. Por exemplo, até onde eu sei, o gibber pode apenas tocar o som e não salvá-lo em um arquivo.
Respostas:
AWKBASH:66866774 bytesConforme solicitado por Martin Büttner, adicionei um tempo, pois após verificar o padrão da notação ABC , parece que não há um valor padrão definido para isso (obrigado nutki por apontar isso).
Também escrevo em um arquivo de disco (a) em vez de STDOUT, pois a pergunta queria explicitamente "um arquivo em disco".
Eu coloquei um tempo de 99 que faz com que o arquivo de áudio dure 22 segundos; É mais lento que a minha versão anterior, mas pelo menos agora deve ter o mesmo tamanho em todos os reprodutores ABC e caber em menos de 30 segundos.
Parece ... muito parecido com a versão anterior, como você pode ver:
Aqui está o novo arquivo midi .
Primeira versão do BASH (falta o andamento)
Por que não pensei nisso primeiro ...: o)
Isso significa 22 bytes a menos que o AWK, para o mesmo resultado
Como a versão anterior no AWK, ele escreve no stdout um arquivo de notação "ABC" válido (obrigado Tobia por descobrir que a instrução "L" era opcional)
Se parece com isso:
E soa exatamente como a versão anterior .
Versão anterior no AWK (86 bytes)
Aqui está uma nova versão; um pouco mais, mas com um timing mais preciso. Deixei a primeira versão abaixo para comparação / referência:
Este ainda é um arquivo "abc" válido, com a seguinte aparência:
Aqui está o novo arquivo midi (eu acelerei o andamento para ficar abaixo do limite de 30 segundos).
Primeira versão no AWK (66 bytes):
Isso é muito menos interessante do que minha resposta anterior , mas é muito menor, então:
Isso gera um arquivo "abc" válido, que pode ser lido (entre outros) no EasyABC. Isso parecerá assim:
e soará assim (arquivo midi) . +
fonte
código de máquina x86 (arquivo .COM):
121120113109 bytesHexdump:
Pode ser facilmente executado no DosBox; a saída é um arquivo .SND chamado
SND
. Aqui está uma versão FLAC de sua saída (e aqui o arquivo .COM).Montagem comentada:
A
data.dat
descrição acima é uma representação fácil de usar da sequência morse (bit inferior: som ativado / desativado, superior a 7 bits: duração do som nas amostras >> 4) gerada por um script Python:fonte
a
dea.snd
é colocado logo antes do cabeçalho do SND, que começa com.snd
um byte zero, então eu pego a.snd
peça gratuitamente e reciclo seu terminador zero. Além disso, o fato de o cabeçalho iniciar um byte após o nome do arquivo permite que eu use ainc dx
para mover para o cabeçalho (1 byte) em vez demov dx, header
(3 bytes). OTOH, se eu tivesse permissão para chamá-lo.snd
sozinho, poderia salvar dois bytes, mas não tenho certeza se o DOS real permitiria isso (o tratamento da extensão no DOS era bastante peculiar)..SND
: entrei.SND
no DosBox,SND~1
no FreeDOS e espero algo mais no DOS "real"; portanto, é definitivamente a área "comportamento indefinido". No final, resolvi chamar o arquivoSND
(1 byte a menos devido à remoçãoa
, mantendo o custo doinc dx
- que se tornadec dx
).Mathematica - 130
Jogue online
fonte
Export
, como"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
deve ser(b=None~s~#&)@.4
Além disso, você pode salvar 3 caracteres usandor = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5: 94
122 140Os arquivos SND têm cabeçalhos mais simples, sem necessidade de imprimir em binário. Esta versão produz um arquivo SND mono de 8khz chamado 'a':
O arquivo de resultado .
Solução antiga. Produz um arquivo WAV mono de 8khz de 8 bits chamado 'a':
O arquivo de resultado.
Para obter 122 caracteres, tive que colar o cabeçalho em binário, em vez de empacotá-lo, o que dificulta a cópia aqui. A versão de escape é:
Codificação Base64 da solução real de 122 bytes:
fonte
.au
extensão, talvez. Bem feito!AWK:
172170 bytes... e sem usar nenhuma biblioteca wave! (*)
Isso gera um arquivo de áudio Sun au no stdout que pode ser reproduzido pelo vlc (entre outros). Enquanto o formato de arquivo au não possui nenhuma limitação de taxa de amostragem, o VLC se recusa a reproduzir qualquer arquivo com uma taxa de amostragem inferior a 4096 Hz, então usei essa frequência
EDIT: Link para o arquivo de áudio resultante no DropBox
(*) Não deveria haver um bônus por isso? ; o)
fonte
d=d "\177
... concatenação. Isso economiza um byte. Mas quando eu reproduzo o arquivo de áudio resultante, parece que está faltando o último toque do 5. #Python, 155
Usa o módulo wave incorporado do python.
Grava em um arquivo chamado
n
.Agradecemos ao Sp3000 pela sugestão de usar a compreensão da lista para loop (isso ajudou a remover um pouco de recuo).
Escute isto:
https://soundcloud.com/bitpwner/morse-the-new-year-2015
Aqui está um link para o SoundCloud se o player incorporado não funcionar para você.
Código comentado:
fonte
w
é um efeito colateral Eu acho que você pode listar comp para salvar dois bytes:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 bytesUsa a biblioteca Wav.Net .
Saídas para um arquivo chamado
a
.Resultado hospedado no Dropbox
Código não destruído:
fonte
Python
32191188174171 (sem bibliotecas)Arquivos Wav são incrivelmente simples. Queria tentar sem bibliotecas. Por alguma razão, meus arquivos parecem travar o Windows Media Player. Tempo rápido
trabalhobugs no meio do arquivo. A conversão para uma taxa de amostragem maior usando o Audition corrige isso.Atualização : implementadas algumas otimizações da resposta Perl. Agora é emitido apenas com o nome
n
e na amostragem de 1000Hz. Informações editadas acima em conformidade.Versão antiga
fonte
Bytes em C # ~ 485
Usando a biblioteca Wav.Net .
E aqui está a saída.
Versão legível,
fonte
C #
382333 bytesNão usa bibliotecas não padrão, escreve um wav de 44100 amostras por segundo de 8 bits por amostra, com o que eu espero que seja um cabeçalho válido (parece reproduzir / carregar felizmente no WMP / .NET / Audacity).
O cabeçalho é codificado em base64 e o morse é codificado como sinal on / off, que é armazenado em um único comprimento (64 bits) porque os últimos 5 bits são os mesmos que o primeiro.
O resultado pode ser encontrado aqui
Código de golfe:
Com comentários:
fonte
.wav
, para que você possa salvar 4 bytes lá.SuperCollider ,
625605 bytesEnvio de linguagem de programação de áudio!
A saída é gravada em um arquivo
b
no formato AIFF. O Windows Media Player falha ao abri-lo, mas funciona bem no VLC media player. O arquivo geradoa
é um arquivo OSC .Criei algumas funções do SuperCollider:
f
gera um bipe curto,g
um intervalo curto,h
um bipe longo ei
um intervalo longo. O SuperCollider precisa das posições iniciais para cada onda senoidal e não de um comprimento, então eu tive que criar funções que geram uma onda com a posição inicial correta e preciso chamar as funções toda vez que precisar de uma onda senoidal. (Não foi possível armazenar uma onda com um comprimento específico em uma variável para reutilização). A\w
definição é criada no final do bloco de código.No meu computador com Windows, ele não salvou o arquivo de áudio no mesmo diretório que o meu código, mas neste diretório:
Resultado hospedado no Dropbox
Código com recuo:
fonte
ChucK -
1195217201147145144ChucK é uma linguagem de programação de áudio. O bitpwner me ajudou a reduzir isso de 201 para 147 bytes.
Aqui está um link direto para o SoundCloud se o player incorporado não funcionar para você.
fonte
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
para evitar a matriz?1016835
em binário é11111000010000000011
.j
existe apenas para acompanhar as pausas entre cada dígito de2015
(cada dígito tem 5 sons).Csound, 140 + 40 = 180
Linguagem de programação de áudio.
Este é o arquivo da orquestra:
e este é o arquivo de pontuação:
Os tamanhos são calculados assumindo espaço em branco extra, terminador de linha única (UNIX) e nenhum terminador após a última linha.
Você os chama usando o comando csound:
que produzirá um arquivo de saída no diretório atual, por padrão chamado "test.aif"
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
Eu poderia ter raspado dois ou três bytes escolhendo uma forma de onda mais feia, mas gosto do som da tradicional onda senoidal de Morse.
PS: Eu sou um novato em Csound, todas as dicas de golfe são apreciadas, especialmente no que diz respeito à pontuação!
fonte
brainfuck , 649 bytes
Isso gera uma sequência de amostras não assinadas de 8 bits que podem ser reproduzidas em 8000 amostras por segundo com uma ferramenta como
aplay
no Linux. Crédito na tabela de constantes BF .Experimente online!
Um pouco menos jogado
fonte