You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.5 KiB

const generateToneButton = document.querySelector('#generate-tone > button:nth-of-type(1)')
const playButton = document.querySelector('#generate-tone > button:nth-of-type(2)')
const stopButton = document.querySelector('#generate-tone > button:nth-of-type(3)')
const toneDisplay = document.querySelector('#generate-tone dd')
const minInput = document.querySelector('#generate-tone input:nth-of-type(1)')
const maxInput = document.querySelector('#generate-tone input:nth-of-type(2)')
const synth = new Tone.Synth().toDestination()
let newTone
let lowest = 'a0'
let highest = 'c8'
const notes = [
['c'],
['c#','db'],
['d'],
['d#', 'eb'],
['e'],
['f'],
['f#','gb'],
['g'],
['g#', 'ab'],
['a'],
['a#', 'bb'],
['b']
]
minInput.setAttribute('placeholder', lowest)
maxInput.setAttribute('placeholder', highest)
generateToneButton.addEventListener('click', () => {
Tone.start()
if(!document.querySelector('[type="checkbox"]').checked) {
const minFreq = teoria.note(lowest).fq()
const maxFreq = teoria.note(highest).fq()
newTone = (Math.random() * (maxFreq - minFreq)) + minFreq
} else {
const lowOctave = parseInt(lowest.charAt(lowest.length - 1)) * 12
const highOctave = parseInt(highest.charAt(highest.length - 1)) * 12
const lowNote = notes.findIndex(enharmonics => enharmonics.includes(lowest.substring(0, lowest.length-1)))
const highNote = notes.findIndex(enharmonics => enharmonics.includes(highest.substring(0, highest.length-1)))
const lowPitch = lowOctave + lowNote
const highPitch = highOctave + highNote
const pitchSpread = highPitch - lowPitch
const randomAddedPitches = Math.floor(Math.random() * (pitchSpread + 1) )
const randomPitch = lowPitch + randomAddedPitches
const randomPitchOctave = Math.floor(randomPitch / 12)
const randomPitchNote = randomPitch % 12
newTone = notes[randomPitchNote][0] + randomPitchOctave
newTone = teoria.note(newTone).fq()
}
toneDisplay.innerHTML = newTone
})
playButton.addEventListener('click', ()=>{
synth.triggerAttack(newTone)
})
stopButton.addEventListener('click', ()=>{
synth.triggerRelease()
})
minInput.addEventListener('change', ()=>{
lowest = minInput.value
})
maxInput.addEventListener('change', ()=>{
highest = maxInput.value
})
startPitchDetection((heardPitch)=>{
if(newTone) {
const centsDifference = 1200 * Math.log2(heardPitch / newTone)
document.querySelector('#analyze-pitch input[type="range"]').value = centsDifference
}
if(heardPitch === -1){
document.querySelector('#analyze-pitch input[type="range"]').value = 0
}
});