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 @@ + + + + + + + + + + + + + +