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 {
|
#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;
|
||||||
}
|
}
|
||||||
@@ -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 './';
|
} 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;
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
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_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>
|
||||||
@@ -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';
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -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='将音效增加';
|
||||||
})();
|
})();
|
||||||
@@ -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='將音效增加';
|
||||||
})();
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user