From 7827430be2639744b0b2455305a85b8367b55cbc Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 02:40:05 +0100 Subject: [PATCH 01/25] Add files via upload --- extensions/Lily/SoundExpanded.js | 389 +++++++++++++++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 extensions/Lily/SoundExpanded.js diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js new file mode 100644 index 0000000000..c35326552e --- /dev/null +++ b/extensions/Lily/SoundExpanded.js @@ -0,0 +1,389 @@ +(function(Scratch) { + "use strict"; + + const vm = Scratch.vm; + const runtime = vm.runtime; + const soundCategory = runtime.ext_scratch3_sound; + + /** + * @param {VM.BlockUtility} util + * @param {unknown} targetName + */ + const getSpriteTargetByName = (util, targetName) => { + const nameString = Scratch.Cast.toString(targetName); + const target = util.target; + if (target.getName() === nameString) { + return target; + } + return util.runtime.getSpriteTargetByName(nameString); + }; + + class SoundExpanded { + getInfo() { + return { + id: 'lmsSoundExpanded', + color1: "#CF63CF", + name: "Sound Expanded", + blocks: [ + { + opcode: 'startSoundAtSeconds', + blockType: Scratch.BlockType.COMMAND, + text: 'start sound [SOUND] from [START] seconds', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + }, + START: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0 + } + } + }, + { + opcode: 'playSoundAtSecondsUntilDone', + blockType: Scratch.BlockType.COMMAND, + text: 'play sound [SOUND] at [START] seconds until done', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + }, + START: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0 + } + } + }, + { + opcode: 'startSoundAndStopAtSeconds', + blockType: Scratch.BlockType.COMMAND, + text: 'start sound [SOUND] and stop at [END] seconds', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + }, + END: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 3 + } + } + }, + { + opcode: 'startSoundDuringTimeframe', + blockType: Scratch.BlockType.COMMAND, + text: 'start sound [SOUND] from [START] and stop at [END] seconds', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + }, + START: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 0 + }, + END: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 3 + } + } + }, + { + opcode: 'stopSound', + blockType: Scratch.BlockType.COMMAND, + text: 'stop sound [SOUND]', + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + + '---', + + { + opcode: 'pauseSound', + blockType: Scratch.BlockType.COMMAND, + text: 'pause sound [SOUND]', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + { + opcode: 'resumeSound', + blockType: Scratch.BlockType.COMMAND, + text: 'resume sound [SOUND]', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + { + opcode: 'pauseAllSounds', + blockType: Scratch.BlockType.COMMAND, + text: 'pause all sounds', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + { + opcode: 'resumeAllSounds', + blockType: Scratch.BlockType.COMMAND, + text: 'resume all sounds', + hideFromPalette: true, + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + + '---', + + { + opcode: 'setLooping', + blockType: Scratch.BlockType.COMMAND, + text: 'set looping on [SOUND] to [STATE]', + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + }, + STATE: { + type: Scratch.ArgumentType.STRING, + menu: 'state' + } + } + }, + { + opcode: 'isLooping', + blockType: Scratch.BlockType.BOOLEAN, + text: '[SOUND] is looping?', + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + + '---', + + { + opcode: 'isSoundPlaying', + blockType: Scratch.BlockType.BOOLEAN, + text: 'sound [SOUND] is playing?', + arguments: { + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + { + opcode: 'attributeOfSound', + blockType: Scratch.BlockType.REPORTER, + text: '[ATTRIBUTE] of [SOUND]', + arguments: { + ATTRIBUTE: { + type: Scratch.ArgumentType.STRING, + menu: 'attribute' + }, + SOUND: { + type: Scratch.ArgumentType.SOUND + } + } + }, + { + opcode: 'getSoundEffect', + blockType: Scratch.BlockType.REPORTER, + text: '[EFFECT] of [TARGET]', + arguments: { + EFFECT: { + type: Scratch.ArgumentType.STRING, + menu: 'effect' + }, + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + } + } + } + ], + menus: { + state: { + acceptReporters: false, + items: ['enabled', 'disabled'] + }, + attribute: { + acceptReporters: false, + items: ['length', 'channels', 'sample rate', 'current time'] + }, + effect: { + acceptReporters: false, + items: ['pitch', 'pan'] + }, + targets: { + acceptReporters: true, + items: '_getTargets' + } + } + } + } + + startSoundAtSeconds(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return 0; + const target = util.target; + const sprite = target.sprite; + const duration = args.START; + + const soundId = sprite.sounds[index].soundId; + soundCategory._addWaitingSound(target.id, soundId); + sprite.soundBank.playSound(util.target, soundId, duration); + } + + stopSound(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return 0; + const target = util.target; + const sprite = target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundBank = sprite.soundBank; + soundBank.stop(target, soundId); + } + + setLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + soundPlayer.outputNode.loop = (args.STATE === 'enabled') ? true : false; + } + + isLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + return soundPlayer.outputNode.loop; + } + + isSoundPlaying(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayers = sprite.soundBank.soundPlayers; + return soundPlayers[soundId].isPlaying; + } + + attributeOfSound(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return 0; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + const soundBuffer = soundPlayer.buffer; + + switch (args.ATTRIBUTE) { + case ('length'): + return Math.round(soundBuffer.duration * 100) / 100; + case ('channels'): + return soundBuffer.numberOfChannels; + case ('sample rate'): + return soundBuffer.sampleRate; + case ('current time'): + return soundPlayer.audioEngine.audioContext.currentTime; + } + } + + getSoundEffect(args, util) { + const target = getSpriteTargetByName(util, args.TARGET); + const effects = target.soundEffects; + if (!effects) return 0; + return effects[args.EFFECT]; + } + + /* Utility Functions */ + + _getSoundIndex(soundName, util) { + const len = util.target.sprite.sounds.length; + if (len === 0) { + return -1; + } + const index = this._getSoundIndexByName(soundName, util); + if (index !== -1) { + return index; + } + const oneIndexedIndex = parseInt(soundName, 10); + if (!isNaN(oneIndexedIndex)) { + return this._wrapClamp(oneIndexedIndex - 1, 0, len - 1); + } + return -1; + } + + _getSoundIndexByName(soundName, util) { + const sounds = util.target.sprite.sounds; + for (let i = 0; i < sounds.length; i++) { + if (sounds[i].name === soundName) { + return i; + } + } + return -1; + } + + _wrapClamp(n, min, max) { + const range = (max - min) + 1; + return n - (Math.floor((n - min) / range) * range); + } + + _getTargets() { + const spriteNames = []; + const targets = runtime.targets; + const myself = runtime.getEditingTarget().getName(); + for (let index = 1; index < targets.length; index++) { + const target = targets[index]; + if (target.isOriginal) { + const targetName = target.getName(); + if (targetName === myself) { + spriteNames.unshift({ + text: 'myself', + value: targetName + }); + } else { + spriteNames.push({ + text: targetName, + value: targetName + }); + } + } + } + if (spriteNames.length > 0) { + return spriteNames; + } else { + return [{ + text: "", + value: 0 + }]; //this should never happen but it's a failsafe + } + } + } + + Scratch.extensions.register(new SoundExpanded()); +})(Scratch); \ No newline at end of file From c37b1f8435ec0dfd40e5a80b703ddff984dfd7f0 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 03:13:41 +0100 Subject: [PATCH 02/25] Actually, this is better. --- extensions/Lily/SoundExpanded.js | 175 +++++++++++++------------------ 1 file changed, 74 insertions(+), 101 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index c35326552e..a116208335 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -26,10 +26,9 @@ name: "Sound Expanded", blocks: [ { - opcode: 'startSoundAtSeconds', + opcode: 'startSoundOnLoop', blockType: Scratch.BlockType.COMMAND, - text: 'start sound [SOUND] from [START] seconds', - hideFromPalette: true, + text: 'start sound [SOUND] on loop', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -41,58 +40,32 @@ } }, { - opcode: 'playSoundAtSecondsUntilDone', - blockType: Scratch.BlockType.COMMAND, - text: 'play sound [SOUND] at [START] seconds until done', - hideFromPalette: true, - arguments: { - SOUND: { - type: Scratch.ArgumentType.SOUND - }, - START: { - type: Scratch.ArgumentType.NUMBER, - defaultValue: 0 - } - } - }, - { - opcode: 'startSoundAndStopAtSeconds', + opcode: 'stopSound', blockType: Scratch.BlockType.COMMAND, - text: 'start sound [SOUND] and stop at [END] seconds', - hideFromPalette: true, + text: 'stop sound [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND - }, - END: { - type: Scratch.ArgumentType.NUMBER, - defaultValue: 3 } } }, + + '---', + { - opcode: 'startSoundDuringTimeframe', + opcode: 'pauseSound', blockType: Scratch.BlockType.COMMAND, - text: 'start sound [SOUND] from [START] and stop at [END] seconds', - hideFromPalette: true, + text: 'pause sound [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND - }, - START: { - type: Scratch.ArgumentType.NUMBER, - defaultValue: 0 - }, - END: { - type: Scratch.ArgumentType.NUMBER, - defaultValue: 3 } } }, { - opcode: 'stopSound', + opcode: 'resumeSound', blockType: Scratch.BlockType.COMMAND, - text: 'stop sound [SOUND]', + text: 'resume sound [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -103,10 +76,9 @@ '---', { - opcode: 'pauseSound', + opcode: 'startLooping', blockType: Scratch.BlockType.COMMAND, - text: 'pause sound [SOUND]', - hideFromPalette: true, + text: 'start looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -114,10 +86,9 @@ } }, { - opcode: 'resumeSound', + opcode: 'stopLooping', blockType: Scratch.BlockType.COMMAND, - text: 'resume sound [SOUND]', - hideFromPalette: true, + text: 'stop looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -125,21 +96,9 @@ } }, { - opcode: 'pauseAllSounds', - blockType: Scratch.BlockType.COMMAND, - text: 'pause all sounds', - hideFromPalette: true, - arguments: { - SOUND: { - type: Scratch.ArgumentType.SOUND - } - } - }, - { - opcode: 'resumeAllSounds', - blockType: Scratch.BlockType.COMMAND, - text: 'resume all sounds', - hideFromPalette: true, + opcode: 'isLooping', + blockType: Scratch.BlockType.BOOLEAN, + text: '[SOUND] is looping?', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -149,33 +108,6 @@ '---', - { - opcode: 'setLooping', - blockType: Scratch.BlockType.COMMAND, - text: 'set looping on [SOUND] to [STATE]', - arguments: { - SOUND: { - type: Scratch.ArgumentType.SOUND - }, - STATE: { - type: Scratch.ArgumentType.STRING, - menu: 'state' - } - } - }, - { - opcode: 'isLooping', - blockType: Scratch.BlockType.BOOLEAN, - text: '[SOUND] is looping?', - arguments: { - SOUND: { - type: Scratch.ArgumentType.SOUND - } - } - }, - - '---', - { opcode: 'isSoundPlaying', blockType: Scratch.BlockType.BOOLEAN, @@ -217,10 +149,6 @@ } ], menus: { - state: { - acceptReporters: false, - items: ['enabled', 'disabled'] - }, attribute: { acceptReporters: false, items: ['length', 'channels', 'sample rate', 'current time'] @@ -237,7 +165,7 @@ } } - startSoundAtSeconds(args, util) { + startSoundOnLoop(args, util) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return 0; const target = util.target; @@ -246,7 +174,12 @@ const soundId = sprite.sounds[index].soundId; soundCategory._addWaitingSound(target.id, soundId); - sprite.soundBank.playSound(util.target, soundId, duration); + sprite.soundBank.playSound(util.target, soundId); + + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + if (!soundPlayer.outputNode) return; + soundPlayer.outputNode.loop = true; } stopSound(args, util) { @@ -260,18 +193,33 @@ soundBank.stop(target, soundId); } - setLooping(args, util) { + pauseSound(args, util) { + this._toggleSoundState(args, util, true); + } + + resumeSound(args, util) { + this._toggleSoundState(args, util, false); + } + + _toggleSoundState(args, util, state) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return false; const sprite = util.target.sprite; const soundId = sprite.sounds[index].soundId; const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + const audioContext = soundPlayer.audioEngine.audioContext; - soundPlayer.outputNode.loop = (args.STATE === 'enabled') ? true : false; - } + if (state) { + audioContext.suspend(); + return; + } else { + audioContext.resume(); + return; + } + } - isLooping(args, util) { + startLooping(args, util) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return false; const sprite = util.target.sprite; @@ -279,8 +227,33 @@ const soundId = sprite.sounds[index].soundId; const soundPlayer = sprite.soundBank.soundPlayers[soundId]; - return soundPlayer.outputNode.loop; - } + if (!soundPlayer.outputNode) return; + soundPlayer.outputNode.loop = true; + } + + stopLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + if (!soundPlayer.outputNode) return; + soundPlayer.outputNode.loop = false; + } + + isLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + if (!soundPlayer.outputNode) return false; + return soundPlayer.outputNode.loop; + } isSoundPlaying(args, util) { const index = this._getSoundIndex(args.SOUND, util); @@ -308,8 +281,8 @@ return soundBuffer.numberOfChannels; case ('sample rate'): return soundBuffer.sampleRate; - case ('current time'): - return soundPlayer.audioEngine.audioContext.currentTime; + case ('current time'): + return soundPlayer.audioEngine.audioContext.currentTime; } } @@ -386,4 +359,4 @@ } Scratch.extensions.register(new SoundExpanded()); -})(Scratch); \ No newline at end of file +})(Scratch); From 38e6d368997fb3589f1977776c05762ce652e494 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 03:16:58 +0100 Subject: [PATCH 03/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index a116208335..aa2639460f 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -25,7 +25,7 @@ color1: "#CF63CF", name: "Sound Expanded", blocks: [ - { + { opcode: 'startSoundOnLoop', blockType: Scratch.BlockType.COMMAND, text: 'start sound [SOUND] on loop', @@ -162,7 +162,7 @@ items: '_getTargets' } } - } + }; } startSoundOnLoop(args, util) { From dfc0ff47bc1da1baa35f8f88514a76aa089fdb5b Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:04:09 +0100 Subject: [PATCH 04/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index aa2639460f..b561955c56 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -25,7 +25,7 @@ color1: "#CF63CF", name: "Sound Expanded", blocks: [ - { + { opcode: 'startSoundOnLoop', blockType: Scratch.BlockType.COMMAND, text: 'start sound [SOUND] on loop', @@ -53,9 +53,9 @@ '---', { - opcode: 'pauseSound', + opcode: 'pauseSounds', blockType: Scratch.BlockType.COMMAND, - text: 'pause sound [SOUND]', + text: 'pause all sounds', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -63,9 +63,9 @@ } }, { - opcode: 'resumeSound', + opcode: 'resumeSounds', blockType: Scratch.BlockType.COMMAND, - text: 'resume sound [SOUND]', + text: 'resume all sounds', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -162,7 +162,7 @@ items: '_getTargets' } } - }; + } } startSoundOnLoop(args, util) { @@ -193,11 +193,11 @@ soundBank.stop(target, soundId); } - pauseSound(args, util) { + pauseSounds(args, util) { this._toggleSoundState(args, util, true); } - resumeSound(args, util) { + resumeSounds(args, util) { this._toggleSoundState(args, util, false); } @@ -205,10 +205,7 @@ const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return false; const sprite = util.target.sprite; - - const soundId = sprite.sounds[index].soundId; - const soundPlayer = sprite.soundBank.soundPlayers[soundId]; - const audioContext = soundPlayer.audioEngine.audioContext; + const audioContext = sprite.soundBank.audioEngine.audioContext; if (state) { audioContext.suspend(); From 53106a4e9691893595391133e6d7e2741bb3f0c2 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:05:39 +0100 Subject: [PATCH 05/25] shut up, eslint --- extensions/Lily/SoundExpanded.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index b561955c56..ddeaef38eb 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -25,7 +25,7 @@ color1: "#CF63CF", name: "Sound Expanded", blocks: [ - { + { opcode: 'startSoundOnLoop', blockType: Scratch.BlockType.COMMAND, text: 'start sound [SOUND] on loop', @@ -162,7 +162,7 @@ items: '_getTargets' } } - } + }; } startSoundOnLoop(args, util) { From 5759061fa603bfb75878b13a97cface34087c98e Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:12:19 +0100 Subject: [PATCH 06/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index ddeaef38eb..7d2c0a368b 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -201,9 +201,9 @@ this._toggleSoundState(args, util, false); } + // Scratch.vm.runtime.targets[1].sprite.soundBank.audioEngine.audioContext.resume() + _toggleSoundState(args, util, state) { - const index = this._getSoundIndex(args.SOUND, util); - if (index < 0) return false; const sprite = util.target.sprite; const audioContext = sprite.soundBank.audioEngine.audioContext; From 7a2253216635b09e3a0d87fc293d9f2dc158ba52 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:13:43 +0100 Subject: [PATCH 07/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 7d2c0a368b..6dacb24d50 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -201,8 +201,6 @@ this._toggleSoundState(args, util, false); } - // Scratch.vm.runtime.targets[1].sprite.soundBank.audioEngine.audioContext.resume() - _toggleSoundState(args, util, state) { const sprite = util.target.sprite; const audioContext = sprite.soundBank.audioEngine.audioContext; From 4328bf6085e2faafeae43c6373d63ada2e4e40f7 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:41:49 +0100 Subject: [PATCH 08/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 6dacb24d50..37696427b8 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -151,7 +151,7 @@ menus: { attribute: { acceptReporters: false, - items: ['length', 'channels', 'sample rate', 'current time'] + items: ['length', 'channels', 'sample rate'] }, effect: { acceptReporters: false, @@ -276,8 +276,6 @@ return soundBuffer.numberOfChannels; case ('sample rate'): return soundBuffer.sampleRate; - case ('current time'): - return soundPlayer.audioEngine.audioContext.currentTime; } } From f606f04ce8c20b8bf6d7f78b5b666172ce088729 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 17 Jul 2023 03:44:23 +0100 Subject: [PATCH 09/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 33 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 37696427b8..c755297a52 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -280,7 +280,9 @@ } getSoundEffect(args, util) { - const target = getSpriteTargetByName(util, args.TARGET); + let target = Scratch.vm.runtime.getSpriteTargetByName(args.TARGET); + if (args.TARGET === '_myself_') target = util.target; + if (args.TARGET === '_stage_') target = runtime.getTargetForStage(); const effects = target.soundEffects; if (!effects) return 0; return effects[args.EFFECT]; @@ -320,33 +322,26 @@ } _getTargets() { - const spriteNames = []; - const targets = runtime.targets; - const myself = runtime.getEditingTarget().getName(); + const spriteNames = [ + {text: 'myself', value: '_myself_'}, + {text: 'Stage', value: '_stage_'} + ]; + const targets = Scratch.vm.runtime.targets; + const myself = Scratch.vm.runtime.getEditingTarget().getName(); for (let index = 1; index < targets.length; index++) { const target = targets[index]; if (target.isOriginal) { const targetName = target.getName(); - if (targetName === myself) { - spriteNames.unshift({ - text: 'myself', - value: targetName - }); - } else { - spriteNames.push({ - text: targetName, - value: targetName - }); - } + spriteNames.push({ + text: targetName, + value: targetName + }); } } if (spriteNames.length > 0) { return spriteNames; } else { - return [{ - text: "", - value: 0 - }]; //this should never happen but it's a failsafe + return [{text: "", value: 0}]; //this should never happen but it's a failsafe } } } From c342af5ecf94caa75fa453165af942c49e057824 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:37:02 +0100 Subject: [PATCH 10/25] Update and rename SoundExpanded.js to SoundPlus.js --- extensions/Lily/{SoundExpanded.js => SoundPlus.js} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename extensions/Lily/{SoundExpanded.js => SoundPlus.js} (95%) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundPlus.js similarity index 95% rename from extensions/Lily/SoundExpanded.js rename to extensions/Lily/SoundPlus.js index c755297a52..3b8bc94987 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundPlus.js @@ -18,12 +18,12 @@ return util.runtime.getSpriteTargetByName(nameString); }; - class SoundExpanded { + class SoundPlus { getInfo() { return { - id: 'lmsSoundExpanded', + id: 'lmsSoundPlus', color1: "#CF63CF", - name: "Sound Expanded", + name: "Sound Plus", blocks: [ { opcode: 'startSoundOnLoop', @@ -346,5 +346,5 @@ } } - Scratch.extensions.register(new SoundExpanded()); + Scratch.extensions.register(new SoundPlus()); })(Scratch); From 9afb799c164f357d4df483fae7c166463840be89 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Tue, 18 Jul 2023 22:37:58 +0100 Subject: [PATCH 11/25] Update SoundPlus.js --- extensions/Lily/SoundPlus.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/SoundPlus.js b/extensions/Lily/SoundPlus.js index 3b8bc94987..a9e66cff3d 100644 --- a/extensions/Lily/SoundPlus.js +++ b/extensions/Lily/SoundPlus.js @@ -78,7 +78,7 @@ { opcode: 'startLooping', blockType: Scratch.BlockType.COMMAND, - text: 'start looping [SOUND]', + text: 'begin looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -88,7 +88,7 @@ { opcode: 'stopLooping', blockType: Scratch.BlockType.COMMAND, - text: 'stop looping [SOUND]', + text: 'end looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND From 216041cc1ecd37fe0c6cfbd0cf7f267e3708b8f4 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Tue, 18 Jul 2023 22:49:31 +0100 Subject: [PATCH 12/25] Update SoundExpanded.js --- extensions/Lily/SoundPlus.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/Lily/SoundPlus.js b/extensions/Lily/SoundPlus.js index a9e66cff3d..3413acf672 100644 --- a/extensions/Lily/SoundPlus.js +++ b/extensions/Lily/SoundPlus.js @@ -18,12 +18,12 @@ return util.runtime.getSpriteTargetByName(nameString); }; - class SoundPlus { + class SoundExpanded { getInfo() { return { - id: 'lmsSoundPlus', + id: 'lmsSoundExpanded', color1: "#CF63CF", - name: "Sound Plus", + name: "Sound Expanded", blocks: [ { opcode: 'startSoundOnLoop', @@ -346,5 +346,5 @@ } } - Scratch.extensions.register(new SoundPlus()); + Scratch.extensions.register(new SoundExpanded()); })(Scratch); From 4c2f7872537f3b3f82c8fbabd59d31e58cee0b4f Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Sun, 30 Jul 2023 12:54:21 +0100 Subject: [PATCH 13/25] Update and rename SoundPlus.js to SoundExpanded.js --- extensions/Lily/{SoundPlus.js => SoundExpanded.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename extensions/Lily/{SoundPlus.js => SoundExpanded.js} (100%) diff --git a/extensions/Lily/SoundPlus.js b/extensions/Lily/SoundExpanded.js similarity index 100% rename from extensions/Lily/SoundPlus.js rename to extensions/Lily/SoundExpanded.js From af5927631f2b29e5108cff3073b9637de2007c65 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 04:52:30 +0100 Subject: [PATCH 14/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 3413acf672..27d9232c01 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -146,6 +146,34 @@ menu: 'targets' } } + }, + '---', + { + opcode: 'setProjectVolume', + blockType: Scratch.BlockType.COMMAND, + text: 'set project volume to [VALUE]', + arguments: { + VALUE: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 100 + } + } + }, + { + opcode: 'changeProjectVolume', + blockType: Scratch.BlockType.COMMAND, + text: 'change project volume by [VALUE]', + arguments: { + VALUE: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: 100 + } + } + }, + { + opcode: 'getProjectVolume', + blockType: Scratch.BlockType.REPORTER, + text: 'project volume' } ], menus: { @@ -288,6 +316,24 @@ return effects[args.EFFECT]; } + setProjectVolume(args) { + const value = Scratch.Cast.toNumber(args.VALUE); + const newVolume = Math.min(Math.max(value / 100, 0), 1); + runtime.audioEngine.inputNode.gain.value = newVolume; + } + + changeProjectVolume(args) { + const value = Scratch.Cast.toNumber(args.VALUE) / 100; + const volume = runtime.audioEngine.inputNode.gain.value; + const newVolume = Math.min(Math.max(volume + value, 0), 1); + runtime.audioEngine.inputNode.gain.value = newVolume; + } + + getProjectVolume() { + const volume = runtime.audioEngine.inputNode.gain.value; + return (Math.round(volume * 10000) / 100); + } + /* Utility Functions */ _getSoundIndex(soundName, util) { From 419e9d75f60fd21b45537056bb99173860f732a3 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 04:57:23 +0100 Subject: [PATCH 15/25] Fix weird discrepencies --- extensions/Lily/SoundExpanded.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 27d9232c01..c8fb17e0da 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -151,7 +151,7 @@ { opcode: 'setProjectVolume', blockType: Scratch.BlockType.COMMAND, - text: 'set project volume to [VALUE]', + text: 'set project volume to [VALUE]%', arguments: { VALUE: { type: Scratch.ArgumentType.NUMBER, @@ -166,7 +166,7 @@ arguments: { VALUE: { type: Scratch.ArgumentType.NUMBER, - defaultValue: 100 + defaultValue: -10 } } }, @@ -318,14 +318,14 @@ setProjectVolume(args) { const value = Scratch.Cast.toNumber(args.VALUE); - const newVolume = Math.min(Math.max(value / 100, 0), 1); + const newVolume = this._wrapClamp(value / 100, 0, 1); runtime.audioEngine.inputNode.gain.value = newVolume; } changeProjectVolume(args) { const value = Scratch.Cast.toNumber(args.VALUE) / 100; const volume = runtime.audioEngine.inputNode.gain.value; - const newVolume = Math.min(Math.max(volume + value, 0), 1); + const newVolume = this._wrapClamp(volume + value, 0, 1); runtime.audioEngine.inputNode.gain.value = newVolume; } From 3cb80084a4c1193460e2de440707299a794b4a38 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 05:06:17 +0100 Subject: [PATCH 16/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 114 ++++++++++++------------------- 1 file changed, 45 insertions(+), 69 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index c8fb17e0da..0b1a3ab0b9 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -26,9 +26,9 @@ name: "Sound Expanded", blocks: [ { - opcode: 'startSoundOnLoop', + opcode: 'startLooping', blockType: Scratch.BlockType.COMMAND, - text: 'start sound [SOUND] on loop', + text: 'start looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -40,22 +40,9 @@ } }, { - opcode: 'stopSound', - blockType: Scratch.BlockType.COMMAND, - text: 'stop sound [SOUND]', - arguments: { - SOUND: { - type: Scratch.ArgumentType.SOUND - } - } - }, - - '---', - - { - opcode: 'pauseSounds', + opcode: 'stopLooping', blockType: Scratch.BlockType.COMMAND, - text: 'pause all sounds', + text: 'end looping [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -63,9 +50,9 @@ } }, { - opcode: 'resumeSounds', - blockType: Scratch.BlockType.COMMAND, - text: 'resume all sounds', + opcode: 'isLooping', + blockType: Scratch.BlockType.BOOLEAN, + text: '[SOUND] is looping?', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -76,9 +63,9 @@ '---', { - opcode: 'startLooping', + opcode: 'stopSound', blockType: Scratch.BlockType.COMMAND, - text: 'begin looping [SOUND]', + text: 'stop sound [SOUND]', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -86,9 +73,9 @@ } }, { - opcode: 'stopLooping', + opcode: 'pauseSounds', blockType: Scratch.BlockType.COMMAND, - text: 'end looping [SOUND]', + text: 'pause all sounds', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -96,9 +83,9 @@ } }, { - opcode: 'isLooping', - blockType: Scratch.BlockType.BOOLEAN, - text: '[SOUND] is looping?', + opcode: 'resumeSounds', + blockType: Scratch.BlockType.COMMAND, + text: 'resume all sounds', arguments: { SOUND: { type: Scratch.ArgumentType.SOUND @@ -193,23 +180,48 @@ }; } - startSoundOnLoop(args, util) { + startLooping(args, util) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return 0; const target = util.target; - const sprite = target.sprite; - const duration = args.START; + const sprite = util.target.sprite; const soundId = sprite.sounds[index].soundId; - soundCategory._addWaitingSound(target.id, soundId); - sprite.soundBank.playSound(util.target, soundId); - const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + if (!soundPlayer.isPlaying) { + soundCategory._addWaitingSound(target.id, soundId); + sprite.soundBank.playSound(util.target, soundId); + } + if (!soundPlayer.outputNode) return; soundPlayer.outputNode.loop = true; } + stopLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + if (!soundPlayer.outputNode) return; + soundPlayer.outputNode.loop = false; + } + + isLooping(args, util) { + const index = this._getSoundIndex(args.SOUND, util); + if (index < 0) return false; + const sprite = util.target.sprite; + + const soundId = sprite.sounds[index].soundId; + const soundPlayer = sprite.soundBank.soundPlayers[soundId]; + + if (!soundPlayer.outputNode) return false; + return soundPlayer.outputNode.loop; + } + stopSound(args, util) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return 0; @@ -242,42 +254,6 @@ } } - startLooping(args, util) { - const index = this._getSoundIndex(args.SOUND, util); - if (index < 0) return false; - const sprite = util.target.sprite; - - const soundId = sprite.sounds[index].soundId; - const soundPlayer = sprite.soundBank.soundPlayers[soundId]; - - if (!soundPlayer.outputNode) return; - soundPlayer.outputNode.loop = true; - } - - stopLooping(args, util) { - const index = this._getSoundIndex(args.SOUND, util); - if (index < 0) return false; - const sprite = util.target.sprite; - - const soundId = sprite.sounds[index].soundId; - const soundPlayer = sprite.soundBank.soundPlayers[soundId]; - - if (!soundPlayer.outputNode) return; - soundPlayer.outputNode.loop = false; - } - - isLooping(args, util) { - const index = this._getSoundIndex(args.SOUND, util); - if (index < 0) return false; - const sprite = util.target.sprite; - - const soundId = sprite.sounds[index].soundId; - const soundPlayer = sprite.soundBank.soundPlayers[soundId]; - - if (!soundPlayer.outputNode) return false; - return soundPlayer.outputNode.loop; - } - isSoundPlaying(args, util) { const index = this._getSoundIndex(args.SOUND, util); if (index < 0) return false; From 85f1222f18bbc7f82bdfc9f110005cd901e4311b Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 05:09:11 +0100 Subject: [PATCH 17/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 0b1a3ab0b9..88355531b3 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -191,7 +191,7 @@ if (!soundPlayer.isPlaying) { soundCategory._addWaitingSound(target.id, soundId); - sprite.soundBank.playSound(util.target, soundId); + sprite.soundBank.playSound(util.target, soundId); } if (!soundPlayer.outputNode) return; From d9ca249f7a1c5ccd8a793a158c1049b4995b2b24 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 05:14:49 +0100 Subject: [PATCH 18/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 88355531b3..ba63a4ad1f 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -23,6 +23,8 @@ return { id: 'lmsSoundExpanded', color1: "#CF63CF", + color2: "#C94FC9", + color3: "#BD42BD", name: "Sound Expanded", blocks: [ { @@ -191,7 +193,7 @@ if (!soundPlayer.isPlaying) { soundCategory._addWaitingSound(target.id, soundId); - sprite.soundBank.playSound(util.target, soundId); + sprite.soundBank.playSound(util.target, soundId); } if (!soundPlayer.outputNode) return; From e510f3ca0f6521767829da8472b4c8da89863c21 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 05:15:11 +0100 Subject: [PATCH 19/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index ba63a4ad1f..263fbacb14 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -193,7 +193,7 @@ if (!soundPlayer.isPlaying) { soundCategory._addWaitingSound(target.id, soundId); - sprite.soundBank.playSound(util.target, soundId); + sprite.soundBank.playSound(util.target, soundId); } if (!soundPlayer.outputNode) return; From 6a68c2d5826784ed622e46a9e2882de4167573da Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:48:24 +0100 Subject: [PATCH 20/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 263fbacb14..4627de2f52 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -168,7 +168,7 @@ menus: { attribute: { acceptReporters: false, - items: ['length', 'channels', 'sample rate'] + items: ['length', 'channels', 'sample rate', 'dataURI'] }, effect: { acceptReporters: false, @@ -271,7 +271,8 @@ if (index < 0) return 0; const sprite = util.target.sprite; - const soundId = sprite.sounds[index].soundId; + const sound = sprite.sounds[index]; + const soundId = sound.soundId; const soundPlayer = sprite.soundBank.soundPlayers[soundId]; const soundBuffer = soundPlayer.buffer; @@ -282,6 +283,8 @@ return soundBuffer.numberOfChannels; case ('sample rate'): return soundBuffer.sampleRate; + case ('dataURI'): + return sound.asset.encodeDataURI(); } } From b9014d66f5c7e7a9bb292ad76af6c25edbe1e41e Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Wed, 23 Aug 2023 05:22:21 +0100 Subject: [PATCH 21/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 188 +++++++++++++++---------------- 1 file changed, 88 insertions(+), 100 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 4627de2f52..ee87522947 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -1,4 +1,4 @@ -(function(Scratch) { +(function (Scratch) { "use strict"; const vm = Scratch.vm; @@ -21,164 +21,164 @@ class SoundExpanded { getInfo() { return { - id: 'lmsSoundExpanded', + id: "lmsSoundExpanded", color1: "#CF63CF", color2: "#C94FC9", color3: "#BD42BD", name: "Sound Expanded", blocks: [ { - opcode: 'startLooping', + opcode: "startLooping", blockType: Scratch.BlockType.COMMAND, - text: 'start looping [SOUND]', + text: "start looping [SOUND]", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND + type: Scratch.ArgumentType.SOUND, }, START: { type: Scratch.ArgumentType.NUMBER, - defaultValue: 0 - } - } + defaultValue: 0, + }, + }, }, { - opcode: 'stopLooping', + opcode: "stopLooping", blockType: Scratch.BlockType.COMMAND, - text: 'end looping [SOUND]', + text: "end looping [SOUND]", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, { - opcode: 'isLooping', + opcode: "isLooping", blockType: Scratch.BlockType.BOOLEAN, - text: '[SOUND] is looping?', + text: "[SOUND] is looping?", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, - '---', + "---", { - opcode: 'stopSound', + opcode: "stopSound", blockType: Scratch.BlockType.COMMAND, - text: 'stop sound [SOUND]', + text: "stop sound [SOUND]", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, { - opcode: 'pauseSounds', + opcode: "pauseSounds", blockType: Scratch.BlockType.COMMAND, - text: 'pause all sounds', + text: "pause all sounds", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, { - opcode: 'resumeSounds', + opcode: "resumeSounds", blockType: Scratch.BlockType.COMMAND, - text: 'resume all sounds', + text: "resume all sounds", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, - '---', + "---", { - opcode: 'isSoundPlaying', + opcode: "isSoundPlaying", blockType: Scratch.BlockType.BOOLEAN, - text: 'sound [SOUND] is playing?', + text: "sound [SOUND] is playing?", arguments: { SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, { - opcode: 'attributeOfSound', + opcode: "attributeOfSound", blockType: Scratch.BlockType.REPORTER, - text: '[ATTRIBUTE] of [SOUND]', + text: "[ATTRIBUTE] of [SOUND]", arguments: { ATTRIBUTE: { type: Scratch.ArgumentType.STRING, - menu: 'attribute' + menu: "attribute", }, SOUND: { - type: Scratch.ArgumentType.SOUND - } - } + type: Scratch.ArgumentType.SOUND, + }, + }, }, { - opcode: 'getSoundEffect', + opcode: "getSoundEffect", blockType: Scratch.BlockType.REPORTER, - text: '[EFFECT] of [TARGET]', + text: "[EFFECT] of [TARGET]", arguments: { EFFECT: { type: Scratch.ArgumentType.STRING, - menu: 'effect' + menu: "effect", }, TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' - } - } + menu: "targets", + }, + }, }, - '---', + "---", { - opcode: 'setProjectVolume', + opcode: "setProjectVolume", blockType: Scratch.BlockType.COMMAND, - text: 'set project volume to [VALUE]%', + text: "set project volume to [VALUE]%", arguments: { VALUE: { type: Scratch.ArgumentType.NUMBER, - defaultValue: 100 - } - } + defaultValue: 100, + }, + }, }, { - opcode: 'changeProjectVolume', + opcode: "changeProjectVolume", blockType: Scratch.BlockType.COMMAND, - text: 'change project volume by [VALUE]', + text: "change project volume by [VALUE]", arguments: { VALUE: { type: Scratch.ArgumentType.NUMBER, - defaultValue: -10 - } - } + defaultValue: -10, + }, + }, }, { - opcode: 'getProjectVolume', + opcode: "getProjectVolume", blockType: Scratch.BlockType.REPORTER, - text: 'project volume' - } + text: "project volume", + }, ], menus: { attribute: { acceptReporters: false, - items: ['length', 'channels', 'sample rate', 'dataURI'] + items: ["length", "channels", "sample rate", "dataURI"], }, effect: { acceptReporters: false, - items: ['pitch', 'pan'] + items: ["pitch", "pan"], }, targets: { acceptReporters: true, - items: '_getTargets' - } - } + items: "_getTargets", + }, + }, }; } @@ -277,21 +277,21 @@ const soundBuffer = soundPlayer.buffer; switch (args.ATTRIBUTE) { - case ('length'): + case "length": return Math.round(soundBuffer.duration * 100) / 100; - case ('channels'): + case "channels": return soundBuffer.numberOfChannels; - case ('sample rate'): + case "sample rate": return soundBuffer.sampleRate; - case ('dataURI'): + case "dataURI": return sound.asset.encodeDataURI(); } } getSoundEffect(args, util) { let target = Scratch.vm.runtime.getSpriteTargetByName(args.TARGET); - if (args.TARGET === '_myself_') target = util.target; - if (args.TARGET === '_stage_') target = runtime.getTargetForStage(); + if (args.TARGET === "_myself_") target = util.target; + if (args.TARGET === "_stage_") target = runtime.getTargetForStage(); const effects = target.soundEffects; if (!effects) return 0; return effects[args.EFFECT]; @@ -312,7 +312,7 @@ getProjectVolume() { const volume = runtime.audioEngine.inputNode.gain.value; - return (Math.round(volume * 10000) / 100); + return Math.round(volume * 10000) / 100; } /* Utility Functions */ @@ -344,32 +344,20 @@ } _wrapClamp(n, min, max) { - const range = (max - min) + 1; - return n - (Math.floor((n - min) / range) * range); + const range = max - min + 1; + return n - Math.floor((n - min) / range) * range; } _getTargets() { - const spriteNames = [ - {text: 'myself', value: '_myself_'}, - {text: 'Stage', value: '_stage_'} + let spriteNames = [ + { text: "myself", value: "_myself_" }, + { text: "Stage", value: "_stage_" }, ]; - const targets = Scratch.vm.runtime.targets; - const myself = Scratch.vm.runtime.getEditingTarget().getName(); - for (let index = 1; index < targets.length; index++) { - const target = targets[index]; - if (target.isOriginal) { - const targetName = target.getName(); - spriteNames.push({ - text: targetName, - value: targetName - }); - } - } - if (spriteNames.length > 0) { - return spriteNames; - } else { - return [{text: "", value: 0}]; //this should never happen but it's a failsafe - } + const targets = Scratch.vm.runtime.targets + .filter((target) => target.isOriginal && !target.isStage) + .map((target) => target.getName()); + spriteNames = spriteNames.concat(targets); + return spriteNames; } } From ef21660cd860d0a0d8b54d9be1a101e1c53e1c79 Mon Sep 17 00:00:00 2001 From: Muffin Date: Fri, 25 Aug 2023 01:37:04 -0500 Subject: [PATCH 22/25] unused variable --- extensions/Lily/SoundExpanded.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index ee87522947..247738c6db 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -5,19 +5,6 @@ const runtime = vm.runtime; const soundCategory = runtime.ext_scratch3_sound; - /** - * @param {VM.BlockUtility} util - * @param {unknown} targetName - */ - const getSpriteTargetByName = (util, targetName) => { - const nameString = Scratch.Cast.toString(targetName); - const target = util.target; - if (target.getName() === nameString) { - return target; - } - return util.runtime.getSpriteTargetByName(nameString); - }; - class SoundExpanded { getInfo() { return { From b17c2b36c183bb883fd49c83f4168c9b7ed9b661 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Fri, 25 Aug 2023 18:14:30 +0100 Subject: [PATCH 23/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 247738c6db..d1712301ba 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -293,7 +293,7 @@ changeProjectVolume(args) { const value = Scratch.Cast.toNumber(args.VALUE) / 100; const volume = runtime.audioEngine.inputNode.gain.value; - const newVolume = this._wrapClamp(volume + value, 0, 1); + const newVolume = Scratch.Cast.toNumber(Math.min(Math.max(volume + value, 1), 0)); runtime.audioEngine.inputNode.gain.value = newVolume; } From 02336805379c3b94be34bce48082b38d9f1cede2 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Fri, 25 Aug 2023 20:11:24 +0100 Subject: [PATCH 24/25] Update SoundExpanded.js --- extensions/Lily/SoundExpanded.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index d1712301ba..5969d9753e 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -293,7 +293,9 @@ changeProjectVolume(args) { const value = Scratch.Cast.toNumber(args.VALUE) / 100; const volume = runtime.audioEngine.inputNode.gain.value; - const newVolume = Scratch.Cast.toNumber(Math.min(Math.max(volume + value, 1), 0)); + const newVolume = Scratch.Cast.toNumber( + Math.min(Math.max(volume + value, 1), 0) + ); runtime.audioEngine.inputNode.gain.value = newVolume; } From 09a45ae6e7baae8133886b9158c342dcfc7f9297 Mon Sep 17 00:00:00 2001 From: Muffin Date: Fri, 25 Aug 2023 18:13:07 -0500 Subject: [PATCH 25/25] Add to homepage --- extensions/Lily/SoundExpanded.js | 5 +++++ extensions/extensions.json | 1 + 2 files changed, 6 insertions(+) diff --git a/extensions/Lily/SoundExpanded.js b/extensions/Lily/SoundExpanded.js index 5969d9753e..aefe95072b 100644 --- a/extensions/Lily/SoundExpanded.js +++ b/extensions/Lily/SoundExpanded.js @@ -1,3 +1,8 @@ +// Name: Sound Expanded +// Description: Adds more sound-related blocks. +// ID: lmsSoundExpanded +// By: LilyMakesThings + (function (Scratch) { "use strict"; diff --git a/extensions/extensions.json b/extensions/extensions.json index 73ce264655..1a620f4e96 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -31,6 +31,7 @@ "XeroName/Deltatime", "ar", "encoding", + "Lily/SoundExpanded", "Lily/TempVariables2", "Lily/MoreTimers", "clouddata-ping",