Comment jouer quelques notes de musique sans charger une librairie externe ?
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 ) } );