sábado, 2 de mayo de 2020

Javascript aplicado(3). Nociones muuuuy elementales de Tone.js

0. Introcucción

Tone.js es una librería muy completa pero bastante durilla de entender si no estás en el mundillo del audio.

Veamos solo unas pequeñas indicaciones de utilización mínima.

1. Inicializar tone.js en una sola voz y tocar una nota

El objeto Tone.Synth nos permite crear música. En este caso, solo actua  un instrumento o voz:


//create a synth and connect it to the master output (your speakers)
var synth = new Tone.Synth().toMaster()

Y si queremos tocar una nota por ejemplo Do4 con una duración de una corchea (1/8 de redonca)


//play a middle 'C' for the duration of an 8th note
synth.triggerAttackRelease('C4', '8n')


2. Inicializar tone.js con polifonía y tocar un acorde

Vamos a crear un sintetizador polifónico de 6 voces máximo y a continuación tocaremos un acorde mayor de Do4 (Do4-Mi4-Sol4) de duración una negra (1/4 de redonda). En este caso estamos utilizando 3 de las 6 voces que tenemos.


//a polysynth composed of 6 Voices of Synth
var synth = new Tone.PolySynth(6, Tone.Synth).toMaster();
//set the attributes using the set interface
synth.set("detune", -1200); //?
//play a chord
synth.triggerAttackRelease(["C4", "E4", "G4"], "4n");


3. Tocar una nota y esperar un momento


Cuando tocamos una nota, la nota se ejecuta en un hilo de ejecución y simultáneamente la ejecución de la siguiente sentencia se ejecuta en otro hilo paralelo. Por tanto debemos utilizar la función window.setTimeout (funcion a ejecutar, tiempo de espera em ms, parametros de la función a ejecutar) donde la función a ejecutar es la continuación del programa.

Por ejemplo si queremos tocar 2 notas una a continuación de la otra.

//Toca una nota (note1) durante myDuration1 en ms
synth.triggerAttackRelease(note1, myDuration1/1000);

//Espera myDuration1 en ms a tocar la nota2  (note2) durante myDuration2 ms.
window.setTimeout(synth.triggerAttackRelease, myDuration1, note2, myDuration2/1000);


Existen otras maneras de tocar varias notas una a continuación de la otra, y hay que tener en cuenta la duración acumulada de las notas anteriores.


var synth = new Tone.FMSynth().toMaster()

//schedule a series of notes, one per second (although they ara actuve for 0.5 seconds)
//Note the last parameter that indicates the moment the note should be played!! So it must take into account the previous notes!
synth.triggerAttackRelease('C4', 0.5, 0)
synth.triggerAttackRelease('E4', 0.5, 1)
synth.triggerAttackRelease('G4', 0.5, 2)
synth.triggerAttackRelease('B4', 0.5, 3)


No hay comentarios :

Publicar un comentario