|<- [[1.16 Modulation with an oscillator]]|[[1.20 Fiddling with the filter]] ->| 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)