t t t t looper sketch

main
km0 1 year ago
parent 4e57ebe4f3
commit 856937ddb1

95
]

@ -0,0 +1,95 @@
// The surface where to tap
const ttt = document.querySelector("#ttt")
// The input to store a sequence
const s = document.querySelector("#s")
let series = []
let initial = null
// The function of a tap
const tap = () => {
if (initial == null) {
initial = new Date()
series.push(0)
} else {
series.push((new Date() - initial))
}
ttt.innerHTML = series
}
const stap = () => {
if (initial == null) return
// insert the final value
series.push((new Date() - initial))
// copy the series
let sequence = series
// reset series and initial date
series = []
initial = null
return sequence
}
const audioContext = new AudioContext()
const gain = new GainNode(audioContext, {
value: 0.05
})
const playNoise = (bandHz=1000, time=0) => {
let noiseDuration = 0.05
const bufferSize = audioContext.sampleRate * noiseDuration
const noiseBuffer = new AudioBuffer({
length: bufferSize,
sampleRate: audioContext.sampleRate
})
const data = noiseBuffer.getChannelData(0)
for (let i=0; i<bufferSize; i++){
data[i] = Math.random() * 2 - 1;
}
const noise = new AudioBufferSourceNode(audioContext, {
buffer: noiseBuffer
})
const bandpass = new BiquadFilterNode(audioContext, {
type: "bandpass",
frequency: bandHz
})
noise.connect(bandpass).connect(gain).connect(audioContext.destination);
noise.start(time)
}
const promiSeq = (sequence) => {
return new Promise((resolve)=>{
const seq = (sequence = []) => {
if (!sequence.length) resolve()
setTimeout( ()=> playNoise(), sequence[0])
sequence.shift()
seq(sequence)
}
seq(sequence)
})
}
ttt.addEventListener("click", () => tap())
s.addEventListener("click", () => {
let sequence = stap();
promiSeq([...sequence])
})

@ -41,14 +41,13 @@ const playNoise = (bandHz = 1000, time = 0) => {
type: "square",
frequency: freq
})
const amp = new GainNode(audioContext, {
value: 0
value: 0
})
const lfo = new OscillatorNode(audioContext, {
type: "sine",
frequency: lfoFreq
type: "sine" frequency: lfoFreq
})
lfo.connect(amp.gain)

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>t t t</title>
<script src="ttt.js" defer></script>
<style>
#ttt {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
#s {
position: absolute;
top: 100px;
left: 100px;
z-index: 50;
}
</style>
</head>
<body>
<button id="s">Send</button>
<div id="ttt"></div>
</body>
</html>

107
ttt.js

@ -0,0 +1,107 @@
// The surface where to tap
const ttt = document.querySelector("#ttt")
// The input to store a sequence
const s = document.querySelector("#s")
let series = []
let initial = null
// The function of a tap
const tap = () => {
if (initial == null) {
initial = new Date()
series.push(0)
} else {
series.push((new Date() - initial))
}
ttt.innerHTML = series
}
const stap = () => {
if (initial == null) return
// insert the final value
series.push((new Date() - initial))
// copy the series
let sequence = series
// reset series and initial date
series = []
initial = null
return sequence
}
const audioContext = new AudioContext()
const gain = new GainNode(audioContext, {
value: 0.05
})
const playNoise = (bandHz=1000, time=0) => {
let noiseDuration = 0.05
const bufferSize = audioContext.sampleRate * noiseDuration
const noiseBuffer = new AudioBuffer({
length: bufferSize,
sampleRate: audioContext.sampleRate
})
const data = noiseBuffer.getChannelData(0)
for (let i=0; i<bufferSize; i++){
data[i] = Math.random() * 2 - 1;
}
const noise = new AudioBufferSourceNode(audioContext, {
buffer: noiseBuffer
})
const bandpass = new BiquadFilterNode(audioContext, {
type: "bandpass",
frequency: bandHz
})
noise.connect(bandpass).connect(gain).connect(audioContext.destination);
noise.start(time)
}
const playOsc = (freq=440) => {
const osc = new OscillatorNode(audioContext, {
type: "sine",
frequency: freq
})
osc.connect(gain).connect(audioContext.destination);
osc.start()
osc.stop(audioContext.currentTime + 0.1)
}
const seq = (sequence, fn) => {
if (!sequence.length) return
setTimeout(fn, sequence[0])
let copy = [...sequence]
copy.shift()
seq(copy,fn)
}
ttt.addEventListener("click", () => tap())
s.addEventListener("click", () => {
let sequence = stap();
let period = sequence.pop()
let freq = Math.random() * 1000
seq(sequence, ()=> playOsc(freq))
setInterval(seq, period, sequence, ()=>playOsc(freq))
})
Loading…
Cancel
Save