From 259fb049801ffbcf3bcc291392e71c33bb138980 Mon Sep 17 00:00:00 2001 From: EillesWan Date: Fri, 29 Apr 2022 18:45:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=94=AF=E6=8C=81bdx=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-38.pyc | Bin 6252 -> 12167 bytes example_convert_bdx.py | 2 +- example_convert_mcpack.py | 10 +++++----- main.py | 33 ++++++++++++++++++++++---------- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc index 25db3d0e88b1a03e68a9e3e78dbbaa41f0ad29f7..02a936973e892c21bf7382d29029c61535ff653a 100644 GIT binary patch literal 12167 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 delta 1720 zcmZ8h-ESL35Z~F``?ej&aU3UgKAJ$22x!x)q*WUVs8vA~4WbE3I3=o@Y)YL^az2aF z?kPe^;f2zoB?8e}IwKxaK(ctC68r=358wwLDz)W-zknxZFHUN>)6CA!%+AjIc6L9# z{P#%e-DJ`s_@(FGnw#qVB31AvamERUW#a9Q;6Xg69*sxM)8dhNEFN`F-=CXY<7^8& z;|;=fZfp^5Y*NqUFhPbb`6tb9Brv>zbQYqDq;s{{zAn4BiJwTG+@ACAjuHUSB_!;Z>F>@zp1^2{P5mb|GCIVMW4 zA(bZO1HJG{Yg{HE1epbG!NA|-_I<`3?r!Ox#oHF_hTh@H`#MkY7Sy{ujeBNgpK+{L z!(cj649F=I1PF4O1Q1a{7K!}GH~>U$8%5V|M{Av}6#1I8&DT>}os|}ruf}RWCuhxq zGk_kY_&{s7%-foKOwG?ABf9K%AHazG&Fviu2u6lQx{0vfg;_E~Lp?M&4NW8q$$p<8 zjE2l4j@YJf7tIqSH06cFAehoml=>_VsIk`1BZjtcs(^?ho~ov@K?$j4k_N3EY?*+r zIuz@A;9r?v^7NoMzf|(9`L&gmE2~_7o<4naS|#|RO3+|nK})RVH`l~8q%s#*kRRduw`nG6kKL^iik?{pB3)R5c` z61YJkN><4xpe2EnRJMDhLQzir&)(93Jr87xyiDF9m&i0({jq7c4a(EF-Hp%;Qc;UA zqjVMB@#OYH3X8XP5}p~06KKrZ#+s67=(1ykx1*dx?~dIS&k}9YqaW_ms_x4a+1Sgf zDW@2L$i{>+!m2_H+8#c6g%9uKUAHy7wL0G3YuH{kB6T2eg&wu37UGCYj7?#;_Wju1 z%^rAcJ(Uf%7w%530eK< zJsAF6MZ=WvwP@-P^r=D;AC2d+*$gQ~%ko0!V8*|M8c#2mi~M+yEW3S#sO-VTr(}FZjvn*sFqh;}`c{B?t92KP@kNO@h zhgY-@hM)(!z@q(B{@Rt3qlZWEy}W+-Y_hHuSA#m6TU%T9=jHE*3#a>4dO)%Z-Y_vFPRBiS^H7H+!#GpGGuHBoxc 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))