OscillatorNode
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die OscillatorNode-Schnittstelle repräsentiert eine periodische Wellenform, beispielsweise eine Sinuswelle. Sie ist ein Audioverarbeitungsmodul vom Typ AudioScheduledSourceNode, das eine Welle mit einer festgelegten Frequenz erzeugt – also einen konstanten Ton.
| Anzahl der Eingänge | 0 |
|---|---|
| Anzahl der Ausgänge | 1 |
| Kanalanzahlmodus | max |
| Kanalanzahl | 2 (wird im standardmäßigen Kanalanzahlmodus nicht verwendet) |
| Kanalinterpretation | speakers |
Konstruktor
OscillatorNode()-
Erstellt eine neue Instanz eines
OscillatorNode-Objekts. Optional kann ein Objekt mit Standardwerten für die Eigenschaften des Knotens übergeben werden. Alternativ können Sie die Factory-MethodeBaseAudioContext.createOscillator()verwenden; siehe Erstellen eines AudioNode.
Instanzeigenschaften
Erbt außerdem Eigenschaften von der übergeordneten Schnittstelle AudioScheduledSourceNode.
OscillatorNode.frequencySchreibgeschützt-
Ein a-rate-
AudioParam, der die Schwingungsfrequenz in Hertz angibt (der Wert desAudioParamkann geändert werden). Der Standardwert beträgt 440 Hz (der Kammerton A). OscillatorNode.detuneSchreibgeschützt-
Ein a-rate-
AudioParam, der die Verstimmung der Schwingung in Cent angibt (der Wert desAudioParamkann geändert werden). Der Standardwert ist 0. OscillatorNode.type-
Eine Zeichenfolge, die die Form der abzuspielenden Wellenform festlegt. Sie kann einen von mehreren Standardwerten annehmen oder
custom, um mit einerPeriodicWaveeine benutzerdefinierte Wellenform zu beschreiben. Unterschiedliche Wellenformen erzeugen unterschiedliche Klänge. Die Standardwerte sind"sine","square","sawtooth","triangle"und"custom". Der Vorgabewert ist"sine".
Instanzmethoden
Erbt außerdem Methoden von der übergeordneten Schnittstelle AudioScheduledSourceNode.
OscillatorNode.setPeriodicWave()-
Legt eine
PeriodicWavefest, die eine periodische Wellenform beschreibt und anstelle einer der Standardwellenformen verwendet wird. Durch den Aufruf wirdtypeaufcustomgesetzt. AudioScheduledSourceNode.start()-
Legt den genauen Zeitpunkt fest, zu dem die Wiedergabe des Tons beginnt.
AudioScheduledSourceNode.stop()-
Legt den Zeitpunkt fest, zu dem die Wiedergabe des Tons endet.
Ereignisse
Erbt außerdem Ereignisse von der übergeordneten Schnittstelle AudioScheduledSourceNode.
Beispiele
>Verwendung eines OscillatorNode
Das folgende Beispiel zeigt die grundlegende Verwendung eines AudioContext, um einen Oszillatorknoten zu erstellen und mit ihm einen Ton abzuspielen. Ein Anwendungsbeispiel finden Sie in unserer Violent-Theremin-Demo (siehe app.js für den relevanten Code).
// create web audio api context
const audioCtx = new AudioContext();
// create Oscillator node
const oscillator = audioCtx.createOscillator();
oscillator.type = "square";
oscillator.frequency.setValueAtTime(440, audioCtx.currentTime); // value in hertz
oscillator.connect(audioCtx.destination);
oscillator.start();
Verschiedene Typen von Oszillatorknoten
Die vier integrierten Oszillator-Typen sind sine, square, triangle und sawtooth. Sie bezeichnen die Form der Wellenform, die ein Oszillator erzeugt. Wissenswert: Sie sind bei den meisten Synthesizern voreingestellt, weil sich diese Wellenformen elektronisch leicht erzeugen lassen. Dieses Beispiel veranschaulicht die Wellenformen der verschiedenen Typen bei unterschiedlichen Frequenzen.
<div class="controls">
<label for="type-select">
Oscillator type
<select id="type-select">
<option>sine</option>
<option>square</option>
<option>triangle</option>
<option>sawtooth</option>
</select>
</label>
<label for="freq-range">
Frequency
<input
type="range"
min="100"
max="800"
step="10"
value="250"
id="freq-range" />
</label>
<button data-playing="init" id="play-button">Play</button>
</div>
<canvas id="wave-graph"></canvas>
Der Code besteht aus zwei Teilen: Im ersten Teil richten wir die Audiofunktionen ein.
const typeSelect = document.getElementById("type-select");
const frequencyControl = document.getElementById("freq-range");
const playButton = document.getElementById("play-button");
const audioCtx = new AudioContext();
const osc = new OscillatorNode(audioCtx, {
type: typeSelect.value,
frequency: frequencyControl.valueAsNumber,
});
// Rather than creating a new oscillator for every start and stop
// which you would do in an audio application, we are just going
// to mute/un-mute for demo purposes - this means we need a gain node
const gain = new GainNode(audioCtx);
const analyser = new AnalyserNode(audioCtx, {
fftSize: 1024,
smoothingTimeConstant: 0.8,
});
osc.connect(gain).connect(analyser).connect(audioCtx.destination);
typeSelect.addEventListener("change", () => {
osc.type = typeSelect.value;
});
frequencyControl.addEventListener("input", () => {
osc.frequency.value = frequencyControl.valueAsNumber;
});
playButton.addEventListener("click", () => {
if (audioCtx.state === "suspended") {
audioCtx.resume();
}
if (playButton.dataset.playing === "init") {
osc.start(audioCtx.currentTime);
playButton.dataset.playing = "true";
playButton.innerText = "Pause";
} else if (playButton.dataset.playing === "false") {
gain.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.2);
playButton.dataset.playing = "true";
playButton.innerText = "Pause";
} else if (playButton.dataset.playing === "true") {
gain.gain.linearRampToValueAtTime(0.0001, audioCtx.currentTime + 0.2);
playButton.dataset.playing = "false";
playButton.innerText = "Play";
}
});
Im zweiten Teil zeichnen wir die Wellenform mithilfe des oben erstellten AnalyserNode auf ein Canvas.
const dpr = window.devicePixelRatio;
const w = 500 * dpr;
const h = 300 * dpr;
const canvasEl = document.getElementById("wave-graph");
canvasEl.width = w;
canvasEl.height = h;
const canvasCtx = canvasEl.getContext("2d");
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);
// draw an oscilloscope of the current oscillator
function draw() {
analyser.getByteTimeDomainData(dataArray);
canvasCtx.fillStyle = "white";
canvasCtx.fillRect(0, 0, w, h);
canvasCtx.lineWidth = 4.0;
canvasCtx.strokeStyle = "black";
canvasCtx.beginPath();
const sliceWidth = (w * 1.0) / bufferLength;
let x = 0;
for (let i = 0; i < bufferLength; i++) {
const v = dataArray[i] / 128.0;
const y = (v * h) / 2;
if (i === 0) {
canvasCtx.moveTo(x, y);
} else {
canvasCtx.lineTo(x, y);
}
x += sliceWidth;
}
canvasCtx.lineTo(w, h / 2);
canvasCtx.stroke();
requestAnimationFrame(draw);
}
draw();
Warnung: Dieses Beispiel erzeugt ein Geräusch!
Spezifikationen
| Spezifikation |
|---|
| Web Audio API> # OscillatorNode> |