/Projeto_piano-virtual

Piano virtual desenvolvido em Javascript puro.

Primary LanguageJavaScript

Projeto Piano Virtual 🎹

Este projeto de piano virtual faz uso do framework de áudio Tone.js, cuja biblioteca permite gerar sons e trabalhar com diversos tipos de efeitos e filtros pré-definidos, dispensando a necessidade de uso de samplers.

Para ver o resultado, clique aqui 🎵🎶.

Sugestão: ao visualizar a aplicação em dispositivos moveis, rotacionar a tela para o modo landscape (paisagem), para melhor experiência.

Características do projeto

  • Interruptor Standby/on;
  • Controle de volume;
  • Seletor com 3 opções de som;
  • Guia com as escalas das notas;
  • Controle de visibilidade de marcação de teclas.
  • 24 teclas ativáveis por clique, toque ou teclado físico.

Mapa das notas musicais para uso do teclado físico:

Nota Tecla Nota Tecla
C A C+ K
C# Q C#+ Y
D S D+ L
D# W D#+ U
E D E+ Ç
F F F+ M
F# E F#+ I
G G G+ ,
G# R G#+ O
A H A+ .
A# T A#+ P
B J B+ ;

Configurações gerais:

O interruptor Standby--on` foi inserido para habilitar a inicialização do contexto de áudio. Isto se fez necessário uma vez que os navegadores exigem que haja uma prévia interação do usuário para a execução de áudios. Além disto, a inserção deste permite liberar recursos, caso a aplicação esteja aberta mas não sendo utilizada.

O array allowedKeys armazenado no objeto piano contém os nomes das teclas físicas utilizadas para acionamento das teclas do piano. A referência de cada uma é feita por meio dos atributos data-keys dos elementos li do index.html, e devem receber como valores os códigos das teclas físicas usadas. Deve-se notar que os elementos <span> que se aninham em cada um dos elementos <li> devem conter o nome da tecla a qual o data-keys se refere, estes serão exibidos quando o interruptor Teclas estiver acionado.

Os atributos data-note referem-se às notas musicais que devem ser executadas e estão dispostas em ordem de acordo com a posição de teclas de um piano real, portanto, não devem ser alterados.

A seleção do tipo de som é feita pela chave Seletor. A mudança de valor do input atrelado a ele aciona o callback responsável pelo acesso ao chooseTypeOfSound(option), cujas propriedades nele presentes referem-se à criação de um sintetizador específico.

Ao criar um novo sintetizador, ele é armazenado na propriedade synth do objeto piano, executado pela chamada da função activeNote(key) e é "descartado" sempre que alteramos o seletor, para liberação dos recursos.

Neste projeto, foram incluídos os sintetizadores Synth, MonoSynth e FMSynth, seguindo as recomendações da documentação do framework Tone.js 1.

O controle de volume é feito pelo input da chave Volume, que aciona a função adjustVolume() toda vez que o valor de entrada é alterado. O valor máximo fixado neste projeto é o valor "normal" da saída de áudio e a redução do som se dá pela diminuição de ganho (em dB) aplicado a synth. A redução máxima é estabelecida por meio da propriedade volumeRange do objeto piano.

Referências e inspirações 🤩:

Footnotes

  1. O framework Tone.js inclui o ScriptProcessorMode (interface obsoleta), porém apenas para verificação de recursos, não impactando no processamento de áudio, desta forma, as mensagens de aviso no console referentes a esta interface podem ser ignoradas.