# -*- coding: utf-8 -*- # 音·创 开发交流群 861684859 # Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com # 版权所有 金羿("Eilles Wan") & 诸葛亮与八卦阵("bgArray") & 鸣凤鸽子("MingFengPigeon") # 若需转载或借鉴 请依照 Apache 2.0 许可证进行许可 """ 音·创 库版 MIDI转换示例程序 Musicreater Package Version : Demo for Midi Conversion Copyright 2022 all the developers of Musicreater Licensed under the Apache License, Version 2.0 (the 'License'); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ languages = { "ZH_CN": { "MSCT": "音·创", "ChooseLang": "选择语言", "LangChd": "当前语言已经切换为", "ZH_CN": "简体中文", "ZH_TW": "繁体中文(台湾)", "EN_GB": "英语(英国)", "EN_US": "英语(美国)", ":": ":", ",": ",", ".": "。", "ChooseFileFormat": "请输入输出格式[BDX(1)或MCPACK(0)]", "ChoosePlayer": "请选择播放方式[计分板(1) 或 延迟(0)]", "ChoosePath": "请输入MIDI路径或所在文件夹", "WhetherArgEntering": "是否为文件夹内文件的转换统一参数[是(1) 或 否(0)]", "EnterArgs": "请输入转换参数", "noteofArgs": "注:文件夹内的全部midi将统一以此参数转换", "ChooseSbReset": "是否自动重置计分板[是(1) 或 否(0)]", "WhetherCstmProgressBar": "是否自定义进度条[是(1) 或 否(0)]", "EnterProgressBarStyle": "请输入进度条样式", "EnterSbName": "请输入计分板名称", "EnterVolume": "请输入音量大小(0~1)", "EnterSpeed": "请输入速度倍率", "EnterAuthor": "请输入作者", "EnterMaxHeight": "请输入指令结构最大生成高度", "ErrEnter": "输入错误", "Re-Enter": "请重新输入", "Dealing": "正在处理", "FileNotFound": "文件(夹)不存在", "ChooseOutPath": "请输入输出路径", "EnterSelecter": "请输入播放者选择器", "Saying": "言·论", } } import sys if sys.argv.__len__() > 0: currentLang = sys.argv[0] if not currentLang in languages.keys(): currentLang = "ZH_CN" else: currentLang = "ZH_CN" def _(__): ''' `languages` ''' return languages[currentLang][__] import os import random import datetime from msctPkgver.main import * try: from rich.console import Console except ModuleNotFoundError as E: if input("您需要安装 Rich 模块才能使用这个样例\n请问是否安装?(y/n)").lower() in ('y', '1'): os.system("pip install Rich -i https://mirrors.aliyun.com/pypi/") from rich.console import Console else: raise E try: import zhdate except ModuleNotFoundError as E: if input("您需要安装 zhdate 模块才能使用这个样例\n请问是否安装?(y/n)").lower() in ('y', '1'): os.system("pip install zhdate -i https://mirrors.aliyun.com/pypi/") import zhdate else: raise E try: import requests except ModuleNotFoundError as E: if input("您需要安装 requests 模块才能使用这个样例\n请问是否安装?(y/n)").lower() in ('y', '1'): os.system("pip install requests -i https://mirrors.aliyun.com/pypi/") import requests else: raise E MainConsole = Console() MainConsole.print( "[#121110 on #F0F2F4] ", style="#121110 on #F0F2F4", justify="center", ) # 显示大标题 MainConsole.rule(title="[bold #AB70FF]欢迎使用音·创独立转换器", characters="=", style="#26E2FF") MainConsole.rule( title="[bold #AB70FF]Welcome to Independent Musicreater Convernter", characters="-" ) # 显示箴言部分 MainConsole.print( "[#121110 on #F0F2F4]" + random.choice( requests.get( "https://gitee.com/EillesWan/Musicreater/raw/master/resources/myWords.txt" ) .text.strip("\r\n") .split("\r\n") ), style="#121110 on #F0F2F4", justify="center", ) from typing import Any, Literal, Optional, TextIO JustifyMethod = Literal["default", "left", "center", "right", "full"] OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] # 高级的打印函数 def prt( *objects: Any, sep: str = " ", end: str = "\n", justify: Optional[JustifyMethod] = None, overflow: Optional[OverflowMethod] = None, no_wrap: Optional[bool] = None, emoji: Optional[bool] = None, markup: Optional[bool] = None, highlight: Optional[bool] = None, width: Optional[int] = None, height: Optional[int] = None, crop: bool = True, soft_wrap: Optional[bool] = None, new_line_start: bool = False, ) -> None: """打印到控制台。 Args: objects (位置性的args): 要记录到终端的对象。 sep (str, 可选): 要在打印数据之间写入的字符串。默认为""。 end (str, optio可选nal): 在打印数据结束时写入的字符串。默认值为"\\\\n"。 style (Union[str, Style], 可选): 应用于输出的样式。默认为`None`。 justify (str, 可选): 校正位置,可为"default", "left", "right", "center" 或 "full". 默认为`None`。 overflow (str, 可选): 控制溢出:"ignore"忽略, "crop"裁剪, "fold"折叠, "ellipsis"省略号。默认为`None`。 no_wrap (Optional[bool], 可选): 禁用文字包装。默认为`None`。 emoji (Optional[bool], 可选): 启用表情符号代码,或使用控制台默认的`None`。默认为`None`。 markup (Optional[bool], 可选): 启用标记,或`None`使用控制台默认值。默认为`None`。 highlight (Optional[bool], 可选): 启用自动高亮,或`None`使用控制台默认值。默认为`None`。 width (Optional[int], 可选): 输出的宽度,或`None`自动检测。默认为`None`。 crop (Optional[bool], 可选): 裁剪输出到终端的宽度。默认为`True`。 soft_wrap (bool, 可选): 启用软包装模式,禁止文字包装和裁剪,或`None``用于 控制台默认值。默认为`None`。 new_line_start (bool, False): 如果输出包含多行,在开始时插入一个新行。默认值为`False`。 """ MainConsole.print( *objects, sep=sep, end=end, style="#F0F2F4 on #121110", justify=justify, overflow=overflow, no_wrap=no_wrap, emoji=emoji, markup=markup, highlight=highlight, width=width, height=height, crop=crop, soft_wrap=soft_wrap, new_line_start=new_line_start, ) prt(f"{_('LangChd')}{_(':')}{_(currentLang)}") # 高级的输入函数 def ipt( *objects: Any, sep: str = " ", justify: Optional[JustifyMethod] = None, overflow: Optional[OverflowMethod] = None, no_wrap: Optional[bool] = None, emoji: Optional[bool] = None, markup: Optional[bool] = None, highlight: Optional[bool] = None, width: Optional[int] = None, height: Optional[int] = None, crop: bool = True, soft_wrap: Optional[bool] = None, new_line_start: bool = False, password: bool = False, stream: Optional[TextIO] = None, ) -> str: """显示一个提示并等待用户的输入。 它的工作方式与Python内建的 :func:`input` 函数相同,如果Python内建的 :mod:`readline` 模块先前已经加载,则提供详细的行编辑和历史功能。 Args: objects (位置性的args): 要记录到终端的对象。 sep (str, 可选): 要在打印数据之间写入的字符串。默认为""。 end (str, optio可选nal): 在打印数据结束时写入的字符串。默认值为"\\\\n"。 style (Union[str, Style], 可选): 应用于输出的样式。默认为`None`。 justify (str, 可选): 校正位置,可为"default", "left", "right", "center" 或 "full". 默认为`None`。 overflow (str, 可选): 控制溢出:"ignore"忽略, "crop"裁剪, "fold"折叠, "ellipsis"省略号。默认为`None`。 no_wrap (Optional[bool], 可选): 禁用文字包装。默认为`None`。 emoji (Optional[bool], 可选): 启用表情符号代码,或使用控制台默认的`None`。默认为`None`。 markup (Optional[bool], 可选): 启用标记,或`None`使用控制台默认值。默认为`None`。 highlight (Optional[bool], 可选): 启用自动高亮,或`None`使用控制台默认值。默认为`None`。 width (Optional[int], 可选): 输出的宽度,或`None`自动检测。默认为`None`。 crop (Optional[bool], 可选): 裁剪输出到终端的宽度。默认为`True`。 soft_wrap (bool, 可选): 启用软包装模式,禁止文字包装和裁剪,或`None``用于 控制台默认值。默认为`None`。 new_line_start (bool, False): 如果输出包含多行,在开始时插入一个新行。默认值为`False`。 password (bool, 可选): 隐藏已经输入的文案,默认值为`False`。 stream (TextIO, 可选): 可选从文件中读取(而非控制台),默认为 `None`。 Returns: str: 从stdin读取的字符串 """ MainConsole.print( *objects, sep=sep, end="", style="#F0F2F4 on #121110", justify=justify, overflow=overflow, no_wrap=no_wrap, emoji=emoji, markup=markup, highlight=highlight, width=width, height=height, crop=crop, soft_wrap=soft_wrap, new_line_start=new_line_start, ) return MainConsole.input("", password=password, stream=stream) def formatipt(notice: str, fun: function, errnote: str): while True: result = ipt(notice) try: result = fun(result) break except: prt(errnote) continue return result while True: midipath = ipt(f"{_('ChoosePath')}{_(':')}").lower() if os.path.exists(midipath): if os.path.isfile(midipath): midis = (midipath,) elif os.path.isdir(midipath): midis = tuple( ( os.path.join(midipath, i) for i in os.listdir(midipath) if i.lower().endswith('.mid') or i.lower().endswith('.midi') ) ) else: prt(f"{_('ErrEnter')}{_(',')}{_('Re-Enter')}{_('.')}") continue else: prt(f"{_('FileNotFound')}{_(',')}{_('Re-Enter')}{_('.')}") continue break while True: fileFormat = ipt(f"{_('ChooseFileFormat')}{_(':')}").lower() if fileFormat in ('0', 'mcpack'): fileFormat = 0 prt(_("EnterArgs")) if len(midis) > 1: prt(_("noteofArgs")) elif fileFormat in ('1', 'bdx'): fileFormat = 1 while True: playerFormat = ipt(f"{_('ChoosePlayer')}{_(':')}").lower() if playerFormat in ('0', '延迟'): playerFormat = 0 elif playerFormat in ('1', '计分板'): playerFormat = 1 else: prt(f"{_('ErrEnter')}{_(',')}{_('Re-Enter')}{_('.')}") continue break else: prt(f"{_('ErrEnter')}{_(',')}{_('Re-Enter')}{_('.')}") continue break if fileFormat == 0: pass MainConsole.input()