bare bones filter
This commit is contained in:
parent
7d0a80a987
commit
2d84b91e56
13
index.html
13
index.html
|
@ -227,8 +227,17 @@
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div style="padding: 5px">
|
||||||
|
<label for="filter" class="block text-sm font-medium text-gray-700 mb-1">filter</label>
|
||||||
|
<input id="filter" type="range" min="0" max="900" value="5000" step="1" class="slider bg-gray-300 h-2 rounded-full outline-none"/>
|
||||||
|
<span id="filterdisplay" class="text-sm text-gray-700 ml-2">0</span>
|
||||||
|
</div>
|
||||||
|
<div style="padding: 5px">
|
||||||
|
<label for="Q" class="block text-sm font-medium text-gray-700 mb-1">Q</label>
|
||||||
|
<input id="Q" type="range" min="0" max="100" value="0" step="1" class="slider bg-gray-300 h-2 rounded-full outline-none"/>
|
||||||
|
<span id="Qdisplay" class="text-sm text-gray-700 ml-2">0</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
51
synth.js
51
synth.js
|
@ -117,14 +117,25 @@ class Synth {
|
||||||
createOscillator(type = "sine", freq = 440, startOctave) {
|
createOscillator(type = "sine", freq = 440, startOctave) {
|
||||||
const osc = this.audioContext.createOscillator();
|
const osc = this.audioContext.createOscillator();
|
||||||
const gainNode = this.audioContext.createGain();
|
const gainNode = this.audioContext.createGain();
|
||||||
gainNode.connect(this.audioContext.destination);
|
const filterNode = this.audioContext.createBiquadFilter();
|
||||||
|
|
||||||
osc.type = type;
|
osc.type = type;
|
||||||
osc.frequency.setValueAtTime(freq, this.audioContext.currentTime);
|
osc.frequency.setValueAtTime(freq, this.audioContext.currentTime);
|
||||||
|
|
||||||
|
filterNode.tupe = "lowpass";
|
||||||
|
filterNode.Q.setValueAtTime(100, this.audioContext.currentTime);
|
||||||
|
filterNode.frequency.setValueAtTime(5000, this.audioContext.currentTime);
|
||||||
|
|
||||||
|
// osc --> filter --> gain (voice) --> destination
|
||||||
|
// \--> gain (master) --^
|
||||||
|
osc.connect(filterNode);
|
||||||
|
filterNode.connect(gainNode);
|
||||||
|
gainNode.connect(this.audioContext.destination);
|
||||||
|
filterNode.connect(this.gain);
|
||||||
|
|
||||||
// connect it to the gain node
|
// connect it to the gain node
|
||||||
this.gain.gain.setTargetAtTime(0.1, this.audioContext.currentTime, 0);
|
this.gain.gain.setTargetAtTime(0.1, this.audioContext.currentTime, 0);
|
||||||
gainNode.gain.setTargetAtTime(0.05, this.audioContext.currentTime, 0);
|
gainNode.gain.setTargetAtTime(0.05, this.audioContext.currentTime, 0);
|
||||||
osc.connect(this.gain);
|
|
||||||
osc.connect(gainNode);
|
|
||||||
|
|
||||||
// wrap around the container and add to array
|
// wrap around the container and add to array
|
||||||
const oscContainer = {
|
const oscContainer = {
|
||||||
|
@ -133,6 +144,7 @@ class Synth {
|
||||||
baseFreq: freq,
|
baseFreq: freq,
|
||||||
currentOctave: startOctave,
|
currentOctave: startOctave,
|
||||||
gainNode,
|
gainNode,
|
||||||
|
filterNode,
|
||||||
};
|
};
|
||||||
return oscContainer;
|
return oscContainer;
|
||||||
}
|
}
|
||||||
|
@ -169,12 +181,12 @@ class Synth {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createFilter(type, freq, Q) {
|
updateFilter(osc, freq, Q) {
|
||||||
const filter = this.audioContext.createBiquadFilter();
|
osc.filterNode.frequency.setValueAtTime(
|
||||||
filter.type = type;
|
freq,
|
||||||
filter.frequency.setValueAtTime(freq, this.audioContext.currentTime);
|
this.audioContext.currentTime
|
||||||
filter.Q.setValueAtTime(Q, this.audioContext.currentTime);
|
);
|
||||||
return filter;
|
osc.filterNode.Q.setValueAtTime(Q, this.audioContext.currentTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,4 +445,25 @@ window.onload = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
draw();
|
draw();
|
||||||
|
|
||||||
|
const filterSlider = document.getElementById("filter");
|
||||||
|
const filterSliderDisplay = document.getElementById("filterdisplay");
|
||||||
|
filterSlider.addEventListener("input", (event) => {
|
||||||
|
filtervalue = parseFloat(filterSlider.value);
|
||||||
|
filterSliderDisplay.textContent = filtervalue;
|
||||||
|
let osc = synth.oscillators[0];
|
||||||
|
osc.filterNode.frequency.setValueAtTime(
|
||||||
|
filtervalue,
|
||||||
|
synth.audioContext.currentTime
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const QSlider = document.getElementById("Q");
|
||||||
|
const QSliderDisplay = document.getElementById("Qdisplay");
|
||||||
|
QSlider.addEventListener("input", (event) => {
|
||||||
|
Qvalue = parseFloat(QSlider.value);
|
||||||
|
QSliderDisplay.textContent = Qvalue;
|
||||||
|
let osc = synth.oscillators[0];
|
||||||
|
osc.filterNode.Q.setValueAtTime(Qvalue, synth.audioContext.currentTime);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue