mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2025-09-03 19:06:23 +00:00
还不能用的新版本
This commit is contained in:
@ -1,72 +1,72 @@
|
||||
从此日志开始,我的世界函数音乐构建更名为 函数音创 NoteFunCreater(谐音NotFun[狗头]),版本号更为0.1.0开始
|
||||
|
||||
注意,运行此文件需要第三方库:
|
||||
1. mido 用于对midi文件的解码
|
||||
2. py7zr 用于对7z压缩包的压缩与解压等(需pycparser, cffi, texttable, pyzstd, pyppmd, pycryptodomex, multivolumefile, brotli, bcj-cffi支持) -(从0.1.3开始不需要)
|
||||
3. zipfile 用于自动生成函数包的压缩
|
||||
4. pystray 用于支持窗口任务栏
|
||||
5. pillow (相当于Python2的PIL)用于绘图
|
||||
|
||||
|
||||
0.1.0
|
||||
2021 7 10 - 2021 7 12
|
||||
1.程序窗口化
|
||||
2.仅支持基本的菜单操作
|
||||
3.程序文件皆储存至其相应目录下
|
||||
4.程序./bin/目录下文件将会自动防修改
|
||||
5.删除了彩蛋
|
||||
|
||||
|
||||
0.1.1
|
||||
2021 7 14
|
||||
1.新增版本辨别的提示
|
||||
2.窗口中显示歌曲信息
|
||||
|
||||
|
||||
0.1.2
|
||||
2021 7 14 - 2021 7 15
|
||||
1.在没运行过的机器上会自动安装库
|
||||
2.从midi导入时不会删除其他音轨
|
||||
3.改进UI样式
|
||||
4.支持对于单个音轨设置的修改以及音乐主设置的修改
|
||||
5.当未保存便退出时,会询问存储
|
||||
6.新增加载进度提示
|
||||
|
||||
|
||||
0.1.3
|
||||
2021 7 15 - 2021 7 19
|
||||
1.不再从文件中读取音符及乐器信息(所以包更小了)
|
||||
2.改进UI
|
||||
3.修复了修改玩家选择器时变更了音乐标题的bug
|
||||
4.新增删除当前选定音轨按钮
|
||||
5.新增重置设置按钮(将音乐总设置设置为开始时的设置)
|
||||
6.运用多线程加载函数与文件等,程序运行效率更高
|
||||
7.修复变量作用域混淆问题
|
||||
|
||||
|
||||
0.1.3.1
|
||||
2021 7 19
|
||||
1.修复了菜单中无法退出程序的问题
|
||||
|
||||
|
||||
0.1.4
|
||||
2021 7 22
|
||||
1.支持显示指令于列表中
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TO-DO
|
||||
1.支持从midi文件的元信息中收取音符信息并自动生成
|
||||
2.支持生成zip函数包
|
||||
3.支持使用WebSocket接口自动播放已编辑的音乐
|
||||
4.可以编辑多个项目
|
||||
5.能够自动将一个长串的音乐分成多个函数文件
|
||||
6.支持用户导入自己的乐器
|
||||
7.支持汇报崩溃记录(通过邮件附件的方式)
|
||||
8.支持播放字幕
|
||||
9.支持任务栏角标与通知
|
||||
10.将控制台版本的彩蛋移植到此版本,开启了任务栏
|
||||
从此日志开始,我的世界函数音乐构建更名为 函数音创 NoteFunCreater(谐音NotFun[狗头]),版本号更为0.1.0开始
|
||||
|
||||
注意,运行此文件需要第三方库:
|
||||
1. mido 用于对midi文件的解码
|
||||
2. py7zr 用于对7z压缩包的压缩与解压等(需pycparser, cffi, texttable, pyzstd, pyppmd, pycryptodomex, multivolumefile, brotli, bcj-cffi支持) -(从0.1.3开始不需要)
|
||||
3. zipfile 用于自动生成函数包的压缩
|
||||
4. pystray 用于支持窗口任务栏
|
||||
5. pillow (相当于Python2的PIL)用于绘图
|
||||
|
||||
|
||||
0.1.0
|
||||
2021 7 10 - 2021 7 12
|
||||
1.程序窗口化
|
||||
2.仅支持基本的菜单操作
|
||||
3.程序文件皆储存至其相应目录下
|
||||
4.程序./bin/目录下文件将会自动防修改
|
||||
5.删除了彩蛋
|
||||
|
||||
|
||||
0.1.1
|
||||
2021 7 14
|
||||
1.新增版本辨别的提示
|
||||
2.窗口中显示歌曲信息
|
||||
|
||||
|
||||
0.1.2
|
||||
2021 7 14 - 2021 7 15
|
||||
1.在没运行过的机器上会自动安装库
|
||||
2.从midi导入时不会删除其他音轨
|
||||
3.改进UI样式
|
||||
4.支持对于单个音轨设置的修改以及音乐主设置的修改
|
||||
5.当未保存便退出时,会询问存储
|
||||
6.新增加载进度提示
|
||||
|
||||
|
||||
0.1.3
|
||||
2021 7 15 - 2021 7 19
|
||||
1.不再从文件中读取音符及乐器信息(所以包更小了)
|
||||
2.改进UI
|
||||
3.修复了修改玩家选择器时变更了音乐标题的bug
|
||||
4.新增删除当前选定音轨按钮
|
||||
5.新增重置设置按钮(将音乐总设置设置为开始时的设置)
|
||||
6.运用多线程加载函数与文件等,程序运行效率更高
|
||||
7.修复变量作用域混淆问题
|
||||
|
||||
|
||||
0.1.3.1
|
||||
2021 7 19
|
||||
1.修复了菜单中无法退出程序的问题
|
||||
|
||||
|
||||
0.1.4
|
||||
2021 7 22
|
||||
1.支持显示指令于列表中
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TO-DO
|
||||
1.支持从midi文件的元信息中收取音符信息并自动生成
|
||||
2.支持生成zip函数包
|
||||
3.支持使用WebSocket接口自动播放已编辑的音乐
|
||||
4.可以编辑多个项目
|
||||
5.能够自动将一个长串的音乐分成多个函数文件
|
||||
6.支持用户导入自己的乐器
|
||||
7.支持汇报崩溃记录(通过邮件附件的方式)
|
||||
8.支持播放字幕
|
||||
9.支持任务栏角标与通知
|
||||
10.将控制台版本的彩蛋移植到此版本,开启了任务栏
|
||||
11.可编辑音符
|
@ -1,36 +1,36 @@
|
||||
世界音创(NoteMapCreater)是金羿开发的一款用于生成我的世界中各类有关音乐的物件的软件
|
||||
软件禁止商用,源代码始终公开,如使用未经授权的音乐经过此软件生成的任何物件侵犯了他人权利与本软件及其作者无关
|
||||
|
||||
Copyright © W-YI 2021
|
||||
|
||||
开头,特别感谢:
|
||||
KCINE:提供Cinemusicedit函数包(虽然函数包没怎么用过)
|
||||
Charlie_Ping:提供MusiCreaterBot(音乐地图生成QQ机器人)源码核心以及时不时的催更(虽然源码没有抄)
|
||||
金羿(作者本人):提供NoteFunCreater(函数音创)的制作经验以及时不时的摸鱼(虽然不是很支持函数音创)
|
||||
广大群友:高效的催更作业让我以蜗牛的速度前进
|
||||
|
||||
Alpha 0.0.0
|
||||
2021 8 1 - 2021 8 10
|
||||
1.确定了大概的功能
|
||||
2.不支持无参数传入
|
||||
3.可以查看帮助,但是帮助大多功能没实现
|
||||
4.可以从格式文本、midi文件、钢琴声音MP3导入音轨
|
||||
5.可以生成一些方块到世界里,但是没有播放器(半支持bw开关)
|
||||
5.提供了修改文件地址的方法,但是不能修改
|
||||
|
||||
Alpha 0.0.1
|
||||
2021 8 10
|
||||
1.可以从函数音创的工程文件读取音轨
|
||||
2.可以新建一个空白世界来生成
|
||||
3.支持修改输出文件地址
|
||||
4.支持修改输出方块起始位置
|
||||
5.支持指定播放乐器,执行实体,执行积分板,播放玩家选择器
|
||||
6.可以生成指令音乐地图(完全支持-w开关)
|
||||
|
||||
Beta 0.0.0
|
||||
2021 8 X?
|
||||
1.除了-nw 和 -f 开关不支持以外都支持了
|
||||
|
||||
Beta 0.0.1
|
||||
2021 8 19
|
||||
1.修复了大量bug
|
||||
世界音创(NoteMapCreater)是金羿开发的一款用于生成我的世界中各类有关音乐的物件的软件
|
||||
软件禁止商用,源代码始终公开,如使用未经授权的音乐经过此软件生成的任何物件侵犯了他人权利与本软件及其作者无关
|
||||
|
||||
Copyright © W-YI 2021
|
||||
|
||||
开头,特别感谢:
|
||||
KCINE:提供Cinemusicedit函数包(虽然函数包没怎么用过)
|
||||
Charlie_Ping:提供MusiCreaterBot(音乐地图生成QQ机器人)源码核心以及时不时的催更(虽然源码没有抄)
|
||||
金羿(作者本人):提供NoteFunCreater(函数音创)的制作经验以及时不时的摸鱼(虽然不是很支持函数音创)
|
||||
广大群友:高效的催更作业让我以蜗牛的速度前进
|
||||
|
||||
Alpha 0.0.0
|
||||
2021 8 1 - 2021 8 10
|
||||
1.确定了大概的功能
|
||||
2.不支持无参数传入
|
||||
3.可以查看帮助,但是帮助大多功能没实现
|
||||
4.可以从格式文本、midi文件、钢琴声音MP3导入音轨
|
||||
5.可以生成一些方块到世界里,但是没有播放器(半支持bw开关)
|
||||
5.提供了修改文件地址的方法,但是不能修改
|
||||
|
||||
Alpha 0.0.1
|
||||
2021 8 10
|
||||
1.可以从函数音创的工程文件读取音轨
|
||||
2.可以新建一个空白世界来生成
|
||||
3.支持修改输出文件地址
|
||||
4.支持修改输出方块起始位置
|
||||
5.支持指定播放乐器,执行实体,执行积分板,播放玩家选择器
|
||||
6.可以生成指令音乐地图(完全支持-w开关)
|
||||
|
||||
Beta 0.0.0
|
||||
2021 8 X?
|
||||
1.除了-nw 和 -f 开关不支持以外都支持了
|
||||
|
||||
Beta 0.0.1
|
||||
2021 8 19
|
||||
1.修复了大量bug
|
||||
|
758
nmcsup/const.py
758
nmcsup/const.py
@ -1,312 +1,446 @@
|
||||
"""音创系列的音符对照表 以及一系列常数"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:109个
|
||||
|
||||
|
||||
notes = {
|
||||
'....A': [0.074, 27.5, 'wood', 8],
|
||||
'....A#': [0.0787, 29.135, 'wood', 9],
|
||||
'....B': [0.083, 30.868, 'wood', 10],
|
||||
'...C': [0.088, 32.703, 'wood', 11],
|
||||
'...C#': [0.094, 34.648, 'wood', 12],
|
||||
'...D': [0.1, 36.708, 'wood', 13],
|
||||
'...D#': [0.105, 38.891, 'log', 0],
|
||||
'...E': [0.11, 41.203, 'log', 1],
|
||||
'...F': [0.12, 43.654, 'log', 2],
|
||||
'...F#': [0.125, 46.249, 'wood', 0],
|
||||
'...G': [0.13, 48.999, 'wood', 1],
|
||||
'...G#': [0.14, 51.913, 'wood', 2],
|
||||
'...A': [0.15, 55.0, 'wood', 3],
|
||||
'...A#': [0.16, 58.27, 'wood', 4],
|
||||
'...B': [0.17, 61.735, 'wood', 5],
|
||||
'..C': [0.18, 65.406, 'wool', 0],
|
||||
'..C#': [0.19, 69.296, 'wool', 1],
|
||||
'..D': [0.2, 73.416, 'wool', 2],
|
||||
'..D#': [0.21, 77.782, 'wool', 3],
|
||||
'..E': [0.22, 82.407, 'wool', 4],
|
||||
'..F': [0.235, 87.307, 'wool', 5],
|
||||
'..F#': [0.25, 92.499, 'concretepowder', 0],
|
||||
'..G': [0.26, 97.999, 'concretepowder', 1],
|
||||
'..G#': [0.28, 103.826, 'concretepowder', 2],
|
||||
'..A': [0.3, 110.0, 'concretepowder', 3],
|
||||
'..A#': [0.31, 116.541, 'concretepowder', 4],
|
||||
'..B': [0.33, 123.471, 'concretepowder', 5],
|
||||
'.C': [0.35, 130.813, 'concretepowder', 6],
|
||||
'.C#': [0.37, 138.591, 'concretepowder', 7],
|
||||
'.D': [0.4, 146.832, 'concretepowder', 8],
|
||||
'.D#': [0.42, 155.563, 'concretepowder', 9],
|
||||
'.E': [0.44, 164.814, 'concretepowder', 10],
|
||||
'.F': [0.47, 174.614, 'concretepowder', 11],
|
||||
'.F#': [0.5, 184.997, 'concretepowder', 12],
|
||||
'.G': [0.53, 195.998, 'concretepowder', 13],
|
||||
'.G#': [0.56, 207.652, 'concretepowder', 14],
|
||||
'.A': [0.6, 220.0, 'concretepowder', 15],
|
||||
'.A#': [0.63, 233.082, 'concrete', 0],
|
||||
'.B': [0.67, 246.942, 'concrete', 1],
|
||||
'C': [0.7, 261.626, 'concrete', 2],
|
||||
'C#': [0.75, 277.183, 'concrete', 3],
|
||||
'D': [0.8, 293.665, 'concrete', 4],
|
||||
'D#': [0.84, 311.127, 'concrete', 5],
|
||||
'E': [0.9, 329.628, 'concrete', 6],
|
||||
'F': [0.94, 349.228, 'concrete', 7],
|
||||
'F#': [1.0, 369.994, 'concrete', 8],
|
||||
'G': [1.05, 391.995, 'concrete', 9],
|
||||
'G#': [1.12, 415.305, 'concrete', 10],
|
||||
'A': [1.2, 440.0, 'concrete', 11],
|
||||
'A#': [1.25, 466.164, 'concrete', 12],
|
||||
'B': [1.33, 493.883, 'concrete', 13],
|
||||
'`C': [1.4, 523.251, 'concrete', 14],
|
||||
'`C#': [1.5, 554.365, 'concrete', 15],
|
||||
'`D': [1.6, 587.33, 'stained_hardened_clay', 0],
|
||||
'`D#': [1.7, 622.254, 'stained_hardened_clay', 1],
|
||||
'`E': [1.8, 659.255, 'stained_hardened_clay', 2],
|
||||
'`F': [1.9, 698.456, 'stained_hardened_clay', 3],
|
||||
'`F#': [2.0, 739.989, 'stained_hardened_clay', 4],
|
||||
'`G': [2.1, 783.991, 'stained_hardened_clay', 5],
|
||||
'`G#': [2.24, 830.609, 'stained_hardened_clay', 6],
|
||||
'`A': [2.4, 880.0, 'stained_hardened_clay', 7],
|
||||
'`A#': [2.5, 932.328, 'stained_hardened_clay', 8],
|
||||
'`B': [2.67, 987.767, 'stained_hardened_clay', 9],
|
||||
'``C': [2.83, 1046.502, 'stained_hardened_clay', 10],
|
||||
'``C#': [3.0, 1108.731, 'stained_hardened_clay', 11],
|
||||
'``D': [3.17, 1174.659, 'stained_hardened_clay', 12],
|
||||
'``D#': [3.36, 1244.508, 'stained_hardened_clay', 13],
|
||||
'``E': [3.56, 1318.51, 'stained_hardened_clay', 14],
|
||||
'``F': [3.78, 1396.913, 'stained_hardened_clay', 15],
|
||||
'``F#': [4.0, 1479.978, 'white_glazed_terracotta', 0],
|
||||
'``G': [4.24, 1567.982, 'orange_glazed_terracotta', 0],
|
||||
'``G#': [4.5, 1661.219, 'magenta_glazed_terracotta', 0],
|
||||
'``A': [4.76, 1760.0, 'light_blue_glazed_terracotta', 0],
|
||||
'``A#': [5.04, 1864.655, 'yellow_glazed_terracotta', 0],
|
||||
'``B': [5.34, 1975.533, 'lime_glazed_terracotta', 0],
|
||||
'```C': [5.66, 2093.005, 'pink_glazed_terracotta', 0],
|
||||
'```C#': [6.0, 2217.461, 'gray_glazed_terracotta', 0],
|
||||
'```D': [6.35, 2349.318, 'silver_glazed_terracotta', 0],
|
||||
'```D#': [6.73, 2489.016, 'cyan_glazed_terracotta', 0],
|
||||
'```E': [7.13, 2637.02, 'purple_glazed_terracotta', 0],
|
||||
'```F': [7.55, 2793.826, 'blue_glazed_terracotta', 0],
|
||||
'```F#': [8.0, 2959.955, 'brown_glazed_terracotta', 0],
|
||||
'```G': [8.47, 3135.963, 'green_glazed_terracotta', 0],
|
||||
'```G#': [8.98, 3322.438, 'red_glazed_terracotta', 0],
|
||||
'```A': [9.51, 3520.0, 'black_glazed_terracotta', 0],
|
||||
'```A#': [10.08, 3729.31, 'stained_glass', 0],
|
||||
'```B': [10.68, 3951.066, 'stained_glass', 1],
|
||||
'````C': [11.31, 4186.009, 'stained_glass', 2],
|
||||
'0': [0.0, 0.0, 'glass', 0]
|
||||
}
|
||||
'''音符对照表\n
|
||||
音符:[MC音调, 声音频率, 方块名称, 数据值]'''
|
||||
|
||||
# 方块
|
||||
'''
|
||||
blocks = {
|
||||
0.074 : ['stained_glass', 3],
|
||||
0.0787 : ['stained_glass', 4],
|
||||
0.083 : ['stained_glass', 5],
|
||||
0.088 : ['stained_glass', 6],
|
||||
0.094 : ['stained_glass', 7],
|
||||
0.1 : ['stained_glass', 8],
|
||||
0.105 : ['stained_glass', 9],
|
||||
0.11 : ['stained_glass', 10],
|
||||
0.12 : ['stained_glass', 11],
|
||||
0.125 : ['stained_glass', 12],
|
||||
0.13 : ['stained_glass', 13],
|
||||
0.14 : ['stained_glass', 14],
|
||||
0.15 : ['stained_glass', 15],
|
||||
0.16 : ['wool', 0],
|
||||
0.17 : ['wool', 1],
|
||||
0.18 : ['wool', 2],
|
||||
0.19 : ['wool', 3],
|
||||
0.2 : ['wool', 4],
|
||||
0.21 : ['wool', 5],
|
||||
0.22 : ['wool', 6],
|
||||
0.235 : ['wool', 7],
|
||||
0.25 : ['concretepowder', 0],
|
||||
0.26 : ['concretepowder', 1],
|
||||
0.28 : ['concretepowder', 2],
|
||||
0.3 : ['concretepowder', 3],
|
||||
0.31 : ['concretepowder', 4],
|
||||
0.33 : ['concretepowder', 5],
|
||||
0.35 : ['concretepowder', 6],
|
||||
0.37 : ['concretepowder', 7],
|
||||
0.4 : ['concretepowder', 8],
|
||||
0.42 : ['concretepowder', 9],
|
||||
0.44 : ['concretepowder', 10],
|
||||
0.47 : ['concretepowder', 11],
|
||||
0.5 : ['concretepowder', 12],
|
||||
0.53 : ['concretepowder', 13],
|
||||
0.56 : ['concretepowder', 14],
|
||||
0.6 : ['concretepowder', 15],
|
||||
0.63 : ['concrete', 0],
|
||||
0.67 : ['concrete', 1],
|
||||
0.7 : ['concrete', 2],
|
||||
0.75 : ['concrete', 3],
|
||||
0.8 : ['concrete', 4],
|
||||
0.84 : ['concrete', 5],
|
||||
0.9 : ['concrete', 6],
|
||||
0.94 : ['concrete', 7],
|
||||
1.0 : ['concrete', 8],
|
||||
1.05 : ['concrete', 9],
|
||||
1.12 : ['concrete', 10],
|
||||
1.2 : ['concrete', 11],
|
||||
1.25 : ['concrete', 12],
|
||||
1.33 : ['concrete', 13],
|
||||
1.4 : ['concrete', 14],
|
||||
1.5 : ['concrete', 15],
|
||||
1.6 : ['stained_hardened_clay', 0],
|
||||
1.7 : ['stained_hardened_clay', 1],
|
||||
1.8 : ['stained_hardened_clay', 2],
|
||||
1.9 : ['stained_hardened_clay', 3],
|
||||
2.0 : ['stained_hardened_clay', 4],
|
||||
2.1 : ['stained_hardened_clay', 5],
|
||||
2.24 : ['stained_hardened_clay', 6],
|
||||
2.4 : ['stained_hardened_clay', 7],
|
||||
2.5 : ['stained_hardened_clay', 8],
|
||||
2.67 : ['stained_hardened_clay', 9],
|
||||
2.83 : ['stained_hardened_clay', 10],
|
||||
3.0 : ['stained_hardened_clay', 11],
|
||||
3.17 : ['stained_hardened_clay', 12],
|
||||
3.36 : ['stained_hardened_clay', 13],
|
||||
3.56 : ['stained_hardened_clay', 14],
|
||||
3.78 : ['stained_hardened_clay', 15],
|
||||
4.0 : ['stained_glass_pane', 0],
|
||||
4.24 : ['stained_glass_pane', 1],
|
||||
4.5 : ['stained_glass_pane', 2],
|
||||
4.76 : ['stained_glass_pane', 3],
|
||||
5.04 : ['stained_glass_pane', 4],
|
||||
5.34 : ['stained_glass_pane', 5],
|
||||
5.66 : ['stained_glass_pane', 6],
|
||||
6.0 : ['stained_glass_pane', 7],
|
||||
6.35 : ['stained_glass_pane', 8],
|
||||
6.73 : ['stained_glass_pane', 9],
|
||||
7.13 : ['stained_glass_pane', 10],
|
||||
7.55 : ['stained_glass_pane', 11],
|
||||
8.0 : ['stained_glass_pane', 12],
|
||||
8.47 : ['stained_glass_pane', 13],
|
||||
8.98 : ['stained_glass_pane', 14],
|
||||
9.51 : ['stained_glass_pane', 15],
|
||||
10.08 : ['stained_glass', 0],
|
||||
10.68 : ['stained_glass', 1],
|
||||
11.31 : ['stained_glass', 2],
|
||||
0.0 : ['glass', 0]
|
||||
}
|
||||
#向查理平致敬!!!!!
|
||||
'''
|
||||
|
||||
Blocks = {
|
||||
0.074: 'barrel',
|
||||
0.0787: 'beacon',
|
||||
0.083: 'bedrock',
|
||||
0.088: 'black_glazed_terracotta',
|
||||
0.094: 'blast_furnace',
|
||||
0.1: 'blue_glazed_terracotta',
|
||||
0.105: 'blue_ice',
|
||||
0.11: 'bone_block',
|
||||
0.12: 'bookshelf',
|
||||
0.125: 'brick_block',
|
||||
0.13: 'brown_glazed_terracotta',
|
||||
0.14: 'cartography_table',
|
||||
0.15: 'carved_pumpkin',
|
||||
0.16: 'clay',
|
||||
0.17: 'coal_block',
|
||||
0.18: 'coal_ore',
|
||||
0.19: 'cobblestone',
|
||||
0.2: 'concrete',
|
||||
0.21: 'crafting_table',
|
||||
0.22: 'cyan_glazed_terracotta',
|
||||
0.235: 'diamond_block',
|
||||
0.25: 'diamond_ore',
|
||||
0.26: 'white_glazed_terracotta',
|
||||
0.28: 'dispenser',
|
||||
0.3: 'dried_kelp_block',
|
||||
0.31: 'dropper',
|
||||
0.33: 'emerald_block',
|
||||
0.35: 'emerald_ore',
|
||||
0.37: 'end_bricks',
|
||||
0.4: 'end_stone',
|
||||
0.42: 'fletching_table',
|
||||
0.44: 'furnace',
|
||||
0.47: 'glass',
|
||||
0.5: 'glowingobsidian',
|
||||
0.53: 'glowstone',
|
||||
0.56: 'gold_block',
|
||||
0.6: 'gold_ore',
|
||||
0.63: 'grass',
|
||||
0.67: 'gray_glazed_terracotta',
|
||||
0.7: 'green_glazed_terracotta',
|
||||
0.75: 'hardened_clay',
|
||||
0.8: 'hay_block',
|
||||
0.84: 'iron_block',
|
||||
0.9: 'iron_ore',
|
||||
0.94: 'jukebox',
|
||||
1.0: 'lapis_block',
|
||||
1.05: 'lapis_ore',
|
||||
1.12: 'light_blue_glazed_terracotta',
|
||||
1.2: 'lime_glazed_terracotta',
|
||||
1.25: 'lit_pumpkin',
|
||||
1.33: 'log',
|
||||
1.4: 'loom',
|
||||
1.5: 'magenta_glazed_terracotta',
|
||||
1.6: 'magma',
|
||||
1.7: 'melon_block',
|
||||
1.8: 'web',
|
||||
1.9: 'mossy_cobblestone',
|
||||
2.0: 'nether_brick',
|
||||
2.1: 'nether_wart_block',
|
||||
2.24: 'netherrack',
|
||||
2.4: 'noteblock',
|
||||
2.5: 'observer',
|
||||
2.67: 'obsidian',
|
||||
2.83: 'orange_glazed_terracotta',
|
||||
3.0: 'pink_glazed_terracotta',
|
||||
3.17: 'piston',
|
||||
3.36: 'planks',
|
||||
3.56: 'prismarine',
|
||||
3.78: 'pumpkin',
|
||||
4.0: 'purple_glazed_terracotta',
|
||||
4.24: 'purpur_block',
|
||||
4.5: 'quartz_block',
|
||||
4.76: 'quartz_ore',
|
||||
5.04: 'red_glazed_terracotta',
|
||||
5.34: 'red_nether_brick',
|
||||
5.66: 'red_sandstone',
|
||||
6.0: 'redstone_block',
|
||||
6.35: 'yellow_glazed_terracotta',
|
||||
6.73: 'sandstone',
|
||||
7.13: 'stonebrick',
|
||||
7.55: 'silver_glazed_terracotta',
|
||||
8.0: 'slime',
|
||||
8.47: 'smithing_table',
|
||||
8.98: 'smoker',
|
||||
9.51: 'smooth_stone',
|
||||
10.08: 'snow',
|
||||
10.68: 'soul_sand',
|
||||
11.31: 'sponge',
|
||||
0.0: 'stone'
|
||||
}
|
||||
'''频率对照表\n
|
||||
MC音调:方块名称'''
|
||||
|
||||
# 乐器
|
||||
Instuments = {
|
||||
'note.banjo': '班卓',
|
||||
'note.bass': '低音',
|
||||
'note.bassattack': '贝斯',
|
||||
'note.bd': '鼓声',
|
||||
'note.bell': '铃声',
|
||||
'note.bit': '比特',
|
||||
'note.cow_bell': '牛铃',
|
||||
'note.didgeridoo': '迪吉',
|
||||
'note.flute': '长笛',
|
||||
'note.guitar': '吉他',
|
||||
'note.harp': '竖琴',
|
||||
'note.hat': '架鼓',
|
||||
'note.chime': '钟声',
|
||||
'note.iron_xylophone': '铁琴',
|
||||
'note.pling': '叮叮',
|
||||
'note.snare': '响弦',
|
||||
'note.xylophone': '木琴'
|
||||
}
|
||||
'''乐器对照表\n
|
||||
乐器英文:中文
|
||||
翻译:雪莹工坊Fun-Fer'''
|
||||
"""音创系列的音符对照表 以及一系列常数"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:109个
|
||||
|
||||
|
||||
notes = {
|
||||
'....A': [0.074, 27.5, 'wood', 8],
|
||||
'....A#': [0.0787, 29.135, 'wood', 9],
|
||||
'....B': [0.083, 30.868, 'wood', 10],
|
||||
'...C': [0.088, 32.703, 'wood', 11],
|
||||
'...C#': [0.094, 34.648, 'wood', 12],
|
||||
'...D': [0.1, 36.708, 'wood', 13],
|
||||
'...D#': [0.105, 38.891, 'log', 0],
|
||||
'...E': [0.11, 41.203, 'log', 1],
|
||||
'...F': [0.12, 43.654, 'log', 2],
|
||||
'...F#': [0.125, 46.249, 'wood', 0],
|
||||
'...G': [0.13, 48.999, 'wood', 1],
|
||||
'...G#': [0.14, 51.913, 'wood', 2],
|
||||
'...A': [0.15, 55.0, 'wood', 3],
|
||||
'...A#': [0.16, 58.27, 'wood', 4],
|
||||
'...B': [0.17, 61.735, 'wood', 5],
|
||||
'..C': [0.18, 65.406, 'wool', 0],
|
||||
'..C#': [0.19, 69.296, 'wool', 1],
|
||||
'..D': [0.2, 73.416, 'wool', 2],
|
||||
'..D#': [0.21, 77.782, 'wool', 3],
|
||||
'..E': [0.22, 82.407, 'wool', 4],
|
||||
'..F': [0.235, 87.307, 'wool', 5],
|
||||
'..F#': [0.25, 92.499, 'concretepowder', 0],
|
||||
'..G': [0.26, 97.999, 'concretepowder', 1],
|
||||
'..G#': [0.28, 103.826, 'concretepowder', 2],
|
||||
'..A': [0.3, 110.0, 'concretepowder', 3],
|
||||
'..A#': [0.31, 116.541, 'concretepowder', 4],
|
||||
'..B': [0.33, 123.471, 'concretepowder', 5],
|
||||
'.C': [0.35, 130.813, 'concretepowder', 6],
|
||||
'.C#': [0.37, 138.591, 'concretepowder', 7],
|
||||
'.D': [0.4, 146.832, 'concretepowder', 8],
|
||||
'.D#': [0.42, 155.563, 'concretepowder', 9],
|
||||
'.E': [0.44, 164.814, 'concretepowder', 10],
|
||||
'.F': [0.47, 174.614, 'concretepowder', 11],
|
||||
'.F#': [0.5, 184.997, 'concretepowder', 12],
|
||||
'.G': [0.53, 195.998, 'concretepowder', 13],
|
||||
'.G#': [0.56, 207.652, 'concretepowder', 14],
|
||||
'.A': [0.6, 220.0, 'concretepowder', 15],
|
||||
'.A#': [0.63, 233.082, 'concrete', 0],
|
||||
'.B': [0.67, 246.942, 'concrete', 1],
|
||||
'C': [0.7, 261.626, 'concrete', 2],
|
||||
'C#': [0.75, 277.183, 'concrete', 3],
|
||||
'D': [0.8, 293.665, 'concrete', 4],
|
||||
'D#': [0.84, 311.127, 'concrete', 5],
|
||||
'E': [0.9, 329.628, 'concrete', 6],
|
||||
'F': [0.94, 349.228, 'concrete', 7],
|
||||
'F#': [1.0, 369.994, 'concrete', 8],
|
||||
'G': [1.05, 391.995, 'concrete', 9],
|
||||
'G#': [1.12, 415.305, 'concrete', 10],
|
||||
'A': [1.2, 440.0, 'concrete', 11],
|
||||
'A#': [1.25, 466.164, 'concrete', 12],
|
||||
'B': [1.33, 493.883, 'concrete', 13],
|
||||
'`C': [1.4, 523.251, 'concrete', 14],
|
||||
'`C#': [1.5, 554.365, 'concrete', 15],
|
||||
'`D': [1.6, 587.33, 'stained_hardened_clay', 0],
|
||||
'`D#': [1.7, 622.254, 'stained_hardened_clay', 1],
|
||||
'`E': [1.8, 659.255, 'stained_hardened_clay', 2],
|
||||
'`F': [1.9, 698.456, 'stained_hardened_clay', 3],
|
||||
'`F#': [2.0, 739.989, 'stained_hardened_clay', 4],
|
||||
'`G': [2.1, 783.991, 'stained_hardened_clay', 5],
|
||||
'`G#': [2.24, 830.609, 'stained_hardened_clay', 6],
|
||||
'`A': [2.4, 880.0, 'stained_hardened_clay', 7],
|
||||
'`A#': [2.5, 932.328, 'stained_hardened_clay', 8],
|
||||
'`B': [2.67, 987.767, 'stained_hardened_clay', 9],
|
||||
'``C': [2.83, 1046.502, 'stained_hardened_clay', 10],
|
||||
'``C#': [3.0, 1108.731, 'stained_hardened_clay', 11],
|
||||
'``D': [3.17, 1174.659, 'stained_hardened_clay', 12],
|
||||
'``D#': [3.36, 1244.508, 'stained_hardened_clay', 13],
|
||||
'``E': [3.56, 1318.51, 'stained_hardened_clay', 14],
|
||||
'``F': [3.78, 1396.913, 'stained_hardened_clay', 15],
|
||||
'``F#': [4.0, 1479.978, 'white_glazed_terracotta', 0],
|
||||
'``G': [4.24, 1567.982, 'orange_glazed_terracotta', 0],
|
||||
'``G#': [4.5, 1661.219, 'magenta_glazed_terracotta', 0],
|
||||
'``A': [4.76, 1760.0, 'light_blue_glazed_terracotta', 0],
|
||||
'``A#': [5.04, 1864.655, 'yellow_glazed_terracotta', 0],
|
||||
'``B': [5.34, 1975.533, 'lime_glazed_terracotta', 0],
|
||||
'```C': [5.66, 2093.005, 'pink_glazed_terracotta', 0],
|
||||
'```C#': [6.0, 2217.461, 'gray_glazed_terracotta', 0],
|
||||
'```D': [6.35, 2349.318, 'silver_glazed_terracotta', 0],
|
||||
'```D#': [6.73, 2489.016, 'cyan_glazed_terracotta', 0],
|
||||
'```E': [7.13, 2637.02, 'purple_glazed_terracotta', 0],
|
||||
'```F': [7.55, 2793.826, 'blue_glazed_terracotta', 0],
|
||||
'```F#': [8.0, 2959.955, 'brown_glazed_terracotta', 0],
|
||||
'```G': [8.47, 3135.963, 'green_glazed_terracotta', 0],
|
||||
'```G#': [8.98, 3322.438, 'red_glazed_terracotta', 0],
|
||||
'```A': [9.51, 3520.0, 'black_glazed_terracotta', 0],
|
||||
'```A#': [10.08, 3729.31, 'stained_glass', 0],
|
||||
'```B': [10.68, 3951.066, 'stained_glass', 1],
|
||||
'````C': [11.31, 4186.009, 'stained_glass', 2],
|
||||
'0': [0.0, 0.0, 'glass', 0]
|
||||
}
|
||||
'''音符对照表\n
|
||||
音符:[MC音调, 声音频率, 方块名称, 数据值]'''
|
||||
|
||||
# 方块
|
||||
'''
|
||||
blocks = {
|
||||
0.074 : ['stained_glass', 3],
|
||||
0.0787 : ['stained_glass', 4],
|
||||
0.083 : ['stained_glass', 5],
|
||||
0.088 : ['stained_glass', 6],
|
||||
0.094 : ['stained_glass', 7],
|
||||
0.1 : ['stained_glass', 8],
|
||||
0.105 : ['stained_glass', 9],
|
||||
0.11 : ['stained_glass', 10],
|
||||
0.12 : ['stained_glass', 11],
|
||||
0.125 : ['stained_glass', 12],
|
||||
0.13 : ['stained_glass', 13],
|
||||
0.14 : ['stained_glass', 14],
|
||||
0.15 : ['stained_glass', 15],
|
||||
0.16 : ['wool', 0],
|
||||
0.17 : ['wool', 1],
|
||||
0.18 : ['wool', 2],
|
||||
0.19 : ['wool', 3],
|
||||
0.2 : ['wool', 4],
|
||||
0.21 : ['wool', 5],
|
||||
0.22 : ['wool', 6],
|
||||
0.235 : ['wool', 7],
|
||||
0.25 : ['concretepowder', 0],
|
||||
0.26 : ['concretepowder', 1],
|
||||
0.28 : ['concretepowder', 2],
|
||||
0.3 : ['concretepowder', 3],
|
||||
0.31 : ['concretepowder', 4],
|
||||
0.33 : ['concretepowder', 5],
|
||||
0.35 : ['concretepowder', 6],
|
||||
0.37 : ['concretepowder', 7],
|
||||
0.4 : ['concretepowder', 8],
|
||||
0.42 : ['concretepowder', 9],
|
||||
0.44 : ['concretepowder', 10],
|
||||
0.47 : ['concretepowder', 11],
|
||||
0.5 : ['concretepowder', 12],
|
||||
0.53 : ['concretepowder', 13],
|
||||
0.56 : ['concretepowder', 14],
|
||||
0.6 : ['concretepowder', 15],
|
||||
0.63 : ['concrete', 0],
|
||||
0.67 : ['concrete', 1],
|
||||
0.7 : ['concrete', 2],
|
||||
0.75 : ['concrete', 3],
|
||||
0.8 : ['concrete', 4],
|
||||
0.84 : ['concrete', 5],
|
||||
0.9 : ['concrete', 6],
|
||||
0.94 : ['concrete', 7],
|
||||
1.0 : ['concrete', 8],
|
||||
1.05 : ['concrete', 9],
|
||||
1.12 : ['concrete', 10],
|
||||
1.2 : ['concrete', 11],
|
||||
1.25 : ['concrete', 12],
|
||||
1.33 : ['concrete', 13],
|
||||
1.4 : ['concrete', 14],
|
||||
1.5 : ['concrete', 15],
|
||||
1.6 : ['stained_hardened_clay', 0],
|
||||
1.7 : ['stained_hardened_clay', 1],
|
||||
1.8 : ['stained_hardened_clay', 2],
|
||||
1.9 : ['stained_hardened_clay', 3],
|
||||
2.0 : ['stained_hardened_clay', 4],
|
||||
2.1 : ['stained_hardened_clay', 5],
|
||||
2.24 : ['stained_hardened_clay', 6],
|
||||
2.4 : ['stained_hardened_clay', 7],
|
||||
2.5 : ['stained_hardened_clay', 8],
|
||||
2.67 : ['stained_hardened_clay', 9],
|
||||
2.83 : ['stained_hardened_clay', 10],
|
||||
3.0 : ['stained_hardened_clay', 11],
|
||||
3.17 : ['stained_hardened_clay', 12],
|
||||
3.36 : ['stained_hardened_clay', 13],
|
||||
3.56 : ['stained_hardened_clay', 14],
|
||||
3.78 : ['stained_hardened_clay', 15],
|
||||
4.0 : ['stained_glass_pane', 0],
|
||||
4.24 : ['stained_glass_pane', 1],
|
||||
4.5 : ['stained_glass_pane', 2],
|
||||
4.76 : ['stained_glass_pane', 3],
|
||||
5.04 : ['stained_glass_pane', 4],
|
||||
5.34 : ['stained_glass_pane', 5],
|
||||
5.66 : ['stained_glass_pane', 6],
|
||||
6.0 : ['stained_glass_pane', 7],
|
||||
6.35 : ['stained_glass_pane', 8],
|
||||
6.73 : ['stained_glass_pane', 9],
|
||||
7.13 : ['stained_glass_pane', 10],
|
||||
7.55 : ['stained_glass_pane', 11],
|
||||
8.0 : ['stained_glass_pane', 12],
|
||||
8.47 : ['stained_glass_pane', 13],
|
||||
8.98 : ['stained_glass_pane', 14],
|
||||
9.51 : ['stained_glass_pane', 15],
|
||||
10.08 : ['stained_glass', 0],
|
||||
10.68 : ['stained_glass', 1],
|
||||
11.31 : ['stained_glass', 2],
|
||||
0.0 : ['glass', 0]
|
||||
}
|
||||
#向查理平致敬!!!!!
|
||||
'''
|
||||
|
||||
Blocks = {
|
||||
0.074: 'barrel',
|
||||
0.0787: 'beacon',
|
||||
0.083: 'bedrock',
|
||||
0.088: 'black_glazed_terracotta',
|
||||
0.094: 'blast_furnace',
|
||||
0.1: 'blue_glazed_terracotta',
|
||||
0.105: 'blue_ice',
|
||||
0.11: 'bone_block',
|
||||
0.12: 'bookshelf',
|
||||
0.125: 'brick_block',
|
||||
0.13: 'brown_glazed_terracotta',
|
||||
0.14: 'cartography_table',
|
||||
0.15: 'carved_pumpkin',
|
||||
0.16: 'clay',
|
||||
0.17: 'coal_block',
|
||||
0.18: 'coal_ore',
|
||||
0.19: 'cobblestone',
|
||||
0.2: 'concrete',
|
||||
0.21: 'crafting_table',
|
||||
0.22: 'cyan_glazed_terracotta',
|
||||
0.235: 'diamond_block',
|
||||
0.25: 'diamond_ore',
|
||||
0.26: 'white_glazed_terracotta',
|
||||
0.28: 'dispenser',
|
||||
0.3: 'dried_kelp_block',
|
||||
0.31: 'dropper',
|
||||
0.33: 'emerald_block',
|
||||
0.35: 'emerald_ore',
|
||||
0.37: 'end_bricks',
|
||||
0.4: 'end_stone',
|
||||
0.42: 'fletching_table',
|
||||
0.44: 'furnace',
|
||||
0.47: 'glass',
|
||||
0.5: 'glowingobsidian',
|
||||
0.53: 'glowstone',
|
||||
0.56: 'gold_block',
|
||||
0.6: 'gold_ore',
|
||||
0.63: 'grass',
|
||||
0.67: 'gray_glazed_terracotta',
|
||||
0.7: 'green_glazed_terracotta',
|
||||
0.75: 'hardened_clay',
|
||||
0.8: 'hay_block',
|
||||
0.84: 'iron_block',
|
||||
0.9: 'iron_ore',
|
||||
0.94: 'jukebox',
|
||||
1.0: 'lapis_block',
|
||||
1.05: 'lapis_ore',
|
||||
1.12: 'light_blue_glazed_terracotta',
|
||||
1.2: 'lime_glazed_terracotta',
|
||||
1.25: 'lit_pumpkin',
|
||||
1.33: 'log',
|
||||
1.4: 'loom',
|
||||
1.5: 'magenta_glazed_terracotta',
|
||||
1.6: 'magma',
|
||||
1.7: 'melon_block',
|
||||
1.8: 'web',
|
||||
1.9: 'mossy_cobblestone',
|
||||
2.0: 'nether_brick',
|
||||
2.1: 'nether_wart_block',
|
||||
2.24: 'netherrack',
|
||||
2.4: 'noteblock',
|
||||
2.5: 'observer',
|
||||
2.67: 'obsidian',
|
||||
2.83: 'orange_glazed_terracotta',
|
||||
3.0: 'pink_glazed_terracotta',
|
||||
3.17: 'piston',
|
||||
3.36: 'planks',
|
||||
3.56: 'prismarine',
|
||||
3.78: 'pumpkin',
|
||||
4.0: 'purple_glazed_terracotta',
|
||||
4.24: 'purpur_block',
|
||||
4.5: 'quartz_block',
|
||||
4.76: 'quartz_ore',
|
||||
5.04: 'red_glazed_terracotta',
|
||||
5.34: 'red_nether_brick',
|
||||
5.66: 'red_sandstone',
|
||||
6.0: 'redstone_block',
|
||||
6.35: 'yellow_glazed_terracotta',
|
||||
6.73: 'sandstone',
|
||||
7.13: 'stonebrick',
|
||||
7.55: 'silver_glazed_terracotta',
|
||||
8.0: 'slime',
|
||||
8.47: 'smithing_table',
|
||||
8.98: 'smoker',
|
||||
9.51: 'smooth_stone',
|
||||
10.08: 'snow',
|
||||
10.68: 'soul_sand',
|
||||
11.31: 'sponge',
|
||||
0.0: 'stone'
|
||||
}
|
||||
'''频率对照表\n
|
||||
MC音调:方块名称'''
|
||||
|
||||
# 乐器
|
||||
Instuments = {
|
||||
'note.banjo': '班卓',
|
||||
'note.bass': '低音',
|
||||
'note.bassattack': '贝斯',
|
||||
'note.bd': '鼓声',
|
||||
'note.bell': '铃声',
|
||||
'note.bit': '比特',
|
||||
'note.cow_bell': '牛铃',
|
||||
'note.didgeridoo': '迪吉',
|
||||
'note.flute': '长笛',
|
||||
'note.guitar': '吉他',
|
||||
'note.harp': '竖琴',
|
||||
'note.hat': '架鼓',
|
||||
'note.chime': '钟声',
|
||||
'note.iron_xylophone': '铁琴',
|
||||
'note.pling': '叮叮',
|
||||
'note.snare': '响弦',
|
||||
'note.xylophone': '木琴'
|
||||
}
|
||||
'''乐器对照表\n
|
||||
乐器英文:中文
|
||||
翻译:雪莹工坊Fun-Fer'''
|
||||
pitch = {
|
||||
'0': '0.0220970869120796',
|
||||
'1': '0.0234110480761981',
|
||||
'2': '0.0248031414370031',
|
||||
'3': '0.0262780129766786',
|
||||
'4': '0.0278405849418856',
|
||||
'5': '0.0294960722713029',
|
||||
'6': '0.03125',
|
||||
'7': '0.033108221698728',
|
||||
'8': '0.0350769390096679',
|
||||
'9': '0.037162722343835',
|
||||
'10': '0.0393725328092148',
|
||||
'11': '0.0417137454428136',
|
||||
'12': '0.0441941738241592',
|
||||
'13': '0.0468220961523963',
|
||||
'14': '0.0496062828740062',
|
||||
'15': '0.0525560259533572',
|
||||
'16': '0.0556811698837712',
|
||||
'17': '0.0589921445426059',
|
||||
'18': '0.0625',
|
||||
'19': '0.066216443397456',
|
||||
'20': '0.0701538780193358',
|
||||
'21': '0.0743254446876701',
|
||||
'22': '0.0787450656184296',
|
||||
'23': '0.0834274908856271',
|
||||
'24': '0.0883883476483184',
|
||||
'25': '0.0936441923047926',
|
||||
'26': '0.0992125657480125',
|
||||
'27': '0.105112051906714',
|
||||
'28': '0.111362339767542',
|
||||
'29': '0.117984289085212',
|
||||
'30': '0.125',
|
||||
'31': '0.132432886794912',
|
||||
'32': '0.140307756038672',
|
||||
'33': '0.14865088937534',
|
||||
'34': '0.157490131236859',
|
||||
'35': '0.166854981771254',
|
||||
'36': '0.176776695296637',
|
||||
'37': '0.187288384609585',
|
||||
'38': '0.198425131496025',
|
||||
'39': '0.210224103813429',
|
||||
'40': '0.222724679535085',
|
||||
'41': '0.235968578170423',
|
||||
'42': '0.25',
|
||||
'43': '0.264865773589824',
|
||||
'44': '0.280615512077343',
|
||||
'45': '0.29730177875068',
|
||||
'46': '0.314980262473718',
|
||||
'47': '0.333709963542509',
|
||||
'48': '0.353553390593274',
|
||||
'49': '0.37457676921917',
|
||||
'50': '0.39685026299205',
|
||||
'51': '0.420448207626857',
|
||||
'52': '0.44544935907017',
|
||||
'53': '0.471937156340847',
|
||||
'54': '0.5',
|
||||
'55': '0.529731547179648',
|
||||
'56': '0.561231024154687',
|
||||
'57': '0.594603557501361',
|
||||
'58': '0.629960524947437',
|
||||
'59': '0.667419927085017',
|
||||
'60': '0.707106781186548',
|
||||
'61': '0.749153538438341',
|
||||
'62': '0.7937005259841',
|
||||
'63': '0.840896415253715',
|
||||
'64': '0.890898718140339',
|
||||
'65': '0.943874312681694',
|
||||
'66': '1',
|
||||
'67': '1.0594630943593',
|
||||
'68': '1.12246204830937',
|
||||
'69': '1.18920711500272',
|
||||
'70': '1.25992104989487',
|
||||
'71': '1.33483985417003',
|
||||
'72': '1.4142135623731',
|
||||
'73': '1.49830707687668',
|
||||
'74': '1.5874010519682',
|
||||
'75': '1.68179283050743',
|
||||
'76': '1.78179743628068',
|
||||
'77': '1.88774862536339',
|
||||
'78': '2',
|
||||
'79': '2.11892618871859',
|
||||
'80': '2.24492409661875',
|
||||
'81': '2.37841423000544',
|
||||
'82': '2.51984209978975',
|
||||
'83': '2.66967970834007',
|
||||
'84': '2.82842712474619',
|
||||
'85': '2.99661415375336',
|
||||
'86': '3.1748021039364',
|
||||
'87': '3.36358566101486',
|
||||
'88': '3.56359487256136',
|
||||
'89': '3.77549725072677',
|
||||
'90': '4',
|
||||
'91': '4.23785237743718',
|
||||
'92': '4.48984819323749',
|
||||
'93': '4.75682846001088',
|
||||
'94': '5.03968419957949',
|
||||
'95': '5.33935941668014',
|
||||
'96': '5.65685424949238',
|
||||
'97': '5.99322830750673',
|
||||
'98': '6.3496042078728',
|
||||
'99': '6.72717132202972',
|
||||
'100': '7.12718974512272',
|
||||
'101': '7.55099450145355',
|
||||
'102': '8',
|
||||
'103': '8.47570475487436',
|
||||
'104': '8.97969638647498',
|
||||
'105': '9.51365692002177',
|
||||
'106': '10.079368399159',
|
||||
'107': '10.6787188333603',
|
||||
'108': '11.3137084989848',
|
||||
'109': '11.9864566150135',
|
||||
'110': '12.6992084157456',
|
||||
'111': '13.4543426440594',
|
||||
'112': '14.2543794902454',
|
||||
'113': '15.1019890029071',
|
||||
'114': '16',
|
||||
'115': '16.9514095097487',
|
||||
'116': '17.95939277295',
|
||||
'117': '19.0273138400435',
|
||||
'118': '20.158736798318',
|
||||
'119': '21.3574376667206',
|
||||
'120': '22.6274169979695',
|
||||
'121': '23.9729132300269',
|
||||
'122': '25.3984168314912',
|
||||
'123': '26.9086852881189',
|
||||
'124': '28.5087589804909',
|
||||
'125': '30.2039780058142',
|
||||
'126': '32',
|
||||
'127': '33.9028190194974',
|
||||
'128': '35.9187855458999',
|
||||
'129': '38.0546276800871',
|
||||
'130': '40.3174735966359',
|
||||
'131': '42.7148753334411'
|
||||
}
|
||||
|
124
nmcsup/log.py
124
nmcsup/log.py
@ -1,56 +1,68 @@
|
||||
"""提供对于音创系列的日志"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个
|
||||
|
||||
import logging
|
||||
import os
|
||||
import datetime
|
||||
import sys
|
||||
|
||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||
time = StrStartTime
|
||||
|
||||
main_path = './log/'
|
||||
|
||||
position = main_path + time
|
||||
|
||||
if not os.path.exists('./log/'):
|
||||
os.makedirs('./log/')
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(level=logging.INFO)
|
||||
handler = logging.FileHandler(position + ".logger")
|
||||
print(position + ".logger")
|
||||
|
||||
handler.setLevel(logging.INFO)
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
handler.setFormatter(formatter)
|
||||
|
||||
console = logging.StreamHandler()
|
||||
console.setLevel(logging.INFO)
|
||||
|
||||
logger.addHandler(handler)
|
||||
logger.addHandler(console)
|
||||
|
||||
print("using Timbre_resources_package_generator_lib \n --made by 诸葛亮与八卦阵")
|
||||
print(sys.path[0].replace("nmcsup\\logger", "log\\"))
|
||||
|
||||
# import logger
|
||||
|
||||
# 载入日志功能
|
||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||
# logger.setting(StrStartTime)
|
||||
"""字符串型的程序开始时间"""
|
||||
|
||||
|
||||
def log(info: str = '', isPrinted: bool = True, isLoggerLibRecord: bool = True):
|
||||
# isLoggerLibRecord: 是否同时在logger库中记录
|
||||
"""将信息连同当前时间载入日志"""
|
||||
if not os.path.exists('./log/'):
|
||||
os.makedirs('./log/')
|
||||
with open('./log/' + StrStartTime + '.msct.log', 'a', encoding='UTF-8') as f:
|
||||
f.write(str(datetime.datetime.now())[11:19] + ' ' + info + '\n')
|
||||
if isPrinted:
|
||||
print(str(datetime.datetime.now())[11:19] + ' ' + info)
|
||||
if isLoggerLibRecord:
|
||||
logger.info(info)
|
||||
"""提供对于音创系列的日志"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个
|
||||
|
||||
import logging
|
||||
import os
|
||||
import datetime
|
||||
|
||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||
time = StrStartTime
|
||||
|
||||
main_path = './log/'
|
||||
|
||||
position = main_path + time
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(level=logging.INFO)
|
||||
|
||||
if not os.path.exists('./log/'):
|
||||
os.makedirs('./log/')
|
||||
|
||||
# try:
|
||||
# handler = logging.FileHandler(position + ".logger")
|
||||
# except FileNotFoundError:
|
||||
# os.makedirs('./log/')
|
||||
handler = logging.FileHandler(position + ".logger")
|
||||
print(position + ".logger")
|
||||
|
||||
handler.setLevel(logging.INFO)
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
handler.setFormatter(formatter)
|
||||
|
||||
console = logging.StreamHandler()
|
||||
console.setLevel(logging.INFO)
|
||||
|
||||
logger.addHandler(handler)
|
||||
logger.addHandler(console)
|
||||
|
||||
# import logger
|
||||
|
||||
# 载入日志功能
|
||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||
# logger.setting(StrStartTime)
|
||||
"""字符串型的程序开始时间"""
|
||||
|
||||
|
||||
def log(info: str = '', isPrinted: bool = False, isLoggerLibRecord: bool = True, isWrite: bool = False):
|
||||
"""
|
||||
info: 信息
|
||||
isPrinted: 是否print(仅限金羿log,python官方的logging照常输出)
|
||||
isLoggerLibRecord: 是否同时在logger库中记录
|
||||
isWrite: 是否write(仅限金羿log,python官方的logging照常输出)
|
||||
"""
|
||||
"""将信息连同当前时间载入日志"""
|
||||
if not os.path.exists('./log/'):
|
||||
os.makedirs('./log/')
|
||||
if isWrite:
|
||||
with open('./log/' + StrStartTime + '.msct.log', 'a', encoding='UTF-8') as f:
|
||||
f.write(str(datetime.datetime.now())[11:19] + ' ' + info + '\n')
|
||||
if isPrinted:
|
||||
print(str(datetime.datetime.now())[11:19] + ' ' + info)
|
||||
if isLoggerLibRecord:
|
||||
logger.info(info)
|
||||
|
||||
|
||||
def end():
|
||||
logging.disable(logging.INFO)
|
||||
logging.shutdown()
|
||||
|
@ -1,84 +1,201 @@
|
||||
"""音创系列的文件读取功能"""
|
||||
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:3个;语法(一级)错误:22个
|
||||
|
||||
|
||||
from nmcsup.log import log
|
||||
from nmcsup.const import notes
|
||||
|
||||
|
||||
# 从格式文本文件读入一个音轨并存入一个列表
|
||||
def ReadFile(fn: str): # -> list
|
||||
from nmcsup.trans import note2list
|
||||
log('打开' + fn + "并读取音符")
|
||||
try:
|
||||
nat = open(fn, 'r', encoding='UTF-8').read().split(" ")
|
||||
del fn
|
||||
except FileNotFoundError:
|
||||
log("找不到读取目标文件")
|
||||
return False
|
||||
Notes = []
|
||||
log(str(nat) + "已读取")
|
||||
for i in range(int(len(nat) / 2)):
|
||||
Notes.append([nat[i * 2], float(nat[i * 2 + 1])])
|
||||
Notes = note2list(Notes)
|
||||
log('音符数据更新' + str(Notes))
|
||||
return [Notes, ]
|
||||
|
||||
|
||||
# 从midi读入多个音轨,返回多个音轨列表
|
||||
def ReadMidi(midfile: str): # -> list
|
||||
import mido
|
||||
from msctspt.threadOpera import NewThread
|
||||
Notes = []
|
||||
try:
|
||||
mid = mido.MidiFile(midfile)
|
||||
except FileNotFoundError:
|
||||
log("找不到文件或无法读取文件" + midfile)
|
||||
return False
|
||||
# 解析
|
||||
ks = list(notes.values())
|
||||
|
||||
def loadMidi(track1):
|
||||
datas = []
|
||||
for i in track1:
|
||||
if i.is_meta:
|
||||
log('元信息' + str(i))
|
||||
pass # 不处理元信息
|
||||
elif 'note_on' in str(i):
|
||||
msg = str(i).replace("note=", '').replace("time=", '').split(" ")
|
||||
log('音符on消息,处理后:' + str(msg))
|
||||
if msg[4] == '0':
|
||||
datas.append([ks[int(msg[2]) - 20][0], 1.0])
|
||||
log('延续时间0tick--:添加音符' + str([ks[int(msg[2]) - 20][0], 1.0]))
|
||||
else:
|
||||
datas.append([ks[int(msg[2]) - 20][0], float(msg[4]) / 480])
|
||||
log('延续时间' + msg[4] + 'tick--:添加音符' + str([ks[int(msg[2]) - 20][0], float(msg[4]) / 480]))
|
||||
del msg
|
||||
log('音符增加' + str(datas))
|
||||
return datas
|
||||
|
||||
for j, track in enumerate(mid.tracks):
|
||||
th = NewThread(loadMidi, (track,))
|
||||
th.start()
|
||||
Notes.append(th.getResult())
|
||||
del ks
|
||||
return Notes
|
||||
|
||||
|
||||
def ReadOldProject(fn: str): # -> list
|
||||
import json
|
||||
from nmcsup.trans import note2list
|
||||
log("读取文件:" + fn)
|
||||
try:
|
||||
with open(fn, 'r', encoding='UTF-8') as c:
|
||||
dataset = json.load(c)
|
||||
except FileNotFoundError:
|
||||
print('找不到文件:' + fn + ",请查看您是否输入正确")
|
||||
log("丢失" + fn)
|
||||
return False
|
||||
for i in range(len(dataset['musics'])):
|
||||
dataset['musics'][i]['notes'] = note2list(dataset['musics'][i]['notes'])
|
||||
# 返回 音轨列表 选择器
|
||||
return dataset
|
||||
"""音创系列的文件读取功能"""
|
||||
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:3个;语法(一级)错误:22个
|
||||
|
||||
|
||||
from nmcsup.log import log
|
||||
from nmcsup.const import notes
|
||||
import pickle
|
||||
|
||||
|
||||
# 从格式文本文件读入一个音轨并存入一个列表
|
||||
def ReadFile(fn: str): # -> list
|
||||
from nmcsup.trans import note2list
|
||||
log('打开' + fn + "并读取音符")
|
||||
try:
|
||||
nat = open(fn, 'r', encoding='UTF-8').read().split(" ")
|
||||
del fn
|
||||
except FileNotFoundError:
|
||||
log("找不到读取目标文件")
|
||||
return False
|
||||
Notes = []
|
||||
log(str(nat) + "已读取")
|
||||
for i in range(int(len(nat) / 2)):
|
||||
Notes.append([nat[i * 2], float(nat[i * 2 + 1])])
|
||||
Notes = note2list(Notes)
|
||||
log('音符数据更新' + str(Notes))
|
||||
return [Notes, ]
|
||||
|
||||
|
||||
# 从midi读入多个音轨,返回多个音轨列表
|
||||
def ReadMidi(midfile: str): # -> list
|
||||
import mido
|
||||
from msctspt.threadOpera import NewThread
|
||||
Notes = []
|
||||
try:
|
||||
mid = mido.MidiFile(midfile)
|
||||
except FileNotFoundError:
|
||||
log("找不到文件或无法读取文件" + midfile)
|
||||
return False
|
||||
# 解析
|
||||
ks = list(notes.values())
|
||||
|
||||
def loadMidi(track1):
|
||||
datas = []
|
||||
for i in track1:
|
||||
if i.is_meta:
|
||||
log('元信息' + str(i))
|
||||
pass # 不处理元信息
|
||||
elif 'note_on' in str(i):
|
||||
msg = str(i).replace("note=", '').replace("time=", '').split(" ")
|
||||
log('音符on消息,处理后:' + str(msg))
|
||||
if msg[4] == '0':
|
||||
datas.append([ks[int(msg[2]) - 20][0], 1.0])
|
||||
log('延续时间0tick--:添加音符' + str([ks[int(msg[2]) - 20][0], 1.0]))
|
||||
else:
|
||||
datas.append([ks[int(msg[2]) - 20][0], float(msg[4]) / 480])
|
||||
log('延续时间' + msg[4] + 'tick--:添加音符' + str([ks[int(msg[2]) - 20][0], float(msg[4]) / 480]))
|
||||
del msg
|
||||
log('音符增加' + str(datas))
|
||||
return datas
|
||||
|
||||
for j, track in enumerate(mid.tracks):
|
||||
th = NewThread(loadMidi, (track,))
|
||||
th.start()
|
||||
Notes.append(th.getResult())
|
||||
del ks
|
||||
return Notes
|
||||
|
||||
|
||||
class Note:
|
||||
def __init__(self, channel, pitch, velocity, time, time_position, instrument):
|
||||
self.channel = channel
|
||||
self.pitch = pitch
|
||||
self.velocity = velocity
|
||||
self.delay = time
|
||||
self.time_position = time_position
|
||||
self.instrument = instrument
|
||||
self.CD = "d"
|
||||
|
||||
def get_CD(self, start, end):
|
||||
if end - start > 1.00:
|
||||
self.CD = "c"
|
||||
else:
|
||||
self.CD = "d"
|
||||
|
||||
|
||||
def midi_conversion(midfile: str):
|
||||
import mido
|
||||
# from msctspt.threadOpera import NewThread
|
||||
from bgArrayLib.bpm import get
|
||||
|
||||
def Time(mt, tpb_a, bpm_a):
|
||||
return round(mt / tpb_a / bpm_a * 60 * 20)
|
||||
Notes = []
|
||||
tracks = []
|
||||
note_list = []
|
||||
close = []
|
||||
on = []
|
||||
off = []
|
||||
instruments = []
|
||||
isPercussion = False
|
||||
try:
|
||||
mid = mido.MidiFile(midfile)
|
||||
except FileNotFoundError:
|
||||
log("找不到文件或无法读取文件" + midfile)
|
||||
return False
|
||||
tpb = mid.ticks_per_beat
|
||||
bpm = get(midfile)
|
||||
# 解析
|
||||
# def loadMidi(track1):
|
||||
for track in mid.tracks:
|
||||
overallTime = 0.0
|
||||
instrument = 0
|
||||
for i in track:
|
||||
overallTime += i.time
|
||||
try:
|
||||
if i.channel != 9:
|
||||
# try:
|
||||
# log("event_type(事件): " + str(i.type) + " channel(音轨): " + str(i.channel) + " note/pitch(音高): " +
|
||||
# str(i[2]) +
|
||||
# " velocity(力度): " + str(i.velocity) + " time(间隔时间): " + str(i.time) +
|
||||
# " overallTime/globalTime/timePosition: " + str(overallTime) + " \n")
|
||||
# except AttributeError:
|
||||
# log("event_type(事件): " + str(i.type) + " thing(内容):" + str(i) + " \n")
|
||||
if 'program_change' in str(i):
|
||||
instrument = i.program
|
||||
if instrument > 119: # 音色不够
|
||||
pass
|
||||
else:
|
||||
instruments.append(i.program)
|
||||
if 'note_on' in str(i) and i.velocity > 0:
|
||||
print(i)
|
||||
# print(i.note)
|
||||
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||
tracks.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||
note_list.append([i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument])
|
||||
on.append([i.note, Time(overallTime, tpb, bpm)])
|
||||
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||
if 'note_off' in str(i) or 'note_on' in str(i) and i.velocity == 0:
|
||||
# print(i)
|
||||
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm))])
|
||||
close.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||
off.append([i.note, Time(overallTime, tpb, bpm)])
|
||||
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||
except AttributeError:
|
||||
pass
|
||||
if 'note_on' in str(i) and i.channel == 9:
|
||||
if 'note_on' in str(i) and i.velocity > 0:
|
||||
print(i)
|
||||
# print(i.note)
|
||||
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1)])
|
||||
tracks.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1)])
|
||||
note_list.append([i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1])
|
||||
on.append([i.note, Time(overallTime, tpb, bpm)])
|
||||
isPercussion = True
|
||||
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||
Notes.append(tracks)
|
||||
if instruments is []:
|
||||
instruments.append(0)
|
||||
instruments = list(set(instruments))
|
||||
with open("1.pkl", 'wb') as b:
|
||||
pickle.dump([instruments, isPercussion], b)
|
||||
|
||||
# for j, track in enumerate(mid.tracks):
|
||||
# th = NewThread(loadMidi, (track,))
|
||||
# th.start()
|
||||
# Notes.append(th.getResult())
|
||||
|
||||
# print(Notes)
|
||||
print(Notes.__len__())
|
||||
# print(note_list)
|
||||
print(instruments)
|
||||
return Notes
|
||||
# return [Notes, note_list]
|
||||
|
||||
|
||||
def ReadOldProject(fn: str): # -> list
|
||||
import json
|
||||
from nmcsup.trans import note2list
|
||||
log("读取文件:" + fn)
|
||||
try:
|
||||
with open(fn, 'r', encoding='UTF-8') as c:
|
||||
dataset = json.load(c)
|
||||
except FileNotFoundError:
|
||||
print('找不到文件:' + fn + ",请查看您是否输入正确")
|
||||
log("丢失" + fn)
|
||||
return False
|
||||
for i in range(len(dataset['musics'])):
|
||||
dataset['musics'][i]['notes'] = note2list(dataset['musics'][i]['notes'])
|
||||
# 返回 音轨列表 选择器
|
||||
return dataset
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# a = midi_conversion("L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\同道殊途标准.mid")
|
||||
# midi_conversion("L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\"
|
||||
# "Illusionary_Daytime_--------幻昼.mid")
|
||||
# a = midi_conversion(r"C:\Users\lc\Documents\MuseScore3\乐谱\架子鼓.mid")
|
||||
a = midi_conversion(r"C:\Users\lc\Documents\MuseScore3\乐谱\stay2.mid")
|
||||
# print(a)
|
||||
|
534
nmcsup/trans.py
534
nmcsup/trans.py
@ -1,245 +1,289 @@
|
||||
"""音创系列的转换功能"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:2个;语法(一级)错误:192个
|
||||
|
||||
|
||||
from nmcsup.log import log
|
||||
|
||||
|
||||
import amulet
|
||||
import amulet_nbt
|
||||
from amulet.api.block import Block
|
||||
from amulet.api.block_entity import BlockEntity
|
||||
from amulet.utils.world_utils import block_coords_to_chunk_coords
|
||||
from amulet_nbt import TAG_String, TAG_Compound, TAG_Byte
|
||||
|
||||
|
||||
# 输入一个列表 [ [str, float ], [], ... ] 音符str 值为持续时间float
|
||||
def note2list(Notes: list) -> list:
|
||||
from nmcsup.const import notes
|
||||
|
||||
def change(base):
|
||||
enwo = {
|
||||
'a': 'A',
|
||||
'b': 'B',
|
||||
'c': 'C',
|
||||
'd': "D",
|
||||
"e": "E",
|
||||
'f': 'F',
|
||||
'g': "G"
|
||||
}
|
||||
nuwo = {
|
||||
'6': 'A',
|
||||
'7': 'B',
|
||||
'1': 'C',
|
||||
'2': "D",
|
||||
"3": "E",
|
||||
'4': 'F',
|
||||
'5': "G"
|
||||
}
|
||||
for k, v in enwo.items():
|
||||
if k in base:
|
||||
base = base.replace(k, v)
|
||||
for k, v in nuwo.items():
|
||||
if k in base:
|
||||
base = base.replace(k, v)
|
||||
return base
|
||||
|
||||
res = []
|
||||
log(" === 音符列表=>音调列表")
|
||||
for i in Notes:
|
||||
s2 = change(i[0])
|
||||
log(' === 正在操作音符' + i[0] + '->' + s2)
|
||||
if s2 in notes.keys():
|
||||
log(" === 找到此音符,加入:" + str(notes[s2][0]))
|
||||
res.append([notes[s2][0], float(i[1])])
|
||||
else:
|
||||
log(' === ' + s2 + '不在音符表内,此处自动替换为 休止符0 ')
|
||||
res.append(['0', float(i[1])])
|
||||
log(' === 最终反回' + str(res))
|
||||
return res
|
||||
|
||||
|
||||
def mcnote2freq(Notes):
|
||||
from nmcsup.const import notes
|
||||
mcnback = {}
|
||||
for i, j in notes.items():
|
||||
mcnback[j[0]] = i
|
||||
res = []
|
||||
log(" === 我的世界音调表=>频率列表")
|
||||
for i in Notes:
|
||||
log(' === 正在操作音符' + i[0] + '->' + mcnback[i[0]])
|
||||
res.append([notes[mcnback[i[0]]][1], float(i[1])])
|
||||
log(' === 最终反回' + str(res))
|
||||
return res
|
||||
|
||||
|
||||
# MP3文件转midi文件
|
||||
def Mp32Mid(mp3File, midFile):
|
||||
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio
|
||||
# 加载
|
||||
(audio, _) = load_audio(mp3File, sr=sample_rate) # , mono=True
|
||||
# 实例化并转换
|
||||
PianoTranscription(device="cpu").transcribe(audio, midFile)
|
||||
|
||||
|
||||
# 传入一个音符列表转为指令列表
|
||||
def Note2Cmd(Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
||||
isProsess: bool = False) -> list:
|
||||
commands = []
|
||||
a = 0.0
|
||||
if isProsess:
|
||||
length = len(Notes)
|
||||
j = 1
|
||||
for i in range(len(Notes)):
|
||||
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ playsound " + Instrument + " @s ~ ~ ~ 1000 " + str(
|
||||
Notes[i][0]) + " 1000\n")
|
||||
a += Notes[i][1]
|
||||
if isProsess:
|
||||
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ title @s actionbar §e▶ 播放中: §a" + str(
|
||||
j) + "/" + str(length) + " || " + str(int(j / length * 1000) / 10) + "\n")
|
||||
j += 1
|
||||
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||
return commands
|
||||
|
||||
|
||||
# 简单载入方块
|
||||
# level.set_version_block(posx,posy,posz,"minecraft:overworld",("bedrock", (1, 16, 20)),Block(namespace, name))
|
||||
|
||||
|
||||
# 转入指令列表与位置信息转至世界
|
||||
def Cmd2World(cmd: list, world: str, dire: list):
|
||||
"""将指令以命令链的形式载入世界\n
|
||||
cmd指令列表位为一个序列,中包含指令字符串\n
|
||||
world为地图所在位置,需要指向文件夹,dire为指令方块生成之位置"""
|
||||
level = amulet.load_level(world)
|
||||
cdl = []
|
||||
for i in cmd:
|
||||
e = True
|
||||
try:
|
||||
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
||||
cdl.append(i[:i.index('#')])
|
||||
e = False
|
||||
except ValueError:
|
||||
cdl.append(i)
|
||||
finally:
|
||||
if e is True:
|
||||
cdl.append(i)
|
||||
i = 0
|
||||
# 第一个是特殊
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||
'mode': TAG_String("repeating")})
|
||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1], dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(0), 'Command': TAG_String(cdl.pop(0))})})))
|
||||
chunk.blocks[offset_x, dire[1], offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], dire[1], dire[2])] = universal_block_entity
|
||||
chunk.changed = True
|
||||
# 集体上移
|
||||
dire[1] += 1
|
||||
# 真正开始
|
||||
down = False
|
||||
for j in cdl:
|
||||
if dire[1] + i >= 255:
|
||||
dire[0] += 1
|
||||
i = 0
|
||||
down = not down
|
||||
# 定义此方块
|
||||
if dire[1] + i == 254:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('east'),
|
||||
'mode': TAG_String("chain")})
|
||||
else:
|
||||
if down:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('down'),
|
||||
'mode': TAG_String("chain")})
|
||||
else:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||
'mode': TAG_String("chain")})
|
||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||
# 获取区块
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||
if down:
|
||||
# 定义方块实体
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], 254 - i, dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
||||
|
||||
# 将方块加入世界
|
||||
chunk.blocks[offset_x, 254 - i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], 254 - i, dire[2])] = universal_block_entity
|
||||
else:
|
||||
# 定义方块实体
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1] + i, dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
||||
|
||||
# 将方块加入世界
|
||||
chunk.blocks[offset_x, dire[1] + i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], dire[1] + i, dire[2])] = universal_block_entity
|
||||
# 设置为已更新区块
|
||||
chunk.changed = True
|
||||
i += 1
|
||||
del i, cdl
|
||||
# 保存世界并退出
|
||||
level.save()
|
||||
level.close()
|
||||
|
||||
|
||||
# 音符转成方块再加载到世界里头
|
||||
def Blocks2World(world: str, dire: list, Datas: list):
|
||||
from nmcsup.const import Blocks
|
||||
level = amulet.load_level(world)
|
||||
i = 0
|
||||
|
||||
def setblock(block: str, pos: list):
|
||||
"""pos : list[int,int,int]"""
|
||||
cx, cz = block_coords_to_chunk_coords(pos[0], pos[2])
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = pos[0] - 16 * cx, pos[2] - 16 * cz
|
||||
chunk.blocks[offset_x, pos[1], offset_z] = level.block_palette.get_add_block(Block("minecraft", block))
|
||||
chunk.changed = True
|
||||
|
||||
for j in Datas:
|
||||
if dire[1] + 1 >= 255:
|
||||
i = 0
|
||||
dire[0] += 1
|
||||
setblock(Blocks[j[0]], [dire[0], dire[1] + i, dire[2]])
|
||||
i = int(i + j[1] + 0.5) # 四舍五入
|
||||
level.save()
|
||||
level.close()
|
||||
|
||||
|
||||
# 传入音符列表制作播放器指令
|
||||
def Notes2Player(Note, dire: list, CmdData: dict):
|
||||
"""传入音符列表、坐标、指令数据,生成播放器指令"""
|
||||
Notes = {}
|
||||
for i in Note:
|
||||
Notes[i[0]] = ''
|
||||
Notes = list(Notes.keys())
|
||||
from nmcsup.const import Blocks
|
||||
Cmds = []
|
||||
for j in Notes:
|
||||
Cmds.append('execute @e[x=' + str(dire[0]) + ',y=' + str(dire[1]) + ',z=' + str(dire[2]) + ',dy=' + str(
|
||||
255 - dire[1]) + ',name=' + CmdData['Ent'] + '] ~ ~ ~ detect ~ ~ ~ ' + Blocks[j] + ' 0 execute @a ' +
|
||||
CmdData['Pls'] + ' ~ ~ ~ playsound ' + CmdData['Ins'] + ' @s ~ ~ ~ 1000 ' + str(j) + ' 1000\n')
|
||||
Cmds += ['#本函数由 金羿 音·创 生成\n', 'execute @e[y=' + str(dire[1]) + ',dy=' + str(255 - dire[1]) + ',name=' + CmdData[
|
||||
'Ent'] + '] ~ ~ ~ tp ~ ~1 ~\n',
|
||||
'execute @e[y=255,dy=100,name=' + CmdData['Ent'] + '] ~ ~ ~ tp ~1 ' + str(dire[1]) + ' ~\n',
|
||||
'#音·创 开发交流群 861684859']
|
||||
return Cmds
|
||||
|
||||
|
||||
# 传入音符列表生成方块至世界
|
||||
def Datas2BlkWorld(NoteData, world: str, dire: list):
|
||||
for i in range(len(NoteData)):
|
||||
Blocks2World(world, [dire[0], dire[1], dire[2] + i], NoteData[i])
|
||||
"""音创系列的转换功能"""
|
||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:2个;语法(一级)错误:192个
|
||||
|
||||
|
||||
from nmcsup.log import log
|
||||
|
||||
|
||||
import amulet
|
||||
import amulet_nbt
|
||||
from amulet.api.block import Block
|
||||
from amulet.api.block_entity import BlockEntity
|
||||
from amulet.utils.world_utils import block_coords_to_chunk_coords
|
||||
from amulet_nbt import TAG_String, TAG_Compound, TAG_Byte
|
||||
|
||||
|
||||
# 输入一个列表 [ [str, float ], [], ... ] 音符str 值为持续时间float
|
||||
def note2list(Notes: list) -> list:
|
||||
from nmcsup.const import notes
|
||||
|
||||
def change(base):
|
||||
enwo = {
|
||||
'a': 'A',
|
||||
'b': 'B',
|
||||
'c': 'C',
|
||||
'd': "D",
|
||||
"e": "E",
|
||||
'f': 'F',
|
||||
'g': "G"
|
||||
}
|
||||
nuwo = {
|
||||
'6': 'A',
|
||||
'7': 'B',
|
||||
'1': 'C',
|
||||
'2': "D",
|
||||
"3": "E",
|
||||
'4': 'F',
|
||||
'5': "G"
|
||||
}
|
||||
for k, v in enwo.items():
|
||||
if k in base:
|
||||
base = base.replace(k, v)
|
||||
for k, v in nuwo.items():
|
||||
if k in base:
|
||||
base = base.replace(k, v)
|
||||
return base
|
||||
|
||||
res = []
|
||||
log(" === 音符列表=>音调列表")
|
||||
for i in Notes:
|
||||
s2 = change(i[0])
|
||||
log(' === 正在操作音符' + i[0] + '->' + s2)
|
||||
if s2 in notes.keys():
|
||||
log(" === 找到此音符,加入:" + str(notes[s2][0]))
|
||||
res.append([notes[s2][0], float(i[1])])
|
||||
else:
|
||||
log(' === ' + s2 + '不在音符表内,此处自动替换为 休止符0 ')
|
||||
res.append(['0', float(i[1])])
|
||||
log(' === 最终反回' + str(res))
|
||||
return res
|
||||
|
||||
|
||||
def mcnote2freq(Notes):
|
||||
from nmcsup.const import notes
|
||||
mcnback = {}
|
||||
for i, j in notes.items():
|
||||
mcnback[j[0]] = i
|
||||
res = []
|
||||
log(" === 我的世界音调表=>频率列表")
|
||||
for i in Notes:
|
||||
log(' === 正在操作音符' + i[0] + '->' + mcnback[i[0]])
|
||||
res.append([notes[mcnback[i[0]]][1], float(i[1])])
|
||||
log(' === 最终反回' + str(res))
|
||||
return res
|
||||
|
||||
|
||||
# MP3文件转midi文件
|
||||
def Mp32Mid(mp3File, midFile):
|
||||
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio
|
||||
# 加载
|
||||
(audio, _) = load_audio(mp3File, sr=sample_rate) # , mono=True
|
||||
# 实例化并转换
|
||||
PianoTranscription(device="cpu").transcribe(audio, midFile)
|
||||
|
||||
|
||||
# 传入一个音符列表转为指令列表
|
||||
def Note2Cmd(Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
||||
isProsess: bool = False) -> list:
|
||||
commands = []
|
||||
a = 0.0
|
||||
length = len(Notes)
|
||||
j = 1
|
||||
for i in range(len(Notes)):
|
||||
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ playsound " + Instrument + " @s ~ ~ ~ 1000 " + str(
|
||||
Notes[i][0]) + " 1000\n")
|
||||
a += Notes[i][1]
|
||||
if isProsess:
|
||||
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ title @s actionbar §e▶ 播放中: §a" + str(
|
||||
j) + "/" + str(length) + " || " + str(int(j / length * 1000) / 10) + "\n")
|
||||
j += 1
|
||||
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||
return commands
|
||||
# def newDataStructureCounterChange():
|
||||
|
||||
|
||||
def classList_conversion(List: list, ScoreboardName: str,
|
||||
isProsess: bool = False) -> list:
|
||||
from bgArrayLib.compute import round_up
|
||||
commands = []
|
||||
length = len(List)
|
||||
j = 1
|
||||
print(List)
|
||||
for k in range(len(List)):
|
||||
i = List[k][0]
|
||||
print(i)
|
||||
print(type(i))
|
||||
try:
|
||||
if i.instrument > 119:
|
||||
pass
|
||||
else:
|
||||
commands.append("execute @e[scores={" +
|
||||
ScoreboardName + "=" + str(round_up(i.time_position)).replace(".0", "") + "}] ~ ~" +
|
||||
str(127 - i.velocity) +
|
||||
" ~ playsound " +
|
||||
str(i.instrument) +
|
||||
str(i.CD) + "." +
|
||||
str(i.pitch)
|
||||
+ " @a ~ ~ ~ 1000 1.0 1000\n")
|
||||
if isProsess:
|
||||
commands.append("execute @a"" ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" +
|
||||
str(round_up(i.time_position)).replace(".0", "") +
|
||||
"}] ~ ~ ~ title @s actionbar §e▶ 播放中: §a" +
|
||||
str(j) + "/" + str(length) + " || " + str(int(j / length * 1000) / 10) + "\n")
|
||||
j += 1
|
||||
except AttributeError:
|
||||
pass
|
||||
# a += List[i][1]
|
||||
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||
print(commands)
|
||||
return commands
|
||||
|
||||
|
||||
# 简单载入方块
|
||||
# level.set_version_block(posx,posy,posz,"minecraft:overworld",("bedrock", (1, 16, 20)),Block(namespace, name))
|
||||
|
||||
|
||||
# 转入指令列表与位置信息转至世界
|
||||
def Cmd2World(cmd: list, world: str, dire: list):
|
||||
"""将指令以命令链的形式载入世界\n
|
||||
cmd指令列表位为一个序列,中包含指令字符串\n
|
||||
world为地图所在位置,需要指向文件夹,dire为指令方块生成之位置"""
|
||||
level = amulet.load_level(world)
|
||||
cdl = []
|
||||
for i in cmd:
|
||||
# e = True
|
||||
try:
|
||||
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
||||
cdl.append(i[:i.index('#')])
|
||||
# e = False
|
||||
except:
|
||||
cdl.append(i)
|
||||
# finally:
|
||||
# if e is True:
|
||||
# cdl.append(i)
|
||||
i = 0
|
||||
# 第一个是特殊
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||
'mode': TAG_String("repeating")})
|
||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1], dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(0), 'Command': TAG_String(cdl.pop(0))})})))
|
||||
chunk.blocks[offset_x, dire[1], offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], dire[1], dire[2])] = universal_block_entity
|
||||
chunk.changed = True
|
||||
# 集体上移
|
||||
dire[1] += 1
|
||||
# 真正开始
|
||||
down = False
|
||||
for j in cdl:
|
||||
if dire[1] + i >= 255:
|
||||
dire[0] += 1
|
||||
i = 0
|
||||
down = not down
|
||||
# 定义此方块
|
||||
if dire[1] + i == 254:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('east'),
|
||||
'mode': TAG_String("chain")})
|
||||
else:
|
||||
if down:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('down'),
|
||||
'mode': TAG_String("chain")})
|
||||
else:
|
||||
universal_block = Block('universal_minecraft', 'command_block',
|
||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||
'mode': TAG_String("chain")})
|
||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||
# 获取区块
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||
if down:
|
||||
# 定义方块实体
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], 254 - i, dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
||||
|
||||
# 将方块加入世界
|
||||
chunk.blocks[offset_x, 254 - i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], 254 - i, dire[2])] = universal_block_entity
|
||||
else:
|
||||
# 定义方块实体
|
||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1] + i, dire[2],
|
||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
||||
|
||||
# 将方块加入世界
|
||||
chunk.blocks[offset_x, dire[1] + i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||
chunk.block_entities[(dire[0], dire[1] + i, dire[2])] = universal_block_entity
|
||||
# 设置为已更新区块
|
||||
chunk.changed = True
|
||||
i += 1
|
||||
del i, cdl
|
||||
# 保存世界并退出
|
||||
level.save()
|
||||
level.close()
|
||||
|
||||
|
||||
# 音符转成方块再加载到世界里头
|
||||
def Blocks2World(world: str, dire: list, Datas: list):
|
||||
from nmcsup.const import Blocks
|
||||
level = amulet.load_level(world)
|
||||
i = 0
|
||||
|
||||
def setblock(block: str, pos: list):
|
||||
"""pos : list[int,int,int]"""
|
||||
cx, cz = block_coords_to_chunk_coords(pos[0], pos[2])
|
||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||
offset_x, offset_z = pos[0] - 16 * cx, pos[2] - 16 * cz
|
||||
chunk.blocks[offset_x, pos[1], offset_z] = level.block_palette.get_add_block(Block("minecraft", block))
|
||||
chunk.changed = True
|
||||
|
||||
for j in Datas:
|
||||
if dire[1] + 1 >= 255:
|
||||
i = 0
|
||||
dire[0] += 1
|
||||
setblock(Blocks[j[0]], [dire[0], dire[1] + i, dire[2]])
|
||||
i = int(i + j[1] + 0.5) # 四舍五入
|
||||
level.save()
|
||||
level.close()
|
||||
|
||||
|
||||
# 传入音符列表制作播放器指令
|
||||
def Notes2Player(Note, dire: list, CmdData: dict):
|
||||
"""传入音符列表、坐标、指令数据,生成播放器指令"""
|
||||
Notes = {}
|
||||
for i in Note:
|
||||
Notes[i[0]] = ''
|
||||
Notes = list(Notes.keys())
|
||||
from nmcsup.const import Blocks
|
||||
Cmds = []
|
||||
for j in Notes:
|
||||
Cmds.append('execute @e[x=' + str(dire[0]) + ',y=' + str(dire[1]) + ',z=' + str(dire[2]) + ',dy=' + str(
|
||||
255 - dire[1]) + ',name=' + CmdData['Ent'] + '] ~ ~ ~ detect ~ ~ ~ ' + Blocks[j] + ' 0 execute @a ' +
|
||||
CmdData['Pls'] + ' ~ ~ ~ playsound ' + CmdData['Ins'] + ' @s ~ ~ ~ 1000 ' + str(j) + ' 1000\n')
|
||||
Cmds += ['#本函数由 金羿 音·创 生成\n', 'execute @e[y=' + str(dire[1]) + ',dy=' + str(255 - dire[1]) + ',name=' + CmdData[
|
||||
'Ent'] + '] ~ ~ ~ tp ~ ~1 ~\n',
|
||||
'execute @e[y=255,dy=100,name=' + CmdData['Ent'] + '] ~ ~ ~ tp ~1 ' + str(dire[1]) + ' ~\n',
|
||||
'#音·创 开发交流群 861684859']
|
||||
return Cmds
|
||||
|
||||
|
||||
# 传入音符列表生成方块至世界
|
||||
def Datas2BlkWorld(NoteData, world: str, dire: list):
|
||||
for i in range(len(NoteData)):
|
||||
Blocks2World(world, [dire[0], dire[1], dire[2] + i], NoteData[i])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from nmcreader import midi_conversion
|
||||
path = "L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\同道殊途标准.mid"
|
||||
b = midi_conversion(path)
|
||||
classList_conversion(b, "n")
|
||||
|
172
nmcsup/vers.py
172
nmcsup/vers.py
@ -1,86 +1,86 @@
|
||||
"""音创系列版本号和版本操作函数"""
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:24个
|
||||
|
||||
|
||||
from msctspt.bugReporter import version
|
||||
import os
|
||||
|
||||
# 以下下两个值请在 msctspt/bugReporter 的version类中修改
|
||||
VER = version.version
|
||||
"""当前版本"""
|
||||
|
||||
LIBS = version.libraries
|
||||
"""当前所需库"""
|
||||
|
||||
|
||||
# 判断版本、临时文件与补全库
|
||||
def compver(ver1, ver2):
|
||||
"""
|
||||
传入不带英文的版本号,特殊情况:"10.12.2.6.5">"10.12.2.6"
|
||||
:param ver1: 版本号1
|
||||
:param ver2: 版本号2
|
||||
:return: ver1< = >ver2返回-1/0/1
|
||||
"""
|
||||
list1 = str(ver1).split(".")
|
||||
list2 = str(ver2).split(".")
|
||||
# 循环次数为短的列表的len
|
||||
for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)):
|
||||
if int(list1[i]) == int(list2[i]):
|
||||
pass
|
||||
elif int(list1[i]) < int(list2[i]):
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
# 循环结束,哪个列表长哪个版本号高
|
||||
if len(list1) == len(list2):
|
||||
return 0
|
||||
elif len(list1) < len(list2):
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
#
|
||||
# ————————————————
|
||||
# 版权声明:上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
||||
# 原文链接:https://blog.csdn.net/tinyjm/article/details/93514261
|
||||
# ————————————————
|
||||
#
|
||||
|
||||
|
||||
def InstallLibs(now, LIBS1):
|
||||
"""比对库信息并安装库"""
|
||||
from os import system as run
|
||||
for i in LIBS1:
|
||||
if i not in now:
|
||||
print("安装库:" + i)
|
||||
run("python -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
||||
|
||||
|
||||
def chkver(ver=VER, libs=LIBS):
|
||||
"""通过文件比对版本信息并安装库"""
|
||||
if not os.path.exists(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct'):
|
||||
print("新安装库")
|
||||
os.makedirs(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||
f.write(ver[0] + '\n')
|
||||
for i in libs:
|
||||
f.write(i + '\n')
|
||||
InstallLibs([], libs)
|
||||
else:
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'r') as f:
|
||||
v = f.readlines()
|
||||
cp = compver(ver[0], v[0])
|
||||
if cp != 0:
|
||||
InstallLibs(v[1:], libs)
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||
f.write(ver[0] + '\n')
|
||||
for i in libs:
|
||||
f.write(i + '\n')
|
||||
del cp
|
||||
|
||||
|
||||
def resetver():
|
||||
"""重置版本信息"""
|
||||
import shutil
|
||||
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||
"""音创系列版本号和版本操作函数"""
|
||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:24个
|
||||
|
||||
|
||||
from msctspt.bugReporter import version
|
||||
import os
|
||||
|
||||
# 以下下两个值请在 msctspt/bugReporter 的version类中修改
|
||||
VER = version.version
|
||||
"""当前版本"""
|
||||
|
||||
LIBS = version.libraries
|
||||
"""当前所需库"""
|
||||
|
||||
|
||||
# 判断版本、临时文件与补全库
|
||||
def compver(ver1, ver2):
|
||||
"""
|
||||
传入不带英文的版本号,特殊情况:"10.12.2.6.5">"10.12.2.6"
|
||||
:param ver1: 版本号1
|
||||
:param ver2: 版本号2
|
||||
:return: ver1< = >ver2返回-1/0/1
|
||||
"""
|
||||
list1 = str(ver1).split(".")
|
||||
list2 = str(ver2).split(".")
|
||||
# 循环次数为短的列表的len
|
||||
for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)):
|
||||
if int(list1[i]) == int(list2[i]):
|
||||
pass
|
||||
elif int(list1[i]) < int(list2[i]):
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
# 循环结束,哪个列表长哪个版本号高
|
||||
if len(list1) == len(list2):
|
||||
return 0
|
||||
elif len(list1) < len(list2):
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
#
|
||||
# ————————————————
|
||||
# 版权声明:上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
||||
# 原文链接:https://blog.csdn.net/tinyjm/article/details/93514261
|
||||
# ————————————————
|
||||
#
|
||||
|
||||
|
||||
def InstallLibs(now, LIBS1):
|
||||
"""比对库信息并安装库"""
|
||||
from os import system as run
|
||||
for i in LIBS1:
|
||||
if i not in now:
|
||||
print("安装库:" + i)
|
||||
run("python -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
||||
|
||||
|
||||
def chkver(ver=VER, libs=LIBS):
|
||||
"""通过文件比对版本信息并安装库"""
|
||||
if not os.path.exists(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct'):
|
||||
print("新安装库")
|
||||
os.makedirs(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||
f.write(ver[0] + '\n')
|
||||
for i in libs:
|
||||
f.write(i + '\n')
|
||||
InstallLibs([], libs)
|
||||
else:
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'r') as f:
|
||||
v = f.readlines()
|
||||
cp = compver(ver[0], v[0])
|
||||
if cp != 0:
|
||||
InstallLibs(v[1:], libs)
|
||||
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||
f.write(ver[0] + '\n')
|
||||
for i in libs:
|
||||
f.write(i + '\n')
|
||||
del cp
|
||||
|
||||
|
||||
def resetver():
|
||||
"""重置版本信息"""
|
||||
import shutil
|
||||
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||
|
Reference in New Issue
Block a user