Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/resources/formats/revealjs/plugins/tone/tone.js
12923 views
1
window.QuartoTone = function () {
2
return {
3
id: "quarto-tone",
4
init: function (deck) {
5
function slideToneScale(i) {
6
// https://www.intmath.com/trigonometric-graphs/music.php
7
const note = 15 - (deck.getTotalSlides() - i);
8
return 440 * 2 ** (note / 12);
9
}
10
11
/*
12
* Sliding tones between C3 and C5 with equal steps between tones
13
* but not aligned to musical scale
14
*/
15
function slideToneBounded(i, lower = 261.63, upper = 1046.5) {
16
const step = (upper - lower) / deck.getTotalSlides();
17
return lower + step * i;
18
}
19
20
/*
21
* Choose slide tone scale automatically based on number of slides.
22
* If there are <= 32 slides, use musical scale.
23
*/
24
function slideToneAuto(toneIdx) {
25
return deck.getTotalSlides() > 32
26
? slideToneBounded(toneIdx)
27
: slideToneScale(toneIdx);
28
}
29
30
const synth = new Tone.Synth({
31
oscillator: {
32
type: "sine",
33
},
34
envelope: {
35
attack: 0.001,
36
decay: 0.2,
37
sustain: 0.2,
38
release: 1,
39
},
40
}).toMaster();
41
42
const playTone = () => {
43
synth.triggerAttackRelease(
44
slideToneAuto(deck.getSlidePastCount()),
45
"8n"
46
);
47
};
48
deck.on("slidechanged", playTone);
49
deck.on("fragmentshown", playTone);
50
deck.on("fragmenthidden", playTone);
51
},
52
};
53
};
54
55