From 1973008b4f789b5c24c1f418b0280c9ce21659c8 Mon Sep 17 00:00:00 2001 From: AmpElectrecuted Date: Tue, 1 Jul 2025 21:13:49 +0000 Subject: [PATCH 1/5] Add oscillators extension --- extensions/Amp/oscillators.js | 87 +++++++++++++++++++++++++++++++++++ extensions/extensions.json | 1 + images/Amp/oscillators.svg | 40 ++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 extensions/Amp/oscillators.js create mode 100644 images/Amp/oscillators.svg diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js new file mode 100644 index 0000000000..a9de812aac --- /dev/null +++ b/extensions/Amp/oscillators.js @@ -0,0 +1,87 @@ +// Name: Oscillators +// ID: oscillator +// 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: 'oscillator', + 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 = args.WAVEFORM; + oscillator.frequency.setValueAtTime(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); \ No newline at end of file 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 @@ + + + + + + + + + + + + + + From 536e7a88521de41674cde27b0cf0fce181e69255 Mon Sep 17 00:00:00 2001 From: AmpElectrecuted Date: Tue, 1 Jul 2025 21:27:50 +0000 Subject: [PATCH 2/5] formatted --- extensions/Amp/oscillators.js | 52 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js index a9de812aac..de9473683b 100644 --- a/extensions/Amp/oscillators.js +++ b/extensions/Amp/oscillators.js @@ -5,7 +5,7 @@ // License: MPL-2.0 (function (Scratch) { - 'use strict'; + "use strict"; let context = new AudioContext(); let oscillator = new OscillatorNode(context); oscillator.connect(context.destination); @@ -15,54 +15,54 @@ class OscillatorExtension { getInfo() { return { - id: 'oscillator', - name: Scratch.translate('Oscillators'), + id: "oscillator", + name: Scratch.translate("Oscillators"), blocks: [ { - opcode: 'startFreq', + opcode: "startFreq", blockType: Scratch.BlockType.COMMAND, - text: Scratch.translate('start [WAVEFORM] wave at [FREQ] Hz'), + text: Scratch.translate("start [WAVEFORM] wave at [FREQ] Hz"), arguments: { WAVEFORM: { type: Scratch.ArgumentType.STRING, - menu: 'WAVEFORM_MENU' + menu: "WAVEFORM_MENU", }, FREQ: { type: Scratch.ArgumentType.NUMBER, - defaultValue: 440 - } - } + defaultValue: 440, + }, + }, }, { - opcode: 'stopFreq', + opcode: "stopFreq", blockType: Scratch.BlockType.COMMAND, - text: Scratch.translate("stop wave") - } + text: Scratch.translate("stop wave"), + }, ], menus: { WAVEFORM_MENU: { acceptReporters: true, items: [ { - text: Scratch.translate('sine'), - value: 'sine' + text: Scratch.translate("sine"), + value: "sine", }, { - text: Scratch.translate('square'), - value: 'square' + text: Scratch.translate("square"), + value: "square", }, { - text: Scratch.translate('sawtooth'), - value: 'sawtooth' + text: Scratch.translate("sawtooth"), + value: "sawtooth", }, { - text: Scratch.translate('triangle'), - value: 'triangle' - } - ] - } - } - } + text: Scratch.translate("triangle"), + value: "triangle", + }, + ], + }, + }, + }; } startFreq(args) { @@ -84,4 +84,4 @@ } } Scratch.extensions.register(new OscillatorExtension()); -})(Scratch); \ No newline at end of file +})(Scratch); From dd5018c5862ba060f096dcdb8d8e2df9bf804a42 Mon Sep 17 00:00:00 2001 From: AmpElectrecuted <197376797+ampelectrecuted@users.noreply.github.com> Date: Sat, 30 Aug 2025 14:46:49 +0100 Subject: [PATCH 3/5] Update oscillators.js --- extensions/Amp/oscillators.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js index de9473683b..4fc5d36572 100644 --- a/extensions/Amp/oscillators.js +++ b/extensions/Amp/oscillators.js @@ -1,5 +1,5 @@ // Name: Oscillators -// ID: oscillator +// ID: aecOscillator // Description: Synthensize simple sound waves. // By: AmpElectrecuted // License: MPL-2.0 @@ -15,7 +15,7 @@ class OscillatorExtension { getInfo() { return { - id: "oscillator", + id: "aecOscillator", name: Scratch.translate("Oscillators"), blocks: [ { From 6b2dee1739a2eab296a158254bda3d868e8b82cf Mon Sep 17 00:00:00 2001 From: AmpElectrecuted <197376797+ampelectrecuted@users.noreply.github.com> Date: Sat, 30 Aug 2025 20:17:03 +0100 Subject: [PATCH 4/5] Update extensions/Amp/oscillators.js Co-authored-by: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> --- extensions/Amp/oscillators.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js index 4fc5d36572..c5e7f60833 100644 --- a/extensions/Amp/oscillators.js +++ b/extensions/Amp/oscillators.js @@ -66,7 +66,7 @@ } startFreq(args) { - oscillator.type = args.WAVEFORM; + oscillator.type = Scratch.Cast.toString(args.WAVEFORM); oscillator.frequency.setValueAtTime(args.FREQ, context.currentTime); if (!isStart) { oscillator.start(); From bf77e120e0395559325291ddda43f05f0e4bccfa Mon Sep 17 00:00:00 2001 From: AmpElectrecuted <197376797+ampelectrecuted@users.noreply.github.com> Date: Sat, 30 Aug 2025 20:18:24 +0100 Subject: [PATCH 5/5] Apply suggestion from @Brackets-Coder Co-authored-by: Brackets-Coder <142950368+Brackets-Coder@users.noreply.github.com> --- extensions/Amp/oscillators.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Amp/oscillators.js b/extensions/Amp/oscillators.js index c5e7f60833..d606d27de4 100644 --- a/extensions/Amp/oscillators.js +++ b/extensions/Amp/oscillators.js @@ -67,7 +67,7 @@ startFreq(args) { oscillator.type = Scratch.Cast.toString(args.WAVEFORM); - oscillator.frequency.setValueAtTime(args.FREQ, context.currentTime); + oscillator.frequency.setValueAtTime(Scratch.Cast.toNumber(args.FREQ), context.currentTime); if (!isStart) { oscillator.start(); isStart = true;