Existe alguma maneira de fazer o Android emitir um som de frequência arbitrária (ou seja, não quero ter arquivos de som pré-gravados)?
Eu olhei em volta e ToneGenerator foi a única coisa que consegui encontrar que estava ainda perto, mas parece ser capaz de emitir apenas os tons DTMF padrão.
Alguma ideia?
Respostas:
Eu originalmente encontrei este código de exemplo em um blog, mas ele tinha alguns bugs que geravam alguns sons horríveis. Corrigi os bugs e postei o código resultante aqui. Parece funcionar bem para mim!
fonte
0.0
a1.0
. Multiplicar por32767
iria convertê-lo no intervalo de ponto fixo de 16 bits. O AudioTrack espera que o buffer esteja no formato little endian . Portanto, as próximas duas linhas apenas convertem a ordem de bytes de big endian em little endian.Melhorando o código acima:
Adicione amplitude de aumento e redução para evitar os cliques.
Adicione o código para determinar quando a tacada terminou de tocar.
fonte
Eu envolvi as soluções maravilhosas acima em um pequeno pacote que é mais utilizável fora da caixa como uma campainha configurável simples. Ele o executa em um thread de segundo plano e tem métodos de parar e reproduzir e um punhado de opções que você pode definir.
Ele está no JCenter para que você possa adicioná-lo à sua lista de dependências assim
e você o usa assim para uma campainha contínua
ou uma campainha tocada apenas uma vez e você pode definir a frequência e o volume como este
Postagem estendida do blog aqui sobre isso aqui GitHub aqui
fonte
Como há um bug em algumas versões mais antigas do Android que causa um vazamento de memória ao usar MODE_STATIC, modifiquei a resposta do Xarph acima para usar MODE_STREAM. Espero que ajude alguns.
fonte
Aqui está outro blog demonstrando um sintetizador simples mais alguma interface do usuário
http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/
Você também pode estar interessado em csound ou pdlib (pure data lib) para Android.
fonte
Código modificado com base na resposta de Singhaks
fonte
// Você pode adicionar um valor arbitrário em synth_frequency para mudar o som, por exemplo, você pode adicionar uma variável aleatória para obter o som
fonte
Faça maior (16 notas)
fonte
veja esta biblioteca útil
https://github.com/karlotoy/perfectTune
é fácil de usar
adicione isso às suas dependências
E você o usa assim:
para parar a melodia:
fonte
Existem vários programas para isso, mas eles são uma merda. Eu medi alguns:
http://www.endolith.com/wordpress/2009/11/24/android-audio-applications/
Portanto, não faça o que eles fazem. : D
fonte