Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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.

EventTarget AudioNode AudioScheduledSourceNode OscillatorNode
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-Methode BaseAudioContext.createOscillator() verwenden; siehe Erstellen eines AudioNode.

Instanzeigenschaften

Erbt außerdem Eigenschaften von der übergeordneten Schnittstelle AudioScheduledSourceNode.

OscillatorNode.frequency Schreibgeschützt

Ein a-rate-AudioParam, der die Schwingungsfrequenz in Hertz angibt (der Wert des AudioParam kann geändert werden). Der Standardwert beträgt 440 Hz (der Kammerton A).

OscillatorNode.detune Schreibgeschützt

Ein a-rate-AudioParam, der die Verstimmung der Schwingung in Cent angibt (der Wert des AudioParam kann 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 einer PeriodicWave eine 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 PeriodicWave fest, die eine periodische Wellenform beschreibt und anstelle einer der Standardwellenformen verwendet wird. Durch den Aufruf wird type auf custom gesetzt.

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).

js
// 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.

html
<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.

js
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.

js
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

Browser-Kompatibilität

Siehe auch