O usuário quartata postou esse desafio , mas negligenciou o fato de que, por qualquer motivo, ele não é capaz de reproduzir arquivos MIDI em seu computador.
Vamos ajudá-lo escrevendo um programa completo que lê uma música no formato RTTTL a partir da entrada padrão, imprime o nome da música na saída padrão e a reproduz (na velocidade e tom certos).
Detalhes do formato
RTTTL é um formato de toque bastante estúpido e subespecificado. Consiste em um nome, alguns valores padrão e uma série de notas (apenas uma nota por vez) em um formato de texto simples.
Exemplo: fifth: d=4,o=5,b=63: 8P, 8G5, 8G5, 8G5, 2D#5
O nome é uma sequência terminada por dois pontos. Aqui o nome é "quinto". Seu programa deve aceitar nomes com pelo menos 15 caracteres.
A seguir, a seção de padrões (também terminada por dois pontos) lista alguns valores padrão para duração (d), oitava (o) e as batidas por minuto (b) da música. Eles são separados por vírgula e usam uma sintaxe "chave = valor". Pode haver qualquer número de espaços ao redor de cada parte "chave = valor". Você pode assumir que os valores padrão d, o e b estão todos presentes nesta ordem. A duração e a oitava serão explicadas abaixo; o bpm refere-se ao número de batidas (correspondentes às semínimas) que devem ser tocadas em um minuto e você deve suportar qualquer valor inteiro entre 20 e 900 (inclusive).
Em seguida, a música real é listada como uma série de notas separadas por vírgula usando uma sintaxe "DPO", onde D é a duração, P é a afinação (nota) e O é a oitava. Pode haver qualquer número de espaços e novas linhas ao redor de cada parte "DPO".
A duração é uma potência de 2 entre 1 e 32 (inclusive), representando uma fração de uma nota inteira. Assim, por exemplo, um valor de 4 (semínima) é o dobro do valor de 8 (colcheia). A duração pode estar faltando; nesse caso, a duração padrão será usada. A duração também pode ser modificada pela presença de um ponto ( .
), especificamente o ponto que faz a nota durar 50% mais. Como nem todos concordam sobre onde o ponto deve estar, você deve aceitá-lo após a afinação ou após a oitava (ou seja, "DP.O" e "DPO." Devem funcionar).
O tom é um de A, B, C, D, E, F, G, A #, C #, D #, F #, G #, P, em que AG # são as notas musicais padrão (nota: sem planos, use a nota afiada correspondente) e P é uma pausa. O tom é a única parte da nota necessária e não diferencia maiúsculas de minúsculas.
E, finalmente, a oitava é um número normalmente de 4 a 8, mas você deve suportar qualquer número de 1 a 8, inclusive. Por exemplo, C4 é o C médio padrão com uma frequência de cerca de 261,63Hz. A oitava pode estar faltando; nesse caso, a oitava padrão será usada. Você pode supor que as pausas não tenham uma oitava especificada (pois não tem significado).
Conforme mencionado no outro desafio, você pode usar este site para converter músicas RTTTL para o formato MIDI para teste (mas observe que ele pode não seguir exatamente a mesma especificação).
Requisitos:
Seu programa deve tocar cada nota na velocidade e no tom certos. Ele pode usar qualquer tipo de som (seno / triângulo / onda quadrada, som de piano, som de sino, qualquer que seja; também pode ser um sinal sonoro padrão, som de onda ou som MIDI etc.), desde que seja audível e o tom seja reconhecível.
Cada nota deve ser tocada continuamente pela duração especificada ou não mais do que uma nota 64 mais curta que essa, exceto se você estiver usando algo como um envelope ADSR ; nesse caso, a fase de lançamento poderá continuar na próxima pausa ou na próxima nota .
Se duas notas consecutivas tiverem o mesmo tom, elas deverão ser claramente distinguidas, seja através de uma pequena pausa (usando no máximo a 64ª nota como parte da duração da primeira nota) ou usando um som não uniforme (como como o envelope ADSR mencionado acima), ou pelo menos através de uma mudança de fase, se estiver claro o suficiente. Duas pausas consecutivas devem ser tratadas da mesma forma que uma única pausa com a duração total.
O programa deve ser executável no Linux usando software disponível gratuitamente. Ele deve ler a música da entrada padrão e imprimir o nome da música na saída padrão.
Se a entrada não corresponder à especificação acima, o comportamento não será especificado. Seu programa pode ignorar erros, imprimir uma mensagem ou reproduzir algo errado, travar ou travar; ele não deve causar nenhum dano.
As brechas padrão não são permitidas.
Pontuação
O código de golfe, o programa mais curto (medido em UTF-8 bytes) vence.
Respostas:
Java, 813
Ainda estou trabalhando nisso.
É um pouco sensível à velocidade e ocupação da CPU ao iniciar.
fonte
C ++, 15186 bytes
Há um link na parte inferior onde você pode ouvir uma amostra
Apresento uma das maneiras menos práticas de tocar música em sua máquina Linux:
Infelizmente, não posso incluir o código com e sem golfe (restrições de espaço), e o código pode ser alterado ainda mais.
Grande parte do motivo pelo qual o arquivo é tão longo é que ele precisa criar todos os passos (12 notas * 5 oitavas) individualmente usando ondas senoidais.
Compilando Compilei usando o prompt dev cmd do visual studio, mas é muito semelhante ao g ++ no Linux.
Você só precisa vincular as coisas corretamente.
crédito para SFML e este post para a idéia.
Acho que os horários estão corretos, deixe-me saber se não estão.
Ouça
Aqui (Link to DropBox) está uma gravação de tela dele, reproduzindo uma versão rápida do Tema Morrowind que eu criei. Observe que no vídeo ele não solicita entrada porque o arquivo já existe.
fonte