diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js
new file mode 100644
index 0000000000..d606d27de4
--- /dev/null
+++ b/extensions/Amp/oscillators.js
@@ -0,0 +1,87 @@
+// Name: Oscillators
+// ID: aecOscillator
+// Description: Synthensize simple sound waves.
+// By: AmpElectrecuted
+// License: MPL-2.0
+
+(function (Scratch) {
+ "use strict";
+ let context = new AudioContext();
+ let oscillator = new OscillatorNode(context);
+ oscillator.connect(context.destination);
+ let isStart = false;
+ let isPaused = true;
+
+ class OscillatorExtension {
+ getInfo() {
+ return {
+ id: "aecOscillator",
+ name: Scratch.translate("Oscillators"),
+ blocks: [
+ {
+ opcode: "startFreq",
+ blockType: Scratch.BlockType.COMMAND,
+ text: Scratch.translate("start [WAVEFORM] wave at [FREQ] Hz"),
+ arguments: {
+ WAVEFORM: {
+ type: Scratch.ArgumentType.STRING,
+ menu: "WAVEFORM_MENU",
+ },
+ FREQ: {
+ type: Scratch.ArgumentType.NUMBER,
+ defaultValue: 440,
+ },
+ },
+ },
+ {
+ opcode: "stopFreq",
+ blockType: Scratch.BlockType.COMMAND,
+ text: Scratch.translate("stop wave"),
+ },
+ ],
+ menus: {
+ WAVEFORM_MENU: {
+ acceptReporters: true,
+ items: [
+ {
+ text: Scratch.translate("sine"),
+ value: "sine",
+ },
+ {
+ text: Scratch.translate("square"),
+ value: "square",
+ },
+ {
+ text: Scratch.translate("sawtooth"),
+ value: "sawtooth",
+ },
+ {
+ text: Scratch.translate("triangle"),
+ value: "triangle",
+ },
+ ],
+ },
+ },
+ };
+ }
+
+ startFreq(args) {
+ oscillator.type = Scratch.Cast.toString(args.WAVEFORM);
+ oscillator.frequency.setValueAtTime(Scratch.Cast.toNumber(args.FREQ), context.currentTime);
+ if (!isStart) {
+ oscillator.start();
+ isStart = true;
+ }
+ if (isPaused) {
+ context.resume();
+ isPaused = false;
+ }
+ }
+
+ stopFreq() {
+ context.suspend();
+ isPaused = true;
+ }
+ }
+ Scratch.extensions.register(new OscillatorExtension());
+})(Scratch);
diff --git a/extensions/extensions.json b/extensions/extensions.json
index d8ed71e33d..072e493c17 100644
--- a/extensions/extensions.json
+++ b/extensions/extensions.json
@@ -48,6 +48,7 @@
"ar",
"encoding",
"Lily/SoundExpanded",
+ "Amp/oscillators",
"Lily/TempVariables2",
"Lily/MoreTimers",
"clouddata-ping",
diff --git a/images/Amp/oscillators.svg b/images/Amp/oscillators.svg
new file mode 100644
index 0000000000..ac772d5c9f
--- /dev/null
+++ b/images/Amp/oscillators.svg
@@ -0,0 +1,40 @@
+
+
+
+