Notes played upon each choice

This commit is contained in:
echarp 2022-11-21 22:30:21 +01:00
parent ee9275256b
commit b849e7d884
2 changed files with 61 additions and 0 deletions

View File

@ -0,0 +1 @@
/1er-quiz/start

View File

@ -0,0 +1,60 @@
// let freq = 440
const tons = [264, 275, 297, 316.8, 330, 352, 371.25, 396, 412.5, 440, 475.2, 495]
// const tons = [396, 417, 528. 639, 741, 852, 963]
/*
* Play one note
*/
note = (context, freq, counter) => {
console.log("Note n°", counter, freq)
const oscil = context.createOscillator()
oscil.type = 'triangle'
oscil.frequency.value = freq
const gainNode = context.createGain()
oscil.connect(gainNode)
gainNode.connect(context.destination)
const notesPerSecond = 5 // In Hertz
// All are in seconds
const start = counter / notesPerSecond
const duration = 1.2 / notesPerSecond
const ramp = .2 / notesPerSecond / 3 // Exponential increase
// Increase volume
gainNode.gain.setTargetAtTime(1, start, ramp)
// Decrease volume
gainNode.gain.setTargetAtTime(0, start + duration - ramp * 3, ramp)
oscil.start(start)
oscil.stop(start + duration)
}
/*
* From the current URL generate an UUID
*/
getUuidFromUrl = () =>
document.location.pathname
.split('')
.reverse()
.filter(l => l.match(/[0-9a-f]/))
.join('')
/*
* Launch notes based on the current URL
*/
launchNotes = (event, counter = 0, uuid = getUuidFromUrl()) => {
if (counter >= uuid.length || counter >= 5) return
const context = new AudioContext()
const freq = tons[parseInt(uuid[counter], 16) % tons.length] / 2
// freq *= Math.max(1, parseInt(uuid[counter], 16)) / Math.max(1, parseInt(uuid[counter + 1], 16))
// freq = Math.min(2000, Math.round(freq))
note(context, freq, counter)
launchNotes(event, counter + 1, uuid)
}