From 3b6d7863466d507ed6743185827843c01df21cac Mon Sep 17 00:00:00 2001 From: Eilles Date: Fri, 3 Jul 2026 18:31:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=B2=BE=E7=A1=AE=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=AE=9E=E9=99=85=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builtin_plugins/midi_read/utils.py | 2 +- .../builtin_plugins/to_commands/main.py | 6 +-- Musicreater/data.py | 39 ++++++++++++------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/Musicreater/builtin_plugins/midi_read/utils.py b/Musicreater/builtin_plugins/midi_read/utils.py index af45607..c7d0587 100644 --- a/Musicreater/builtin_plugins/midi_read/utils.py +++ b/Musicreater/builtin_plugins/midi_read/utils.py @@ -208,7 +208,7 @@ def midi_msgs_to_noteinfo( start_tick=(tk := int(start_time / float(play_speed) / 50000)), keep_tick=round(duration / float(play_speed) / 50000), mass_precision_time=round( - (start_time / float(play_speed) - tk * 50000) / 800 + (start_time / float(play_speed) - tk * 50000) / 200 ), extra_information={ "LYRIC_TEXT": lyric_line, diff --git a/Musicreater/builtin_plugins/to_commands/main.py b/Musicreater/builtin_plugins/to_commands/main.py index b0776b2..9f693dd 100644 --- a/Musicreater/builtin_plugins/to_commands/main.py +++ b/Musicreater/builtin_plugins/to_commands/main.py @@ -592,7 +592,7 @@ class NoteDataConvert2CommandPlugin(LibraryPluginBase): for note in music.get_minenotes( start_time=0, ): - if (tickdelay := (note.start_tick - delaytime_previous)) == 0: + if (tickdelay := (note.precise_tick - delaytime_previous)) == 0: multi += 1 else: max_multi = max(max_multi, multi) @@ -631,10 +631,10 @@ class NoteDataConvert2CommandPlugin(LibraryPluginBase): mc_pitch, ) ), - delay=tickdelay, + delay=int(tickdelay), ), ) - delaytime_previous = note.start_tick + delaytime_previous = note.precise_tick last_note = note if music_command_list: return ( diff --git a/Musicreater/data.py b/Musicreater/data.py index 1435479..afa1de9 100644 --- a/Musicreater/data.py +++ b/Musicreater/data.py @@ -152,7 +152,7 @@ class SingleNote: """音符持续时间 命令刻""" high_precision_start_time: int - """高精度开始时间偏量 1/1250 秒""" + """高精度开始时间偏量 1/5000 秒""" extra_info: Dict[str, Any] """你觉得放什么好?""" @@ -181,7 +181,7 @@ class SingleNote: last_time: int 音符延续时间(命令刻) mass_precision_time: int - 高精度的开始时间偏移量(1/1250秒) + 高精度的开始时间偏移量(1/5000秒) is_percussion: bool 是否作为打击乐器 extra_information: Dict[str, Any] @@ -205,6 +205,11 @@ class SingleNote: self.extra_info = extra_information if extra_information else {} + @property + def precise_start_time(self) -> float: + """高精度开始时间""" + return self.start_time + self.high_precision_start_time / 250 + @classmethod def decode(cls, code_buffer: bytes, is_high_time_precision: bool = True): """自字节码析出 SingleNote 类""" @@ -261,7 +266,7 @@ class SingleNote: # duration 17 位 支持到 131071 即 109.22583 分钟 合 1.8204305 小时 # 共 48 位 合 6 字节 - # high_time_precision(可选)长度 8 位 支持到 255 合 1 字节 支持 1/1250 秒] + # high_time_precision(可选)长度 8 位 支持到 255 合 1 字节 单位为 1/5000 秒] return ( ( @@ -379,13 +384,18 @@ class MineNote: """开始之时 命令刻""" duration_tick: int """音符持续时间 命令刻""" - persiced_time: int - """高精度开始时间偏量 1/1250 秒""" + start_time_offset: int + """高精度开始时间偏量 1/5000 秒""" percussive: bool """是否作为打击乐器启用""" position: SoundAtmos """声像方位""" + @property + def precise_tick(self) -> float: + """高精度开始时间""" + return self.start_tick + self.start_time_offset / 250 + @classmethod def from_single_note( cls, @@ -412,7 +422,7 @@ class MineNote: volume=note.volume + adjust_note_volume, start_tick=note.start_time, duration_tick=note.duration, - persiced_time=note.high_precision_start_time if is_persiced_time else 0, + start_time_offset=note.high_precision_start_time if is_persiced_time else 0, percussive=is_percussive_note, position=sound_position, ) @@ -567,7 +577,7 @@ class SingleTrack(List[SingleNote]): 通过时间范围来复制音轨,返回一个音轨 """ single_track = SingleTrack.from_note_list( - [x for x in self if start_time <= x.start_time <= end_time], + [x for x in self if start_time <= x.precise_start_time <= end_time], track_instrument=self.instrument, precise_time=self.is_high_time_precision, percussion=self.is_percussive, @@ -600,13 +610,13 @@ class SingleTrack(List[SingleNote]): if curve is not None: curve.delete(start_time, end_time) for i, note in enumerate(self): - if start_time <= note.start_time <= end_time: + if start_time <= note.precise_start_time <= end_time: del self[i] def get(self, time: int) -> Generator[SingleNote, None, None]: """通过确切的开始时间来获取音符""" - return (x for x in self if x.start_time == time) + return (x for x in self if x.precise_start_time == time) def get_notes( self, start_time: float, end_time: float = inf @@ -622,13 +632,14 @@ class SingleTrack(List[SingleNote]): raise ParameterValueError( "获取音符的时间范围有误,终止时间`{}`不可为负数".format(end_time) ) - elif start_time <= 0 and end_time >= self[-1].start_time: + elif start_time <= 0 and end_time >= self[-1].precise_start_time: return iter(self) return ( x for x in self - if (x.start_time >= start_time) and (x.start_time <= end_time) + if (x.precise_start_time >= start_time) + and (x.precise_start_time <= end_time) ) def get_minenotes( @@ -644,7 +655,7 @@ class SingleTrack(List[SingleNote]): is_percussive_note=self.is_percussive, sound_position=self.sound_position, **{ - item.value: argcrv.value_at(_note.start_time) + item.value: argcrv.value_at(_note.precise_start_time) for item in CurvableParam if (argcrv := self.argument_curves[item]) }, @@ -673,7 +684,7 @@ class SingleTrack(List[SingleNote]): is_percussive_note=self.is_percussive, sound_position=self.sound_position, **{ - item.value: argcrv.value_at(_note.start_time) + item.value: argcrv.value_at(_note.precise_start_time) for item in CurvableParam if (argcrv := self.argument_curves[item]) }, @@ -851,7 +862,7 @@ class SingleMusic(List[SingleTrack]): return iter(()) return self.yield_from_tracks( [track.get_notes(start_time, end_time) for track in self.music_tracks], - sort_key=lambda x: x.start_time, + sort_key=lambda x: x.precise_start_time, ) def get_minenotes(