53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
window.QuartoTone = function () {
|
|
return {
|
|
id: "quarto-tone",
|
|
init: function (deck) {
|
|
function slideToneScale(i) {
|
|
// https://www.intmath.com/trigonometric-graphs/music.php
|
|
const note = 15 - (deck.getTotalSlides() - i);
|
|
return 440 * 2 ** (note / 12);
|
|
}
|
|
|
|
/*
|
|
* Sliding tones between C3 and C5 with equal steps between tones
|
|
* but not aligned to musical scale
|
|
*/
|
|
function slideToneBounded(i, lower = 261.63, upper = 1046.5) {
|
|
const step = (upper - lower) / deck.getTotalSlides();
|
|
return lower + step * i;
|
|
}
|
|
|
|
/*
|
|
* Choose slide tone scale automatically based on number of slides.
|
|
* If there are <= 32 slides, use musical scale.
|
|
*/
|
|
function slideToneAuto(toneIdx) {
|
|
return deck.getTotalSlides() > 32
|
|
? slideToneBounded(toneIdx)
|
|
: slideToneScale(toneIdx);
|
|
}
|
|
|
|
const synth = new Tone.Synth({
|
|
oscillator: {
|
|
type: "sine",
|
|
},
|
|
envelope: {
|
|
attack: 0.001,
|
|
decay: 0.2,
|
|
sustain: 0.2,
|
|
release: 1,
|
|
},
|
|
}).toMaster();
|
|
|
|
const playTone = () => {
|
|
synth.triggerAttackRelease(
|
|
slideToneAuto(deck.getSlidePastCount()),
|
|
"8n"
|
|
);
|
|
};
|
|
deck.on("slidechanged", playTone);
|
|
deck.on("fragmentshown", playTone);
|
|
deck.on("fragmenthidden", playTone);
|
|
},
|
|
};
|
|
};
|