online加声音目录

This commit is contained in:
whm1216
2025-12-02 00:57:34 +08:00
parent 7835a77ae2
commit 3ecb7d8cfb
37 changed files with 2444 additions and 2 deletions

View File

@@ -0,0 +1,17 @@
import * as Blockly from 'blockly/core';
export const sound_effect_add = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_SET_TO)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SOUND_EFFECT_PITCH, "pitch"], [Blockly.Msg.MIXLY_SOUND_EFFECT_PAN, "pan"]]), "EFFECT")
.appendField(Blockly.Msg.MIXLY_SOUND_EFFECT_ADD_BY);
this.appendValueInput("VALUE")
.setCheck(null)
this.appendDummyInput();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_ADD_TOOLTIP);
}
};

View File

@@ -0,0 +1,12 @@
import * as Blockly from 'blockly/core';
export const sound_effect_clear = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_catSoundSOUND_CLEAR_EFFECTS);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_CLEAR_TOOLTIP);
}
};

View File

@@ -0,0 +1,17 @@
import * as Blockly from 'blockly/core';
export const sound_effect_set = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_SET_TO)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SOUND_EFFECT_PITCH, "pitch"], [Blockly.Msg.MIXLY_SOUND_EFFECT_PAN, "pan"]]), "EFFECT")
.appendField(Blockly.Msg.MIXLY_SOUND_EFFECT_SET_TO);
this.appendValueInput("VALUE")
.setCheck(null)
this.appendDummyInput();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_SET_TOOLTIP);
}
};

View File

@@ -0,0 +1,26 @@
import * as Blockly from 'blockly/core';
export const sound_play = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_PLAY)
.appendField(new Blockly.FieldDropdown(this.getSoundOptions), "SOUND");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_TOOLTIP);
},
getSoundOptions: function() {
const options = [["Meow", "Meow"], [Blockly.Msg.MIXLY_SOUND_RECORD_OPTION, "record"]];
if (window.sound && window.sound.builtin) {
const recordings = Object.keys(window.sound.builtin).filter(k => k.startsWith('recording'));
recordings.forEach(recording => {
options.push([recording, recording]);
});
}
return options;
}
};

View File

@@ -0,0 +1,21 @@
import * as Blockly from 'blockly/core';
export const sound_play_frequency = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_PLAY)
.appendField(Blockly.Msg.MIXLY_SOUND_FREQUENCY);
this.appendValueInput("FREQUENCY")
.setCheck(null)
.setAlign(Blockly.ALIGN_RIGHT);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_DURATION);
this.appendValueInput("DURATION")
.setCheck(null)
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_TOOLTIP);
}
};

View File

@@ -0,0 +1,13 @@
import * as Blockly from 'blockly/core';
export const sound_play_frequency_no_duration = {
init: function() {
this.setColour('#acc159');
this.appendValueInput("FREQUENCY")
.setCheck(null)
.appendField(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION_TOOLTIP);
}
};

View File

@@ -0,0 +1,22 @@
import * as Blockly from 'blockly/core';
export const sound_play_note_list = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_PLAY_NOTE_LIST);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["DADADADUM", "DADADADUM"],
["BIRTHDAY", "BIRTHDAY"],
["BA_DING", "BA_DING"],
["JUMP_UP", "JUMP_UP"],
["JUMP_DOWN", "JUMP_DOWN"],
["POWER_UP", "POWER_UP"],
["POWER_DOWN", "POWER_DOWN"]
]), "NOTE_LIST");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_NOTE_LIST_TOOLTIP);
}
};

View File

@@ -0,0 +1,27 @@
import * as Blockly from 'blockly/core';
export const sound_play_wait = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_PLAY)
.appendField(new Blockly.FieldDropdown(this.getSoundOptions), "SOUND")
.appendField(Blockly.Msg.MIXLY_SOUND_WAIT_FINISH);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_WAIT_TOOLTIP);
},
getSoundOptions: function() {
const options = [["Meow", "Meow"], [Blockly.Msg.MIXLY_SOUND_RECORD_OPTION, "record"]];
if (window.sound && window.sound.builtin) {
const recordings = Object.keys(window.sound.builtin).filter(k => k.startsWith('recording'));
recordings.forEach(recording => {
options.push([recording, recording]);
});
}
return options;
}
};

View File

@@ -0,0 +1,12 @@
import * as Blockly from 'blockly/core';
export const sound_record = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SOUND_RECORD);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_RECORD_TOOLTIP);
}
};

View File

@@ -0,0 +1,26 @@
import * as Blockly from 'blockly/core';
export const sound_note = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["NOTE_B3", "NOTE_B3"],
["NOTE_C4", "NOTE_C4"],
["NOTE_D4", "NOTE_D4"],
["NOTE_E4", "NOTE_E4"],
["NOTE_F4", "NOTE_F4"],
["NOTE_G4", "NOTE_G4"],
["NOTE_A4", "NOTE_A4"],
["NOTE_B4", "NOTE_B4"],
["NOTE_C5", "NOTE_C5"],
["NOTE_D5", "NOTE_D5"],
["NOTE_E5", "NOTE_E5"],
["NOTE_F5", "NOTE_F5"],
["NOTE_G5", "NOTE_G5"]
]), "NOTE");
this.setOutput(true, null);
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_NOTE_TOOLTIP);
}
};

View File

@@ -0,0 +1,12 @@
import * as Blockly from 'blockly/core';
export const sound_stop_all = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_catSoundSOUND_STOP_ALL);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_STOP_ALL_TOOLTIP);
}
};

View File

@@ -0,0 +1,15 @@
import * as Blockly from 'blockly/core';
export const sound_volume_add = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_INCREASE);
this.appendValueInput("VALUE")
.setCheck(null);
this.appendDummyInput();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_ADD_TOOLTIP);
}
};

View File

@@ -0,0 +1,11 @@
import * as Blockly from 'blockly/core';
export const sound_volume_get = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_GET);
this.setOutput(true, "Volume");
this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_GET_TOOLTIP);
}
};

View File

@@ -0,0 +1,15 @@
import * as Blockly from 'blockly/core';
export const sound_volume_set = {
init: function() {
this.setColour('#acc159');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_SET);
this.appendValueInput("VALUE")
.setCheck(null);
this.appendDummyInput();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_SET_TOOLTIP);
}
};

View File

@@ -203,4 +203,14 @@ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTr
#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { #catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
background: url('../../../../common/media/mark/factory4.png') no-repeat; background: url('../../../../common/media/mark/factory4.png') no-repeat;
background-size: 100% auto; background-size: 100% auto;
}
#catSound.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
background: url('../../../../common/media/mark/voice.png') no-repeat;
background-size: 100% auto;
}
#catSound.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
background: url('../../../../common/media/mark/voice2.png') no-repeat;
background-size: 100% auto;
} }

View File

@@ -0,0 +1,21 @@
export const sound_effect_add = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
const effect = _block.getFieldValue("EFFECT");
const valueInput = _block.getInputTargetBlock("VALUE");
let val;
if (valueInput) {
if (valueInput.type === "math_number") {
val = valueInput.getFieldValue("NUM") || "10";
} else {
val = _generator.valueToCode(valueInput, "VALUE", _generator.ORDER_NONE) || "10";
}
} else {
val = "10";
}
return `sound.adjust_effect("${effect}", ${val})\n`;
};

View File

@@ -0,0 +1,7 @@
export const sound_effect_clear = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
return "sound.clear_effects()\n";
};

View File

@@ -0,0 +1,21 @@
export const sound_effect_set = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
const effect = _block.getFieldValue("EFFECT");
const valueInput = _block.getInputTargetBlock("VALUE");
let val;
if (valueInput) {
if (valueInput.type === "math_number") {
val = valueInput.getFieldValue("NUM") || "100";
} else {
val = _generator.valueToCode(valueInput, "VALUE", _generator.ORDER_NONE) || "100";
}
} else {
val = "100";
}
return `sound.set_effect("${effect}", ${val})\n`;
};

View File

@@ -0,0 +1,11 @@
export const sound_play = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
const sound = _block.getFieldValue("SOUND");
if (sound === "record") {
return `sound.record()\n`;
}
return `sound.play("${sound}")\n`;
};

View File

@@ -0,0 +1,75 @@
function hasPlayWaitBefore(block) {
let currentBlock = block.getPreviousBlock();
while (currentBlock) {
if (currentBlock.type === 'sound_play_wait') {
return true;
}
currentBlock = currentBlock.getPreviousBlock();
}
return false;
}
export const sound_play_frequency = function(_block, generator) {
if (!generator.definitions_['import_sound']) {
generator.definitions_['import_sound'] = 'import sound';
}
const frequencyInput = _block.getInputTargetBlock("FREQUENCY");
const durationInput = _block.getInputTargetBlock("DURATION");
let frequencyCode, durationCode;
if (frequencyInput) {
try {
if (frequencyInput.type === "sound_note") {
const note = frequencyInput.getFieldValue("NOTE") || "NOTE_A4";
const noteFrequencies = {
"NOTE_B3": 247,
"NOTE_C4": 262,
"NOTE_D4": 294,
"NOTE_E4": 330,
"NOTE_F4": 349,
"NOTE_G4": 392,
"NOTE_A4": 440,
"NOTE_B4": 494,
"NOTE_C5": 523,
"NOTE_D5": 587,
"NOTE_E5": 659,
"NOTE_F5": 698,
"NOTE_G5": 784
};
frequencyCode = noteFrequencies[note] || 440;
} else if (frequencyInput.type === "math_number") {
const numValue = frequencyInput.getFieldValue("NUM");
frequencyCode = numValue || "440";
} else {
frequencyCode = generator.valueToCode(frequencyInput, "FREQUENCY", generator.ORDER_ATOMIC);
}
} catch (error) {
console.warn("生成频率代码时出错:", error);
frequencyCode = "440";
}
} else {
frequencyCode = "440";
}
if (durationInput) {
try {
if (durationInput.type === "math_number") {
const numValue = durationInput.getFieldValue("NUM");
durationCode = numValue || "1000";
} else {
durationCode = generator.valueToCode(durationInput, "DURATION", generator.ORDER_ATOMIC);
}
} catch (error) {
console.warn("生成持续时间代码时出错:", error);
durationCode = "1000";
}
} else {
durationCode = "1000";
}
const useBlocking = hasPlayWaitBefore(_block);
const methodName = useBlocking ? 'play_frequency_blocking' : 'play_frequency';
return `sound.${methodName}(${frequencyCode}, ${durationCode})\n`;
};

View File

@@ -0,0 +1,58 @@
function hasPlayWaitBefore(block) {
let currentBlock = block.getPreviousBlock();
while (currentBlock) {
if (currentBlock.type === 'sound_play_wait') {
return true;
}
currentBlock = currentBlock.getPreviousBlock();
}
return false;
}
export const sound_play_frequency_no_duration = function(_block, generator) {
if (!generator.definitions_['import_sound']) {
generator.definitions_['import_sound'] = 'import sound';
}
const frequencyInput = _block.getInputTargetBlock("FREQUENCY");
let frequencyCode;
if (frequencyInput) {
try {
if (frequencyInput.type === "sound_note") {
const note = frequencyInput.getFieldValue("NOTE") || "NOTE_A4";
const noteFrequencies = {
"NOTE_B3": 247,
"NOTE_C4": 262,
"NOTE_D4": 294,
"NOTE_E4": 330,
"NOTE_F4": 349,
"NOTE_G4": 392,
"NOTE_A4": 440,
"NOTE_B4": 494,
"NOTE_C5": 523,
"NOTE_D5": 587,
"NOTE_E5": 659,
"NOTE_F5": 698,
"NOTE_G5": 784
};
frequencyCode = noteFrequencies[note] || 440;
} else if (frequencyInput.type === "math_number") {
const numValue = frequencyInput.getFieldValue("NUM");
frequencyCode = numValue || "440";
} else {
frequencyCode = generator.valueToCode(frequencyInput, "FREQUENCY", generator.ORDER_ATOMIC);
}
} catch (error) {
console.warn("生成频率代码时出错:", error);
frequencyCode = "440";
}
} else {
frequencyCode = "440";
}
const useBlocking = hasPlayWaitBefore(_block);
const methodName = useBlocking ? 'play_frequency_blocking' : 'play_frequency';
return `sound.${methodName}(${frequencyCode}, 0)\n`;
};

View File

@@ -0,0 +1,23 @@
function hasPlayWaitBefore(block) {
let currentBlock = block.getPreviousBlock();
while (currentBlock) {
if (currentBlock.type === 'sound_play_wait') {
return true;
}
currentBlock = currentBlock.getPreviousBlock();
}
return false;
}
export const sound_play_note_list = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
const noteList = _block.getFieldValue("NOTE_LIST") || "DADADADUM";
const useBlocking = hasPlayWaitBefore(_block);
const methodName = useBlocking ? 'play_note_list_blocking' : 'play_note_list';
return `sound.${methodName}("${noteList}")\n`;
};

View File

@@ -0,0 +1,12 @@
export const sound_play_wait = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
const sound = _block.getFieldValue("SOUND");
if (sound === "record") {
return `sound.record()\n`;
}
return `sound.play_blocking("${sound}")\n`;
};

View File

@@ -0,0 +1,7 @@
export const sound_record = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
return `sound.record()\n`;
};

View File

@@ -0,0 +1,6 @@
export const sound_note = function(_block, generator) {
const note = _block.getFieldValue("NOTE") || "NOTE_A4";
return [`"${note}"`, generator.ORDER_ATOMIC];
};

View File

@@ -0,0 +1,7 @@
export const sound_stop_all = function(_block, _generator) {
if (!_generator.definitions_['import_sound']) {
_generator.definitions_['import_sound'] = 'import sound';
}
return "sound.stop_all()\n";
};

View File

@@ -0,0 +1,8 @@
export const sound_volume_add = function(_block, generator) {
if (!generator.definitions_['import_sound']) {
generator.definitions_['import_sound'] = 'import sound';
}
const val = generator.valueToCode(_block, "VALUE", generator.ORDER_NONE) || "0";
return `sound.adjust_volume(${val})\n`;
};

View File

@@ -0,0 +1,7 @@
export const sound_volume_get = function(_block, generator) {
if (!generator.definitions_['import_sound']) {
generator.definitions_['import_sound'] = 'import sound';
}
return ['sound.get_volume()', generator.ORDER_ATOMIC];
};

View File

@@ -0,0 +1,8 @@
export const sound_volume_set = function(_block, generator) {
if (!generator.definitions_['import_sound']) {
generator.definitions_['import_sound'] = 'import sound';
}
const val = generator.valueToCode(_block, "VALUE", generator.ORDER_NONE) || "100";
return `sound.set_volume(${val})\n`;
};

View File

@@ -75,6 +75,7 @@ import {
} from './'; } from './';
import './others/loader'; import './others/loader';
import sound from './others/sound.js';
import './css/color_mixpy_python_advance.css'; import './css/color_mixpy_python_advance.css';
@@ -151,4 +152,83 @@ Object.assign(
PythonMixpyTurtleGenerators, PythonMixpyTurtleGenerators,
PythonPyodideSKLearnGenerators, PythonPyodideSKLearnGenerators,
PythonTensorflowGenerators PythonTensorflowGenerators
); );
import { sound_play } from './blocks/sound/play/play.js';
import { sound_play_wait } from './blocks/sound/play/play_wait.js';
import { sound_stop_all } from './blocks/sound/play/sound_stop_all.js';
import { sound_effect_add } from './blocks/sound/effect/add.js';
import { sound_effect_set } from './blocks/sound/effect/sound_effect_set.js';
import { sound_effect_clear } from './blocks/sound/effect/sound_effect_clear.js';
import { sound_volume_add } from './blocks/sound/volume/add.js';
import { sound_volume_set } from './blocks/sound/volume/set.js';
import { sound_volume_get } from './blocks/sound/volume/get.js';
import { sound_record } from './blocks/sound/play/record.js';
import { sound_play_frequency } from './blocks/sound/play/play_frequency.js';
import { sound_play_frequency_no_duration } from './blocks/sound/play/play_frequency_no_duration.js';
import { sound_play_note_list } from './blocks/sound/play/play_note_list.js';
import { sound_note } from './blocks/sound/play/sound_note.js';
import { sound_play as sound_play_gen } from './generators/sound/play/play.js';
import { sound_play_wait as sound_play_wait_gen } from './generators/sound/play/play_wait.js';
import { sound_stop_all as sound_stop_all_gen } from './generators/sound/play/sound_stop_all.js';
import { sound_effect_add as sound_effect_add_gen } from './generators/sound/effect/add.js';
import { sound_effect_set as sound_effect_set_gen } from './generators/sound/effect/sound_effect_set.js';
import { sound_effect_clear as sound_effect_clear_gen } from './generators/sound/effect/sound_effect_clear.js';
import { sound_volume_add as sound_volume_add_gen } from './generators/sound/volume/add.js';
import { sound_volume_set as sound_volume_set_gen } from './generators/sound/volume/set.js';
import { sound_volume_get as sound_volume_get_gen } from './generators/sound/volume/get.js';
import { sound_record as sound_record_gen } from './generators/sound/play/record.js';
import { sound_play_frequency as sound_play_frequency_gen } from './generators/sound/play/play_frequency.js';
import { sound_play_frequency_no_duration as sound_play_frequency_no_duration_gen } from './generators/sound/play/play_frequency_no_duration.js';
import { sound_play_note_list as sound_play_note_list_gen } from './generators/sound/play/play_note_list.js';
import { sound_note as sound_note_gen } from './generators/sound/play/sound_note.js';
Object.assign(Blockly.Blocks, {
sound_play,
sound_play_wait,
sound_stop_all,
sound_effect_add,
sound_effect_set,
sound_effect_clear,
sound_volume_add,
sound_volume_set,
sound_volume_get,
sound_record,
sound_play_frequency,
sound_play_frequency_no_duration,
sound_play_note_list,
sound_note,
});
Object.assign(Blockly.Python.forBlock, {
sound_play: sound_play_gen,
sound_play_wait: sound_play_wait_gen,
sound_stop_all: sound_stop_all_gen,
sound_effect_add: sound_effect_add_gen,
sound_effect_set: sound_effect_set_gen,
sound_effect_clear: sound_effect_clear_gen,
sound_volume_add: sound_volume_add_gen,
sound_volume_set: sound_volume_set_gen,
sound_volume_get: sound_volume_get_gen,
sound_record: sound_record_gen,
sound_play_frequency: sound_play_frequency_gen,
sound_play_frequency_no_duration: sound_play_frequency_no_duration_gen,
sound_play_note_list: sound_play_note_list_gen,
sound_note: sound_note_gen,
});
window.sound = sound;

View File

@@ -1,6 +1,7 @@
import NavExt from './nav-ext'; import NavExt from './nav-ext';
import * as tf from '@tensorflow/tfjs'; import * as tf from '@tensorflow/tfjs';
import './tensorflow'; import './tensorflow';
import './sound.js';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
NavExt.init(); NavExt.init();
@@ -292,7 +293,10 @@ async function createModal() {
createModal(); createModal();
await loadAndDisplayAllModels(); // 使用立即执行的异步函数,避免 top-level await 导致模块异步加载
(async () => {
await loadAndDisplayAllModels();
})();
function openModal() { function openModal() {
loadAndDisplayAllModels(); loadAndDisplayAllModels();

View File

@@ -71,6 +71,9 @@ export default class PythonShell {
this.pyodide.setInterruptBuffer(this.interruptBuffer); this.pyodide.setInterruptBuffer(this.interruptBuffer);
this.kernelLoaded = true; this.kernelLoaded = true;
this.$loader.remove(); this.$loader.remove();
if (this.$loader && this.$loader.remove) {
this.$loader.remove();
}
this.$loader = null; this.$loader = null;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3859,4 +3859,63 @@
<block type="factory_block_with_textarea"></block> <block type="factory_block_with_textarea"></block>
<block type="factory_block_return_with_textarea"></block> <block type="factory_block_return_with_textarea"></block>
</category> </category>
<category id="catSound" colour="#acc159">
<block type="sound_play"></block>
<block type="sound_play_wait"></block>
<block type="sound_stop_all"></block>
<block type="sound_volume_set">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="sound_volume_get"></block>
<block type="sound_volume_add">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">-10</field>
</shadow>
</value>
</block>
<block type="sound_effect_add">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">10</field>
</shadow>
</value>
</block>
<block type="sound_effect_set">
<value name="VALUE">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
<block type="sound_effect_clear"></block>
<block type="sound_play_frequency">
<value name="FREQUENCY">
<shadow type="sound_note">
<field name="NOTE">NOTE_A4</field>
</shadow>
</value>
<value name="DURATION">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="sound_play_frequency_no_duration">
<value name="FREQUENCY">
<shadow type="sound_note">
<field name="NOTE">NOTE_A4</field>
</shadow>
</value>
</block>
<block type="sound_play_note_list"></block>
<block type="sound_note">
<field name="NOTE">NOTE_A4</field>
</block>
</xml> </xml>

View File

@@ -96,6 +96,7 @@ En.MSG = {
catOLED: 'OLED Screen', catOLED: 'OLED Screen',
catMatrix: 'Matrix', catMatrix: 'Matrix',
catFactory: 'Factory', catFactory: 'Factory',
catSound: 'Sound',
catBlynk: 'Blynk IoT', catBlynk: 'Blynk IoT',
catFile: 'File', catFile: 'File',
catOnenet: 'OneNET', catOnenet: 'OneNET',
@@ -4068,4 +4069,41 @@ En.MIXLY_ERROR_RATE = 'error-tolerant rate';
En.MIXLY_Enlarge_and_scale_to = 'enlarge and scale to'; En.MIXLY_Enlarge_and_scale_to = 'enlarge and scale to';
En.MIXLY_High_zoom_level_to = 'high zoom level to'; En.MIXLY_High_zoom_level_to = 'high zoom level to';
En.MIXLY_OPEN_IMAGE_TOOLTIP = 'Scaling is only supported for multiples of 8. A value of 0 indicates no scaling.'; En.MIXLY_OPEN_IMAGE_TOOLTIP = 'Scaling is only supported for multiples of 8. A value of 0 indicates no scaling.';
En.MIXLY_SOUND_PLAY_WAIT='Play sound %1 and wait for it to finish';
En.MIXLY_SOUND_PLAY='Play Sound';
En.MIXLY_catSoundSOUND_STOP_ALL='Stop all sounds';
En.MIXLY_catSoundSOUND_PITCH_INCREASE='Increase the tone';
En.MIXLY_catSoundSOUND_PITCH_SET='Set the tone to';
En.MIXLY_catSoundSOUND_CLEAR_EFFECTS='Clear sound effects';
En.MIXLY_catSoundSOUND_VOLUME_INCREASE='Increase the volume';
En.MIXLY_catSoundSOUND_VOLUME_SET='Set the volume to';
En.MIXLY_catSoundSOUND_VOLUME_GET='volume';
En.MIXLY_catSoundSOUND_DROPDOWN='Meow';
En.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION='Play Sound Frequency';
En.MIXLY_SOUND_FREQUENCY='Frequency';
En.MIXLY_SOUND_DURATION='Duration';
En.MIXLY_SOUND_PLAY_NOTE_LIST='Play Note Sequence';
En.MIXLY_SOUND_WAIT_FINISH='and wait to finish';
En.MIXLY_SOUND_RECORD='Record Sound';
En.MIXLY_SOUND_RECORD_OPTION='Record...';
En.MIXLY_SOUND_NOTE='Note Sequence';
En.MIXLY_SOUND_EFFECT_PITCH='Pitch';
En.MIXLY_SOUND_EFFECT_PAN='Pan Left/Right';
En.MIXLY_SOUND_EFFECT_SET_TO='effect to';
En.MIXLY_SOUND_EFFECT_ADD_BY='effect by';
En.MIXLY_SOUND_SET_TO='Set';
En.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION_TOOLTIP='Play sound at a specific frequency';
En.MIXLY_SOUND_PLAY_FREQUENCY_TOOLTIP='Play sound at a specific frequency for a limited time';
En.MIXLY_SOUND_PLAY_NOTE_LIST_TOOLTIP='Play a preset note sequence';
En.MIXLY_SOUND_PLAY_WAIT_TOOLTIP='Play sound and wait for it to finish';
En.MIXLY_SOUND_PLAY_TOOLTIP='Play sound';
En.MIXLY_SOUND_NOTE_TOOLTIP='Note sequence';
En.MIXLY_SOUND_STOP_ALL_TOOLTIP='Stop all sounds';
En.MIXLY_SOUND_RECORD_TOOLTIP='Record sound';
En.MIXLY_SOUND_VOLUME_GET_TOOLTIP='Get volume';
En.MIXLY_SOUND_VOLUME_SET_TOOLTIP='Set volume';
En.MIXLY_SOUND_VOLUME_ADD_TOOLTIP='Change volume';
En.MIXLY_SOUND_EFFECT_SET_TOOLTIP='Set sound effect';
En.MIXLY_SOUND_EFFECT_CLEAR_TOOLTIP='Clear sound effects';
En.MIXLY_SOUND_EFFECT_ADD_TOOLTIP='Change sound effect';
})(); })();

View File

@@ -107,6 +107,7 @@ ZhHans.MSG = {
catOLED: 'OLED显示屏', catOLED: 'OLED显示屏',
catMatrix: '点阵屏', catMatrix: '点阵屏',
catFactory: '自定义模块', catFactory: '自定义模块',
catSound: '声音',
catBlynk: 'Blynk', catBlynk: 'Blynk',
catFile: '文件', catFile: '文件',
catOnenet: 'OneNET', catOnenet: 'OneNET',
@@ -4251,4 +4252,41 @@ ZhHans.MIXLY_ERROR_RATE = '容错率';
ZhHans.MIXLY_Enlarge_and_scale_to = '宽缩放至'; ZhHans.MIXLY_Enlarge_and_scale_to = '宽缩放至';
ZhHans.MIXLY_High_zoom_level_to = '高缩放至'; ZhHans.MIXLY_High_zoom_level_to = '高缩放至';
ZhHans.MIXLY_OPEN_IMAGE_TOOLTIP = '缩放仅支持8的倍数,填0代表不缩放'; ZhHans.MIXLY_OPEN_IMAGE_TOOLTIP = '缩放仅支持8的倍数,填0代表不缩放';
ZhHans.MIXLY_SOUND_PLAY_WAIT='播放声音 等待播完';
ZhHans.MIXLY_SOUND_PLAY='播放声音';
ZhHans.MIXLY_catSoundSOUND_STOP_ALL='停止所有声音';
ZhHans.MIXLY_catSoundSOUND_PITCH_INCREASE='将音调增加';
ZhHans.MIXLY_catSoundSOUND_PITCH_SET='将音调设为';
ZhHans.MIXLY_catSoundSOUND_CLEAR_EFFECTS='清除音效';
ZhHans.MIXLY_catSoundSOUND_VOLUME_INCREASE='将音量增加';
ZhHans.MIXLY_catSoundSOUND_VOLUME_SET='将音量设为';
ZhHans.MIXLY_catSoundSOUND_VOLUME_GET='音量';
ZhHans.MIXLY_catSoundSOUND_DROPDOWN='Meow';
ZhHans.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION='播放声音 频率';
ZhHans.MIXLY_SOUND_FREQUENCY='频率';
ZhHans.MIXLY_SOUND_DURATION='持续时间';
ZhHans.MIXLY_SOUND_PLAY_NOTE_LIST='播放音符序列';
ZhHans.MIXLY_SOUND_WAIT_FINISH='等待播完';
ZhHans.MIXLY_SOUND_RECORD='录制声音';
ZhHans.MIXLY_SOUND_RECORD_OPTION='录制...';
ZhHans.MIXLY_SOUND_NOTE='音符序列';
ZhHans.MIXLY_SOUND_EFFECT_PITCH='音调';
ZhHans.MIXLY_SOUND_EFFECT_PAN='左右平衡';
ZhHans.MIXLY_SOUND_EFFECT_SET_TO='音效设为';
ZhHans.MIXLY_SOUND_EFFECT_ADD_BY='音效增加';
ZhHans.MIXLY_SOUND_SET_TO='将';
ZhHans.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION_TOOLTIP='播放特定频率的声音';
ZhHans.MIXLY_SOUND_PLAY_FREQUENCY_TOOLTIP='限定时间内播放特定频率的声音';
ZhHans.MIXLY_SOUND_PLAY_NOTE_LIST_TOOLTIP='播放预设的音符序列';
ZhHans.MIXLY_SOUND_PLAY_WAIT_TOOLTIP='阻塞播放声音';
ZhHans.MIXLY_SOUND_PLAY_TOOLTIP='播放声音';
ZhHans.MIXLY_SOUND_NOTE_TOOLTIP='音符序列';
ZhHans.MIXLY_SOUND_STOP_ALL_TOOLTIP='停止所有声音';
ZhHans.MIXLY_SOUND_RECORD_TOOLTIP='录制声音';
ZhHans.MIXLY_SOUND_VOLUME_GET_TOOLTIP='获取音量';
ZhHans.MIXLY_SOUND_VOLUME_SET_TOOLTIP='设置音量';
ZhHans.MIXLY_SOUND_VOLUME_ADD_TOOLTIP='增加音量';
ZhHans.MIXLY_SOUND_EFFECT_SET_TOOLTIP='将音效设为';
ZhHans.MIXLY_SOUND_EFFECT_CLEAR_TOOLTIP='清除音效';
ZhHans.MIXLY_SOUND_EFFECT_ADD_TOOLTIP='将音效增加';
})(); })();

View File

@@ -106,6 +106,7 @@ ZhHant.MSG = {
catOLED: 'OLED顯示屏', catOLED: 'OLED顯示屏',
catMatrix: '點陣屏', catMatrix: '點陣屏',
catFactory: '自定義模組', catFactory: '自定義模組',
catSound: '聲音',
catBlynk: 'Blynk', catBlynk: 'Blynk',
catFile: '文件', catFile: '文件',
catOnenet: 'OneNET', catOnenet: 'OneNET',
@@ -4221,4 +4222,41 @@ ZhHant.MIXLY_ERROR_RATE = '容錯率';
ZhHant.MIXLY_Enlarge_and_scale_to = '寬縮放至'; ZhHant.MIXLY_Enlarge_and_scale_to = '寬縮放至';
ZhHant.MIXLY_High_zoom_level_to = '高縮放至'; ZhHant.MIXLY_High_zoom_level_to = '高縮放至';
ZhHant.MIXLY_OPEN_IMAGE_TOOLTIP = '縮放僅支持8的倍數,填0代表不縮放'; ZhHant.MIXLY_OPEN_IMAGE_TOOLTIP = '縮放僅支持8的倍數,填0代表不縮放';
ZhHant.MIXLY_SOUND_PLAY_WAIT='播放聲音 等待播完';
ZhHant.MIXLY_SOUND_PLAY='播放聲音';
ZhHant.MIXLY_catSoundSOUND_STOP_ALL='停止所有聲音';
ZhHant.MIXLY_catSoundSOUND_PITCH_INCREASE='將音調增加';
ZhHant.MIXLY_catSoundSOUND_PITCH_SET='將音調設為';
ZhHant.MIXLY_catSoundSOUND_CLEAR_EFFECTS='清除音效';
ZhHant.MIXLY_catSoundSOUND_VOLUME_INCREASE='將音量增加';
ZhHant.MIXLY_catSoundSOUND_VOLUME_SET='將音量設為';
ZhHant.MIXLY_catSoundSOUND_VOLUME_GET='音量';
ZhHant.MIXLY_catSoundSOUND_DROPDOWN='Meow';
ZhHant.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION='播放聲音 頻率';
ZhHant.MIXLY_SOUND_FREQUENCY='頻率';
ZhHant.MIXLY_SOUND_DURATION='持續時間';
ZhHant.MIXLY_SOUND_PLAY_NOTE_LIST='播放音符序列';
ZhHant.MIXLY_SOUND_WAIT_FINISH='等待播完';
ZhHant.MIXLY_SOUND_RECORD='錄製聲音';
ZhHant.MIXLY_SOUND_RECORD_OPTION='錄製...';
ZhHant.MIXLY_SOUND_NOTE='音符序列';
ZhHant.MIXLY_SOUND_EFFECT_PITCH='音調';
ZhHant.MIXLY_SOUND_EFFECT_PAN='左右平衡';
ZhHant.MIXLY_SOUND_EFFECT_SET_TO='音效設為';
ZhHant.MIXLY_SOUND_EFFECT_ADD_BY='音效增加';
ZhHant.MIXLY_SOUND_SET_TO='將';
ZhHant.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION_TOOLTIP='播放特定頻率的聲音';
ZhHant.MIXLY_SOUND_PLAY_FREQUENCY_TOOLTIP='限定時間內播放特定頻率的聲音';
ZhHant.MIXLY_SOUND_PLAY_NOTE_LIST_TOOLTIP='播放預設的音符序列';
ZhHant.MIXLY_SOUND_PLAY_WAIT_TOOLTIP='阻塞播放聲音';
ZhHant.MIXLY_SOUND_PLAY_TOOLTIP='播放聲音';
ZhHant.MIXLY_SOUND_NOTE_TOOLTIP='音符序列';
ZhHant.MIXLY_SOUND_STOP_ALL_TOOLTIP='停止所有聲音';
ZhHant.MIXLY_SOUND_RECORD_TOOLTIP='錄製聲音';
ZhHant.MIXLY_SOUND_VOLUME_GET_TOOLTIP='獲取音量';
ZhHant.MIXLY_SOUND_VOLUME_SET_TOOLTIP='設置音量';
ZhHant.MIXLY_SOUND_VOLUME_ADD_TOOLTIP='增加音量';
ZhHant.MIXLY_SOUND_EFFECT_SET_TOOLTIP='將音效設為';
ZhHant.MIXLY_SOUND_EFFECT_CLEAR_TOOLTIP='清除音效';
ZhHant.MIXLY_SOUND_EFFECT_ADD_TOOLTIP='將音效增加';
})(); })();