diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc index 25db3d0..02a9369 100644 Binary files a/__pycache__/main.cpython-38.pyc and b/__pycache__/main.cpython-38.pyc differ diff --git a/example_convert_bdx.py b/example_convert_bdx.py index c4ade89..87df11a 100644 --- a/example_convert_bdx.py +++ b/example_convert_bdx.py @@ -6,4 +6,4 @@ from main import * -midiConvert(input('请输入midi文件路径:'), input('请输入输出路径:')).toBDXfile(1,input('请输入作者:'),int(input('请输入指令结构最大生成高度:')),input('请输入计分板名称:'),float(input('请输入音量(0-1]:')),float(input('请输入速度倍率:'))) \ No newline at end of file +print(midiConvert(input('请输入midi文件路径:'), input('请输入输出路径:')).toBDXfile(1,input('请输入作者:'),int(input('请输入指令结构最大生成高度:')),input('请输入计分板名称:'),float(input('请输入音量(0-1]:')),float(input('请输入速度倍率:')))) \ No newline at end of file diff --git a/example_convert_mcpack.py b/example_convert_mcpack.py index f1ddb31..3a0cec5 100644 --- a/example_convert_mcpack.py +++ b/example_convert_mcpack.py @@ -1,7 +1,7 @@ # THIS PROGRAM IS ONLY A TEST EXAMPLE -if __name__ == '__main__': - from main import * - one = 1 - midiConvert(input('请输入midi文件路径:'), input('请输入输出路径:')).tomcpack(one, input('请输入计分板名称:'), float(input('请输入音量(0-1):')), - float(input('请输入速度倍率:'))) + +from main import * + +midiConvert(input('请输入midi文件路径:'), input('请输入输出路径:')).tomcpack(1, input('请输入计分板名称:'), float(input('请输入音量(0-1):')), + float(input('请输入速度倍率:'))) diff --git a/main.py b/main.py index 21bd311..ea40dd7 100644 --- a/main.py +++ b/main.py @@ -62,8 +62,6 @@ class midiConvert: :param instrumentID: midi的乐器ID :param default: 如果instrumentID不在范围内,返回的默认我的世界乐器名称 :return: 我的世界乐器名 str""" - if self.staticDebug: - pass if instrumentID == 105: return 'note.banjo' @@ -248,14 +246,14 @@ class midiConvert: scoreboardname: str = 'mscplay', volume: float = 1.0, speed: float = 1.0, - ) -> bool: + ): """ 使用method指定的转换算法,将midi转换为BDX结构文件 :param method: 转换算法 :param scoreboardname: 我的世界的计分板名称 :param volume: 音量,注意:这里的音量范围为(0,1],如果超出将被处理为正确值,其原理为在距离玩家 (1 / volume -1) 的地方播放音频 :param speed: 速度,注意:这里的速度指的是播放倍率,其原理为在播放音频的时候,每个音符的播放时间除以 speed - :return 成功与否,成功返回(True,未经过压缩的源),失败返回(False,str失败原因) + :return 成功与否,成功返回(True,未经过压缩的源,结构占用大小),失败返回(False,str失败原因) """ import brotli @@ -358,14 +356,14 @@ class midiConvert: block += i return block - def __fillSquareSideLength(self, total: int, maxHeight: int): + def __fillSquareSideLength(total: int, maxHeight: int): '''给定总方块数量和最大高度,返回所构成的图形外切正方形的边长 :param total: 总方块数量 :param maxHeight: 最大高度 :return: 外切正方形的边长 int''' import math - math.ceil(math.sqrt(total / maxHeight)) + return math.ceil(math.sqrt(total / maxHeight)) _sideLength = __fillSquareSideLength(totalcount, maxheight) @@ -374,13 +372,15 @@ class midiConvert: nowy = 0 nowz = 0 + nowx = 0 for track in cmdlist: for cmd in track: _bytes += __formCMDblk( cmd, (1 if yforward else 0) - if (nowy != 0) and (nowy != maxheight) + if ((nowy != 0) and (not yforward)) + or ((yforward) and (nowy != maxheight)) else (3 if zforward else 2), impluse=2, condition=False, @@ -390,21 +390,34 @@ class midiConvert: executeOnFirstTick=False, trackOutput=True, ) + nowy += 1 if yforward else -1 - _bytes += key[y][int(yforward)] + if ((nowy > maxheight) and (yforward)) or ( (nowy < 0) and (not yforward) ): + nowy -= 1 if yforward else -1 + yforward = not yforward + nowz += 1 if zforward else -1 - _bytes += key[z][int(zforward)] + if ((nowz > _sideLength) and (zforward)) or ( (nowz < 0) and (not zforward) ): + nowz -= 1 if zforward else -1 zforward = not zforward _bytes += key[x][1] + nowx += 1 + else: + + _bytes += key[z][int(zforward)] + + else: + + _bytes += key[y][int(yforward)] with open(f"{self.outputPath}/{self.midFileName}.bdx", "ab+") as f: f.write(brotli.compress(_bytes + b'XE')) - return (True, _bytes) + return (True, _bytes, (nowx, maxheight, _sideLength))