IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Comment jouer quelques notes de musique sans charger une librairie externe ?

Noter ce billet
par , 13/12/2016 à 00h52 (1177 Affichages)
J'ai répondu à cette question en utilisant l'API audio et les promesses, je ne prétends pas avoir trouvé la meilleure solution.

Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const
  ctx = new AudioContext(),
  note = ( frequency = 277.18, duration = 1.0, type = "sine"  ) => {
    /*
     *  fonction note : joue une note de musique
     *  type : sine, triangle, square, sawtooth
     *  frequency : voir tableau
     *  duration : durée de la note en seconde
     */
    let
      osc = ctx.createOscillator(),
      gainNode = ctx.createGain();
 
    osc.type = type;
    osc.connect( gainNode );
    osc.frequency.setValueAtTime( frequency, ctx.currentTime ); // osc.frequency.value = frequency; est devenu obsolète
    gainNode.connect( ctx.destination );
    osc.start( 0 );
    gainNode.gain.exponentialRampToValueAtTime( 0.00001, ctx.currentTime + duration );
    return Promise.resolve( "note" );
  };

Exemple

Ne connaissant pas le solfège, cet exemple est certainement perfectible. Pour séparer les notes (silence), j'ai utilisé la fonction kPromiseDelay qui est incluse dans le fichier dvjhUtilities-1.3.3.js (voir les billets précédents).

Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
note( 261.63, 1.0 ) // do
  .then( r => { note( 261.63, 1.5, "triangle" ) } ) // do
  .then( r => kPromiseDelay( 200 ) ) // silence
  .then( r => { note( 261.63, 1.0, "triangle" ) } ) // do
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 261.63, 1.0, "triangle" ) } ) // do
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 293.66, 1.0, "triangle" ) } ) // ré
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 329.63, 1.0, "triangle" ) } ) // mi
  .then( r => { note( 659.26, 1.5, "triangle" ) } ) // mi
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 293.66, 1.0, "triangle" ) } ) // ré
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 261.63, 1.0, "triangle" ) } ) // do
  .then( r => { note( 659.26, 2.0, "triangle" ) } ) // mi
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 329.63, 1.0, "triangle" ) } ) // mi
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 293.66, 1.0, "triangle" ) } ) // ré
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 293.66, 1.0, "triangle" ) } ) // ré
  .then( r => kPromiseDelay( 200 ) )
  .then( r => { note( 261.63, 1.5, "triangle" ) } ) // do
  .then( r => { note( 220.0, 1.5, "triangle" ) } ) // la
  .catch( er => { console.log( er ) } );

Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Viadeo Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Twitter Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Google Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Facebook Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Digg Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Delicious Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog MySpace Envoyer le billet « Comment jouer quelques notes de musique sans charger une librairie externe ? » dans le blog Yahoo

Mis à jour 03/03/2018 à 22h45 par danielhagnoul (osc.frequency.value = frequency; est devenu obsolète)

Tags: audio, es2015, note
Catégories
Javascript , Développement Web , ES2015

Commentaires