synapses-carousel/site_libs/revealjs/plugin/quarto-tone/tone.js
2025-07-08 14:08:23 +00:00

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);
},
};
};