mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2025-03-04 04:43:43 +08:00
改动
This commit is contained in:
parent
9d4a75cd41
commit
58b312554d
@ -89,8 +89,9 @@ python3 Musicreater.py
|
|||||||
3. 感谢由 Charlie_Ping “查理平” 带来的bdx转换功能
|
3. 感谢由 Charlie_Ping “查理平” 带来的bdx转换功能
|
||||||
4. 感谢由 CMA_2401PT 带来的 BDXWorkShop 供本程序对于bdx操作的指导
|
4. 感谢由 CMA_2401PT 带来的 BDXWorkShop 供本程序对于bdx操作的指导
|
||||||
5. 感谢由 Miracle Plume “神羽” \<QQshenyu40403\>带来的羽音缭绕基岩版音色资源包
|
5. 感谢由 Miracle Plume “神羽” \<QQshenyu40403\>带来的羽音缭绕基岩版音色资源包
|
||||||
6. 感谢广大群友为此程序提供的测试等支持
|
6. 感谢 Arthur Morgan 对本程序的排错提出了最大的支持
|
||||||
7. 若您对我们有所贡献但您的名字没有显示在此列表中,请联系我!
|
7. 感谢广大群友为此程序提供的测试等支持
|
||||||
|
8. 若您对我们有所贡献但您的名字没有显示在此列表中,请联系我!
|
||||||
|
|
||||||
|
|
||||||
### 作者\<*金羿*\>(W-YI)联系方式
|
### 作者\<*金羿*\>(W-YI)联系方式
|
||||||
|
15
README_en.md
15
README_en.md
@ -83,14 +83,15 @@ Musicreater - > function (package) - > the following four new functions
|
|||||||
|
|
||||||
### Thanks
|
### Thanks
|
||||||
|
|
||||||
1. Thank [Fuckcraft](https://github.com/fuckcraft) (“鸣凤鸽子” ,etc) for the function of Creating the Websocket Server for Minecraft: Bedrock Edition.
|
1. Thank [Fuckcraft](https://github.com/fuckcraft) *(“鸣凤鸽子” ,etc)* for the function of Creating the Websocket Server for Minecraft: Bedrock Edition.
|
||||||
- *!! They have given me the rights to directly copy the lib into Musicreater*
|
- *!! They have given me the rights to directly copy the lib into Musicreater*
|
||||||
2. Thank 昀梦\<QQ1515399885\> for finding and correcting the bugs in the commands that *Musicreater* Created.
|
2. Thank *昀梦*\<QQ1515399885\> for finding and correcting the bugs in the commands that *Musicreater* Created.
|
||||||
3. Thank Charlie_Ping “查理平” for bdx convert funtion.
|
3. Thank *Charlie_Ping “查理平”* for bdx convert funtion.
|
||||||
4. Thank CMA_2401PT for BDXWorkShop as the .bdx structure's operation guide.
|
4. Thank *CMA_2401PT* for BDXWorkShop as the .bdx structure's operation guide.
|
||||||
5. Thank Miracle Plume “神羽” \<QQshenyu40403\> for the Miracle Plume Bedrock Edition Audio Resource Pack
|
5. Thank *Miracle Plume “神羽”* \<QQshenyu40403\> for the Miracle Plume Bedrock Edition Audio Resource Pack
|
||||||
6. Thanks for a lot of groupmates who support me and help me to test the program.
|
6. Thank *Arthur Morgan* for his/her biggest support for Musicreater
|
||||||
7. If you have give me some help but u haven't been in the list, please contact me.
|
7. Thanks for a lot of groupmates who support me and help me to test the program.
|
||||||
|
8. If you have give me some help but u haven't been in the list, please contact me.
|
||||||
|
|
||||||
|
|
||||||
### Contact *Eilles(W-YI)*(金羿)
|
### Contact *Eilles(W-YI)*(金羿)
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -4,10 +4,6 @@ import brotli
|
|||||||
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
||||||
|
|
||||||
|
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:7个
|
|
||||||
|
|
||||||
|
|
||||||
class BdxConverter:
|
class BdxConverter:
|
||||||
__header = "BD@"
|
__header = "BD@"
|
||||||
__bin_header = b"BDX"
|
__bin_header = b"BDX"
|
||||||
@ -46,8 +42,8 @@ class BdxConverter:
|
|||||||
:return: list 给出的所有方块种类名称
|
:return: list 给出的所有方块种类名称
|
||||||
"""
|
"""
|
||||||
block_type = set()
|
block_type = set()
|
||||||
for block_ in self.blocks:
|
for block in self.blocks:
|
||||||
block_type.add(block_["block_name"])
|
block_type.add(block["block_name"])
|
||||||
block_type = list(block_type)
|
block_type = list(block_type)
|
||||||
return block_type
|
return block_type
|
||||||
|
|
||||||
@ -78,7 +74,6 @@ class BdxConverter:
|
|||||||
f.write(brotli.compress(_bytes))
|
f.write(brotli.compress(_bytes))
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
def upload_blocks(self):
|
def upload_blocks(self):
|
||||||
"""
|
"""
|
||||||
计算差值
|
计算差值
|
||||||
@ -88,17 +83,17 @@ class BdxConverter:
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
_types = b""
|
_types = b""
|
||||||
for block_ in self.blocks:
|
for block in self.blocks:
|
||||||
# print(f"当前方块:{block['block_name']}, 位置: {block['direction']}]")
|
# print(f"当前方块:{block['block_name']}, 位置: {block['direction']}]")
|
||||||
diff = self.move_pointer(self.direction, block_["direction"])
|
diff = self.move_pointer(self.direction, block["direction"])
|
||||||
_types += diff
|
_types += diff
|
||||||
if block_["block_name"] in ["command_block",
|
if block["block_name"] in ["command_block",
|
||||||
"chain_command_block",
|
"chain_command_block",
|
||||||
"repeating_command_block"]:
|
"repeating_command_block"]:
|
||||||
_types += self.obtain_command_block(block_)
|
_types += self.obtain_command_block(block)
|
||||||
else:
|
else:
|
||||||
_types += self.obtain_universal_block(block_)
|
_types += self.obtain_universal_block(block)
|
||||||
self.direction = block_["direction"]
|
self.direction = block["direction"]
|
||||||
return _types
|
return _types
|
||||||
|
|
||||||
def move_pointer(self, direction: list, new_direction):
|
def move_pointer(self, direction: list, new_direction):
|
||||||
@ -153,21 +148,21 @@ class BdxConverter:
|
|||||||
return pointer_type + num_byte
|
return pointer_type + num_byte
|
||||||
return pointer_type
|
return pointer_type
|
||||||
|
|
||||||
def obtain_universal_block(self, block1):
|
def obtain_universal_block(self, block):
|
||||||
"""
|
"""
|
||||||
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
||||||
:param block1: {block_name: str,particular_value: int}
|
:param block: {block_name: str,particular_value: int}
|
||||||
:return: bytes
|
:return: bytes
|
||||||
"""
|
"""
|
||||||
block_id = b"\x07" + self.block_type.index(block1["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
block_id = b"\x07" + self.block_type.index(block["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
||||||
particular_value = block1["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
particular_value = block["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
||||||
block_header = block_id + particular_value
|
block_header = block_id + particular_value
|
||||||
return block_header
|
return block_header
|
||||||
|
|
||||||
def obtain_command_block(self, block1):
|
def obtain_command_block(self, block):
|
||||||
"""
|
"""
|
||||||
给定一个命令方块,返回命令方块各种数据
|
给定一个命令方块,返回命令方块各种数据
|
||||||
:param block1: {
|
:param block: {
|
||||||
"direction": [x: int, y: int, z: int]
|
"direction": [x: int, y: int, z: int]
|
||||||
"block_name": str,
|
"block_name": str,
|
||||||
"particular_value": int,
|
"particular_value": int,
|
||||||
@ -184,24 +179,23 @@ class BdxConverter:
|
|||||||
:return: bytes of command_block
|
:return: bytes of command_block
|
||||||
"""
|
"""
|
||||||
|
|
||||||
block_id = b"\x1b" + self.block_type.index(block1["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
block_id = b"\x1b" + self.block_type.index(block["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
||||||
particular_value = block1["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
particular_value = block["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
||||||
block_header = block_id + particular_value
|
block_header = block_id + particular_value
|
||||||
for i in [
|
for i in [
|
||||||
block1["impluse"].to_bytes(4, byteorder="big", signed=False),
|
block["impluse"].to_bytes(4, byteorder="big", signed=False),
|
||||||
bytes(block1["command"], encoding="utf-8") + b"\x00",
|
bytes(block["command"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block1["customName"], encoding="utf-8") + b"\x00",
|
bytes(block["customName"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block1["lastOutput"], encoding="utf-8") + b"\x00",
|
bytes(block["lastOutput"], encoding="utf-8") + b"\x00",
|
||||||
block1["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
block["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
||||||
block1["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
block["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
||||||
block1["trackOutput"].to_bytes(1, byteorder="big"),
|
block["trackOutput"].to_bytes(1, byteorder="big"),
|
||||||
block1["conditional"].to_bytes(1, byteorder="big"),
|
block["conditional"].to_bytes(1, byteorder="big"),
|
||||||
block1["needRedstone"].to_bytes(1, byteorder="big")
|
block["needRedstone"].to_bytes(1, byteorder="big")
|
||||||
]:
|
]:
|
||||||
block_header += i
|
block_header += i
|
||||||
return block_header
|
return block_header
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
block = [{"direction": [-1, -1, -1], "block_name": "concrete", "particular_value": 5},
|
block = [{"direction": [-1, -1, -1], "block_name": "concrete", "particular_value": 5},
|
||||||
{"direction": [1, 5, 1], "block_name": "stained_glass", "particular_value": 7},
|
{"direction": [1, 5, 1], "block_name": "stained_glass", "particular_value": 7},
|
||||||
@ -218,4 +212,4 @@ if __name__ == '__main__':
|
|||||||
},
|
},
|
||||||
{"direction": [3, 4, 1], "block_name": "concrete", "particular_value": 6},
|
{"direction": [3, 4, 1], "block_name": "concrete", "particular_value": 6},
|
||||||
{"direction": [-123412133, 4, 1], "block_name": "concrete", "particular_value": 7}]
|
{"direction": [-123412133, 4, 1], "block_name": "concrete", "particular_value": 7}]
|
||||||
bdx = BdxConverter("./test02.bdx", "Charlie_Ping", block)
|
bdx = BdxConverter("./test02.bdx", "Charlie_Ping",block)
|
||||||
|
@ -92,7 +92,7 @@ def funSplit(bigFile, maxCmdLen: int = 10000):
|
|||||||
return parts
|
return parts
|
||||||
|
|
||||||
|
|
||||||
# 注意!播放器应该为个人独立播放器,此处bug需要修改
|
|
||||||
def makeFuncFiles(musicset, path='./'):
|
def makeFuncFiles(musicset, path='./'):
|
||||||
"""在指定目录下生成函数文件"""
|
"""在指定目录下生成函数文件"""
|
||||||
from nmcsup.trans import Note2Cmd
|
from nmcsup.trans import Note2Cmd
|
||||||
@ -139,6 +139,20 @@ def makeFuncFiles(musicset, path='./'):
|
|||||||
log("完成============================")
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def makeFunDir(musicset, path='./'):
|
def makeFunDir(musicset, path='./'):
|
||||||
"""在指定目录下生成函数包文件夹"""
|
"""在指定目录下生成函数包文件夹"""
|
||||||
import os
|
import os
|
||||||
@ -178,37 +192,38 @@ def makeFunDir(musicset, path='./'):
|
|||||||
log("完成============================")
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
def makeNewFuncFiles(musicset, path='./'):
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def makeNewFuncFiles(musicset, path='./', isProsess:bool = False):
|
||||||
"""在指定目录下生成函数文件"""
|
"""在指定目录下生成函数文件"""
|
||||||
from msctspt.transfer import newList_conversion_SinglePlayer
|
from msctspt.transfer import newList_conversion_SinglePlayer
|
||||||
commands = []
|
commands = []
|
||||||
starts = []
|
starts = []
|
||||||
starts.__len__()
|
starts.__len__()
|
||||||
starts.append("scoreboard objectives add " + musicset['musics'][0]['set']['ScoreboardName'] + " dummy\n")
|
starts.append("scoreboard objectives add " + musicset['musics'][0]['set']['ScoreboardName'] + " dummy\n")
|
||||||
starts.append("summon armor_stand " + musicset['musics'][0]['set']['EntityName'] + '\n')
|
# starts.append("summon armor_stand " + musicset['musics'][0]['set']['EntityName'] + '\n')
|
||||||
starts.append("scoreboard objectives setdisplay sidebar " + musicset['musics'][0]['set']['ScoreboardName'] + '\n')
|
# starts.append("scoreboard objectives setdisplay sidebar " + musicset['musics'][0]['set']['ScoreboardName'] + '\n')
|
||||||
starts.append("scoreboard players set @e[type=armor_stand, name=\"" + musicset['musics'][0]['set']['EntityName'] +
|
# starts.append("scoreboard players set @e[type=armor_stand, name=\"" + musicset['musics'][0]['set']['EntityName'] +"\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 0" + '\n')
|
||||||
"\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 0" + '\n')
|
|
||||||
log("=========================正在在此处生成文件:" + path)
|
log("=========================正在在此处生成文件:" + path)
|
||||||
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][0]['set']['EntityName'] + "\"] " +
|
|
||||||
musicset['musics'][0]['set']['ScoreboardName'] + " 1\n")
|
# commands.append("scoreboard players add @e[name=\"" + musicset['musics'][0]['set']['EntityName'] + "\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 1\n")
|
||||||
maxlen = -1
|
maxlen = -1
|
||||||
for i in range(len(musicset['musics'])):
|
for i in range(len(musicset['musics'])):
|
||||||
log('写入第' + str(i) + '个数据')
|
log('写入第' + str(i) + '个数据')
|
||||||
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
|
||||||
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
|
||||||
# [
|
|
||||||
# 'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
|
||||||
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
|
||||||
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
|
||||||
# [
|
|
||||||
# 'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
|
||||||
if len(musicset['musics'][i]['notes']) > maxlen:
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
maxlen = len(musicset['musics'][i]['notes'])
|
maxlen = len(musicset['musics'][i]['notes'])
|
||||||
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
encoding='UTF-8') as f:
|
encoding='UTF-8') as f:
|
||||||
f.writelines(newList_conversion_SinglePlayer(musicset['musics'][i]['notes'],
|
f.writelines(newList_conversion_SinglePlayer(musicset['musics'][i]['notes'],
|
||||||
musicset['musics'][i]['set']['ScoreboardName']))
|
musicset['musics'][i]['set']['ScoreboardName'],
|
||||||
|
musicset['musics'][i]['set']['Instrument']))
|
||||||
if musicset['mainset']['IsRepeat']:
|
if musicset['mainset']['IsRepeat']:
|
||||||
log("增加重复语句")
|
log("增加重复语句")
|
||||||
for i in range(len(musicset['musics'])):
|
for i in range(len(musicset['musics'])):
|
||||||
@ -229,6 +244,19 @@ def makeNewFuncFiles(musicset, path='./'):
|
|||||||
log("完成============================")
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def makeNewFunDir(musicset, path='./'):
|
def makeNewFunDir(musicset, path='./'):
|
||||||
"""在指定目录下生成函数包文件夹"""
|
"""在指定目录下生成函数包文件夹"""
|
||||||
import os
|
import os
|
||||||
|
@ -25,7 +25,7 @@ def hans2pinyin(hans, style=3):
|
|||||||
return final
|
return final
|
||||||
|
|
||||||
|
|
||||||
def classList_conversion_SinglePlayer(List: list, ScoreboardName: str, Instrument: str, playerSelection: str = '',
|
def classList_conversion_SinglePlayer(List: list, ScoreboardName: str, playerSelection: str = '',
|
||||||
isProsess: bool = False) -> list:
|
isProsess: bool = False) -> list:
|
||||||
from bgArrayLib.compute import round_up
|
from bgArrayLib.compute import round_up
|
||||||
from bgArrayLib.pitchStrConstant import pitch
|
from bgArrayLib.pitchStrConstant import pitch
|
||||||
@ -44,7 +44,7 @@ def classList_conversion_SinglePlayer(List: list, ScoreboardName: str, Instrumen
|
|||||||
commands.append(
|
commands.append(
|
||||||
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~{127 - i.velocity} "
|
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~{127 - i.velocity} "
|
||||||
f"~ playsound {Instrument} @s ~ ~ ~ 1000 {pitch.get(str(i.pitch))} 1000\n")
|
f"~ playsound {i.instrument} @s ~ ~ ~ 1000 {pitch.get(str(i.pitch))} 1000\n")
|
||||||
if isProsess:
|
if isProsess:
|
||||||
commands.append(
|
commands.append(
|
||||||
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
|
Binary file not shown.
Binary file not shown.
BIN
测试用/铭刻时间的歌.mid
Normal file
BIN
测试用/铭刻时间的歌.mid
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user