日志和bug修改

This commit is contained in:
bgArray 2022-01-19 17:48:47 +08:00
parent 7e13b22d46
commit 81eb8e5376
17 changed files with 433 additions and 419 deletions

View File

@ -658,6 +658,7 @@ def __main__():
except ValueError: # 测试完为ValueError故修改语法
tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117])
continue
break
Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./')
if Outdire is None or Outdire == '':
return

View File

@ -1,105 +1,103 @@
"""音创系列的音符对照表 以及一系列常数"""
# 诸葛亮与八卦阵帮忙修改语法 日期:---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]
'....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],
@ -195,126 +193,120 @@ blocks = {
#向查理平致敬!!!!!
'''
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.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' : '木琴'
'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'''

View File

@ -1,17 +1,53 @@
"""提供对于音创系列的日志"""
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
# 统计致命三级错误0个警告二级错误0个语法一级错误9个
import datetime,os
import logging
import os
import datetime
import sys
#载入日志功能
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)
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):
'''将信息连同当前时间载入日志'''
def log(info: str = '', isPrinted: bool = False, 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')
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)
print(str(datetime.datetime.now())[11:19] + ' ' + info)
if isLoggerLibRecord:
logger.info(info)

View File

@ -1,87 +1,84 @@
"""音创系列的文件读取功能"""
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
# 统计致命三级错误0个警告二级错误3个语法一级错误22个
from nmcsup.log import log
from nmcsup.const import notes
#从格式文本文件读入一个音轨并存入一个列表
def ReadFile(fn : str) -> list:
# 从格式文本文件读入一个音轨并存入一个列表
def ReadFile(fn: str): # -> list
from nmcsup.trans import note2list
log('打开'+fn+"并读取音符")
log('打开' + fn + "并读取音符")
try:
nat = open(fn, 'r', encoding='UTF-8').read().split(" ")
del fn
except:
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])])
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,]
log('音符数据更新' + str(Notes))
return [Notes, ]
#从midi读入多个音轨返回多个音轨列表
def ReadMidi(midfile : str ) -> list:
# 从midi读入多个音轨返回多个音轨列表
def ReadMidi(midfile: str): # -> list
import mido
from msctspt.threadOpera import NewThread
Notes = []
try:
mid = mido.MidiFile(midfile)
except:
log("找不到文件或无法读取文件"+midfile)
except FileNotFoundError:
log("找不到文件或无法读取文件" + midfile)
return False
# 解析
ks = list(notes.values())
def loadMidi(track):
def loadMidi(track1):
datas = []
for i in track:
for i in track1:
if i.is_meta:
log('元信息'+str(i))
log('元信息' + str(i))
pass # 不处理元信息
elif 'note_on' in str(i):
msg = str(i).replace("note=", '').replace("time=", '').split(" ")
log('音符on消息处理后'+str(msg))
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]))
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]))
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))
log('音符增加' + str(datas))
return datas
for j, track in enumerate(mid.tracks):
th = NewThread(loadMidi,(track,))
th = NewThread(loadMidi, (track,))
th.start()
Notes.append(th.getResult())
del ks
return Notes
def ReadOldProject(fn:str) -> list:
def ReadOldProject(fn: str): # -> list
import json
from nmcsup.trans import note2list
log("读取文件:"+fn)
log("读取文件:" + fn)
try:
with open(fn, 'r', encoding='UTF-8') as c:
dataset = json.load(c)
except:
print('找不到文件:'+fn+",请查看您是否输入正确")
log("丢失"+fn)
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

View File

@ -1,37 +1,41 @@
"""音创系列的转换功能"""
# 诸葛亮与八卦阵帮忙修改语法 日期:---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:
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"
'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"
'6': 'A',
'7': 'B',
'1': 'C',
'2': "D",
"3": "E",
'4': 'F',
'5': "G"
}
for k, v in enwo.items():
if k in base:
@ -40,193 +44,184 @@ def note2list(Notes : list) -> list:
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)
log(' === 正在操作音符' + i[0] + '->' + s2)
if s2 in notes.keys():
log(" === 找到此音符,加入:"+str(notes[s2][0]))
log(" === 找到此音符,加入:" + str(notes[s2][0]))
res.append([notes[s2][0], float(i[1])])
else:
log(' === '+s2+'不在音符表内,此处自动替换为 休止符0 ')
log(' === ' + s2 + '不在音符表内,此处自动替换为 休止符0 ')
res.append(['0', float(i[1])])
log(' === 最终反回'+str(res))
log(' === 最终反回' + str(res))
return res
def mcnote2freq(Notes):
from nmcsup.const import notes
mcnback = {}
for i,j in notes.items():
for i, j in notes.items():
mcnback[j[0]] = i
res = []
log(" === 我的世界音调表=>频率列表")
for i in Notes:
log(' === 正在操作音符'+i[0]+'->'+mcnback[i[0]])
log(' === 正在操作音符' + i[0] + '->' + mcnback[i[0]])
res.append([notes[mcnback[i[0]]][1], float(i[1])])
log(' === 最终反回'+str(res))
log(' === 最终反回' + str(res))
return res
#MP3文件转midi文件
# 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)
(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:
# 传入一个音符列表转为指令列表
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")
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))
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
#简单载入方块
#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
# 转入指令列表与位置信息转至世界
def Cmd2World(cmd: list, world: str, dire: list):
"""将指令以命令链的形式载入世界\n
cmd指令列表位为一个序列中包含指令字符串\n
world为地图所在位置需要指向文件夹dire为指令方块生成之位置'''
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(' ','') != ''):
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
cdl.append(i[:i.index('#')])
except:
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")})
# 第一个是特殊
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))}) })))
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
#真正开始
# 集体上移
dire[1] += 1
# 真正开始
down = False
for j in cdl:
if dire[1]+i >= 255:
dire[0]+=1
i=0
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")})
# 定义此方块
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")})
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")})
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
# 定义方块实体
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
#设置为已更新区块
# 定义方块实体
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
i += 1
del i, cdl
#保存世界并退出
# 保存世界并退出
level.save()
level.close()
#音符转成方块再加载到世界里头
def Blocks2World(world:str,dire:list,Datas:list):
# 音符转成方块再加载到世界里头
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]'''
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.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:
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) #四舍五入
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):
'''传入音符列表、坐标、指令数据,生成播放器指令'''
# 传入音符列表制作播放器指令
def Notes2Player(Note, dire: list, CmdData: dict):
"""传入音符列表、坐标、指令数据,生成播放器指令"""
Notes = {}
for i in Note:
Notes[i[0]] = ''
@ -234,21 +229,17 @@ def Notes2Player(Note,dire:list,CmdData:dict):
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']
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):
# 传入音符列表生成方块至世界
def Datas2BlkWorld(NoteData, world: str, dire: list):
for i in range(len(NoteData)):
Blocks2World(world,[dire[0],dire[1],dire[2]+i],NoteData[i])
Blocks2World(world, [dire[0], dire[1], dire[2] + i], NoteData[i])

View File

@ -1,20 +1,19 @@
"""音创系列版本号和版本操作函数"""
# 统计致命三级错误0个警告二级错误0个语法一级错误24个
from msctspt.bugReporter import version
import os
#以下下两个值请在 msctspt/bugReporter 的version类中修改
# 以下下两个值请在 msctspt/bugReporter 的version类中修改
VER = version.version
'''当前版本'''
"""当前版本"""
LIBS = version.libraries
'''当前所需库'''
"""当前所需库"""
#判断版本、临时文件与补全库
# 判断版本、临时文件与补全库
def compver(ver1, ver2):
"""
传入不带英文的版本号,特殊情况"10.12.2.6.5">"10.12.2.6"
@ -39,6 +38,8 @@ def compver(ver1, ver2):
return -1
else:
return 1
#
# ————————————————
# 版权声明上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。
@ -46,44 +47,40 @@ def compver(ver1, ver2):
# ————————————————
#
import os
def InstallLibs(now,LIBS):
'''比对库信息并安装库'''
def InstallLibs(now, LIBS1):
"""比对库信息并安装库"""
from os import system as run
for i in LIBS:
if not i in now:
print("安装库:"+i)
run("python -m pip install "+i+" -i https://pypi.tuna.tsinghua.edu.cn/simple")
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'):
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')
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)
f.write(i + '\n')
InstallLibs([], libs)
else:
with open(os.getenv('APPDATA')+'\\Musicreater\\msct.ActiveDatas.msct', 'r') as f:
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')
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')
f.write(i + '\n')
del cp
def resetver():
'''重置版本信息'''
"""重置版本信息"""
import shutil
shutil.rmtree(os.getenv('APPDATA')+'\\Musicreater\\')
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')