diff --git a/Musicreater/__init__.py b/Musicreater/__init__.py index f85a5fa..452e464 100644 --- a/Musicreater/__init__.py +++ b/Musicreater/__init__.py @@ -22,8 +22,8 @@ The Licensor of Musicreater("this project") is Eilles, bgArray. # 若需转载或借鉴 许可声明请查看仓库目录下的 License.md -__version__ = "2.3.0.2" -__vername__ = "FSQ 完全流式音符读写适配,修复插件的兼容性问题" +__version__ = "2.3.1" +__vername__ = "新增部分新可指定的默认值" __author__ = ( ("金羿", "Eilles"), ("诸葛亮与八卦阵", "bgArray"), @@ -42,6 +42,7 @@ __all__ = [ "ProgressBarStyle", # "TimeStamp", 未来功能 # 默认值 + "MIDI_DEFAULT_PROGRAM_VALUE", "DEFAULT_PROGRESSBAR_STYLE", "MM_INSTRUMENT_RANGE_TABLE", "MM_CLASSIC_PITCHED_INSTRUMENT_TABLE", diff --git a/Musicreater/constants.py b/Musicreater/constants.py index ea971de..294ef69 100644 --- a/Musicreater/constants.py +++ b/Musicreater/constants.py @@ -37,6 +37,10 @@ z # Midi用对照表 +MIDI_DEFAULT_PROGRAM_VALUE: int = ( + 74 # 当 Midi 本身与用户皆未指定音色时,默认 Flute 长笛 +) + MIDI_PITCH_NAME_TABLE: Dict[int, str] = { 0: "C", 1: "C#", @@ -430,6 +434,33 @@ MC_INSTRUMENT_BLOCKS_TABLE: Dict[str, Tuple[str, ...]] = { } """MC乐器对音符盒下垫方块对照表""" +MC_EILLES_RTJE12_INSTRUMENT_REPLACE_TABLE: Dict[str, str] = { + "note.iron_xylophone": "note.xylophone", + "note.cow_bell": "note.xylophone", + "note.didgeridoo": "note.guitar", + "note.bit": "note.harp", + "note.banjo": "note.flute", + "note.pling": "note.harp", +} +"""在 Minecraft JE 1.12 ~ JE 1.14 的版本中,部分乐器是没有的,这是金羿的乐器替换表""" + +MC_EILLES_RTBETA_INSTRUMENT_REPLACE_TABLE: Dict[str, str] = { + # lt je 12 + "note.bell": "note.harp", + "note.flute": "note.harp", + "note.chime": "note.harp", + "note.guitar": "note.bass", + "note.xylophone": "note.hat", + # rt je 12 + "note.iron_xylophone": "note.hat", + "note.cow_bell": "note.ha", + "note.didgeridoo": "note.bass", + "note.bit": "note.harp", + "note.banjo": "note.harp", + "note.pling": "note.harp", +} +"""在 Minecraft JE Beta1.2 / BE 0.13.0 ~ JE 1.12 / BE 1.13.0 的版本中,部分乐器是没有的,这是金羿的乐器替换表""" + # Midi对MC通用对照表 MM_INSTRUMENT_RANGE_TABLE: Dict[str, Tuple[Tuple[int, int], int]] = { diff --git a/Musicreater/main.py b/Musicreater/main.py index a02363b..c2bdf14 100644 --- a/Musicreater/main.py +++ b/Musicreater/main.py @@ -163,6 +163,7 @@ class MusicSequence: midi_music_name: str, mismatch_error_ignorance: bool = True, speed_multiplier: float = 1, + default_midi_program: int = MIDI_DEFAULT_PROGRAM_VALUE, default_tempo: int = mido.midifiles.midifiles.DEFAULT_TEMPO, pitched_note_referance_table: MidiInstrumentTableType = MM_TOUCH_PITCHED_INSTRUMENT_TABLE, percussion_note_referance_table: MidiInstrumentTableType = MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE, @@ -184,6 +185,8 @@ class MusicSequence: 是否在导入时忽略音符不匹配错误 speed_multiplier: float 音乐播放速度倍数 + default_midi_program: int + 默认的MIDI Program值 default_tempo: int 默认的MIDI TEMPO值 pitched_note_referance_table: Dict[int, Tuple[str, int]] @@ -196,7 +199,10 @@ class MusicSequence: 声像偏移拟合函数 deviation: float 全曲音调偏移值 + note_referance_table_replacement: Dict[str, str] + MC 音符乐器替换表,如果在不希望使用某种 MC 乐器的时候进行替换 """ + if mido_file: ( note_channels, @@ -205,9 +211,9 @@ class MusicSequence: ) = cls.to_music_note_channels( midi=mido_file, speed=speed_multiplier, - default_program_value=-1, # TODO 默认音色可调 pitched_note_rtable=pitched_note_referance_table, percussion_note_rtable=percussion_note_referance_table, + default_program_value=default_midi_program, default_tempo_value=default_tempo, vol_processing_function=volume_processing_function, ignore_mismatch_error=mismatch_error_ignorance, @@ -806,6 +812,8 @@ class MusicSequence: 打击乐器Midi-MC对照表 vol_processing_function: Callable[[float], float] 声像偏移拟合函数 + note_rtable_replacement: Dict[str, str] + 音符名称替换表,此表用于对 Minecraft 乐器名称进行替换,而非 Midi Program 的替换 Returns ------- @@ -976,12 +984,14 @@ class MidiConvert(MusicSequence): midi_name: str, ignore_mismatch_error: bool = True, playment_speed: float = 1, + default_midi_program_value: int = MIDI_DEFAULT_PROGRAM_VALUE, default_tempo_value: int = mido.midifiles.midifiles.DEFAULT_TEMPO, pitched_note_rtable: MidiInstrumentTableType = MM_TOUCH_PITCHED_INSTRUMENT_TABLE, percussion_note_rtable: MidiInstrumentTableType = MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE, enable_old_exe_format: bool = False, minimum_volume: float = 0.1, vol_processing_function: FittingFunctionType = natural_curve, + pitch_deviation: float = 0, note_rtable_replacement: Dict[str, str] = {}, ): """ @@ -993,12 +1003,14 @@ class MidiConvert(MusicSequence): 需要处理的midi对象 midi_name: str 此音乐之名称 - ignore_mismatch_error: bool + ignore_mismatch_error: bool 是否在导入时忽略音符不匹配错误 playment_speed: float 音乐播放速度倍数 + default_midi_program_value: int + 默认的 MIDI Program 值,当 Midi 文件没有指定 Program 值时,使用此值 default_tempo_value: int - 默认的MIDI TEMPO值 + 默认的 MIDI TEMPO 值,同上理 pitched_note_rtable: Dict[int, Tuple[str, int]] 乐音乐器Midi-MC对照表 percussion_note_rtable: Dict[int, Tuple[str, int]] @@ -1009,6 +1021,10 @@ class MidiConvert(MusicSequence): 最小播放音量 vol_processing_function: Callable[[float], float] 声像偏移拟合函数 + pitch_deviation: float + 音调偏移量,手动指定全曲音调偏移量 + note_rtable_replacement: Dict[str, str] + Minecraft 音符 ID 替换表,可在不希望使用某些乐器的时候进行替换 """ cls.enable_old_exe_format: bool = enable_old_exe_format @@ -1027,12 +1043,13 @@ class MidiConvert(MusicSequence): midi_music_name=midi_name, mismatch_error_ignorance=ignore_mismatch_error, speed_multiplier=playment_speed, + default_midi_program=default_midi_program_value, default_tempo=default_tempo_value, pitched_note_referance_table=pitched_note_rtable, percussion_note_referance_table=percussion_note_rtable, minimum_vol=minimum_volume, volume_processing_function=vol_processing_function, - deviation=0, # 加么?感觉不加也没问题……? + deviation=pitch_deviation, note_referance_table_replacement=note_rtable_replacement, ) @@ -1042,25 +1059,29 @@ class MidiConvert(MusicSequence): midi_file_path: str, mismatch_error_ignorance: bool = True, play_speed: float = 1, + default_midi_program: int = MIDI_DEFAULT_PROGRAM_VALUE, default_tempo: int = mido.midifiles.midifiles.DEFAULT_TEMPO, pitched_note_table: MidiInstrumentTableType = MM_TOUCH_PITCHED_INSTRUMENT_TABLE, percussion_note_table: MidiInstrumentTableType = MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE, old_exe_format: bool = False, min_volume: float = 0.1, vol_processing_func: FittingFunctionType = natural_curve, + music_pitch_deviation: float = 0, note_table_replacement: Dict[str, str] = {}, ): """ - 直接输入文件地址,将midi文件读入 + 直接输入文件地址,将 midi 文件读入 Parameters ---------- midi_file_path: str midi文件地址 - mismatch_error_ignorance bool + mismatch_error_ignorance: bool 是否在导入时忽略音符不匹配错误 play_speed: float 音乐播放速度倍数 + default_midi_program: int + 默认的 MIDI Program 值,当 Midi 文件没有指定 Program 值时,使用此值 default_tempo: int 默认的MIDI TEMPO值 pitched_note_table: Dict[int, Tuple[str, int]] @@ -1073,6 +1094,10 @@ class MidiConvert(MusicSequence): 最小播放音量 vol_processing_func: Callable[[float], float] 声像偏移拟合函数 + music_pitch_deviation: float + 全曲音符的音调偏移量 + note_table_replacement: Dict[str, str] + 音符 ID 替换表,用于在不希望使用某些 Minecraft 乐器的时候替换之 """ midi_music_name = os.path.splitext(os.path.basename(midi_file_path))[0].replace( @@ -1089,12 +1114,14 @@ class MidiConvert(MusicSequence): midi_name=midi_music_name, ignore_mismatch_error=mismatch_error_ignorance, playment_speed=play_speed, + default_midi_program_value=default_midi_program, default_tempo_value=default_tempo, pitched_note_rtable=pitched_note_table, percussion_note_rtable=percussion_note_table, enable_old_exe_format=old_exe_format, minimum_volume=min_volume, vol_processing_function=vol_processing_func, + pitch_deviation=music_pitch_deviation, note_rtable_replacement=note_table_replacement, ) except (ValueError, TypeError) as E: @@ -1138,7 +1165,7 @@ class MidiConvert(MusicSequence): | `%%%` | 当前进度比率 | | `_` | 用以表示进度条占位| """ - perEach = max_score / pgs_style.count("_") + per_value_in_each = max_score / pgs_style.count("_") """每个进度条代表的分值""" result: List[MineCommand] = [] @@ -1337,7 +1364,7 @@ class MidiConvert(MusicSequence): self.execute_cmd_head.format( r"@a[scores={" + scoreboard_name - + f"={int(i * perEach)}..{math.ceil((i + 1) * perEach)}" + + f"={int(i * per_value_in_each)}..{math.ceil((i + 1) * per_value_in_each)}" + r"}]" ) + r'titleraw @s actionbar {"rawtext":[{"text":"' diff --git a/Musicreater/utils.py b/Musicreater/utils.py index 582c7f6..dd80d61 100644 --- a/Musicreater/utils.py +++ b/Musicreater/utils.py @@ -271,6 +271,7 @@ def midi_msgs_to_minenote( :param play_speed: float 曲目播放速度 :param midi_reference_table: Dict[int, str] 转换对照表 :param volume_proccessing_method_: Callable[[float], float] 音量处理函数 + :param note_table_replacement: Dict[str, str] 音符替换表,定义 Minecraft 音符字串的替换 :return MineNote我的世界音符对象 """ diff --git a/let_future_java.py b/let_future_java.py index bb6f56d..2a1586e 100644 --- a/let_future_java.py +++ b/let_future_java.py @@ -123,14 +123,7 @@ msc_cvt = Musicreater.experiment.FutureMidiConvertJavaE.from_midi_file( input("midi路径:"), play_speed=float(input("播放速度:")), old_exe_format=True, - note_table_replacement={ - "note.iron_xylophone": "note.xylophone", - "note.cow_bell": "note.xylophone", - "note.didgeridoo": "note.guitar", - "note.bit": "note.harp", - "note.banjo": "note.flute", - "note.pling": "note.harp", - }, + note_table_replacement=Musicreater.MC_EILLES_RTJE12_INSTRUMENT_REPLACE_TABLE, # pitched_note_table=Musicreater.MM_NBS_PITCHED_INSTRUMENT_TABLE, )