Seu objetivo é imprimir a letra da música "Twinkle Twinkle Little Star" à medida que cada nota é tocada.
O microfone do computador ouvirá anotações. Se o tom (mas não necessariamente o comprimento) da nota estiver correto, imprima a sílaba apropriada. Caso contrário, não faça nada. Cada nota terá a duração de pelo menos meio segundo e haverá uma pausa de pelo menos um quarto de segundo entre as notas.
Use as notas musicais fornecidas aqui e as seguintes letras: (Linhas verticais representam quebras de sílabas.)
Gêmeo | kle, gêmeo | kle, iluminado | estrela tle,
Como eu vou saber o que você é.
Até um mundo tão alto,
Como um dia | segundo no céu.
Gêmeo | kle, gêmeo | kle, iluminado | estrela tle,
Como eu vou saber o que você é.
Uma gravação da música pode ser encontrada aqui .
Exemplo
O computador ouve um C médio e imprime "Twin"
Ouve outro C do meio e imprime "kle"
Então ouve outro C do meio (nota errada) e não faz nada.
Então ele ouve o G acima do meio C e imprime "gêmeo" e assim por diante.
Regras
- A pontuação deve ser como mostrada.
- O espaçamento deve ser como mostrado (com espaços e novas linhas).
- O espaço em branco pode ser impresso junto com a sílaba anterior ou a próxima.
Respostas:
Python 3 - Solução parcial (
760742734710705657 caracteres)(Última edição; prometo)
Parece um problema muito, muito, muito difícil (especialmente para reconhecer onde as notas começam ou terminam). A transcrição automática de música parece um tópico de pesquisa aberto (não que eu saiba nada sobre isso). Então, aqui está uma solução parcial que não faz nenhuma segmentação de nota (por exemplo, imprime "Twinkle" de uma só vez quando ouve a frequência) e provavelmente só funciona para esse arquivo ogg específico:
Isto exige...
Altere A = -52 (amplitude mínima) na linha superior, dependendo do microfone, quantidade de som ambiente, quão alta a música está tocando etc. No meu microfone, menos de -57 parece captar muito ruído estranho. e mais de -49 exige que você toque muito alto.
Isso poderia ser muito mais jogado; Tenho certeza de que existem maneiras de salvar um monte de caracteres na matriz de palavras em particular. Este é o meu primeiro programa não trivial em python, então ainda não estou muito familiarizado com a linguagem.
Roubei o código para detecção de frequência via autocorrelação em https://gist.github.com/endolith/255291
Ungolfed:
fonte