online加声音目录
This commit is contained in:
17
boards/default_src/python_pyodide/blocks/sound/effect/add.js
Normal file
17
boards/default_src/python_pyodide/blocks/sound/effect/add.js
Normal 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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
26
boards/default_src/python_pyodide/blocks/sound/play/play.js
Normal file
26
boards/default_src/python_pyodide/blocks/sound/play/play.js
Normal 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;
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
15
boards/default_src/python_pyodide/blocks/sound/volume/add.js
Normal file
15
boards/default_src/python_pyodide/blocks/sound/volume/add.js
Normal 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);
|
||||
}
|
||||
};
|
||||
11
boards/default_src/python_pyodide/blocks/sound/volume/get.js
Normal file
11
boards/default_src/python_pyodide/blocks/sound/volume/get.js
Normal 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);
|
||||
}
|
||||
};
|
||||
15
boards/default_src/python_pyodide/blocks/sound/volume/set.js
Normal file
15
boards/default_src/python_pyodide/blocks/sound/volume/set.js
Normal 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);
|
||||
}
|
||||
};
|
||||
@@ -203,4 +203,14 @@ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTr
|
||||
#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/factory4.png') no-repeat;
|
||||
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;
|
||||
}
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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";
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -0,0 +1,6 @@
|
||||
export const sound_note = function(_block, generator) {
|
||||
const note = _block.getFieldValue("NOTE") || "NOTE_A4";
|
||||
return [`"${note}"`, generator.ORDER_ATOMIC];
|
||||
};
|
||||
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -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];
|
||||
};
|
||||
@@ -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`;
|
||||
};
|
||||
@@ -75,6 +75,7 @@ import {
|
||||
} from './';
|
||||
|
||||
import './others/loader';
|
||||
import sound from './others/sound.js';
|
||||
|
||||
import './css/color_mixpy_python_advance.css';
|
||||
|
||||
@@ -151,4 +152,83 @@ Object.assign(
|
||||
PythonMixpyTurtleGenerators,
|
||||
PythonPyodideSKLearnGenerators,
|
||||
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;
|
||||
@@ -1,6 +1,7 @@
|
||||
import NavExt from './nav-ext';
|
||||
import * as tf from '@tensorflow/tfjs';
|
||||
import './tensorflow';
|
||||
import './sound.js';
|
||||
|
||||
import * as Blockly from 'blockly/core';
|
||||
NavExt.init();
|
||||
@@ -292,7 +293,10 @@ async function createModal() {
|
||||
|
||||
createModal();
|
||||
|
||||
await loadAndDisplayAllModels();
|
||||
// 使用立即执行的异步函数,避免 top-level await 导致模块异步加载
|
||||
(async () => {
|
||||
await loadAndDisplayAllModels();
|
||||
})();
|
||||
|
||||
function openModal() {
|
||||
loadAndDisplayAllModels();
|
||||
|
||||
@@ -71,6 +71,9 @@ export default class PythonShell {
|
||||
this.pyodide.setInterruptBuffer(this.interruptBuffer);
|
||||
this.kernelLoaded = true;
|
||||
this.$loader.remove();
|
||||
if (this.$loader && this.$loader.remove) {
|
||||
this.$loader.remove();
|
||||
}
|
||||
this.$loader = null;
|
||||
}
|
||||
|
||||
|
||||
1655
boards/default_src/python_pyodide/others/sound.js
Normal file
1655
boards/default_src/python_pyodide/others/sound.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3859,4 +3859,63 @@
|
||||
<block type="factory_block_with_textarea"></block>
|
||||
<block type="factory_block_return_with_textarea"></block>
|
||||
</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>
|
||||
Reference in New Issue
Block a user