Compare commits
5 Commits
37eabc79ca
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3273b1e6db | |||
| 3d85edfc98 | |||
| 1ac8df3a3f | |||
| dc1bc9df2d | |||
| 3cb0784e39 |
@@ -1,24 +1,96 @@
|
|||||||
class Synth {
|
class Synth {
|
||||||
constructor(audioContext, waveType = "sine", frequency = 400) {
|
constructor(audioContext, waveType = "triangle", frequency = 100) {
|
||||||
this.audioContext = audioContext;
|
this.audioContext = audioContext;
|
||||||
this.oscWaveType = waveType;
|
this.oscWaveType = waveType;
|
||||||
this.oscFrequency = frequency;
|
this.oscFrequency = frequency;
|
||||||
|
this.isPlaying = false;
|
||||||
|
|
||||||
|
// osc setup
|
||||||
this.osc = this.audioContext.createOscillator();
|
this.osc = this.audioContext.createOscillator();
|
||||||
this.osc.type = this.oscWaveType;
|
this.osc.type = this.oscWaveType;
|
||||||
this.osc.frequency.setValueAtTime(this.oscFrequency, this.audioContext.currentTime);
|
this.osc.frequency.setValueAtTime(this.oscFrequency, this.audioContext.currentTime);
|
||||||
|
this.osc.connect(this.audioContext.destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
setOscWaveType(type) {
|
setOscWaveType(type) {
|
||||||
this.oscWaveType = type;
|
this.oscWaveType = type;
|
||||||
this.osc.type = this.oscWaveType;
|
this.osc.type = this.oscWaveType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setOscFrequency(freq) {
|
||||||
|
this.oscFrequency = freq;
|
||||||
|
this.osc.frequency.setValueAtTime(freq, this.audioContext.currentTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
setOscDetune(amount) {
|
||||||
|
this.osc.detune.setValueAtTime(amount, this.audioContext.currentTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
startOsc() {
|
||||||
|
this.osc.start();
|
||||||
|
this.isPlaying = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
stopOsc() {
|
||||||
|
// first get all the parameters for this osc
|
||||||
|
let currentFreq = this.osc.frequency.value;
|
||||||
|
let currentType = this.osc.type;
|
||||||
|
|
||||||
|
this.osc.stop();
|
||||||
|
this.osc = this.audioContext.createOscillator();
|
||||||
|
this.osc.type = currentType;
|
||||||
|
this.osc.frequency.setValueAtTime(currentFreq, this.audioContext.currentTime);
|
||||||
|
this.osc.connect(this.audioContext.destination);
|
||||||
|
this.isPlaying = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleOsc() {
|
||||||
|
if (this.isPlaying === false) {
|
||||||
|
this.startOsc();
|
||||||
|
} else {
|
||||||
|
this.stopOsc();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let globalAudioContext = new AudioContext();
|
let globalAudioContext = new AudioContext();
|
||||||
let synth = new Synth(globalAudioContext);
|
let synth = new Synth(globalAudioContext);
|
||||||
|
|
||||||
|
function toggleOscillator() {
|
||||||
|
synth.toggleOsc();
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
console.log("hello world!");
|
console.log("hello world!");
|
||||||
console.log(synth);
|
console.log(synth);
|
||||||
|
|
||||||
|
|
||||||
|
var waveTypeChoicesButtons = document.querySelectorAll("input[name='wave']");
|
||||||
|
// waveTypeChoicesButtons.forEach((radio) => {
|
||||||
|
// radio.addEventListener("change", (event) => {
|
||||||
|
// if (event.target.checked) {
|
||||||
|
// let selectedWaveType = event.target.value;
|
||||||
|
// synth.setOscWaveType(selectedWaveType);
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
|
||||||
|
waveTypeChoicesButtons.forEach((rb) => {
|
||||||
|
rb.addEventListener("change", (event) => {
|
||||||
|
let selectedWave = document.querySelector("input[name='wave']:checked").value;
|
||||||
|
synth.setOscWaveType(selectedWave);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
console.info(waveTypeChoicesButtons);
|
||||||
|
console.log("the selected wave:" + waveTypeChoicesButtons);
|
||||||
|
var detune = document.getElementById("detune");
|
||||||
|
detune.addEventListener("input", () => {
|
||||||
|
synth.setOscDetune(parseFloat(detune.value))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,19 @@
|
|||||||
|
|
||||||
|
|
||||||
<body class="bg-gray-900 p-10 mb-5">
|
<body class="bg-gray-900 p-10 mb-5">
|
||||||
|
|
||||||
<script src="single-voice-synth.js"></script>
|
<script src="single-voice-synth.js"></script>
|
||||||
<div class="flex justify-between"></div>
|
<div class="flex justify-between"></div>
|
||||||
|
<button onclick="toggleOscillator()">Start/Stop</button>
|
||||||
|
<input type="range" min="-40" max="40" value="0" class="slider" id="detune">
|
||||||
|
<form>
|
||||||
|
<input type="radio" id="sine" name="wave" value="sine" checked>
|
||||||
|
<label for="sine">Sine</label><br>
|
||||||
|
<input type="radio" id="triangle" name="wave" value="triangle">
|
||||||
|
<label for="triangle">Triangle</label><br>
|
||||||
|
<input type="radio" id="square" name="wave" value="square">
|
||||||
|
<label for="square">Square</label><br>
|
||||||
|
<input type="radio" id="sawtooth" name="wave" value="sawtooth">
|
||||||
|
<label for="sawtooth">Sawtooth</label>
|
||||||
|
</form>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user