https://live.codecircle.com/d/n2Y3PmZEHoKu9b93r
var contexte_audio = window.AudioContext || window.webkitAudioContext;
var contexte = new contexte_audio();
document.body.addEventListener('keydown', jouer_note, false);
function jouer_note () {
/**/
// créer un oscillateur
var oscillateur = contexte.createOscillator();
// on pourrait changer le type d'oscillateur :
//oscillateur.type = 'triangle';
//oscillateur.type = 'square';
//oscillateur.type = 'sine';
/* comme on va en créer plusieurs, pour que l'addition de leur signal ne dépasse pas 1, on utilise un amplificateur pour diminuer le signal de chaque */
var amplificateur = contexte.createGain();
// on part à 0
amplificateur.gain.value = 0;
// régler la fréquence/pitch
// entre 200 et 1000
oscillateur.frequency.value = Math.random() * 800 + 200;
// on le connecte à l'amplificateur à la sortie audio
oscillateur.connect( amplificateur );
// que l'on le connecte à la sortie audio
amplificateur.connect( contexte.destination );
// enveloppe
// retourne un flottant correspondant au nombre de secondes écoulées depuis le début du programme
var instant = contexte.currentTime;
var attaque = {
gain: 0.1,
delai: 0.25,
};
var chute = {
gain: 0.085,
delai: attaque.delai + 0.25,
};
var maintien = {
gain: 0.085,
delai: chute.delai + 0.75,
};
var extinction = {
gain: 0,
delai: maintien.delai + 0.25,
};
// attaque (attack)
amplificateur.gain.linearRampToValueAtTime ( attaque.gain, instant + attaque.delai);
// chute (decay)
amplificateur.gain.linearRampToValueAtTime ( chute.gain, instant + chute.delai);
// maintien (sustain)
amplificateur.gain.linearRampToValueAtTime ( maintien.gain, instant + maintien.delai);
// extinction (release)
amplificateur.gain.linearRampToValueAtTime ( extinction.gain, instant + extinction.delai);
// on le démarre
oscillateur.start();
oscillateur.stop( instant + extinction.delai + 1 );
}
[lien de l'exemple](https://live.codecircle.com/d/XfoN9skouxfrjKqwY)