From 483e45dcc2704a8d284fe28a3fa74068094f3341 Mon Sep 17 00:00:00 2001 From: EillesWan Date: Sun, 10 Sep 2023 19:13:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E4=BA=86=E5=90=97=EF=BC=9F=E5=A6=82?= =?UTF-8?q?=E6=88=90=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 13 +-- Musicreater/__init__.py | 4 +- Musicreater/experiment.py | 35 ++++--- Musicreater/plugin/mcstructure.py | 162 +++++++++++++++++++----------- example.py | 2 +- example_mcstructure_rcd_future.py | 13 +++ resources/测试片段.mid | Bin 0 -> 170 bytes resources/测试片段.mscz | Bin 0 -> 5671 bytes 8 files changed, 149 insertions(+), 80 deletions(-) create mode 100644 example_mcstructure_rcd_future.py create mode 100644 resources/测试片段.mid create mode 100644 resources/测试片段.mscz diff --git a/.gitignore b/.gitignore index f6eff6c..e819f29 100644 --- a/.gitignore +++ b/.gitignore @@ -5,12 +5,13 @@ # mystuff /.vscode -*.mid -*.midi -*.mcpack -*.bdx -*.json -*.mcstructure +/*.mid +/*.midi +/*.mcpack +/*.bdx +/*.json +/*.mcstructure +.mscbackup /logs /languages /llc_cli.py diff --git a/Musicreater/__init__.py b/Musicreater/__init__.py index b35b252..f7b9666 100644 --- a/Musicreater/__init__.py +++ b/Musicreater/__init__.py @@ -17,8 +17,8 @@ Terms & Conditions: License.md in the root directory # 若需转载或借鉴 许可声明请查看仓库目录下的 License.md -__version__ = "1.4.1" -__vername__ = "提高mcstructure结构的兼容性" +__version__ = "1.4.2" +__vername__ = "优质的红石音乐生成&更好的线性插值算法" __author__ = ( ("金羿", "Eilles Wan"), ("诸葛亮与八卦阵", "bgArray"), diff --git a/Musicreater/experiment.py b/Musicreater/experiment.py index fa4ab6b..88522ee 100644 --- a/Musicreater/experiment.py +++ b/Musicreater/experiment.py @@ -171,6 +171,7 @@ class FutureMidiConvertM4(MidiConvert): :return list[tuple(int开始时间(毫秒), int乐器, int音符, int力度(内置), float音量(播放)),]""" totalCount = int(_note.duration / _apply_time_division) + if totalCount == 0: return [ (_note.start_time, _note.inst, _note.pitch, _note.velocity, 1), @@ -277,7 +278,7 @@ class FutureMidiConvertM4(MidiConvert): for note in track: for every_note in self._linear_note( - note, 50 if note.track_no == 0 else 500 + note, 100 if note.track_no == 0 else 500 ): soundID, _X = ( self.perc_inst_to_soundID_withX(note.pitch) @@ -334,7 +335,7 @@ class FutureMidiConvertM4(MidiConvert): max_volume: float = 1.0, speed: float = 1.0, player_selector: str = "@a", - ) -> Tuple[List[SingleCommand], int]: + ) -> Tuple[List[SingleCommand], int, int]: """ 使用金羿的转换思路,使用完全填充算法优化音感后,将midi转换为我的世界命令列表,并输出每个音符之后的延迟 @@ -349,7 +350,7 @@ class FutureMidiConvertM4(MidiConvert): Returns ------- - tuple( list[SingleCommand,...], int音乐时长游戏刻 ) + tuple( list[SingleCommand,...], int音乐时长游戏刻, int最大同时播放的指令数量 ) """ if speed == 0: @@ -410,9 +411,10 @@ class FutureMidiConvertM4(MidiConvert): SpecialBits = True if no == 9 else False for note in track: - for every_note in self._linear_note( - note, 50 if note.track_no == 0 else 500 - ): + liner_list = self._linear_note( + note, 100 if note.track_no == 0 else 500 + ) + for every_note in liner_list: soundID, _X = ( self.perc_inst_to_soundID_withX(note.pitch) if SpecialBits @@ -444,10 +446,14 @@ class FutureMidiConvertM4(MidiConvert): all_ticks = list(tracks.keys()) all_ticks.sort() - results = [] + results:List[SingleCommand] = [] + max_multi = 0 + now_multi_delay = 0 + now_multi = 0 for i in range(len(all_ticks)): - for j in range(len(tracks[all_ticks[i]])): + l = len(tracks[all_ticks[i]]) + for j in range(l): results.append( SingleCommand( tracks[all_ticks[i]][j], @@ -460,15 +466,20 @@ class FutureMidiConvertM4(MidiConvert): else all_ticks[i] ) ), - annotation="在{}播放{}%的{}音".format( - mctick2timestr(i), max_volume * 100, "" - ), + annotation="由 音·创 生成", ) ) + if results[-1].delay + now_multi_delay <= 1: + now_multi += 1 + now_multi_delay += results[-1].delay + else: + max_multi = max(max_multi, now_multi) + now_multi = 0 + now_multi_delay = 0 self.music_command_list = results self.music_tick_num = max(all_ticks) - return results, self.music_tick_num + return results, self.music_tick_num, max_multi class FutureMidiConvertM5(MidiConvert): diff --git a/Musicreater/plugin/mcstructure.py b/Musicreater/plugin/mcstructure.py index 4169f0e..f0dd9e3 100644 --- a/Musicreater/plugin/mcstructure.py +++ b/Musicreater/plugin/mcstructure.py @@ -349,93 +349,137 @@ def commands_to_redstone_delay_structure( goahead = forward_IER(forward) + command_actually_length = sum([int(bool(cmd.delay))for cmd in commands]) + + a = 1 + for cmd in commands: + # print("\r 正在进行处理:",end="") + if cmd.delay > 2: + a = 1 + else: + a += 1 + + struct = Structure( size=( - round(delay_length / 2 + 0.5 + len(commands)) + round(delay_length / 2 + command_actually_length) if extensioon_direction == x - else max_multicmd_length, + else a, 3, - round(delay_length / 2 + 0.5 + len(commands)) + round(delay_length / 2 + command_actually_length) if extensioon_direction == z - else max_multicmd_length, + else a, ), + fill=Block('minecraft','air',compability_version=compability_version_), compability_version=compability_version_, ) pos_now = { - x: (0 if forward else struct.size[0]), + x: ((1 if extensioon_direction == x else 0) if forward else struct.size[0]), y: 0, - z: (0 if forward else struct.size[2]), + z: ((1 if extensioon_direction == z else 0) if forward else struct.size[2]), } - first_impluse = True + chain_list = 0 + # print("结构元信息设定完毕") for cmd in commands: - single_repeater_value = round(cmd.delay / 2) % 4 - 1 - additional_repeater = round(cmd.delay / 2) // 4 - for i in range(additional_repeater): - struct.set_block( - tuple(pos_now.values()), - Block( - "minecraft", - base_block, - compability_version=compability_version_, - ), - ) + # print("\r 正在进行处理:",end="") + if cmd.delay > 1: + # print("\rdelay > 0",end='') + single_repeater_value = int(cmd.delay / 2) % 4 - 1 + additional_repeater = int(cmd.delay / 2 // 4) + for i in range(additional_repeater): + struct.set_block( + tuple(pos_now.values()),# type: ignore + Block( + "minecraft", + base_block, + compability_version=compability_version_, + ), + ) + struct.set_block( + (pos_now[x], 1, pos_now[z]), + form_repeater_in_NBT_struct( + delay=3, + facing=repeater_facing, + compability_version_number=compability_version_, + ), + ) + pos_now[extensioon_direction] += goahead + if single_repeater_value >= 0: + struct.set_block( + tuple(pos_now.values()),# type: ignore + Block( + "minecraft", + base_block, + compability_version=compability_version_, + ), + ) + struct.set_block( + (pos_now[x], 1, pos_now[z]), + form_repeater_in_NBT_struct( + delay=single_repeater_value, + facing=repeater_facing, + compability_version_number=compability_version_, + ), + ) + pos_now[extensioon_direction] += goahead struct.set_block( (pos_now[x], 1, pos_now[z]), - form_repeater_in_NBT_struct( - delay=3, - facing=repeater_facing, + form_command_block_in_NBT_struct( + command=cmd.command_text, + coordinate=(pos_now[x], 1, pos_now[z]), + particularValue=command_statevalue(extensioon_direction, forward), + # impluse= (0 if first_impluse else 2), + impluse=0, + condition=False, + alwaysRun=False, + tickDelay=cmd.delay % 2, + customName=cmd.annotation_text, compability_version_number=compability_version_, ), ) - pos_now[extensioon_direction] += goahead - first_impluse = True - if single_repeater_value >= 0: struct.set_block( - tuple(pos_now.values()), + (pos_now[x], 2, pos_now[z]), Block( "minecraft", - base_block, + "redstone_wire", compability_version=compability_version_, ), ) + pos_now[extensioon_direction] += goahead + chain_list = 1 + + else: + # print(pos_now) + now_pos_copy = pos_now.copy() + now_pos_copy[extensioon_direction] -= goahead + now_pos_copy[aside_direction] += chain_list + # print(pos_now,"\n=========") struct.set_block( - (pos_now[x], 1, pos_now[z]), - form_repeater_in_NBT_struct( - delay=single_repeater_value, - facing=repeater_facing, + (now_pos_copy[x], 1, now_pos_copy[z]), + form_command_block_in_NBT_struct( + command=cmd.command_text, + coordinate=(now_pos_copy[x], 1, now_pos_copy[z]), + particularValue=command_statevalue(extensioon_direction, forward), + # impluse= (0 if first_impluse else 2), + impluse=0, + condition=False, + alwaysRun=False, + tickDelay=cmd.delay % 2, + customName=cmd.annotation_text, compability_version_number=compability_version_, ), ) - pos_now[extensioon_direction] += goahead - first_impluse = True - struct.set_block( - (pos_now[x], 1, pos_now[z]), - form_command_block_in_NBT_struct( - command=cmd.command_text, - coordinate=(pos_now[x], 1, pos_now[z]), - particularValue=command_statevalue(extensioon_direction, forward), - # impluse= (0 if first_impluse else 2), - impluse=0, - condition=False, - alwaysRun=False, - tickDelay=0, - customName=cmd.annotation_text, - compability_version_number=compability_version_, - ), - ) - struct.set_block( - (pos_now[x], 2, pos_now[z]), - Block( - "minecraft", - "redstone_wire", - compability_version=compability_version_, - ), - ) - pos_now[extensioon_direction] += goahead + struct.set_block( + (now_pos_copy[x], 2, now_pos_copy[z]), + Block( + "minecraft", + "redstone_wire", + compability_version=compability_version_, + ), + ) + chain_list += 1 - first_impluse = False - - return struct, struct.size, tuple(pos_now.values()) + return struct, struct.size, tuple(pos_now.values())# type: ignore diff --git a/example.py b/example.py index 8bb99da..3274662 100644 --- a/example.py +++ b/example.py @@ -103,7 +103,7 @@ else: print(f"正在处理 {midi_path} :") -cvt_mid = Musicreater.MidiConvert.from_midi_file(midi_path, old_exe_format=False) +cvt_mid = Musicreater.MidiConvert.from_midi_file(midi_path, old_exe_format=True) cvt_cfg = ConvertConfig(out_path, *prompts[:3]) print( diff --git a/example_mcstructure_rcd_future.py b/example_mcstructure_rcd_future.py new file mode 100644 index 0000000..7c0bc49 --- /dev/null +++ b/example_mcstructure_rcd_future.py @@ -0,0 +1,13 @@ +import Musicreater.experiment +import Musicreater.plugin +import Musicreater.plugin.mcstructfile + +print( + Musicreater.plugin.mcstructfile.to_mcstructure_file_in_redstone_CD( + Musicreater.experiment.FutureMidiConvertM4.from_midi_file(input("midi路径:"), old_exe_format=False), + Musicreater.plugin.ConvertConfig( + input("输出路径:"), + volume=1 + ), + ) +) diff --git a/resources/测试片段.mid b/resources/测试片段.mid new file mode 100644 index 0000000000000000000000000000000000000000..0e4513a8ace4f374df68d059eb1f3f40e5c03773 GIT binary patch literal 170 zcmW;DK?;IE07l_|RGbKg7Hw*mC+Gqpf=D)vSYl{Mix?M0P}r{J*rIKVF3=4;LPzN) z)6nwq@sj*d18_k=$T!KaCsQwI+g%;^=L?`q$FW8|=&fZ$uWkCCpt}JdprbYV0V-f; z$Rog$XG(IgIBQ~1p0^v0VOlh)iK5}4qIe7hTF;*;>4ODJB?GXqQZfXK#C;xNEEY-% NFrNK~vJoJ9iXTa9D8K*! literal 0 HcmV?d00001 diff --git a/resources/测试片段.mscz b/resources/测试片段.mscz new file mode 100644 index 0000000000000000000000000000000000000000..be9c5d9d802c35702958c4f0b1a257e34248e322 GIT binary patch literal 5671 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 literal 0 HcmV?d00001