mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2026-01-25 05:02:02 +00:00
Compare commits
46 Commits
beewarewin
...
v0.1.5.1-D
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
882ce96b90 | ||
|
|
9093a66639 | ||
|
|
b48a66115a | ||
|
|
db20a87ae9 | ||
|
|
69eebd25a9 | ||
|
|
89ef3bcb55 | ||
|
|
f08a2ff9be | ||
|
|
9f8694ef14 | ||
|
|
81272a1166 | ||
|
|
a83052bd5d | ||
|
|
2fcfdca0a0 | ||
|
|
bcaeb129a5 | ||
|
|
36b639f029 | ||
|
|
4b241dfc0b | ||
|
|
255cc84ef3 | ||
|
|
c04b622297 | ||
|
|
b6a63a794e | ||
|
|
7c0dd218b2 | ||
|
|
19bbb92cff | ||
|
|
26ee16f071 | ||
|
|
05eb0c05ec | ||
|
|
5d2e0582c3 | ||
|
|
d3e0f78d2c | ||
|
|
79a2dfb5b1 | ||
|
|
bf3367c7e4 | ||
|
|
c91f5cf2f9 | ||
|
|
d8ea747ef1 | ||
|
|
39148a6c76 | ||
|
|
0e3eb394ab | ||
|
|
f0dedabe1a | ||
|
|
dda78ab35f | ||
|
|
5b6ff5ee68 | ||
|
|
fcb1a25227 | ||
|
|
81eb8e5376 | ||
|
|
7e13b22d46 | ||
|
|
07e153f215 | ||
|
|
908f622433 | ||
|
|
5f7ca0859f | ||
|
|
32ae868c34 | ||
|
|
ce441e4905 | ||
|
|
3dc099af7e | ||
|
|
cf7e51595e | ||
|
|
737b2d5f07 | ||
|
|
143de0bb37 | ||
|
|
17f9fa7ffc | ||
|
|
1bc1c6485b |
66
.gitignore
vendored
66
.gitignore
vendored
@@ -1,66 +0,0 @@
|
|||||||
# Byte-compiled / optimized / DLL files
|
|
||||||
__pycache__/
|
|
||||||
*.py[cod]
|
|
||||||
*$py.class
|
|
||||||
|
|
||||||
# OSX useful to ignore
|
|
||||||
*.DS_Store
|
|
||||||
.AppleDouble
|
|
||||||
.LSOverride
|
|
||||||
|
|
||||||
# Thumbnails
|
|
||||||
._*
|
|
||||||
|
|
||||||
# Files that might appear in the root of a volume
|
|
||||||
.DocumentRevisions-V100
|
|
||||||
.fseventsd
|
|
||||||
.Spotlight-V100
|
|
||||||
.TemporaryItems
|
|
||||||
.Trashes
|
|
||||||
.VolumeIcon.icns
|
|
||||||
.com.apple.timemachine.donotpresent
|
|
||||||
|
|
||||||
# Directories potentially created on remote AFP share
|
|
||||||
.AppleDB
|
|
||||||
.AppleDesktop
|
|
||||||
Network Trash Folder
|
|
||||||
Temporary Items
|
|
||||||
.apdisk
|
|
||||||
|
|
||||||
# C extensions
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Distribution / packaging
|
|
||||||
.Python
|
|
||||||
env/
|
|
||||||
build/
|
|
||||||
develop-eggs/
|
|
||||||
dist/
|
|
||||||
downloads/
|
|
||||||
eggs/
|
|
||||||
.eggs/
|
|
||||||
lib/
|
|
||||||
lib64/
|
|
||||||
parts/
|
|
||||||
sdist/
|
|
||||||
var/
|
|
||||||
*.egg-info/
|
|
||||||
.installed.cfg
|
|
||||||
*.egg
|
|
||||||
|
|
||||||
# IntelliJ Idea family of suites
|
|
||||||
.idea
|
|
||||||
*.iml
|
|
||||||
## File-based project format:
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
## mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# Briefcase build directories
|
|
||||||
iOS/
|
|
||||||
macOS/
|
|
||||||
windows/
|
|
||||||
android/
|
|
||||||
linux/
|
|
||||||
django/
|
|
||||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
12
.idea/Musicreater.iml
generated
Normal file
12
.idea/Musicreater.iml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="PyDocumentationSettings">
|
||||||
|
<option name="format" value="PLAIN" />
|
||||||
|
<option name="myDocStringFormat" value="Plain" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
46
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
46
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="LongLine" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyArgumentEqualDefaultInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyAugmentAssignmentInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyClassicStyleClassInspection" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyCompatibilityInspection" enabled="false" level="WARNING" enabled_by_default="false">
|
||||||
|
<option name="ourVersions">
|
||||||
|
<value>
|
||||||
|
<list size="1">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="3.10" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
<inspection_tool class="PyMandatoryEncodingInspection" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyMissingTypeHintsInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyPep8Inspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredErrors">
|
||||||
|
<list>
|
||||||
|
<option value="E501" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredErrors">
|
||||||
|
<list>
|
||||||
|
<option value="N802" />
|
||||||
|
<option value="N803" />
|
||||||
|
<option value="N806" />
|
||||||
|
<option value="N813" />
|
||||||
|
<option value="N801" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredIdentifiers">
|
||||||
|
<list>
|
||||||
|
<option value="list.__getitem__" />
|
||||||
|
<option value="list.split" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/Musicreater.iml" filepath="$PROJECT_DIR$/.idea/Musicreater.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
25
LICENSE
25
LICENSE
@@ -92,16 +92,16 @@
|
|||||||
meet the following conditions:
|
meet the following conditions:
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
(a) You must give any other recipients of the Work or
|
||||||
Derivative Works a copy of this License; and
|
Derivative Works a copy of this License and
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
(b) You must cause any modified files to carry prominent notices
|
||||||
stating that You changed the files; and
|
stating that You changed the files and
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
that You distribute, all copyright, patent, trademark, and
|
that You distribute, all copyright, patent, trademark, and
|
||||||
attribution notices from the Source form of the Work,
|
attribution notices from the Source form of the Work,
|
||||||
excluding those notices that do not pertain to any part of
|
excluding those notices that do not pertain to any part of
|
||||||
the Derivative Works; and
|
the Derivative Works and
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
distribution, then any Derivative Works that You distribute must
|
distribution, then any Derivative Works that You distribute must
|
||||||
@@ -109,8 +109,8 @@
|
|||||||
within such NOTICE file, excluding those notices that do not
|
within such NOTICE file, excluding those notices that do not
|
||||||
pertain to any part of the Derivative Works, in at least one
|
pertain to any part of the Derivative Works, in at least one
|
||||||
of the following places: within a NOTICE text file distributed
|
of the following places: within a NOTICE text file distributed
|
||||||
as part of the Derivative Works; within the Source form or
|
as part of the Derivative Works within the Source form or
|
||||||
documentation, if provided along with the Derivative Works; or,
|
documentation, if provided along with the Derivative Works or,
|
||||||
within a display generated by the Derivative Works, if and
|
within a display generated by the Derivative Works, if and
|
||||||
wherever such third-party notices normally appear. The contents
|
wherever such third-party notices normally appear. The contents
|
||||||
of the NOTICE file are for informational purposes only and
|
of the NOTICE file are for informational purposes only and
|
||||||
@@ -175,20 +175,10 @@
|
|||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
Copyright 2022 Eilles Wan (金羿)
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
Licensed under the Apache License, Version 2.0 (the "License")
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
@@ -199,3 +189,4 @@
|
|||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
|
|||||||
1994
Musicreater.py
Normal file
1994
Musicreater.py
Normal file
File diff suppressed because it is too large
Load Diff
89
README.md
89
README.md
@@ -1,49 +1,104 @@
|
|||||||
# 音·创 Musicreater
|
# 音·创 Musicreater
|
||||||
|
|
||||||
### 介绍
|
### 介绍
|
||||||
音·创(Musicreater)是由金羿(W-YI)开发的一款《我的世界》基岩版音乐生成辅助软件
|
音·创 Musicreater 是由金羿(*W-YI*)开发的一款 **《我的世界:基岩版》** 音乐生成辅助软件
|
||||||
|
|
||||||
欢迎加群:861684859
|
欢迎加群:861684859
|
||||||
|
|
||||||
|
### 作者
|
||||||
|
|
||||||
|
金羿 (Eilles):主要作者,开发了音·创主体,及其前身“函数音乐生成器”、“世界音创”。
|
||||||
|
|
||||||
|
bgArray “诸葛亮与八卦阵”:修复bug,改进代码美观度,增加新功能,更改数据格式等。
|
||||||
|
|
||||||
### 软件架构
|
### 软件架构
|
||||||
|
|
||||||
软件采用Python作为第一语言,目前还没有使用其他语言辅助。使用BeeWare作为图形库兼容安卓。
|
软件采用 *Python* 作为第一语言,目前还没有使用其他语言辅助。使用 *Tkinter* 为图形库。
|
||||||
|
|
||||||
尽量全平台支持
|
支持 Windows7+ 以及各个支持 Python3.8 的 Linux
|
||||||
|
|
||||||
|
***各位开发人员注意!!!多语言支持请使用`READABLETEXT`常量输出文字!!!如需补充,请在简体中文的语言文件(zhCN.py)中补充!!!***
|
||||||
|
|
||||||
|
|
||||||
### 安装教程
|
### 安装教程
|
||||||
|
|
||||||
#### Windows
|
正在到来。
|
||||||
|
|
||||||
即将到来。
|
### 从源代码运行教程
|
||||||
|
|
||||||
|
#### Windows7+
|
||||||
|
|
||||||
|
0. [Gitee下载(需要登陆)](https://gitee.com/EillesWan/Musicreater/repository/archive/master.zip)
|
||||||
|
[Github下载(慢)](https://github.com/EillesWan/Musicreater/archive/refs/heads/master.zip)本程序源代码
|
||||||
|
1. 安装Python 3.8.10
|
||||||
|
[下载64位Python安装包](https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe)
|
||||||
|
[下载32位Python安装包](https://www.python.org/ftp/python/3.8.10/python-3.8.10.exe)
|
||||||
|
2. 以管理员身份运行 补全库.py :
|
||||||
|
- 点击 “开始” 菜单,搜索 `命令提示符`
|
||||||
|
- 右键点击 `命令提示符` 左键点击 “以管理员身份运行”
|
||||||
|
- 将 “补全库.py” 拖拽入开启的窗口,按下回车
|
||||||
|
3. 等待安装完成后,双击运行 Musicreater.py
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
即将到来。
|
0. 若你没有足够优秀的环境,推荐先在终端敲:
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get upgrade
|
||||||
|
sudo apt-get install python3
|
||||||
|
sudo apt-get install python3-pip
|
||||||
|
sudo apt-get install git
|
||||||
|
```
|
||||||
|
1. 若你足够自信,该整的都整了,就在你想下载此程序的地方打开终端,敲:
|
||||||
|
```bash
|
||||||
|
sudo git clone https://gitee.com/EillesWan/Musicreater.git
|
||||||
|
cd Musicreater
|
||||||
|
python3 补全库.py
|
||||||
|
python3 Musicreater.py
|
||||||
|
```
|
||||||
|
|
||||||
#### Android
|
|
||||||
|
|
||||||
即将到来。
|
|
||||||
|
|
||||||
### 使用说明
|
### 使用说明
|
||||||
|
|
||||||
1. 直接运行就好
|
1. 直接运行就好
|
||||||
2. 有不懂的问题来群里问
|
2. 看得懂简体中文字的不一定全会用
|
||||||
3. 请理解英文表述
|
3. 最好要懂一点点英文
|
||||||
|
|
||||||
|
|
||||||
|
### 诸葛亮与八卦阵的说明(不必要)
|
||||||
|
|
||||||
|
1. 首先!这里的提示是给想使用多音色资源包的人的,如果你想用就请下载 [神羽资源包(神羽自己的链接)](https://pan.baidu.com/s/11uoq5zwN7c3rX-98DqVpJg)提取码:ek3t
|
||||||
|
2. 下载到你自己电脑上某个位置,可以不放置于本项目下。音色资源包较大,可以选取只下载:
|
||||||
|
`神羽资源包_乐器、音源的资源包\羽音缭绕-midiout_25.0` 这个文件夹,再嫌麻烦的话,也可以只下载其中的:
|
||||||
|
`神羽资源包_乐器\音源的资源包\羽音缭绕-midiout_25.0\mcpack(国际版推荐)格式_25.0` 或者:
|
||||||
|
`神羽资源包_乐器\音源的资源包\羽音缭绕-midiout_25.0\zip格式_25.0`
|
||||||
|
4. 接下来就是关键了:在*音创*中绑定资源包
|
||||||
|
首先,先打开 *音创*->帮助与疑问->\[神羽资源包位置选择\]:选择文件夹... 这时候,会跳出选择框
|
||||||
|
关键来了,选择:***您下载的`羽音缭绕-midiout_25.0`文件夹,或者`mcpack(国际版推荐)格式_25.0`或`zip格式_25.0`的上级目录***
|
||||||
|
举个例子:我的文件路径是这样的:
|
||||||
|
`L:\shenyu\音源的资源包\羽音缭绕-midiout_25.0`这里面有:`神羽资源包_25.0_使用方法.xls`、
|
||||||
|
`mcpack(国际版推荐)格式_25.0`、`zip格式_25.0`两个文件夹和一个.xls文件,而你在音创中
|
||||||
|
也应该选择这个文件夹:**L:\shenyu\音源的资源包\羽音缭绕-midiout_25.0**
|
||||||
|
6. 如果你想使用音色资源包来制作函数,那么解析时你应该用 *音创*->编辑->从midi导入音轨且用新方法解析,
|
||||||
|
然后再使用 *音创*->函数(包)->下面的四个新函数
|
||||||
|
|
||||||
### 致谢
|
### 致谢
|
||||||
|
|
||||||
1. 感谢由 [Fuckcraft](https://github.com/fuckcraft) “鸣凤鸽子”等 带来的我的世界websocket服务器功能
|
1. 感谢由 [Fuckcraft](https://github.com/fuckcraft) “鸣凤鸽子”等 带来的我的世界websocket服务器功能
|
||||||
2. 感谢 昀梦<QQ1515399885> 找出指令生成错误bug并指正
|
2. 感谢 昀梦\<QQ1515399885\> 找出指令生成错误bug并指正
|
||||||
3. 感谢由 Charlie_Ping “查理平” 带来的bdx转换功能
|
3. 感谢由 Charlie_Ping “查理平” 带来的bdx转换功能
|
||||||
4. 感谢由 CMA_2401PT 提供的 BDXWorkShop作为.bdx结构的操作指导
|
4. 感谢由 CMA_2401PT 带来的 BDXWorkShop 供本程序对于bdx操作的指导
|
||||||
5. 感谢广大群友为此程序提供的测试等支持
|
5. 感谢由 Miracle Plume “神羽” \<QQshenyu40403\>带来的羽音缭绕基岩版音色资源包
|
||||||
6. 若您为我找出了错误但您的名字没有显示在此列表中,请联系我!
|
6. 感谢广大群友为此程序提供的测试等支持
|
||||||
|
7. 若您对我们有所贡献但您的名字没有显示在此列表中,请联系我!
|
||||||
|
|
||||||
|
|
||||||
### 作者<金羿>联系方式
|
### 作者\<*金羿*\>(W-YI)联系方式
|
||||||
|
|
||||||
1. QQ 2647547478
|
1. QQ 2647547478
|
||||||
2. 电邮 EillesWan2006@163.com W-YI_DoctorYI@outlook.com
|
2. 电邮 EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
||||||
3. 微信 WYI_DoctorYI
|
3. 微信 WYI_DoctorYI
|
||||||
|
|
||||||
|
### 作者\<*诸葛亮与八卦阵*\>(bgArray) 联系方式
|
||||||
|
|
||||||
|
1. QQ 4740437765
|
||||||
12
README.rst
12
README.rst
@@ -1,12 +0,0 @@
|
|||||||
Musicreater
|
|
||||||
===========
|
|
||||||
|
|
||||||
**This cross-platform app was generated by** `Briefcase`_ **- part of**
|
|
||||||
`The BeeWare Project`_. **If you want to see more tools like Briefcase, please
|
|
||||||
consider** `becoming a financial member of BeeWare`_.
|
|
||||||
|
|
||||||
音·创(Musicreater)是由金羿(W-YI)开发的一款《我的世界》基岩版音乐生成辅助软件
|
|
||||||
|
|
||||||
.. _`Briefcase`: https://github.com/beeware/briefcase
|
|
||||||
.. _`The BeeWare Project`: https://beeware.org/
|
|
||||||
.. _`becoming a financial member of BeeWare`: https://beeware.org/contributing/membership
|
|
||||||
82
README_en.md
82
README_en.md
@@ -5,29 +5,59 @@ Musicreater(音·创) is an Eilles(*W-YI*)'s app that is used for creating music
|
|||||||
|
|
||||||
Welcome to join our QQ group: 861684859
|
Welcome to join our QQ group: 861684859
|
||||||
|
|
||||||
|
###Author
|
||||||
|
|
||||||
|
Eilles (金羿):The main author, who developed the most and especially the principal parts of Musicreater, and its predecessors, which has been called as "*Minecraft Function Music Maker*", "*Note Fun Creater*", "*Note World Creater*"(now ,they are united as ***Musicreater***!)
|
||||||
|
|
||||||
|
bgArray "诸葛亮与八卦阵": Fix bugs, improve code aesthetics, add new functions, change data format, etc.
|
||||||
|
|
||||||
### Framework
|
### Framework
|
||||||
|
|
||||||
Use *Python* to develop, use *BeeWare* as a Windows Library.
|
Using *Python* to develop, using Tkinter as a graphics library.
|
||||||
|
|
||||||
We are trying to support every platform.
|
Support Windows7+ && Linux (that supports Python3.8)
|
||||||
|
|
||||||
|
***ATTENTION TO DEVELOPERS!!! TO SUPPORT DIFFERENT LANGUAGES, PLEASE USE CONSTANT `READABLETEXT` TO OUTPUT!!! IF YOU NEED TO SUPPLEMENT, PLEASE ADD THEM IN SIMPLEFIED CHINESE\'S LANGUAGE FILE(zhCN.py), WHEATHER WHAT LANGUAGE YOU USE!!!***
|
||||||
|
|
||||||
|
|
||||||
### Tutorials
|
### Installation
|
||||||
|
|
||||||
|
Comming soon...
|
||||||
|
|
||||||
|
### Run with Source Code
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
Please wait for a while...
|
0. First, download the source code pack of Musicreater.
|
||||||
Comming soon
|
[Download from Gitee (Need to Login)](https://gitee.com/EillesWan/Musicreater/repository/archive/master.zip)
|
||||||
|
[Download from Github](https://github.com/EillesWan/Musicreater/archive/refs/heads/master.zip)
|
||||||
|
1. Install Python 3.8.10
|
||||||
|
[Download the 64-bit Python Installer](https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe)
|
||||||
|
[Download the 32-bit Python Installer](https://www.python.org/ftp/python/3.8.10/python-3.8.10.exe)
|
||||||
|
2. After completing installation, we need to install the libraries :
|
||||||
|
- Open "Start Menu" and find `cmd`
|
||||||
|
- Run `cmd` as Administrator
|
||||||
|
- Drag "补全库.py" into the opened window and press Enter
|
||||||
|
3. After completing installation,double click Musicreater.py to run
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
Please wait for a while...
|
0. If you 're not sure whether your environment is good enough, please run these commands on Terminal
|
||||||
Comming soon
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get upgrade
|
||||||
|
sudo apt-get install python3
|
||||||
|
sudo apt-get install python3-pip
|
||||||
|
sudo apt-get install git
|
||||||
|
```
|
||||||
|
1. Now if you are confident enough about your runtime environment, open Terminal on the place which you want to download Musicreater, and run these
|
||||||
|
```bash
|
||||||
|
sudo git clone https://gitee.com/EillesWan/Musicreater.git
|
||||||
|
cd Musicreater
|
||||||
|
python3 补全库.py
|
||||||
|
python3 Musicreater.py
|
||||||
|
```
|
||||||
|
|
||||||
#### Android
|
|
||||||
|
|
||||||
Please wait for a while...
|
|
||||||
Comming soon
|
|
||||||
|
|
||||||
### Instructions
|
### Instructions
|
||||||
|
|
||||||
@@ -35,14 +65,32 @@ Comming soon
|
|||||||
2. If u dont understand, u can come to the QQ group or email me to ask questions
|
2. If u dont understand, u can come to the QQ group or email me to ask questions
|
||||||
3. The English Edition is comming soon.
|
3. The English Edition is comming soon.
|
||||||
|
|
||||||
|
|
||||||
|
### Explanation of bgArray 诸葛亮与八卦阵 (unnecessary)
|
||||||
|
|
||||||
|
1. First! The tips here are for those who want to use the multi tone resource package, [Shenyu resource package (Shenyu's own link)](https://pan.baidu.com/s/11uoq5zwN7c3rX-98DqVpJg) \(Extraction code: `ek3t`\)
|
||||||
|
2. Download it to any location on your PC. Note that it does ***not*** need to be placed in the directory where *Musicreater* are. The audio resource package is large, so you can choose to download only:`神羽资源包_乐器、音源的资源包\羽音缭绕-midiout_25.0`.
|
||||||
|
Also, you can download only `神羽资源包_乐器\音源的资源包\羽音缭绕-midiout_25.0\mcpack(国际版推荐)格式_25.0` or
|
||||||
|
`神羽资源包_乐器\音源的资源包\羽音缭绕-midiout_25.0\zip格式_25.0`.
|
||||||
|
4. The next step is the most IMPORTANT: to bind the resource package to *Musicreater*
|
||||||
|
First, open *Musicreater*->Q&A->Select \[MiraclePlumeResourcePack\]... .At this time, in the selection box,
|
||||||
|
the IMPORTANT step comes, select: ***The directory you downloaded: `羽音缭绕-midiout_25.0`, or also the parent directory `mcpack(国际版推荐)格式_25.0`or`zip格式_25.0`***
|
||||||
|
For example, my file path is as follows:
|
||||||
|
`L:\shenyu\音源的资源包\羽音缭绕-midiout_25.0` and in the directory, there are two folders and one .xls file:
|
||||||
|
`神羽资源包_25.0_使用方法.xls`, `mcpack(国际版推荐)格式_25.0` and `zip格式_25.0`, so in *Musicreater* you should also select this folder: **L:\shenyu\音源的资源包\羽音缭绕-midiout_25.0**
|
||||||
|
6. If you want to use the Miracle Plume Bedrock Edition Audio Resource Pack to make .mcfunction s, you should use Musicreater -> Edit - > Import audio tracks from MIDI and parse them with a new method, and then use it
|
||||||
|
Musicreater - > function (package) - > the following four new functions
|
||||||
|
|
||||||
### Thanks
|
### Thanks
|
||||||
|
|
||||||
1. Thank [Fuckcraft](https://github.com/fuckcraft) “鸣凤鸽子”and so on for the function of Creating the Websocket Server for Minecraft: Bedrock Edition.
|
1. Thank [Fuckcraft](https://github.com/fuckcraft) (“鸣凤鸽子” ,etc) for the function of Creating the Websocket Server for Minecraft: Bedrock Edition.
|
||||||
2. Thank 昀梦<QQ1515399885> for finding and correcting the bugs in the commands that *Musicreater* Created.
|
- *!! They have given me the rights to directly copy the lib into Musicreater*
|
||||||
|
2. Thank 昀梦\<QQ1515399885\> for finding and correcting the bugs in the commands that *Musicreater* Created.
|
||||||
3. Thank Charlie_Ping “查理平” for bdx convert funtion.
|
3. Thank Charlie_Ping “查理平” for bdx convert funtion.
|
||||||
4. Thank CMA_2401PT for BDXWorkShop as the .bdx structure's operation guide.
|
4. Thank CMA_2401PT for BDXWorkShop as the .bdx structure's operation guide.
|
||||||
5. Thanks for a lot of groupmates who support me and help me to test the program.
|
5. Thank Miracle Plume “神羽” \<QQshenyu40403\> for the Miracle Plume Bedrock Edition Audio Resource Pack
|
||||||
6. If u have give me some help but u haven't been in the list, please contact me.
|
6. Thanks for a lot of groupmates who support me and help me to test the program.
|
||||||
|
7. If you have give me some help but u haven't been in the list, please contact me.
|
||||||
|
|
||||||
|
|
||||||
### Contact *Eilles(W-YI)*(金羿)
|
### Contact *Eilles(W-YI)*(金羿)
|
||||||
@@ -50,3 +98,7 @@ Comming soon
|
|||||||
1. QQ 2647547478
|
1. QQ 2647547478
|
||||||
2. E-mail EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
2. E-mail EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
||||||
3. WeChat WYI_DoctorYI
|
3. WeChat WYI_DoctorYI
|
||||||
|
|
||||||
|
### Contact *bgArray*(诸葛亮与八卦阵)
|
||||||
|
|
||||||
|
1. QQ 4740437765
|
||||||
@@ -1 +0,0 @@
|
|||||||
briefcase dev
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import os,shutil
|
|
||||||
from sys import platform
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print("更新执行位置...")
|
|
||||||
if platform == 'win32':
|
|
||||||
try:
|
|
||||||
os.chdir(__file__[:len(__file__)-__file__[len(__file__)::-1].index('\\')]+'src\\')
|
|
||||||
print("更新执行位置,当前文件位置"+__file__)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
os.chdir(__file__[:len(__file__)-__file__[len(__file__)::-1].index('/')]+'src/')
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
print("其他平台:"+platform+"更新执行位置,当前文件位置"+__file__)
|
|
||||||
print('完成!')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
import toga,amulet
|
|
||||||
except:
|
|
||||||
print("You'd better install the libraries of this app\nNow, we're helping you with this.")
|
|
||||||
from src.musicreater.msctspt.bugReporter import version
|
|
||||||
version.installLibraries(version)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if platform == 'win32':
|
|
||||||
os.system("python ./Musicreater.py")
|
|
||||||
elif platform == 'linux':
|
|
||||||
os.system("python3 ./Musicreater.py")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
if os.path.exists("./log/"):
|
|
||||||
shutil.rmtree("./log/")
|
|
||||||
if os.path.exists("./logs/"):
|
|
||||||
shutil.rmtree("./logs/")
|
|
||||||
if os.path.exists("./cache/"):
|
|
||||||
shutil.rmtree("./cache/")
|
|
||||||
except:
|
|
||||||
print("无法清除日志及临时文件")
|
|
||||||
BIN
bgArrayLib/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
bgArrayLib/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/bpm.cpython-38.pyc
Normal file
BIN
bgArrayLib/__pycache__/bpm.cpython-38.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/bpm.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/bpm.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/compute.cpython-38.pyc
Normal file
BIN
bgArrayLib/__pycache__/compute.cpython-38.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/compute.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/compute.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/namesConstant.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/namesConstant.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/pitchStrConstant.cpython-38.pyc
Normal file
BIN
bgArrayLib/__pycache__/pitchStrConstant.cpython-38.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/pitchStrConstant.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/pitchStrConstant.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/reader.cpython-38.pyc
Normal file
BIN
bgArrayLib/__pycache__/reader.cpython-38.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/reader.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/reader.cpython-39.pyc
Normal file
Binary file not shown.
BIN
bgArrayLib/__pycache__/sy_resourcesPacker.cpython-39.pyc
Normal file
BIN
bgArrayLib/__pycache__/sy_resourcesPacker.cpython-39.pyc
Normal file
Binary file not shown.
57
bgArrayLib/bpm.py
Normal file
57
bgArrayLib/bpm.py
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import mido
|
||||||
|
import numpy
|
||||||
|
|
||||||
|
|
||||||
|
def mt2gt(mt, tpb_a, bpm_a):
|
||||||
|
return round(mt / tpb_a / bpm_a * 60)
|
||||||
|
|
||||||
|
|
||||||
|
def get(mid:mido.MidiFile):
|
||||||
|
# mid = mido.MidiFile(mf)
|
||||||
|
long = mid.length
|
||||||
|
tpb = mid.ticks_per_beat
|
||||||
|
bpm = 20
|
||||||
|
gotV = 0
|
||||||
|
|
||||||
|
for track in mid.tracks:
|
||||||
|
global_time = 0
|
||||||
|
for msg in track:
|
||||||
|
global_time += msg.time
|
||||||
|
if msg.type == "note_on" and msg.velocity > 0:
|
||||||
|
gotV = mt2gt(global_time, tpb, bpm)
|
||||||
|
errorV = numpy.fabs(gotV - long)
|
||||||
|
last_dic = {bpm: errorV}
|
||||||
|
if last_dic.get(bpm) > errorV:
|
||||||
|
last_dic = {bpm: errorV}
|
||||||
|
bpm += 2
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for track in mid.tracks:
|
||||||
|
global_time = 0
|
||||||
|
for msg in track:
|
||||||
|
global_time += msg.time
|
||||||
|
if msg.type == "note_on" and msg.velocity > 0:
|
||||||
|
gotV = mt2gt(global_time, tpb, bpm)
|
||||||
|
errorV = numpy.fabs(gotV - long)
|
||||||
|
try:
|
||||||
|
if last_dic.get(bpm - 2) > errorV:
|
||||||
|
last_dic = {bpm: errorV}
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
bpm += 2
|
||||||
|
if bpm >= 252:
|
||||||
|
break
|
||||||
|
print(list(last_dic.keys())[0])
|
||||||
|
return list(last_dic.keys())[0]
|
||||||
|
|
||||||
|
|
||||||
|
def compute(mid:mido.MidiFile):
|
||||||
|
answer = 60000000/mid.ticks_per_beat
|
||||||
|
print(answer)
|
||||||
|
return answer
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
mid = mido.MidiFile(r"C:\Users\lc\Documents\MuseScore3\乐谱\乐谱\Bad style - Time back.mid")
|
||||||
|
get(mid)
|
||||||
|
compute(mid)
|
||||||
40
bgArrayLib/compute.py
Normal file
40
bgArrayLib/compute.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
def round_up(num, power=0):
|
||||||
|
"""
|
||||||
|
实现精确四舍五入,包含正、负小数多种场景
|
||||||
|
:param num: 需要四舍五入的小数
|
||||||
|
:param power: 四舍五入位数,支持0-∞
|
||||||
|
:return: 返回四舍五入后的结果
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
print(1 / 0)
|
||||||
|
except ZeroDivisionError:
|
||||||
|
digit = 10 ** power
|
||||||
|
num2 = float(int(num * digit))
|
||||||
|
# 处理正数,power不为0的情况
|
||||||
|
if num >= 0 and power != 0:
|
||||||
|
tag = num * digit - num2 + 1 / (digit * 10)
|
||||||
|
if tag >= 0.5:
|
||||||
|
return (num2 + 1) / digit
|
||||||
|
else:
|
||||||
|
return num2 / digit
|
||||||
|
# 处理正数,power为0取整的情况
|
||||||
|
elif num >= 0 and power == 0:
|
||||||
|
tag = num * digit - int(num)
|
||||||
|
if tag >= 0.5:
|
||||||
|
return (num2 + 1) / digit
|
||||||
|
else:
|
||||||
|
return num2 / digit
|
||||||
|
# 处理负数,power为0取整的情况
|
||||||
|
elif power == 0 and num < 0:
|
||||||
|
tag = num * digit - int(num)
|
||||||
|
if tag <= -0.5:
|
||||||
|
return (num2 - 1) / digit
|
||||||
|
else:
|
||||||
|
return num2 / digit
|
||||||
|
# 处理负数,power不为0的情况
|
||||||
|
else:
|
||||||
|
tag = num * digit - num2 - 1 / (digit * 10)
|
||||||
|
if tag <= -0.5:
|
||||||
|
return (num2 - 1) / digit
|
||||||
|
else:
|
||||||
|
return num2 / digit
|
||||||
92
bgArrayLib/namesConstant.py
Normal file
92
bgArrayLib/namesConstant.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
zip_name = {-1: '-1.Acoustic_Kit_打击乐.zip', 0: '0.Acoustic_Grand_Piano_大钢琴.zip', 1: '1.Bright_Acoustic_Piano_亮音大钢琴.zip',
|
||||||
|
10: '10.Music_Box_八音盒.zip', 100: '100.FX_brightness_合成特效-亮音.zip', 101: '101.FX_goblins_合成特效-小妖.zip',
|
||||||
|
102: '102.FX_echoes_合成特效-回声.zip', 103: '103.FX_sci-fi_合成特效-科幻.zip', 104: '104.Sitar_锡塔尔.zip',
|
||||||
|
105: '105.Banjo_班卓.zip', 106: '106.Shamisen_三味线.zip', 107: '107.Koto_筝.zip', 108: '108.Kalimba_卡林巴.zip',
|
||||||
|
109: '109.Bagpipe_风笛.zip', 11: '11.Vibraphone_电颤琴.zip', 110: '110.Fiddle_古提琴.zip', 111: '111.Shanai_唢呐.zip',
|
||||||
|
112: '112.Tinkle_Bell_铃铛.zip', 113: '113.Agogo_拉丁打铃.zip', 114: '114.Steel_Drums_钢鼓.zip',
|
||||||
|
115: '115.Woodblock_木块.zip', 116: '116.Taiko_Drum_太鼓.zip', 117: '117.Melodic_Tom_嗵鼓.zip',
|
||||||
|
118: '118.Synth_Drum_合成鼓.zip', 119: '119.Reverse_Cymbal_镲波形反转.zip', 12: '12.Marimba_马林巴.zip',
|
||||||
|
13: '13.Xylophone_木琴.zip', 14: '14.Tubular_Bells_管钟.zip', 15: '15.Dulcimer_扬琴.zip',
|
||||||
|
16: '16.Drawbar_Organ_击杆风琴.zip', 17: '17.Percussive_Organ_打击型风琴.zip', 18: '18.Rock_Organ_摇滚风琴.zip',
|
||||||
|
19: '19.Church_Organ_管风琴.zip', 2: '2.Electric_Grand_Piano_电子大钢琴.zip', 20: '20.Reed_Organ_簧风琴.zip',
|
||||||
|
21: '21.Accordion_手风琴.zip', 22: '22.Harmonica_口琴.zip', 23: '23.Tango_Accordian_探戈手风琴.zip',
|
||||||
|
24: '24.Acoustic_Guitar_(nylon)_尼龙弦吉他.zip', 25: '25.Acoustic_Guitar(steel)_钢弦吉他.zip',
|
||||||
|
26: '26.Electric_Guitar_(jazz)_爵士乐电吉他.zip', 27: '27.Electric_Guitar_(clean)_清音电吉他.zip',
|
||||||
|
28: '28.Electric_Guitar_(muted)_弱音电吉他.zip', 29: '29.Overdriven_Guitar_驱动音效吉他.zip',
|
||||||
|
3: '3.Honky-Tonk_Piano_酒吧钢琴.zip', 30: '30.Distortion_Guitar_失真音效吉他.zip', 31: '31.Guitar_Harmonics_吉他泛音.zip',
|
||||||
|
32: '32.Acoustic_Bass_原声贝司.zip', 33: '33.Electric_Bass(finger)_指拨电贝司.zip',
|
||||||
|
34: '34.Electric_Bass(pick)_拨片拨电贝司.zip', 35: '35.Fretless_Bass_无品贝司.zip', 36: '36.Slap_Bass_A_击弦贝司A.zip',
|
||||||
|
37: '37.Slap_Bass_B_击弦贝司B.zip', 38: '38.Synth_Bass_A_合成贝司A.zip', 39: '39.Synth_Bass_B_合成贝司B.zip',
|
||||||
|
4: '4.Electric_Piano_1_电钢琴A.zip', 40: '40.Violin_小提琴.zip', 41: '41.Viola_中提琴.zip', 42: '42.Cello_大提琴.zip',
|
||||||
|
43: '43.Contrabass_低音提琴.zip', 44: '44.Tremolo_Strings_弦乐震音.zip', 45: '45.Pizzicato_Strings_弦乐拨奏.zip',
|
||||||
|
46: '46.Orchestral_Harp_竖琴.zip', 47: '47.Timpani_定音鼓.zip', 48: '48.String_Ensemble_A_弦乐合奏A.zip',
|
||||||
|
49: '49.String_Ensemble_B_弦乐合奏B.zip', 5: '5.Electric_Piano_2_电钢琴B.zip', 50: '50.SynthStrings_A_合成弦乐A.zip',
|
||||||
|
51: '51.SynthStrings_B_合成弦乐B.zip', 52: '52.Choir_Aahs_合唱“啊”音.zip', 53: '53.Voice_Oohs_人声“哦”音.zip',
|
||||||
|
54: '54.Synth_Voice_合成人声.zip', 55: '55.Orchestra_Hit_乐队打击乐.zip', 56: '56.Trumpet_小号.zip',
|
||||||
|
57: '57.Trombone_长号.zip', 58: '58.Tuba_大号.zip', 59: '59.Muted_Trumpet_弱音小号.zip',
|
||||||
|
6: '6.Harpsichord_拨弦古钢琴.zip', 60: '60.French_Horn_圆号.zip', 61: '61.Brass_Section_铜管组.zip',
|
||||||
|
62: '62.Synth_Brass_A_合成铜管A.zip', 63: '63.Synth_Brass_A_合成铜管B.zip', 64: '64.Soprano_Sax_高音萨克斯.zip',
|
||||||
|
65: '65.Alto_Sax_中音萨克斯.zip', 66: '66.Tenor_Sax_次中音萨克斯.zip', 67: '67.Baritone_Sax_上低音萨克斯.zip',
|
||||||
|
68: '68.Oboe_双簧管.zip', 69: '69.English_Horn_英国管.zip', 7: '7.Clavinet_击弦古钢琴.zip', 70: '70.Bassoon_大管.zip',
|
||||||
|
71: '71.Clarinet_单簧管.zip', 72: '72.Piccolo_短笛.zip', 73: '73.Flute_长笛.zip', 74: '74.Recorder_竖笛.zip',
|
||||||
|
75: '75.Pan_Flute_排笛.zip', 76: '76.Bottle_Blow_吹瓶口.zip', 77: '77.Skakuhachi_尺八.zip', 78: '78.Whistle_哨.zip',
|
||||||
|
79: '79.Ocarina_洋埙.zip', 8: '8.Celesta_钢片琴.zip', 80: '80.Lead_square_合成主音-方波.zip',
|
||||||
|
81: '81.Lead_sawtooth_合成主音-锯齿波.zip', 82: '82.Lead_calliope_lead_合成主音-汽笛风琴.zip',
|
||||||
|
83: '83.Lead_chiff_lead_合成主音-吹管.zip', 84: '84.Lead_charang_合成主音5-吉他.zip', 85: '85.Lead_voice_合成主音-人声.zip',
|
||||||
|
86: '86.Lead_fifths_合成主音-五度.zip', 87: '87.Lead_bass+lead_合成主音-低音加主音.zip', 88: '88.Pad_new_age_合成柔音-新时代.zip',
|
||||||
|
89: '89.Pad_warm_合成柔音-暖音.zip', 9: '9.Glockenspiel_钟琴.zip', 90: '90.Pad_polysynth_合成柔音-复合成.zip',
|
||||||
|
91: '91.Pad_choir_合成柔音-合唱.zip', 92: '92.Pad_bowed_合成柔音-弓弦.zip', 93: '93.Pad_metallic_合成柔音-金属.zip',
|
||||||
|
94: '94.Pad_halo_合成柔音-光环.zip', 95: '95.Pad_sweep_合成柔音-扫弦.zip', 96: '96.FX_rain_合成特效-雨.zip',
|
||||||
|
97: '97.FX_soundtrack_合成特效-音轨.zip', 98: '98.FX_crystal_合成特效-水晶.zip', 99: '99.FX_atmosphere_合成特效-大气.zip'}
|
||||||
|
|
||||||
|
mcpack_name = {-1: '-1.Acoustic_Kit_打击乐.mcpack', 0: '0.Acoustic_Grand_Piano_大钢琴.mcpack',
|
||||||
|
1: '1.Bright_Acoustic_Piano_亮音大钢琴.mcpack', 10: '10.Music_Box_八音盒.mcpack',
|
||||||
|
100: '100.FX_brightness_合成特效-亮音.mcpack', 101: '101.FX_goblins_合成特效-小妖.mcpack',
|
||||||
|
102: '102.FX_echoes_合成特效-回声.mcpack', 103: '103.FX_sci-fi_合成特效-科幻.mcpack', 104: '104.Sitar_锡塔尔.mcpack',
|
||||||
|
105: '105.Banjo_班卓.mcpack', 106: '106.Shamisen_三味线.mcpack', 107: '107.Koto_筝.mcpack',
|
||||||
|
108: '108.Kalimba_卡林巴.mcpack', 109: '109.Bagpipe_风笛.mcpack', 11: '11.Vibraphone_电颤琴.mcpack',
|
||||||
|
110: '110.Fiddle_古提琴.mcpack', 111: '111.Shanai_唢呐.mcpack', 112: '112.Tinkle_Bell_铃铛.mcpack',
|
||||||
|
113: '113.Agogo_拉丁打铃.mcpack', 114: '114.Steel_Drums_钢鼓.mcpack', 115: '115.Woodblock_木块.mcpack',
|
||||||
|
116: '116.Taiko_Drum_太鼓.mcpack', 117: '117.Melodic_Tom_嗵鼓.mcpack', 118: '118.Synth_Drum_合成鼓.mcpack',
|
||||||
|
119: '119.Reverse_Cymbal_镲波形反转.mcpack', 12: '12.Marimba_马林巴.mcpack', 13: '13.Xylophone_木琴.mcpack',
|
||||||
|
14: '14.Tubular_Bells_管钟.mcpack', 15: '15.Dulcimer_扬琴.mcpack', 16: '16.Drawbar_Organ_击杆风琴.mcpack',
|
||||||
|
17: '17.Percussive_Organ_打击型风琴.mcpack', 18: '18.Rock_Organ_摇滚风琴.mcpack',
|
||||||
|
19: '19.Church_Organ_管风琴.mcpack', 2: '2.Electric_Grand_Piano_电子大钢琴.mcpack',
|
||||||
|
20: '20.Reed_Organ_簧风琴.mcpack', 21: '21.Accordion_手风琴.mcpack', 22: '22.Harmonica_口琴.mcpack',
|
||||||
|
23: '23.Tango_Accordian_探戈手风琴.mcpack', 24: '24.Acoustic_Guitar_(nylon)_尼龙弦吉他.mcpack',
|
||||||
|
25: '25.Acoustic_Guitar(steel)_钢弦吉他.mcpack', 26: '26.Electric_Guitar_(jazz)_爵士乐电吉他.mcpack',
|
||||||
|
27: '27.Electric_Guitar_(clean)_清音电吉他.mcpack', 28: '28.Electric_Guitar_(muted)_弱音电吉他.mcpack',
|
||||||
|
29: '29.Overdriven_Guitar_驱动音效吉他.mcpack', 3: '3.Honky-Tonk_Piano_酒吧钢琴.mcpack',
|
||||||
|
30: '30.Distortion_Guitar_失真音效吉他.mcpack', 31: '31.Guitar_Harmonics_吉他泛音.mcpack',
|
||||||
|
32: '32.Acoustic_Bass_原声贝司.mcpack', 33: '33.Electric_Bass(finger)_指拨电贝司.mcpack',
|
||||||
|
34: '34.Electric_Bass(pick)_拨片拨电贝司.mcpack', 35: '35.Fretless_Bass_无品贝司.mcpack',
|
||||||
|
36: '36.Slap_Bass_A_击弦贝司A.mcpack', 37: '37.Slap_Bass_B_击弦贝司B.mcpack', 38: '38.Synth_Bass_A_合成贝司A.mcpack',
|
||||||
|
39: '39.Synth_Bass_B_合成贝司B.mcpack', 4: '4.Electric_Piano_1_电钢琴A.mcpack', 40: '40.Violin_小提琴.mcpack',
|
||||||
|
41: '41.Viola_中提琴.mcpack', 42: '42.Cello_大提琴.mcpack', 43: '43.Contrabass_低音提琴.mcpack',
|
||||||
|
44: '44.Tremolo_Strings_弦乐震音.mcpack', 45: '45.Pizzicato_Strings_弦乐拨奏.mcpack',
|
||||||
|
46: '46.Orchestral_Harp_竖琴.mcpack', 47: '47.Timpani_定音鼓.mcpack', 48: '48.String_Ensemble_A_弦乐合奏A.mcpack',
|
||||||
|
49: '49.String_Ensemble_B_弦乐合奏B.mcpack', 5: '5.Electric_Piano_2_电钢琴B.mcpack',
|
||||||
|
50: '50.SynthStrings_A_合成弦乐A.mcpack', 51: '51.SynthStrings_B_合成弦乐B.mcpack',
|
||||||
|
52: '52.Choir_Aahs_合唱“啊”音.mcpack', 53: '53.Voice_Oohs_人声“哦”音.mcpack', 54: '54.Synth_Voice_合成人声.mcpack',
|
||||||
|
55: '55.Orchestra_Hit_乐队打击乐.mcpack', 56: '56.Trumpet_小号.mcpack', 57: '57.Trombone_长号.mcpack',
|
||||||
|
58: '58.Tuba_大号.mcpack', 59: '59.Muted_Trumpet_弱音小号.mcpack', 6: '6.Harpsichord_拨弦古钢琴.mcpack',
|
||||||
|
60: '60.French_Horn_圆号.mcpack', 61: '61.Brass_Section_铜管组.mcpack', 62: '62.Synth_Brass_A_合成铜管A.mcpack',
|
||||||
|
63: '63.Synth_Brass_A_合成铜管B.mcpack', 64: '64.Soprano_Sax_高音萨克斯.mcpack', 65: '65.Alto_Sax_中音萨克斯.mcpack',
|
||||||
|
66: '66.Tenor_Sax_次中音萨克斯.mcpack', 67: '67.Baritone_Sax_上低音萨克斯.mcpack', 68: '68.Oboe_双簧管.mcpack',
|
||||||
|
69: '69.English_Horn_英国管.mcpack', 7: '7.Clavinet_击弦古钢琴.mcpack', 70: '70.Bassoon_大管.mcpack',
|
||||||
|
71: '71.Clarinet_单簧管.mcpack', 72: '72.Piccolo_短笛.mcpack', 73: '73.Flute_长笛.mcpack',
|
||||||
|
74: '74.Recorder_竖笛.mcpack', 75: '75.Pan_Flute_排笛.mcpack', 76: '76.Bottle_Blow_吹瓶口.mcpack',
|
||||||
|
77: '77.Skakuhachi_尺八.mcpack', 78: '78.Whistle_哨.mcpack', 79: '79.Ocarina_洋埙.mcpack',
|
||||||
|
8: '8.Celesta_钢片琴.mcpack', 80: '80.Lead_square_合成主音-方波.mcpack', 81: '81.Lead_sawtooth_合成主音-锯齿波.mcpack',
|
||||||
|
82: '82.Lead_calliope_lead_合成主音-汽笛风琴.mcpack', 83: '83.Lead_chiff_lead_合成主音-吹管.mcpack',
|
||||||
|
84: '84.Lead_charang_合成主音5-吉他.mcpack', 85: '85.Lead_voice_合成主音-人声.mcpack',
|
||||||
|
86: '86.Lead_fifths_合成主音-五度.mcpack', 87: '87.Lead_bass+lead_合成主音-低音加主音.mcpack',
|
||||||
|
88: '88.Pad_new_age_合成柔音-新时代.mcpack', 89: '89.Pad_warm_合成柔音-暖音.mcpack', 9: '9.Glockenspiel_钟琴.mcpack',
|
||||||
|
90: '90.Pad_polysynth_合成柔音-复合成.mcpack', 91: '91.Pad_choir_合成柔音-合唱.mcpack',
|
||||||
|
92: '92.Pad_bowed_合成柔音-弓弦.mcpack', 93: '93.Pad_metallic_合成柔音-金属.mcpack',
|
||||||
|
94: '94.Pad_halo_合成柔音-光环.mcpack', 95: '95.Pad_sweep_合成柔音-扫弦.mcpack', 96: '96.FX_rain_合成特效-雨.mcpack',
|
||||||
|
97: '97.FX_soundtrack_合成特效-音轨.mcpack', 98: '98.FX_crystal_合成特效-水晶.mcpack',
|
||||||
|
99: '99.FX_atmosphere_合成特效-大气.mcpack'}
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(zip_name[0])
|
||||||
133
bgArrayLib/pitchStrConstant.py
Normal file
133
bgArrayLib/pitchStrConstant.py
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
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'}
|
||||||
148
bgArrayLib/reader.py
Normal file
148
bgArrayLib/reader.py
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
from nmcsup.log import log
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
|
||||||
|
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 midiNewReader(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 Exception:
|
||||||
|
log("找不到文件或无法读取文件" + midfile)
|
||||||
|
return False
|
||||||
|
tpb = mid.ticks_per_beat
|
||||||
|
bpm = get(mid)
|
||||||
|
# 解析
|
||||||
|
# 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 midiClassReader(midfile: str):
|
||||||
|
import mido
|
||||||
|
from bgArrayLib.bpm import get
|
||||||
|
|
||||||
|
def Time(mt, tpb_a, bpm_a):
|
||||||
|
return round(mt / tpb_a / bpm_a * 60 * 20)
|
||||||
|
|
||||||
|
Notes = []
|
||||||
|
tracks = []
|
||||||
|
try:
|
||||||
|
mid = mido.MidiFile(filename=midfile,clip=True)
|
||||||
|
except Exception:
|
||||||
|
log("找不到文件或无法读取文件" + midfile)
|
||||||
|
return False
|
||||||
|
log("midi已经载入了。")
|
||||||
|
tpb = mid.ticks_per_beat
|
||||||
|
bpm = get(mid)
|
||||||
|
for track in mid.tracks:
|
||||||
|
overallTime = 0.0
|
||||||
|
instrument = 0
|
||||||
|
for i in track:
|
||||||
|
overallTime += i.time
|
||||||
|
if 'note_on' in str(i) and i.velocity > 0:
|
||||||
|
print(i)
|
||||||
|
tracks.append(
|
||||||
|
[Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||||
|
Notes.append(tracks)
|
||||||
|
print(Notes.__len__())
|
||||||
|
return Notes
|
||||||
131
bgArrayLib/sy_resourcesPacker.py
Normal file
131
bgArrayLib/sy_resourcesPacker.py
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
import os
|
||||||
|
import pickle
|
||||||
|
# import tkinter.filedialog
|
||||||
|
# from namesConstant import zip_name
|
||||||
|
# from namesConstant import mcpack_name
|
||||||
|
import bgArrayLib.namesConstant
|
||||||
|
import shutil
|
||||||
|
zipN = bgArrayLib.namesConstant.zip_name
|
||||||
|
mpN = bgArrayLib.namesConstant.mcpack_name
|
||||||
|
|
||||||
|
manifest = {
|
||||||
|
"format_version": 1,
|
||||||
|
"header": {
|
||||||
|
"name": "羽音缭绕-midiout_25.5--音创使用",
|
||||||
|
"description": "羽音缭绕-midiout_25.0--音创使用",
|
||||||
|
"uuid": "c1adbda4-3b3e-4e5b-a57e-cde8ac80ee19",
|
||||||
|
"version": [25, 5, 0]
|
||||||
|
},
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"description": "羽音缭绕-midiout_25.0--音创使用",
|
||||||
|
"type": "resources",
|
||||||
|
"uuid": "c13455d5-b9f3-47f2-9706-c05ad86b3180 ",
|
||||||
|
"version": [25, 5, 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def resources_pathSetting(newPath: str = ""):
|
||||||
|
if not os.path.isfile("./bgArrayLib/resourcesPath.rpposi") and newPath == "":
|
||||||
|
return [False, 1] # 1:没有路径文件
|
||||||
|
elif newPath != "": # not os.path.isfile("./bgArrayLib/resourcesPath.rpposi") and
|
||||||
|
path = newPath
|
||||||
|
print(path)
|
||||||
|
with open("./bgArrayLib/resourcesPath.rpposi", 'w') as w:
|
||||||
|
w.write(path)
|
||||||
|
if "mcpack(国际版推荐)格式_25.0" in os.listdir(path) and "zip格式_25.0" in os.listdir(path):
|
||||||
|
return [True, path, 1] # 1:都有
|
||||||
|
elif "mcpack(国际版推荐)格式_25.0" in os.listdir(path) and "zip格式_25.0" not in os.listdir(path):
|
||||||
|
return [True, path, 2] # 2:有pack
|
||||||
|
elif "mcpack(国际版推荐)格式_25.0" not in os.listdir(path) and "zip格式_25.0" in os.listdir(path):
|
||||||
|
return [True, path, 3] # 3:有zip
|
||||||
|
else:
|
||||||
|
return [False, 2] # 2:路径文件指示错误
|
||||||
|
if os.path.isfile("./bgArrayLib/resourcesPath.rpposi") and newPath == "":
|
||||||
|
with open("./bgArrayLib/resourcesPath.rpposi", 'r') as f:
|
||||||
|
path = f.read()
|
||||||
|
if "mcpack(国际版推荐)格式_25.0" in os.listdir(path) and "zip格式_25.0" in os.listdir(path):
|
||||||
|
return [True, path, 1] # 1:都有
|
||||||
|
elif "mcpack(国际版推荐)格式_25.0" in os.listdir(path) and "zip格式_25.0" not in os.listdir(path):
|
||||||
|
return [True, path, 2] # 2:有pack
|
||||||
|
elif "mcpack(国际版推荐)格式_25.0" not in os.listdir(path) and "zip格式_25.0" in os.listdir(path):
|
||||||
|
return [True, path, 3] # 3:有zip
|
||||||
|
else:
|
||||||
|
return [False, 2] # 2:路径文件指示错误
|
||||||
|
|
||||||
|
|
||||||
|
def choose_resources():
|
||||||
|
global zipN
|
||||||
|
global mpN
|
||||||
|
back_list = []
|
||||||
|
try:
|
||||||
|
with open(r"1.pkl", 'rb') as rb:
|
||||||
|
instrument = list(pickle.load(rb))
|
||||||
|
print(instrument)
|
||||||
|
except FileNotFoundError:
|
||||||
|
try:
|
||||||
|
with open(r"./nmcsup/1.pkl", 'rb') as rb:
|
||||||
|
instrument = list(pickle.load(rb))
|
||||||
|
print(instrument)
|
||||||
|
except FileNotFoundError:
|
||||||
|
return False
|
||||||
|
path = resources_pathSetting()
|
||||||
|
if path.__len__() == 2:
|
||||||
|
return path
|
||||||
|
else:
|
||||||
|
dataT = path[2]
|
||||||
|
pathT = path[1]
|
||||||
|
if dataT == 1:
|
||||||
|
if instrument[1] is True:
|
||||||
|
index = zipN.get(-1)
|
||||||
|
percussion_instrument = str(pathT) + "\\zip格式_25.0\\" + index
|
||||||
|
# print(percussion_instrument)
|
||||||
|
back_list.append(percussion_instrument)
|
||||||
|
for i in instrument[0]:
|
||||||
|
ins_p = str(pathT) + "\\zip格式_25.0\\" + str(zipN.get(i))
|
||||||
|
# print(ins_p)
|
||||||
|
back_list.append(ins_p)
|
||||||
|
print(back_list)
|
||||||
|
return back_list
|
||||||
|
elif dataT == 2:
|
||||||
|
if instrument[1] is True:
|
||||||
|
index = mpN.get(-1)
|
||||||
|
percussion_instrument = str(pathT) + "\\mcpack(国际版推荐)格式_25.0\\" + index
|
||||||
|
# print(percussion_instrument)
|
||||||
|
back_list.append(percussion_instrument)
|
||||||
|
for i in instrument[0]:
|
||||||
|
ins_p = str(pathT) + "\\mcpack(国际版推荐)格式_25.0\\" + str(mpN.get(i))
|
||||||
|
# print(ins_p)
|
||||||
|
back_list.append(ins_p)
|
||||||
|
print(back_list)
|
||||||
|
return back_list
|
||||||
|
elif dataT == 3:
|
||||||
|
if instrument[1] is True:
|
||||||
|
index = zipN.get(-1)
|
||||||
|
percussion_instrument = str(pathT) + "\\zip格式_25.0\\" + index
|
||||||
|
# print(percussion_instrument)
|
||||||
|
back_list.append(percussion_instrument)
|
||||||
|
for i in instrument[0]:
|
||||||
|
ins_p = str(pathT) + "\\zip格式_25.0\\" + str(zipN.get(i))
|
||||||
|
# print(ins_p)
|
||||||
|
back_list.append(ins_p)
|
||||||
|
print(back_list)
|
||||||
|
return back_list
|
||||||
|
|
||||||
|
|
||||||
|
def scatteredPack(path):
|
||||||
|
pack_list = choose_resources()
|
||||||
|
print(pack_list)
|
||||||
|
print(path)
|
||||||
|
# os.close("L:/0WorldMusicCreater-MFMS new edition")
|
||||||
|
# shutil.copy("L:\\shenyu\\音源的资源包\\羽音缭绕-midiout_25.0\\mcpack(国际版推荐)格式_25.0\\0.Acoustic_Grand_Piano_大钢琴.mcpack",
|
||||||
|
# "L:/0WorldMusicCreater-MFMS new edition")
|
||||||
|
for i in pack_list:
|
||||||
|
shutil.copy(i, path)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# print(resources_pathSetting(r"L:\shenyu\音源的资源包\羽音缭绕-midiout_25.0"))
|
||||||
|
choose_resources()
|
||||||
170
fcwslib/__init__.py
Normal file
170
fcwslib/__init__.py
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:2个---未解决;警告(二级)错误:2个;语法(一级)错误:17个
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = '0.0.1'
|
||||||
|
__all__ = []
|
||||||
|
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
||||||
|
|
||||||
|
'''
|
||||||
|
Fuckcraft Websocket Library (FCWSLIB)
|
||||||
|
A library to develop minecraft websocket server easily.
|
||||||
|
|
||||||
|
Copyright (C) 2021 Fuckcraft
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
'''
|
||||||
|
|
||||||
|
from main import *
|
||||||
|
|
||||||
|
# import os
|
||||||
|
import json
|
||||||
|
import uuid
|
||||||
|
# import logging
|
||||||
|
import asyncio
|
||||||
|
import time
|
||||||
|
import websockets
|
||||||
|
|
||||||
|
|
||||||
|
# 写这段代码的时候,只有我和上帝知道这段代码是干什么的。
|
||||||
|
# 现在只有上帝知道。
|
||||||
|
# ----
|
||||||
|
# 没毛病,我讨厌两种人:一种是要我写注释的人,一种是给我代码看但没有写注释的人。
|
||||||
|
|
||||||
|
# 此函数用于向 Minecraft 订阅请求
|
||||||
|
async def subscribe(websocket, event_name):
|
||||||
|
"""
|
||||||
|
参数:
|
||||||
|
: websocket : websocket 对象 :
|
||||||
|
: event_name : 需要订阅的请求 :
|
||||||
|
|
||||||
|
返回:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = {
|
||||||
|
'body': {
|
||||||
|
'eventName': str(event_name) # 示例:PlayerMessage
|
||||||
|
},
|
||||||
|
'header': {
|
||||||
|
'requestId': str(uuid.uuid4()),
|
||||||
|
'messagePurpose': 'subscribe',
|
||||||
|
'version': 1,
|
||||||
|
'messageType': 'commandRequest'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 增加 json 的可读性
|
||||||
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
|
response = json.dumps(response)
|
||||||
|
|
||||||
|
await websocket.send(response)
|
||||||
|
|
||||||
|
|
||||||
|
# 此函数用于向 Minecraft 消除订阅请求
|
||||||
|
async def unsubscribe(webscket):
|
||||||
|
"""
|
||||||
|
参数:
|
||||||
|
: websocket : websocket 对象 :
|
||||||
|
: event_name : 需要消除订阅的请求 :
|
||||||
|
|
||||||
|
返回:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
print(webscket)
|
||||||
|
|
||||||
|
response = {
|
||||||
|
"body": {
|
||||||
|
"eventName": str(event_name) # PlayerMessage
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"requestId": str(uuid.uuid4()),
|
||||||
|
"messagePurpose": "unsubscribe",
|
||||||
|
"version": 1,
|
||||||
|
"messageType": "commandRequest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 增加 json 的可读性
|
||||||
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
|
response = json.dumps(response)
|
||||||
|
|
||||||
|
await websocket.send(response)
|
||||||
|
|
||||||
|
|
||||||
|
# 此函数用于向 Minecraft 执行命令
|
||||||
|
async def send_command(websocket, command):
|
||||||
|
"""
|
||||||
|
参数:
|
||||||
|
: websocket : websocket 对象 :
|
||||||
|
: command : 执行的命令 :
|
||||||
|
|
||||||
|
返回:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = {
|
||||||
|
'body': {
|
||||||
|
'origin': {
|
||||||
|
'type': 'player'
|
||||||
|
},
|
||||||
|
'commandLine': str(command),
|
||||||
|
'version': 1
|
||||||
|
},
|
||||||
|
'header': {
|
||||||
|
'requestId': str(uuid.uuid4()),
|
||||||
|
'messagePurpose': 'commandRequest',
|
||||||
|
'version': 1,
|
||||||
|
'messageType': 'commandRequest'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 增加 json 的可读性
|
||||||
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
|
response = json.dumps(response)
|
||||||
|
|
||||||
|
await websocket.send(response)
|
||||||
|
|
||||||
|
|
||||||
|
# 此函数用于向 Minecraft 发送消息
|
||||||
|
async def tellraw(websocket, message):
|
||||||
|
"""
|
||||||
|
参数:
|
||||||
|
: websocket : websocket 对象 :
|
||||||
|
: message : 发送的消息 :
|
||||||
|
|
||||||
|
返回:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
|
||||||
|
command = {
|
||||||
|
'rawtext': [
|
||||||
|
{
|
||||||
|
'text': '[{}] {}'.format(time.asctime(), message)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# 增加 json 可读性
|
||||||
|
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
|
command = json.dumps(command)
|
||||||
|
command = 'tellraw @a {}'.format(command)
|
||||||
|
|
||||||
|
await send_command(websocket, command)
|
||||||
|
|
||||||
|
|
||||||
|
def run_server(function):
|
||||||
|
# 修改 ip 地址和端口
|
||||||
|
start_server = websockets.serve(function, 'localhost', 8080)
|
||||||
|
asyncio.get_event_loop().run_until_complete(start_server)
|
||||||
|
asyncio.get_event_loop().run_forever()
|
||||||
@@ -5,6 +5,23 @@ __version__ = '0.0.1'
|
|||||||
__all__ = ['run_server', 'subscribe', 'unsubscribe', 'send_command', 'tellraw']
|
__all__ = ['run_server', 'subscribe', 'unsubscribe', 'send_command', 'tellraw']
|
||||||
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
||||||
|
|
||||||
|
'''
|
||||||
|
Fuckcraft Websocket Library (FCWSLIB)
|
||||||
|
A library to develop minecraft websocket server easily.
|
||||||
|
|
||||||
|
Copyright (C) 2021 Fuckcraft
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
'''
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
@@ -19,11 +36,11 @@ import websockets
|
|||||||
# 此函数用于向 Minecraft 订阅请求
|
# 此函数用于向 Minecraft 订阅请求
|
||||||
async def subscribe(websocket, event_name):
|
async def subscribe(websocket, event_name):
|
||||||
'''
|
'''
|
||||||
参数:
|
输入:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: event_name : 需要订阅的请求 :
|
: event_name : 需要订阅的请求 :
|
||||||
|
|
||||||
返回:
|
输出:
|
||||||
None
|
None
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -48,17 +65,17 @@ async def subscribe(websocket, event_name):
|
|||||||
# 此函数用于向 Minecraft 消除订阅请求
|
# 此函数用于向 Minecraft 消除订阅请求
|
||||||
async def unsubscribe(webscket):
|
async def unsubscribe(webscket):
|
||||||
'''
|
'''
|
||||||
参数:
|
输入:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: event_name : 需要消除订阅的请求 :
|
: event_name : 需要消除订阅的请求 :
|
||||||
|
|
||||||
返回:
|
输出:
|
||||||
None
|
None
|
||||||
'''
|
'''
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
"body": {
|
"body": {
|
||||||
"eventName": str(event_name) # PlayerMessage
|
"eventName": str(event_name) # 示例:PlayerMessage
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"requestId": str(uuid.uuid4()),
|
"requestId": str(uuid.uuid4()),
|
||||||
@@ -74,14 +91,16 @@ async def unsubscribe(webscket):
|
|||||||
|
|
||||||
await websocket.send(response)
|
await websocket.send(response)
|
||||||
|
|
||||||
|
# 我个人不负责这块的质量,因为他们逼迫我违心的写了这段代码
|
||||||
|
|
||||||
# 此函数用于向 Minecraft 执行命令
|
# 此函数用于向 Minecraft 执行命令
|
||||||
async def send_command(websocket, command):
|
async def send_command(websocket, command):
|
||||||
'''
|
'''
|
||||||
参数:
|
输入:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: command : 执行的命令 :
|
: command : 执行的命令 :
|
||||||
|
|
||||||
返回:
|
输出:
|
||||||
None
|
None
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -110,11 +129,11 @@ async def send_command(websocket, command):
|
|||||||
# 此函数用于向 Minecraft 发送消息
|
# 此函数用于向 Minecraft 发送消息
|
||||||
async def tellraw(websocket, message):
|
async def tellraw(websocket, message):
|
||||||
'''
|
'''
|
||||||
参数:
|
输入:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: message : 发送的消息 :
|
: message : 发送的消息 :
|
||||||
|
|
||||||
返回:
|
输出:
|
||||||
None
|
None
|
||||||
'''
|
'''
|
||||||
|
|
||||||
BIN
languages/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
languages/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
languages/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/enGB.cpython-38.pyc
Normal file
BIN
languages/__pycache__/enGB.cpython-38.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/lang.cpython-38.pyc
Normal file
BIN
languages/__pycache__/lang.cpython-38.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/lang.cpython-39.pyc
Normal file
BIN
languages/__pycache__/lang.cpython-39.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/zhCN.cpython-38.pyc
Normal file
BIN
languages/__pycache__/zhCN.cpython-38.pyc
Normal file
Binary file not shown.
BIN
languages/__pycache__/zhCN.cpython-39.pyc
Normal file
BIN
languages/__pycache__/zhCN.cpython-39.pyc
Normal file
Binary file not shown.
96
languages/const2string.py
Normal file
96
languages/const2string.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
# W-YI 金羿
|
||||||
|
# QQ 2647547478
|
||||||
|
# 音·创 开发交流群 861684859
|
||||||
|
# Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
||||||
|
# 版权所有 Team-Ryoun 金羿
|
||||||
|
# 若需转载或借鉴 请附作者
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Copyright 2022 Eilles Wan (金羿)
|
||||||
|
|
||||||
|
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.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开
|
||||||
|
|
||||||
|
# -----------------------------分割线-----------------------------
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:12个
|
||||||
|
# 目前我的Pycharm并没有显示任何错误,有错误可以向:
|
||||||
|
# bgArray 诸葛亮与八卦阵
|
||||||
|
# QQ 474037765 或最好加入:音·创 开发交流群 861684859
|
||||||
|
# ------------------------- split line-----------------------------
|
||||||
|
# Zhuge Liang and Bagua array help to modify the grammar date: -- January 19, 2022
|
||||||
|
# Statistics: fatal (Level 3) errors: 0; Warning (Level 2) errors: 15; Syntax (Level 1) error: 597
|
||||||
|
# At present, my Pycham does not display any errors. If there are errors, you can report them to me
|
||||||
|
# Bgarray Zhuge Liang and Bagua array
|
||||||
|
# QQ 474037765 or better join: Musicreater development exchange group 861684859
|
||||||
|
# ------------------------- split line-----------------------------
|
||||||
|
|
||||||
|
# 下面为正文
|
||||||
|
|
||||||
|
|
||||||
|
# 将程序中用双引号""括起来的字符串
|
||||||
|
# 转为字符串列表 list[str, str, ...]
|
||||||
|
# 方便进行语言翻译支持。
|
||||||
|
|
||||||
|
import sys
|
||||||
|
startWith = 0
|
||||||
|
|
||||||
|
|
||||||
|
def __main__():
|
||||||
|
textList = []
|
||||||
|
for fileName in sys.argv[1:]:
|
||||||
|
print('读取文件: {}'.format(fileName))
|
||||||
|
fileText = []
|
||||||
|
for line in open(fileName, 'r', encoding='utf-8'):
|
||||||
|
while line.count('"') >= 2:
|
||||||
|
# 只有上帝看得懂我在写什么。
|
||||||
|
if line[
|
||||||
|
line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])] in textList:
|
||||||
|
thisText = textList.index(
|
||||||
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
||||||
|
else:
|
||||||
|
thisText = len(textList)
|
||||||
|
textList.append(
|
||||||
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
||||||
|
line = line.replace(
|
||||||
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])],
|
||||||
|
'READABLETEXT[{}]'.format(thisText + startWith)
|
||||||
|
)
|
||||||
|
fileText.append(line)
|
||||||
|
|
||||||
|
open(fileName + '_C', 'w', encoding='utf-8').writelines(fileText)
|
||||||
|
|
||||||
|
outFile = open('lang__.py', 'w', encoding='utf-8')
|
||||||
|
outFile.write('''# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
# 由金羿翻译工具生成字符串列表
|
||||||
|
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
READABLETEXT = {
|
||||||
|
''')
|
||||||
|
for i in range(len(textList)):
|
||||||
|
outFile.write(" {}:{},\n".format(i + startWith, textList[i]))
|
||||||
|
outFile.write('}')
|
||||||
|
outFile.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
__main__()
|
||||||
180
languages/enGB.py
Normal file
180
languages/enGB.py
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
# 由金羿翻译工具生成字符串列表
|
||||||
|
# 请在所需翻译的文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
|
READABLETEXT = {
|
||||||
|
'Translator': (("Eilles Wan (金羿)", True),),
|
||||||
|
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
|
0: "ERROR❌",
|
||||||
|
1: "TIPS❗",
|
||||||
|
2: "Clearing log(this wont be in the file)",
|
||||||
|
3: "Could not clear the temporary files or logs",
|
||||||
|
4: "saved",
|
||||||
|
5: "New Musicreater Project",
|
||||||
|
6: "Select old-type project",
|
||||||
|
7: "Select Musicreater Project",
|
||||||
|
8: "Cant open:{}, please check if youve entered the right name",
|
||||||
|
9: "Musicreat - About",
|
||||||
|
10: "Musicreater",
|
||||||
|
11: "Ver. {}",
|
||||||
|
12: """Team-Ryoun for Minecraft\n×\nTeam-Ryoun for Software Development""",
|
||||||
|
13: "OK",
|
||||||
|
14: "Inpute Notes",
|
||||||
|
15: (("- Developers -", False),
|
||||||
|
("Eilles Wan (金羿)", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
||||||
|
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False)),
|
||||||
|
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
|
16: "- Translators -",
|
||||||
|
# 17:"",
|
||||||
|
18: "QQ Group: 861684859",
|
||||||
|
19: "Musicreater - Help",
|
||||||
|
20: "Select sound file",
|
||||||
|
21: "Select MIDI file",
|
||||||
|
22: "Select NoteText file",
|
||||||
|
23: "Get Note info",
|
||||||
|
24: "Write in Note info: {}",
|
||||||
|
25: "Select generating file",
|
||||||
|
26: "Select generating folder",
|
||||||
|
27: "Select generating .mcpack file",
|
||||||
|
28: "Input position info",
|
||||||
|
29: "Select generating world folder",
|
||||||
|
30: "Select generating Function Pack",
|
||||||
|
31: "Select .mcfunction file ",
|
||||||
|
32: "Select .bdx file ",
|
||||||
|
33: "DONE✔",
|
||||||
|
34: "Input playing rate",
|
||||||
|
35: "Generating",
|
||||||
|
36: "Select a world folder",
|
||||||
|
37: "Make sure",
|
||||||
|
38: "Generate .RyStruct file",
|
||||||
|
39: "FAILED❌",
|
||||||
|
40: "Report message inpution",
|
||||||
|
41: "Musicreater - {}",
|
||||||
|
42: "ExecutingEntityName: {}",
|
||||||
|
43: "ScoreboardName: {}",
|
||||||
|
44: "Instrument: {}",
|
||||||
|
45: "TrackName: {}",
|
||||||
|
46: "PackName: {}",
|
||||||
|
47: "MusicTitle: {}",
|
||||||
|
48: "IsRepeat?: {}",
|
||||||
|
49: "Player'sTargetSelector: {}",
|
||||||
|
50: "Modify Main Option",
|
||||||
|
51: "Modify Track Option",
|
||||||
|
52: "Default Instrument: Enter English\n",
|
||||||
|
53: "Open...",
|
||||||
|
54: "Open Old Project...",
|
||||||
|
55: "Save",
|
||||||
|
56: "Save as...",
|
||||||
|
57: "Exit",
|
||||||
|
58: "File",
|
||||||
|
59: "Load tracks from sound",
|
||||||
|
60: "Load tracks from Midi",
|
||||||
|
61: "Load tracks from Text",
|
||||||
|
62: "Input notes to track",
|
||||||
|
63: "Edit",
|
||||||
|
64: "Generate file...",
|
||||||
|
65: "Generate function pack...",
|
||||||
|
66: "Generate .mcpack file...",
|
||||||
|
67: "Functions(Pack)",
|
||||||
|
68: "Save music as blocks into a map",
|
||||||
|
69: "Save music as blocks into a exist map...",
|
||||||
|
70: "Save music as commands into a map",
|
||||||
|
71: "Save music as commands into a exist map...",
|
||||||
|
72: "Save music as notebox into a map",
|
||||||
|
73: "Save music as notebox into a exist map...",
|
||||||
|
74: "World",
|
||||||
|
75: "Generate a function that fits current music...",
|
||||||
|
76: "Export selected track as commands in .bdx...",
|
||||||
|
77: "Export .bdx file from map...",
|
||||||
|
78: "Export .RyStruct file from map...",
|
||||||
|
79: "Load functions into a world...",
|
||||||
|
80: "Separate long .mcfunction file into small ones and set them into a world as a chain...",
|
||||||
|
81: "Additional Functions",
|
||||||
|
82: "Show generating result",
|
||||||
|
83: "Set a websocket server on localhost:8080 and play the selected track",
|
||||||
|
84: "Experimental Functions",
|
||||||
|
85: "Clear log file",
|
||||||
|
86: "Clear save file(obsolete)",
|
||||||
|
87: "Help",
|
||||||
|
88: "About",
|
||||||
|
89: "Send a bug report",
|
||||||
|
90: "Q&A",
|
||||||
|
91: "Main Options",
|
||||||
|
92: "Export music as .BDX...",
|
||||||
|
93: "请输入指令链生成最高相对高度(≥5)",
|
||||||
|
94: "❌You should input a number which is not lower then 4, please reinput again.",
|
||||||
|
95: "Structure",
|
||||||
|
96: "Reset Main Options",
|
||||||
|
97: "Track Options",
|
||||||
|
# 98:"",
|
||||||
|
# 99:"",
|
||||||
|
# 100:"",
|
||||||
|
# 101:"",
|
||||||
|
102: "Delete Selected Track",
|
||||||
|
# 103:"",
|
||||||
|
# 104:"",
|
||||||
|
|
||||||
|
105: "Error with finding or reading file😢:{}",
|
||||||
|
106: "Project is unsaved, save before close?",
|
||||||
|
107: "Saved in: {}",
|
||||||
|
108: ("Musicreater 0.0.X Project","Musicreater 0.1+ Project","Musicreater 0.1+ TESTver Project"),
|
||||||
|
109: "Any Type",
|
||||||
|
110: "NoteFunCreater Project",
|
||||||
|
111: "MMFM (V0.0.6) Project",
|
||||||
|
112: "All Types",
|
||||||
|
113: ".MP3 file(piano sound)",
|
||||||
|
114: "Midi file",
|
||||||
|
115: "Text file",
|
||||||
|
116: "Position Inpution",
|
||||||
|
117: "Format Error❌, please Reinput!",
|
||||||
|
118: ".MCFUNCTION",
|
||||||
|
119: "The position of the ChainCB for execution:",
|
||||||
|
# 120: "",
|
||||||
|
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
||||||
|
122: "请输入执行链生成相对坐标:",
|
||||||
|
123: "FastBuilder Structure",
|
||||||
|
124: "Done!\n{}",
|
||||||
|
125: "一秒,音乐走几拍?",
|
||||||
|
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
||||||
|
127: "请输入区域选择的开始坐标:",
|
||||||
|
128: "请输入区域选择的结束坐标:",
|
||||||
|
129: "Whether air block remain when export?",
|
||||||
|
130: "Musicreater Structure",
|
||||||
|
131: "Done😃\n{}",
|
||||||
|
132: "Failed❌\n{}\n{}",
|
||||||
|
133: "Have not developed yet...",
|
||||||
|
134: "Your name",
|
||||||
|
135: "Your contact",
|
||||||
|
136: "Your description of Problem",
|
||||||
|
137: "Log file will be cleared when you exit.",
|
||||||
|
138: "Log file will NOT be cleared when you exit.",
|
||||||
|
139: "修改包名",
|
||||||
|
140: "修改音乐标题",
|
||||||
|
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
||||||
|
142: "修改本音轨的执行实体名",
|
||||||
|
143: "修改本音轨所用的积分板",
|
||||||
|
144: "修改本音轨所用乐器",
|
||||||
|
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
||||||
|
146: "修改本音轨生成的文件名",
|
||||||
|
# -----2022.1.25更新
|
||||||
|
147: "生成新文件至...",
|
||||||
|
148: "从midi导入音轨且用新方法解析",
|
||||||
|
149: "Open New: Musicreater Project...",
|
||||||
|
150: "保存为新项目",
|
||||||
|
151: "另存为新项...",
|
||||||
|
152: "(开发调试)关闭本次日志记录",
|
||||||
|
153: "生成新函数包至...",
|
||||||
|
154: "生成新函数附加包文件至...",
|
||||||
|
155: "生成新函数附加包文件,并将神羽资源包以散包形式放置至...",
|
||||||
|
156: "Select [MiraclePlumeResourcePack]...",
|
||||||
|
157: "没有路径文件(.rpposi文件),请仔细阅读Readme或先试用:帮助与疑问->[神羽资源包位置选择]:选择文件夹... 方法添加路径文件吧!",
|
||||||
|
158: "有路径文件(.rpposi文件),但路径指示错误,请仔细阅读Readme或先用:帮助与疑问->[神羽资源包位置选择]:选择文件夹... 更改路径!",
|
||||||
|
159: "更改路径文件(.rpposi文件)成功!!",
|
||||||
|
160: "从midi导入音轨且用类方法解析",
|
||||||
|
161: "打开 类方法: 音·创项目...",
|
||||||
|
162: "保存为类方法项目",
|
||||||
|
163: "另存为类方法项...",
|
||||||
|
|
||||||
|
}
|
||||||
20
languages/lang.py
Normal file
20
languages/lang.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULTLANGUAGE = 'zh-CN'
|
||||||
|
|
||||||
|
LANGUAGELIST = {
|
||||||
|
'zh-CN': (
|
||||||
|
"简体中文 中国大陆",
|
||||||
|
"Simplified Chinese, China Mainland",
|
||||||
|
),
|
||||||
|
'en-GB': (
|
||||||
|
"英式英语 大不列颠",
|
||||||
|
"British English, Great Britain",
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
if DEFAULTLANGUAGE == 'zh-CN':
|
||||||
|
from languages.zhCN import READABLETEXT
|
||||||
|
elif DEFAULTLANGUAGE == 'en-GB':
|
||||||
|
from languages.enGB import READABLETEXT
|
||||||
185
languages/zhCN.py
Normal file
185
languages/zhCN.py
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
# 由金羿翻译工具生成字符串列表
|
||||||
|
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
|
READABLETEXT = {
|
||||||
|
'Translator': (("金羿 Eilles 原稿", True),),
|
||||||
|
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
|
0: "错误❌",
|
||||||
|
1: "提示❗",
|
||||||
|
2: "清除log(此句不载入日志)",
|
||||||
|
3: "无法清除日志及临时文件",
|
||||||
|
4: "已存储",
|
||||||
|
5: "新建 音·创 项目",
|
||||||
|
6: "请选择旧类型的项目",
|
||||||
|
7: "请选择 音·创 项目",
|
||||||
|
8: "无法打开文件:{},请查看您是否输入正确",
|
||||||
|
9: "音·创 - 关于",
|
||||||
|
10: "音·创 Musicreater",
|
||||||
|
11: "当前版本:{}",
|
||||||
|
12: """凌云我的世界开发团队\n×\n凌云计算机应用软件开发团队""",
|
||||||
|
13: "确定",
|
||||||
|
14: "请输入音符",
|
||||||
|
15: (("- 开发者 -", False),
|
||||||
|
("金羿 Eilles", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
||||||
|
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False),
|
||||||
|
),
|
||||||
|
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
|
16: "- 翻译者 -",
|
||||||
|
# 17:"",
|
||||||
|
18: "讨论群: 861684859",
|
||||||
|
19: "音·创 - 帮助",
|
||||||
|
20: "请选择钢琴声音的音乐文件",
|
||||||
|
21: "请选择 MIDI 文件",
|
||||||
|
22: "请选择 音符文本 文件",
|
||||||
|
23: "获取音符信息",
|
||||||
|
24: "音符数据写入{}",
|
||||||
|
25: "请选择文件生成的位置",
|
||||||
|
26: "请选择文件夹生成的位置",
|
||||||
|
27: "请选择.mcpack文件生成的位置",
|
||||||
|
28: "坐标信息输入",
|
||||||
|
29: "请选择世界文件夹生成的位置",
|
||||||
|
30: "请选择函数包生成的位置",
|
||||||
|
31: "请选择 .mcfunction 文件",
|
||||||
|
32: "请选择需要生成的.bdx文件",
|
||||||
|
33: "完成✔",
|
||||||
|
34: "输入播放速度",
|
||||||
|
35: "创建中",
|
||||||
|
36: "请选择世界文件夹所在的位置",
|
||||||
|
37: "请确认",
|
||||||
|
38: "生成.RyStruct文件",
|
||||||
|
39: "失败❌",
|
||||||
|
40: "邮件反馈信息输入",
|
||||||
|
41: "音·创 - {}",
|
||||||
|
42: "执行实体名:{}",
|
||||||
|
43: "使用计分板:{}",
|
||||||
|
44: "所用的乐器:{}",
|
||||||
|
45: "当前音轨名:{}",
|
||||||
|
46: "包名:{}",
|
||||||
|
47: "音乐标题:{}",
|
||||||
|
48: "是否重复:{}",
|
||||||
|
49: "玩家选择器:{}",
|
||||||
|
50: "修改主设置",
|
||||||
|
51: "修改节设置",
|
||||||
|
52: "游戏内置乐器如下:请输入英文\n",
|
||||||
|
53: "打开音·创项目...",
|
||||||
|
54: "打开旧项目...",
|
||||||
|
55: "保存项目",
|
||||||
|
56: "另存为...",
|
||||||
|
57: "退出",
|
||||||
|
58: "文件",
|
||||||
|
59: "从钢琴MP3导入音轨",
|
||||||
|
60: "从midi导入音轨",
|
||||||
|
61: "从文本文件导入音轨",
|
||||||
|
62: "输入音符至音轨",
|
||||||
|
63: "编辑",
|
||||||
|
64: "生成文件至...",
|
||||||
|
65: "生成函数包至...",
|
||||||
|
66: "生成附加包文件至...",
|
||||||
|
67: "函数(包)",
|
||||||
|
68: "将音乐以方块存储生成地图",
|
||||||
|
69: "将音乐以方块存储载入地图…",
|
||||||
|
70: "将音乐以指令存储生成地图",
|
||||||
|
71: "将音乐以指令存储载入地图…",
|
||||||
|
72: "将音乐以音符盒存储生成地图",
|
||||||
|
73: "将音乐以音符盒存储载入地图…",
|
||||||
|
74: "世界",
|
||||||
|
75: "生成符合当前音乐的函数播放器…",
|
||||||
|
76: "将选中音轨以指令存储生成.bdx文件…",
|
||||||
|
77: "由地图导出至.bdx文件…",
|
||||||
|
78: "由地图导出至.RyStruct文件…",
|
||||||
|
79: "将函数载入世界…",
|
||||||
|
80: "将大函数分割并建立执行链…",
|
||||||
|
81: "辅助功能",
|
||||||
|
82: "展示生成结果",
|
||||||
|
83: "建立位于localhost:8080上的websocket服务器播放选中音轨",
|
||||||
|
84: "实验性功能",
|
||||||
|
85: "清除日志文件",
|
||||||
|
86: "清除早期版本的存储文件",
|
||||||
|
87: "帮助",
|
||||||
|
88: "关于",
|
||||||
|
89: "发送错误日志反馈",
|
||||||
|
90: "帮助与疑问",
|
||||||
|
91: "音乐总设置(项目设置)",
|
||||||
|
# =============================================================此处有新增
|
||||||
|
92: "将音乐导出为BDX",
|
||||||
|
93: "请输入指令链生成最高相对高度(≥5)",
|
||||||
|
94: "您输入的数据有误❌,相对高度请输入一个不小于4的值,请重新输入。",
|
||||||
|
95: "结构操作",
|
||||||
|
96: "重置项目设置",
|
||||||
|
97: "当前音轨设置(段落设置)",
|
||||||
|
# 98:"",
|
||||||
|
# 99:"",
|
||||||
|
# 100:"",
|
||||||
|
# 101:"",
|
||||||
|
102: "删除选中音轨",
|
||||||
|
# 103:"",
|
||||||
|
# 104:"",
|
||||||
|
105: "找不到或无法读取文件😢:{}",
|
||||||
|
106: "您当前的项目已修改但未存储,是否先保存当前项目?",
|
||||||
|
107: "项目已经存储至:{}",
|
||||||
|
108: ("音·创0.0.X工程文件", "音·创0.1+工程文件", "音·创0.1+TEST工程文件"),
|
||||||
|
109: "任意类型",
|
||||||
|
110: "函数音创工程文件",
|
||||||
|
111: "MMFM0.0.6版本工程文件",
|
||||||
|
112: "全部类型",
|
||||||
|
113: "钢琴声音的音频文件",
|
||||||
|
114: "Midi文件",
|
||||||
|
115: "文本文件",
|
||||||
|
116: "请输入坐标:",
|
||||||
|
117: "您输入的格式有误❌,请重新输入。",
|
||||||
|
118: "我的世界指令函数文件",
|
||||||
|
119: "请输入执行链生成坐标:",
|
||||||
|
# 120: "",
|
||||||
|
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
||||||
|
122: "请输入执行链生成相对坐标:",
|
||||||
|
123: "FastBuilder结构文件",
|
||||||
|
124: "转换结束!\n{}",
|
||||||
|
125: "一秒,音乐走几拍?",
|
||||||
|
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
||||||
|
127: "请输入区域选择的开始坐标:",
|
||||||
|
128: "请输入区域选择的结束坐标:",
|
||||||
|
129: "所选区块导出时是否需要保留空气方块?",
|
||||||
|
130: "音·创结构文件",
|
||||||
|
131: "文件已生成\n{}",
|
||||||
|
132: "文件无法生成\n{}\n{}",
|
||||||
|
133: "本功能尚未开发。",
|
||||||
|
134: "您的称呼",
|
||||||
|
135: "您的联系方式",
|
||||||
|
136: "您对问题的描述",
|
||||||
|
137: "在程序结束后将清除日志及临时文件信息。",
|
||||||
|
138: "在程序结束后将不会清除日志及临时文件信息。",
|
||||||
|
139: "修改包名",
|
||||||
|
140: "修改音乐标题",
|
||||||
|
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
||||||
|
142: "修改本音轨的执行实体名",
|
||||||
|
143: "修改本音轨所用的积分板",
|
||||||
|
144: "修改本音轨所用乐器",
|
||||||
|
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
||||||
|
146: "修改本音轨生成的文件名",
|
||||||
|
# -----2022.1.25更新
|
||||||
|
147: "生成乐器文件至...",
|
||||||
|
148: "从midi导入音轨且用新方法解析",
|
||||||
|
# 149: "打开 新: 音·创项目...",
|
||||||
|
# 150: "保存为新项目",
|
||||||
|
# 151: "另存为新项...",
|
||||||
|
152: "(开发调试)关闭本次日志记录",
|
||||||
|
153: "生成乐器函数包至...",
|
||||||
|
154: "生成乐器函数附加包文件至...",
|
||||||
|
155: "生成乐器函数附加包文件,并将神羽资源包以散包形式放置至...",
|
||||||
|
156: "[神羽资源包位置选择]:选择文件夹...",
|
||||||
|
157: "没有路径文件(.rpposi文件),请仔细阅读Readme或先试用:帮助与疑问->[神羽资源包位置选择]:选择文件夹... 方法添加路径文件吧!",
|
||||||
|
158: "有路径文件(.rpposi文件),但路径指示错误,请仔细阅读Readme或先用:帮助与疑问->[神羽资源包位置选择]:选择文件夹... 更改路径!",
|
||||||
|
159: "更改路径文件(.rpposi文件)成功!!",
|
||||||
|
160: "从midi导入音轨且用类方法解析",
|
||||||
|
# 161: "打开 类方法: 音·创项目...",
|
||||||
|
# 162: "保存为类方法项目",
|
||||||
|
# 163: "另存为类方法项...",
|
||||||
|
164: "生成新文件至...",
|
||||||
|
165: "生成新函数包至...",
|
||||||
|
166: "生成新函数附加包文件至...",
|
||||||
|
167: "!!!这个midi文件读取不了,mido解析报错!!!"
|
||||||
|
|
||||||
|
}
|
||||||
BIN
msctspt/__init__.pyc
Normal file
BIN
msctspt/__init__.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/bdxOpera_CP.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/bdxOpera_CP.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/bdxOpera_CP.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/bdxOpera_CP.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/bugReporter.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/bugReporter.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/bugReporter.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/bugReporter.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/funcOpera.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/funcOpera.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/funcOpera.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/funcOpera.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/threadOpera.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/threadOpera.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/threadOpera.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/threadOpera.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/transfer.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/transfer.cpython-38.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/transfer.cpython-39.pyc
Normal file
BIN
msctspt/__pycache__/transfer.cpython-39.pyc
Normal file
Binary file not shown.
BIN
msctspt/__pycache__/values.cpython-38.pyc
Normal file
BIN
msctspt/__pycache__/values.cpython-38.pyc
Normal file
Binary file not shown.
@@ -4,6 +4,10 @@ import brotli
|
|||||||
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
||||||
|
|
||||||
|
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:7个
|
||||||
|
|
||||||
|
|
||||||
class BdxConverter:
|
class BdxConverter:
|
||||||
__header = "BD@"
|
__header = "BD@"
|
||||||
__bin_header = b"BDX"
|
__bin_header = b"BDX"
|
||||||
@@ -42,8 +46,8 @@ class BdxConverter:
|
|||||||
:return: list 给出的所有方块种类名称
|
:return: list 给出的所有方块种类名称
|
||||||
"""
|
"""
|
||||||
block_type = set()
|
block_type = set()
|
||||||
for block in self.blocks:
|
for block_ in self.blocks:
|
||||||
block_type.add(block["block_name"])
|
block_type.add(block_["block_name"])
|
||||||
block_type = list(block_type)
|
block_type = list(block_type)
|
||||||
return block_type
|
return block_type
|
||||||
|
|
||||||
@@ -74,6 +78,7 @@ class BdxConverter:
|
|||||||
f.write(brotli.compress(_bytes))
|
f.write(brotli.compress(_bytes))
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
def upload_blocks(self):
|
def upload_blocks(self):
|
||||||
"""
|
"""
|
||||||
计算差值
|
计算差值
|
||||||
@@ -83,17 +88,17 @@ class BdxConverter:
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
_types = b""
|
_types = b""
|
||||||
for block in self.blocks:
|
for block_ in self.blocks:
|
||||||
# print(f"当前方块:{block['block_name']}, 位置: {block['direction']}]")
|
# print(f"当前方块:{block['block_name']}, 位置: {block['direction']}]")
|
||||||
diff = self.move_pointer(self.direction, block["direction"])
|
diff = self.move_pointer(self.direction, block_["direction"])
|
||||||
_types += diff
|
_types += diff
|
||||||
if block["block_name"] in ["command_block",
|
if block_["block_name"] in ["command_block",
|
||||||
"chain_command_block",
|
"chain_command_block",
|
||||||
"repeating_command_block"]:
|
"repeating_command_block"]:
|
||||||
_types += self.obtain_command_block(block)
|
_types += self.obtain_command_block(block_)
|
||||||
else:
|
else:
|
||||||
_types += self.obtain_universal_block(block)
|
_types += self.obtain_universal_block(block_)
|
||||||
self.direction = block["direction"]
|
self.direction = block_["direction"]
|
||||||
return _types
|
return _types
|
||||||
|
|
||||||
def move_pointer(self, direction: list, new_direction):
|
def move_pointer(self, direction: list, new_direction):
|
||||||
@@ -148,21 +153,21 @@ class BdxConverter:
|
|||||||
return pointer_type + num_byte
|
return pointer_type + num_byte
|
||||||
return pointer_type
|
return pointer_type
|
||||||
|
|
||||||
def obtain_universal_block(self, block):
|
def obtain_universal_block(self, block1):
|
||||||
"""
|
"""
|
||||||
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
||||||
:param block: {block_name: str,particular_value: int}
|
:param block1: {block_name: str,particular_value: int}
|
||||||
:return: bytes
|
:return: bytes
|
||||||
"""
|
"""
|
||||||
block_id = b"\x07" + self.block_type.index(block["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
block_id = b"\x07" + self.block_type.index(block1["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
||||||
particular_value = block["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
particular_value = block1["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
||||||
block_header = block_id + particular_value
|
block_header = block_id + particular_value
|
||||||
return block_header
|
return block_header
|
||||||
|
|
||||||
def obtain_command_block(self, block):
|
def obtain_command_block(self, block1):
|
||||||
"""
|
"""
|
||||||
给定一个命令方块,返回命令方块各种数据
|
给定一个命令方块,返回命令方块各种数据
|
||||||
:param block: {
|
:param block1: {
|
||||||
"direction": [x: int, y: int, z: int]
|
"direction": [x: int, y: int, z: int]
|
||||||
"block_name": str,
|
"block_name": str,
|
||||||
"particular_value": int,
|
"particular_value": int,
|
||||||
@@ -179,23 +184,24 @@ class BdxConverter:
|
|||||||
:return: bytes of command_block
|
:return: bytes of command_block
|
||||||
"""
|
"""
|
||||||
|
|
||||||
block_id = b"\x1b" + self.block_type.index(block["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
block_id = b"\x1b" + self.block_type.index(block1["block_name"]).to_bytes(2, byteorder="big", signed=False)
|
||||||
particular_value = block["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
particular_value = block1["particular_value"].to_bytes(2, byteorder="big", signed=False)
|
||||||
block_header = block_id + particular_value
|
block_header = block_id + particular_value
|
||||||
for i in [
|
for i in [
|
||||||
block["impluse"].to_bytes(4, byteorder="big", signed=False),
|
block1["impluse"].to_bytes(4, byteorder="big", signed=False),
|
||||||
bytes(block["command"], encoding="utf-8") + b"\x00",
|
bytes(block1["command"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block["customName"], encoding="utf-8") + b"\x00",
|
bytes(block1["customName"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block["lastOutput"], encoding="utf-8") + b"\x00",
|
bytes(block1["lastOutput"], encoding="utf-8") + b"\x00",
|
||||||
block["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
block1["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
||||||
block["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
block1["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
||||||
block["trackOutput"].to_bytes(1, byteorder="big"),
|
block1["trackOutput"].to_bytes(1, byteorder="big"),
|
||||||
block["conditional"].to_bytes(1, byteorder="big"),
|
block1["conditional"].to_bytes(1, byteorder="big"),
|
||||||
block["needRedstone"].to_bytes(1, byteorder="big")
|
block1["needRedstone"].to_bytes(1, byteorder="big")
|
||||||
]:
|
]:
|
||||||
block_header += i
|
block_header += i
|
||||||
return block_header
|
return block_header
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
block = [{"direction": [-1, -1, -1], "block_name": "concrete", "particular_value": 5},
|
block = [{"direction": [-1, -1, -1], "block_name": "concrete", "particular_value": 5},
|
||||||
{"direction": [1, 5, 1], "block_name": "stained_glass", "particular_value": 7},
|
{"direction": [1, 5, 1], "block_name": "stained_glass", "particular_value": 7},
|
||||||
@@ -212,4 +218,4 @@ if __name__ == '__main__':
|
|||||||
},
|
},
|
||||||
{"direction": [3, 4, 1], "block_name": "concrete", "particular_value": 6},
|
{"direction": [3, 4, 1], "block_name": "concrete", "particular_value": 6},
|
||||||
{"direction": [-123412133, 4, 1], "block_name": "concrete", "particular_value": 7}]
|
{"direction": [-123412133, 4, 1], "block_name": "concrete", "particular_value": 7}]
|
||||||
bdx = BdxConverter("./test02.bdx", "Charlie_Ping",block)
|
bdx = BdxConverter("./test02.bdx", "Charlie_Ping", block)
|
||||||
137
msctspt/bugReporter.py
Normal file
137
msctspt/bugReporter.py
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
# -*- coding: UTF-8 -*-
|
||||||
|
"""提供错误报告的基本操作及方法 顺便提供版本更新、安装库等功能"""
|
||||||
|
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:1个;语法(一级)错误:72个
|
||||||
|
import os
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
|
||||||
|
def makeZip(sourceDir, outFilename, compression=8, exceptFile=None):
|
||||||
|
"""使用compression指定的算法打包目录为zip文件\n
|
||||||
|
默认算法为DEFLATED(8),可用算法如下:\n
|
||||||
|
STORED = 0\n
|
||||||
|
DEFLATED = 8\n
|
||||||
|
BZIP2 = 12\n
|
||||||
|
LZMA = 14\n
|
||||||
|
"""
|
||||||
|
zipf = zipfile.ZipFile(outFilename, 'w', compression)
|
||||||
|
pre_len = len(os.path.dirname(sourceDir))
|
||||||
|
for parent, dirnames, filenames in os.walk(sourceDir):
|
||||||
|
for filename in filenames:
|
||||||
|
if filename == exceptFile:
|
||||||
|
continue
|
||||||
|
print(filename)
|
||||||
|
pathfile = os.path.join(parent, filename)
|
||||||
|
arcname = pathfile[pre_len:].strip(os.path.sep) # 相对路径
|
||||||
|
zipf.write(pathfile, arcname)
|
||||||
|
|
||||||
|
zipf.close()
|
||||||
|
del zipf, pre_len
|
||||||
|
|
||||||
|
|
||||||
|
# 以上函数节选并修改自 正在攀登的小蜗牛 的博客:https://blog.csdn.net/qq_21127151/article/details/107503942
|
||||||
|
|
||||||
|
|
||||||
|
class report:
|
||||||
|
"""发送报告以及相应的任务处理"""
|
||||||
|
|
||||||
|
def __init__(self, senderName: str = 'Unknown', senderContact: str = 'None', describetion: str = ''):
|
||||||
|
""":param senderName 发送者名称
|
||||||
|
:param senderContact 发送者联系方式
|
||||||
|
:param describetion 问题描述"""
|
||||||
|
self.senderName = senderName
|
||||||
|
self.senderContact = senderContact
|
||||||
|
self.describetion = describetion
|
||||||
|
if not self.senderName:
|
||||||
|
self.senderName = 'Unknown'
|
||||||
|
if not self.senderContact:
|
||||||
|
self.senderContact = 'None'
|
||||||
|
|
||||||
|
def emailReport(self):
|
||||||
|
"""使用E-mail方法发送当前的日志和临时文件等"""
|
||||||
|
import smtplib
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.header import Header
|
||||||
|
from nmcsup.log import log
|
||||||
|
log("发送错误报告")
|
||||||
|
import os
|
||||||
|
log("添加标题与正文")
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
# 发送者与接收者显示名称
|
||||||
|
msg["From"] = Header(self.senderName, 'utf-8')
|
||||||
|
msg["To"] = Header("W-YI (QQ2647547478)", 'utf-8')
|
||||||
|
# 标题
|
||||||
|
msg["Subject"] = '音·创 - 来自 ' + self.senderName + ' 的错误报告'
|
||||||
|
# 正文
|
||||||
|
msg.attach(
|
||||||
|
MIMEText("来自" + self.senderName + "( " + self.senderContact + " )的错误描述:\n" + self.describetion,
|
||||||
|
'utf-8'))
|
||||||
|
log("添加完毕,正在生成压缩包...")
|
||||||
|
makeZip("./", "Temps&Logs.zip", exceptFile="Temps&Logs.zip")
|
||||||
|
attafile = MIMEText(str(open("Temps&Logs.zip", 'rb').read()), "base64", 'gb2312')
|
||||||
|
attafile["Content-Type"] = 'application/octet-stream'
|
||||||
|
attafile["Content-Disposition"] = 'attachmentfilename="BugReport_from_' + self.senderName + '.zip"'
|
||||||
|
msg.attach(attafile)
|
||||||
|
log("完毕,准备发送")
|
||||||
|
try:
|
||||||
|
smtp = smtplib.SMTP()
|
||||||
|
smtp.connect("smtp.163.com")
|
||||||
|
# smtp.login("RyounDevTeam@163.com","RyounDaiYi99")
|
||||||
|
# SIQQKQQYCZRVIDFJ是授权密码
|
||||||
|
smtp.login("RyounDevTeam@163.com", "SIQQKQQYCZRVIDFJ")
|
||||||
|
smtp.sendmail("RyounDevTeam@163.com", ["RyounDevTeam@163.com", ], msg.as_string())
|
||||||
|
log("错误汇报邮件已发送")
|
||||||
|
except smtplib.SMTPException as e:
|
||||||
|
log("错误汇报邮件发送失败:\n" + str(e))
|
||||||
|
log("清空内存和临时文件")
|
||||||
|
del msg, attafile
|
||||||
|
os.remove("./Temps&Logs.zip")
|
||||||
|
|
||||||
|
|
||||||
|
class version:
|
||||||
|
libraries = (
|
||||||
|
'mido', 'amulet', 'amulet-core', 'amulet-nbt', 'piano_transcription_inference', 'pypinyin',
|
||||||
|
'pyinstaller','py7zr','websockets', 'torch'
|
||||||
|
)
|
||||||
|
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
||||||
|
|
||||||
|
version = ('0.1.5.1', 'Delta',)
|
||||||
|
"""当前版本"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
|
||||||
|
self.libraries = version.libraries
|
||||||
|
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
||||||
|
|
||||||
|
self.version = version.version
|
||||||
|
"""当前版本"""
|
||||||
|
|
||||||
|
|
||||||
|
def installLibraries(self,index:str = 'https://pypi.tuna.tsinghua.edu.cn/simple'):
|
||||||
|
"""安装全部开发用库"""
|
||||||
|
from sys import platform
|
||||||
|
import os
|
||||||
|
if platform == 'win32':
|
||||||
|
import shutil
|
||||||
|
try:
|
||||||
|
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
for i in self.libraries:
|
||||||
|
print("安装库:" + i)
|
||||||
|
os.system(f"python -m pip install {i} -i {index}")
|
||||||
|
elif platform == 'linux':
|
||||||
|
os.system("sudo apt-get install python3-pip")
|
||||||
|
os.system("sudo apt-get install python3-tk")
|
||||||
|
os.system("sudo apt-get install python3-tkinter")
|
||||||
|
for i in self.libraries:
|
||||||
|
print("安装库:" + i)
|
||||||
|
os.system(f"sudo python3 -m pip install {i} -i {index}")
|
||||||
|
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
'''直接安装库,顺便返回一下当前版本'''
|
||||||
|
self.installLibraries()
|
||||||
|
return self.version
|
||||||
396
msctspt/funcOpera.py
Normal file
396
msctspt/funcOpera.py
Normal file
@@ -0,0 +1,396 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""音·创 的函数操作和一些其他功能"""
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:91个
|
||||||
|
|
||||||
|
|
||||||
|
from nmcsup.log import log
|
||||||
|
|
||||||
|
|
||||||
|
def delPart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
||||||
|
"""删除序列从starter物件到ender物件之间的部分\n
|
||||||
|
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
||||||
|
starter与ender若为None则默认从首或尾开始"""
|
||||||
|
try:
|
||||||
|
if starter is None:
|
||||||
|
includeStart = True
|
||||||
|
starter = Data[0]
|
||||||
|
if ender is None:
|
||||||
|
includend = True
|
||||||
|
ender = Data[len(Data) - 1]
|
||||||
|
if includend:
|
||||||
|
if includeStart:
|
||||||
|
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender)]
|
||||||
|
else:
|
||||||
|
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender)]
|
||||||
|
else:
|
||||||
|
if includeStart:
|
||||||
|
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
||||||
|
else:
|
||||||
|
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def keepart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
||||||
|
"""保留序列从starter物件到ender物件之间的部分\n
|
||||||
|
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
||||||
|
starter与ender若为None则默认从首或尾开始"""
|
||||||
|
try:
|
||||||
|
if starter is None:
|
||||||
|
includeStart = True
|
||||||
|
starter = Data[0]
|
||||||
|
if ender is None:
|
||||||
|
includend = True
|
||||||
|
ender = Data[len(Data) - 1]
|
||||||
|
if includend:
|
||||||
|
if includeStart:
|
||||||
|
return Data[Data.index(starter):Data.index(ender) + 1]
|
||||||
|
else:
|
||||||
|
return Data[Data.index(starter) + 1:Data.index(ender) + 1]
|
||||||
|
else:
|
||||||
|
if includeStart:
|
||||||
|
return Data[Data.index(starter):Data.index(ender)]
|
||||||
|
else:
|
||||||
|
return Data[Data.index(starter) + 1:Data.index(ender)]
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def lenFunction(fun) -> int:
|
||||||
|
"""取得函数指令部分长度,即忽略#开头的注释"""
|
||||||
|
try:
|
||||||
|
f = 0
|
||||||
|
for i in fun:
|
||||||
|
if i.replace(" ", '')[0] == '#':
|
||||||
|
f += 1
|
||||||
|
return len(fun) - f
|
||||||
|
except:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
def funSplit(bigFile, maxCmdLen: int = 10000):
|
||||||
|
"""分割bigFile大的函数文件,bigFile需要读入文件流\n
|
||||||
|
返回的部分,每行指令皆带有行尾换行符\\n\n
|
||||||
|
返回-1为大小低于maxCmdLen最长函数指令长度"""
|
||||||
|
bigFile = bigFile.readlines()
|
||||||
|
if lenFunction(bigFile) < maxCmdLen:
|
||||||
|
return -1
|
||||||
|
part = []
|
||||||
|
parts = []
|
||||||
|
h = 0
|
||||||
|
for i in bigFile:
|
||||||
|
if i.replace(" ", '')[0] == '#':
|
||||||
|
part.append(i + '\n')
|
||||||
|
else:
|
||||||
|
part.append(i + '\n')
|
||||||
|
h += 1
|
||||||
|
if h >= 10000:
|
||||||
|
parts.append(part)
|
||||||
|
part = []
|
||||||
|
h = 0
|
||||||
|
return parts
|
||||||
|
|
||||||
|
|
||||||
|
# 注意!播放器应该为个人独立播放器,此处bug需要修改
|
||||||
|
def makeFuncFiles(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数文件"""
|
||||||
|
from nmcsup.trans import Note2Cmd
|
||||||
|
commands = []
|
||||||
|
starts = []
|
||||||
|
log("=========================正在在此处生成文件:" + path)
|
||||||
|
maxlen = -1
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
log('写入第' + str(i) + '个数据')
|
||||||
|
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\"] " +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + " 1\n")
|
||||||
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
||||||
|
'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
||||||
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
||||||
|
'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
||||||
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
|
maxlen = len(musicset['musics'][i]['notes'])
|
||||||
|
starts.append("scoreboard objectives add " + musicset['musics'][i]['set']['ScoreboardName'] + " dummy\n")
|
||||||
|
starts.append("summon armor_stand " + musicset['musics'][i]['set']['EntityName'] + '\n')
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
|
encoding='UTF-8') as f:
|
||||||
|
f.writelines(Note2Cmd(musicset['musics'][i]['notes'], musicset['musics'][i]['set']['ScoreboardName'],
|
||||||
|
musicset['musics'][i]['set']['Instrument'], musicset['mainset']['PlayerSelect'],
|
||||||
|
True))
|
||||||
|
if musicset['mainset']['IsRepeat']:
|
||||||
|
log("增加重复语句")
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
||||||
|
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
||||||
|
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
||||||
|
log("增加版权语句")
|
||||||
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
|
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
|
log("写入支持文件")
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(commands)
|
||||||
|
log("写入开始文件")
|
||||||
|
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(starts)
|
||||||
|
del commands, starts, maxlen
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
def makeFunDir(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数包文件夹"""
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
log("=============================生成函数包文件夹")
|
||||||
|
# note,packname="Ryoun",FileName="Music",EntityName_='music_support',ScoreboardName_='music_support',
|
||||||
|
# MusicTitle_='Noname',PlayerSelect_='',Repeat_=False,Instrument_='harp'
|
||||||
|
try:
|
||||||
|
os.makedirs(path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
log("已创建目录" + path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
except FileExistsError:
|
||||||
|
log("目录已有无需创建")
|
||||||
|
pass
|
||||||
|
# 判断文件皆存在
|
||||||
|
if not (os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json") and os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/manifest.json")):
|
||||||
|
log("创建manifest.json以及world_behavior_packs.json")
|
||||||
|
behaviorUuid = uuid.uuid4()
|
||||||
|
with open(path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json", "w") as f:
|
||||||
|
f.write("[\n {\"pack_id\": \"" + str(behaviorUuid) + "\",\n \"version\": [ 0, 0, 1 ]}\n]")
|
||||||
|
p = path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset']['PackName'] + \
|
||||||
|
"/manifest.json"
|
||||||
|
with open(p, "w") as f:
|
||||||
|
f.write("{\n \"format_version\": 1,\n \"header\": {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"version\": [ 0, 0, 1 ],\n \"name\": \"" +
|
||||||
|
musicset['mainset']['PackName'] + "Pack\",\n \"uuid\": \"" + str(
|
||||||
|
behaviorUuid) + "\"\n },\n \"modules\": [\n {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"type\": \"data\",\n \"version\":"
|
||||||
|
" [ 0, 0, 1 ],\n \"uuid\": \"" + str(
|
||||||
|
uuid.uuid4()) + "\"\n }\n ]\n}")
|
||||||
|
makeFuncFiles(musicset, path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions/")
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
def makeNewFuncFiles(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数文件"""
|
||||||
|
from msctspt.transfer import newList_conversion_SinglePlayer
|
||||||
|
commands = []
|
||||||
|
starts = []
|
||||||
|
starts.__len__()
|
||||||
|
starts.append("scoreboard objectives add " + musicset['musics'][0]['set']['ScoreboardName'] + " dummy\n")
|
||||||
|
starts.append("summon armor_stand " + musicset['musics'][0]['set']['EntityName'] + '\n')
|
||||||
|
starts.append("scoreboard objectives setdisplay sidebar " + musicset['musics'][0]['set']['ScoreboardName'] + '\n')
|
||||||
|
starts.append("scoreboard players set @e[type=armor_stand, name=\"" + musicset['musics'][0]['set']['EntityName'] +
|
||||||
|
"\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 0" + '\n')
|
||||||
|
log("=========================正在在此处生成文件:" + path)
|
||||||
|
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][0]['set']['EntityName'] + "\"] " +
|
||||||
|
musicset['musics'][0]['set']['ScoreboardName'] + " 1\n")
|
||||||
|
maxlen = -1
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
log('写入第' + str(i) + '个数据')
|
||||||
|
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
||||||
|
# [
|
||||||
|
# 'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
||||||
|
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
||||||
|
# [
|
||||||
|
# 'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
||||||
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
|
maxlen = len(musicset['musics'][i]['notes'])
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
|
encoding='UTF-8') as f:
|
||||||
|
f.writelines(newList_conversion_SinglePlayer(musicset['musics'][i]['notes'],
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName']))
|
||||||
|
if musicset['mainset']['IsRepeat']:
|
||||||
|
log("增加重复语句")
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
||||||
|
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
||||||
|
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
||||||
|
log("增加版权语句")
|
||||||
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
|
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
|
log("写入支持文件")
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(commands)
|
||||||
|
log("写入开始文件")
|
||||||
|
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(starts)
|
||||||
|
del commands, starts, maxlen
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
def makeNewFunDir(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数包文件夹"""
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
log("=============================生成函数包文件夹")
|
||||||
|
# note,packname="Ryoun",FileName="Music",EntityName_='music_support',ScoreboardName_='music_support',
|
||||||
|
# MusicTitle_='Noname',PlayerSelect_='',Repeat_=False,Instrument_='harp'
|
||||||
|
try:
|
||||||
|
os.makedirs(path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
log("已创建目录" + path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
except FileExistsError:
|
||||||
|
log("目录已有无需创建")
|
||||||
|
pass
|
||||||
|
# 判断文件皆存在
|
||||||
|
if not (os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json") and os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/manifest.json")):
|
||||||
|
log("创建manifest.json以及world_behavior_packs.json")
|
||||||
|
behaviorUuid = uuid.uuid4()
|
||||||
|
with open(path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json", "w") as f:
|
||||||
|
f.write("[\n {\"pack_id\": \"" + str(behaviorUuid) + "\",\n \"version\": [ 0, 0, 1 ]}\n]")
|
||||||
|
p = path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset']['PackName'] + \
|
||||||
|
"/manifest.json"
|
||||||
|
with open(p, "w") as f:
|
||||||
|
f.write("{\n \"format_version\": 1,\n \"header\": {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"version\": [ 0, 0, 1 ],\n \"name\": \"" +
|
||||||
|
musicset['mainset']['PackName'] + "Pack\",\n \"uuid\": \"" + str(
|
||||||
|
behaviorUuid) + "\"\n },\n \"modules\": [\n {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"type\": \"data\",\n \"version\":"
|
||||||
|
" [ 0, 0, 1 ],\n \"uuid\": \"" + str(
|
||||||
|
uuid.uuid4()) + "\"\n }\n ]\n}")
|
||||||
|
makeNewFuncFiles(musicset, path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions/")
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
def makeClassFuncFiles(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数文件"""
|
||||||
|
from msctspt.transfer import classList_conversion_SinglePlayer
|
||||||
|
commands = []
|
||||||
|
starts = []
|
||||||
|
starts.__len__()
|
||||||
|
starts.append("scoreboard objectives add " + musicset['musics'][0]['set']['ScoreboardName'] + " dummy\n")
|
||||||
|
starts.append("summon armor_stand " + musicset['musics'][0]['set']['EntityName'] + '\n')
|
||||||
|
starts.append("scoreboard objectives setdisplay sidebar " + musicset['musics'][0]['set']['ScoreboardName'] + '\n')
|
||||||
|
starts.append("scoreboard players set @e[type=armor_stand, name=\"" + musicset['musics'][0]['set']['EntityName'] +
|
||||||
|
"\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 0" + '\n')
|
||||||
|
log("=========================正在在此处生成文件:" + path)
|
||||||
|
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][0]['set']['EntityName'] + "\"] " +
|
||||||
|
musicset['musics'][0]['set']['ScoreboardName'] + " 1\n")
|
||||||
|
maxlen = -1
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
log('写入第' + str(i) + '个数据')
|
||||||
|
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
||||||
|
# [
|
||||||
|
# 'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
||||||
|
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset']
|
||||||
|
# [
|
||||||
|
# 'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
||||||
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
|
maxlen = len(musicset['musics'][i]['notes'])
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
|
encoding='UTF-8') as f:
|
||||||
|
f.writelines(classList_conversion_SinglePlayer(musicset['musics'][i]['notes'],
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'],
|
||||||
|
musicset['musics'][i]['set']['Instrument'],
|
||||||
|
musicset['mainset']['PlayerSelect'],
|
||||||
|
True))
|
||||||
|
if musicset['mainset']['IsRepeat']:
|
||||||
|
log("增加重复语句")
|
||||||
|
for i in range(len(musicset['musics'])):
|
||||||
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
|
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
||||||
|
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
||||||
|
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
||||||
|
log("增加版权语句")
|
||||||
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
|
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
|
log("写入支持文件")
|
||||||
|
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(commands)
|
||||||
|
log("写入开始文件")
|
||||||
|
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
|
f.writelines(starts)
|
||||||
|
del commands, starts, maxlen
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
def makeClassFunDir(musicset, path='./'):
|
||||||
|
"""在指定目录下生成函数包文件夹"""
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
log("=============================生成函数包文件夹")
|
||||||
|
# note,packname="Ryoun",FileName="Music",EntityName_='music_support',ScoreboardName_='music_support',
|
||||||
|
# MusicTitle_='Noname',PlayerSelect_='',Repeat_=False,Instrument_='harp'
|
||||||
|
try:
|
||||||
|
os.makedirs(path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
log("已创建目录" + path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions")
|
||||||
|
except FileExistsError:
|
||||||
|
log("目录已有无需创建")
|
||||||
|
pass
|
||||||
|
# 判断文件皆存在
|
||||||
|
if not (os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json") and os.path.exists(
|
||||||
|
path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/manifest.json")):
|
||||||
|
log("创建manifest.json以及world_behavior_packs.json")
|
||||||
|
behaviorUuid = uuid.uuid4()
|
||||||
|
with open(path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json", "w") as f:
|
||||||
|
f.write("[\n {\"pack_id\": \"" + str(behaviorUuid) + "\",\n \"version\": [ 0, 0, 1 ]}\n]")
|
||||||
|
p = path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset']['PackName'] + \
|
||||||
|
"/manifest.json"
|
||||||
|
with open(p, "w") as f:
|
||||||
|
f.write("{\n \"format_version\": 1,\n \"header\": {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"version\": [ 0, 0, 1 ],\n \"name\": \"" +
|
||||||
|
musicset['mainset']['PackName'] + "Pack\",\n \"uuid\": \"" + str(
|
||||||
|
behaviorUuid) + "\"\n },\n \"modules\": [\n {\n \"description\": \"" + musicset['mainset'][
|
||||||
|
'PackName'] + " Pack : behavior pack\",\n \"type\": \"data\",\n \"version\":"
|
||||||
|
" [ 0, 0, 1 ],\n \"uuid\": \"" + str(
|
||||||
|
uuid.uuid4()) + "\"\n }\n ]\n}")
|
||||||
|
makeClassFuncFiles(musicset, path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions/")
|
||||||
|
log("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
这里是往事,用于记载一些用不到的功能
|
||||||
|
|
||||||
|
#存在于 Musicreater.py 播放(试听)音乐
|
||||||
|
def PlayNote(Notes, t=480): # Notes是音符列表,t是一拍占有的毫秒数
|
||||||
|
tkinter.messagebox.showinfo(title='提示!', message="播放发音不一定标准\n说不定还会坏音响/(ㄒoㄒ)/~~qwq\n请注意。")
|
||||||
|
import winsound
|
||||||
|
import time
|
||||||
|
from nmcsup.trans import mcnote2freq
|
||||||
|
Notes = mcnote2freq(Notes)
|
||||||
|
for frequency, duration in Notes:
|
||||||
|
log("播放:"+str([int(frequency), int(duration*t)]))
|
||||||
|
if int(frequency) != 0:
|
||||||
|
winsound.Beep(int(frequency), int(duration*t))
|
||||||
|
elif int(frequency) == 0:
|
||||||
|
time.sleep(duration*t/1000)
|
||||||
|
|
||||||
|
#同上,执行播放命令
|
||||||
|
def PlayOne():
|
||||||
|
log("试听")
|
||||||
|
tkinter.messagebox.showwarning(title="警告⚠", message="试听音质可能引起您的不适,更可能引起您的扬声器的不适,请酌情播放。")
|
||||||
|
global NowMusic
|
||||||
|
PlayNote(dataset[0]['musics'][NowMusic]['notes'])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#同上,是早期 MinecraftMusicFunctionMaker.py (函数音创)的代码转移至音·创时的注解
|
||||||
|
n2c(dataset[0]['musics'][i]['notes'],EntityName=dataset[0]['musics'][i]['set']['EntityName'],ScoreboardName=dataset[0]['
|
||||||
|
musics'][i]['set']['ScoreboardName'],PlayerSelect=dataset[0]['mainset']['PlayerSelect'],Instrument=dataset[0]['musics']
|
||||||
|
i]['set']["Instrument"])
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
18
msctspt/settings.py
Normal file
18
msctspt/settings.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
'language' : 'zh-CN',
|
||||||
|
'theme' : {
|
||||||
|
'' : '',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
class msctSetting:
|
||||||
|
def __init__(self,**settings) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __call__(self, **kwds):
|
||||||
|
pass
|
||||||
541
msctspt/transfer.py
Normal file
541
msctspt/transfer.py
Normal file
@@ -0,0 +1,541 @@
|
|||||||
|
"""音·创 的转换工具库"""
|
||||||
|
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:4个--未解决1个;语法(一级)错误:302个
|
||||||
|
|
||||||
|
|
||||||
|
# 可序列化对象,即可迭代对象
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
|
import amulet
|
||||||
|
|
||||||
|
from amulet.api.block import Block
|
||||||
|
from amulet.utils.world_utils import block_coords_to_chunk_coords as bc2cc
|
||||||
|
from amulet_nbt import TAG_String as ts
|
||||||
|
from nmcsup.log import log
|
||||||
|
|
||||||
|
|
||||||
|
def hans2pinyin(hans, style=3):
|
||||||
|
"""将汉字字符串转化为拼音字符串"""
|
||||||
|
from pypinyin import lazy_pinyin
|
||||||
|
result = lazy_pinyin(hans=hans, style=style)
|
||||||
|
final = ''
|
||||||
|
for i in result:
|
||||||
|
final += i
|
||||||
|
return final
|
||||||
|
|
||||||
|
|
||||||
|
def classList_conversion_SinglePlayer(List: list, ScoreboardName: str, Instrument: str, playerSelection: str = '',
|
||||||
|
isProsess: bool = False) -> list:
|
||||||
|
from bgArrayLib.compute import round_up
|
||||||
|
from bgArrayLib.pitchStrConstant import pitch
|
||||||
|
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(
|
||||||
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
|
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~{127 - i.velocity} "
|
||||||
|
f"~ playsound {Instrument} @s ~ ~ ~ 1000 {pitch.get(str(i.pitch))} 1000\n")
|
||||||
|
if isProsess:
|
||||||
|
commands.append(
|
||||||
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
|
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~ ~ "
|
||||||
|
f"title @s actionbar §e▶ 播放中: §a{j}/{length} || {int(j / length * 1000) / 10}\n")
|
||||||
|
j += 1
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# a += List[i][1]
|
||||||
|
# commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
|
print(commands)
|
||||||
|
return commands
|
||||||
|
|
||||||
|
|
||||||
|
def newList_conversion_SinglePlayer(List: list, ScoreboardName: str, playerSelection: 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(
|
||||||
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
|
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~{127 - i.velocity} "
|
||||||
|
f"~ playsound {i.instrument}{i.CD}.{i.pitch} @s ~ ~ ~ 1000 1.0 1000\n")
|
||||||
|
if isProsess:
|
||||||
|
commands.append(
|
||||||
|
f"execute @a{playerSelection} ~ ~ ~ execute @s[scores={{{ScoreboardName}="
|
||||||
|
f"{str(round_up(i.time_position)).replace('.0', '')}}}] ~ ~ ~ "
|
||||||
|
f"title @s actionbar §e▶ 播放中: §a{j}/{length} || {int(j / length * 1000) / 10}\n")
|
||||||
|
j += 1
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# a += List[i][1]
|
||||||
|
# commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
|
print(commands)
|
||||||
|
return commands
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
def formCmdBlock(direction: Iterable, command: str, particularValue: int, impluse: int = 0, condition: bool = False,
|
||||||
|
needRedstone: bool = True, tickDelay: int = 0, customName: str = '', lastOutput: str = '',
|
||||||
|
executeOnFirstTick: bool = False, trackOutput: bool = True):
|
||||||
|
"""
|
||||||
|
使用指定项目返回指定的指令方块格式字典
|
||||||
|
:param direction: `list[x: int, y: int, z: int]`
|
||||||
|
方块位置
|
||||||
|
:param command: `str`
|
||||||
|
指令
|
||||||
|
:param particularValue:
|
||||||
|
方块特殊值,即朝向
|
||||||
|
:0 下 无条件
|
||||||
|
:1 上 无条件
|
||||||
|
:2 z轴负方向 无条件
|
||||||
|
:3 z轴正方向 无条件
|
||||||
|
:4 x轴负方向 无条件
|
||||||
|
:5 x轴正方向 无条件
|
||||||
|
:6 下 无条件
|
||||||
|
:7 下 无条件
|
||||||
|
|
||||||
|
:8 下 有条件
|
||||||
|
:9 上 有条件
|
||||||
|
:10 z轴负方向 有条件
|
||||||
|
:11 z轴正方向 有条件
|
||||||
|
:12 x轴负方向 有条件
|
||||||
|
:13 x轴正方向 有条件
|
||||||
|
:14 下 有条件
|
||||||
|
:14 下 有条件
|
||||||
|
注意!此处特殊值中的条件会被下面condition参数覆写
|
||||||
|
:param impluse: `int 0|1|2`
|
||||||
|
方块类型
|
||||||
|
0脉冲 1循环 2连锁
|
||||||
|
:param condition: `bool`
|
||||||
|
是否有条件
|
||||||
|
:param needRedstone: `bool`
|
||||||
|
是否需要红石
|
||||||
|
:param tickDelay: `int`
|
||||||
|
执行延时
|
||||||
|
:param customName: `str`
|
||||||
|
悬浮字
|
||||||
|
:param lastOutput: `str`
|
||||||
|
上次输出字符串,注意此处需要留空
|
||||||
|
:param executeOnFirstTick: `bool`
|
||||||
|
执行第一个已选项(循环指令方块是否激活后立即执行,若为False,则从激活时起延迟后第一次执行)
|
||||||
|
:param trackOutput: `bool`
|
||||||
|
是否输出
|
||||||
|
|
||||||
|
:return: 指令方块字典结构,如下
|
||||||
|
"""
|
||||||
|
'''
|
||||||
|
:param block: {
|
||||||
|
"direction": [x: int, y: int, z: int] #方块位置
|
||||||
|
"block_name": str, #方块名称(无需指定,默认为command_block)
|
||||||
|
"particular_value": int, #方块特殊值
|
||||||
|
"impluse": int, #方块类型0脉冲 1循环 2连锁 unsigned_int32
|
||||||
|
"command": str, #指令
|
||||||
|
"customName": str, #悬浮字
|
||||||
|
"lastOutput": str, #上次输出
|
||||||
|
"tickdelay": int, #方块延时 int32
|
||||||
|
"executeOnFirstTick": int, #执行第一个选项 1 bytes
|
||||||
|
"trackOutput": int, #是否输出 1 bytes
|
||||||
|
"conditional": int, #是否有条件 1 bytes
|
||||||
|
"needRedstone": int #是否需要红石 1 bytes
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
return {"direction": direction,
|
||||||
|
"block_name": "command_block",
|
||||||
|
"particular_value": particularValue,
|
||||||
|
"impluse": impluse,
|
||||||
|
"command": command,
|
||||||
|
"customName": customName,
|
||||||
|
"lastOutput": lastOutput,
|
||||||
|
"tickdelay": tickDelay,
|
||||||
|
"executeOnFirstTick": executeOnFirstTick,
|
||||||
|
"trackOutput": trackOutput,
|
||||||
|
"conditional": condition,
|
||||||
|
"needRedstone": needRedstone
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def note2bdx(filePath: str, dire: list, Notes: list, ScoreboardName: str, Instrument: str,
|
||||||
|
PlayerSelect: str = '', isProsess: bool = False, height: int = 200):
|
||||||
|
"""使用方法同Note2Cmd
|
||||||
|
:param 参数说明:
|
||||||
|
filePath: 生成.bdx文件的位置
|
||||||
|
dire: 指令方块在地图中生成的起始位置(相对位置)
|
||||||
|
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
||||||
|
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
||||||
|
ScoreboardName: 用于执行的计分板名称
|
||||||
|
Instrument: 播放的乐器
|
||||||
|
PlayerSelect: 执行的玩家选择器
|
||||||
|
isProsess: 是否显示进度条(会很卡)
|
||||||
|
height: 生成结构的最高高度
|
||||||
|
:return 返回一个BdxConverter类,同时在指定位置生成.bdx文件"""
|
||||||
|
|
||||||
|
# from msctspt.transfer import formCmdBlock
|
||||||
|
from nmcsup.trans import Note2Cmd
|
||||||
|
from msctspt.bdxOpera_CP import BdxConverter
|
||||||
|
cmd = Note2Cmd(Notes, ScoreboardName, Instrument, PlayerSelect, isProsess)
|
||||||
|
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
|
||||||
|
down = False
|
||||||
|
blocks = [formCmdBlock(dire, cdl.pop(0), 1, 1)]
|
||||||
|
dire[1] += 1
|
||||||
|
for j in cdl:
|
||||||
|
if dire[1] + i > height:
|
||||||
|
dire[0] += 1
|
||||||
|
i = 0
|
||||||
|
down = not down
|
||||||
|
if dire[1] + i == height:
|
||||||
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 5, 2, False, False))
|
||||||
|
else:
|
||||||
|
if down:
|
||||||
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 0, 2, False, False))
|
||||||
|
else:
|
||||||
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 1, 2, False, False))
|
||||||
|
i += 1
|
||||||
|
del i, cdl, down, cmd
|
||||||
|
return BdxConverter(filePath, 'Build by RyounMusicreater', blocks)
|
||||||
|
|
||||||
|
|
||||||
|
def music2BDX(filePath: str, direction: Iterable, music: dict, isProsess: bool = False, height: int = 200,
|
||||||
|
isSquare: bool = False):
|
||||||
|
"""使用方法同Note2Cmd
|
||||||
|
:param 参数说明:
|
||||||
|
filePath: 生成.bdx文件的位置
|
||||||
|
dire: 指令方块在地图中生成的起始位置(相对位置)
|
||||||
|
music: 详见 Musicreater.py - dataset[0]
|
||||||
|
isProsess: 是否显示进度条(会很卡)
|
||||||
|
height: 生成结构的最高高度
|
||||||
|
isSquare: 生成的结构是否需要遵循生成正方形原则
|
||||||
|
:return 返回一个BdxConverter类,同时在指定位置生成.bdx文件"""
|
||||||
|
from msctspt.bdxOpera_CP import BdxConverter
|
||||||
|
|
||||||
|
blocks = []
|
||||||
|
'''需要放置的方块'''
|
||||||
|
baseDire = direction
|
||||||
|
|
||||||
|
direction = list(direction)
|
||||||
|
|
||||||
|
for track in music['musics']:
|
||||||
|
cmdList = classList_conversion_SinglePlayer(track['notes'], track['set']['ScoreboardName'],
|
||||||
|
music['mainset']['PlayerSelect'], isProsess)
|
||||||
|
if len(cmdList) == 0:
|
||||||
|
continue
|
||||||
|
elif cmdList is []:
|
||||||
|
continue
|
||||||
|
dire = direction
|
||||||
|
down = False
|
||||||
|
'''当前是否为向下的阶段?'''
|
||||||
|
# 开头的指令方块
|
||||||
|
blocks.append(formCmdBlock(dire,
|
||||||
|
f"scoreboard players add @a{music['mainset']['PlayerSelect']} "
|
||||||
|
f"{track['set']['ScoreboardName']} 1",
|
||||||
|
1, 1))
|
||||||
|
dire[1] += 1
|
||||||
|
blocks.append(formCmdBlock(dire, cmdList.pop(0), 2, needRedstone=False))
|
||||||
|
dire[1] += 1
|
||||||
|
# :0 下 无条件
|
||||||
|
# :1 上 无条件
|
||||||
|
# :2 z轴负方向 无条件
|
||||||
|
# :3 z轴正方向 无条件
|
||||||
|
# :4 x轴负方向 无条件
|
||||||
|
# :5 x轴正方向 无条件
|
||||||
|
for cmd in cmdList:
|
||||||
|
blocks.append(formCmdBlock(dire, cmd, 5 if (down is False and dire[1] == height + direction[1]) or (
|
||||||
|
down and dire[1] == direction + 1) else 0 if down else 1, 2, needRedstone=False))
|
||||||
|
|
||||||
|
if down:
|
||||||
|
if dire[1] > direction[1] + 1:
|
||||||
|
dire[1] -= 1
|
||||||
|
else:
|
||||||
|
if dire[1] < height + direction[1]:
|
||||||
|
dire[1] += 1
|
||||||
|
|
||||||
|
if (down is False and dire[1] == height + direction[1]) or (down and dire[1] == direction + 1):
|
||||||
|
down = not down
|
||||||
|
dire[0] += 1
|
||||||
|
direction[2] += 2
|
||||||
|
|
||||||
|
return BdxConverter(filePath, 'Build by Ryoun Musicreater', blocks)
|
||||||
|
|
||||||
|
|
||||||
|
def note2webs(Notes: list, Instrument: str, speed: float = 5.0, PlayerSelect: str = '', isProsess: bool = False):
|
||||||
|
"""传入音符,在oaclhost:8080上建立websocket服务器以供我的世界connect/wssever指令连接
|
||||||
|
:param 参数说明:
|
||||||
|
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
||||||
|
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
||||||
|
Instrument: 播放的乐器
|
||||||
|
speed: 用于控制播放速度,数值越大,播放速度越快,相当于把一秒变为几拍
|
||||||
|
PlayerSelect: 执行的玩家选择器
|
||||||
|
isProsess: 是否显示进度条
|
||||||
|
:return None"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
import fcwslib
|
||||||
|
# import asyncio
|
||||||
|
from nmcsup.log import log
|
||||||
|
from nmcsup.vers import VER
|
||||||
|
|
||||||
|
async def run_server(websocket): # , path
|
||||||
|
log('服务器连接创建')
|
||||||
|
await fcwslib.tellraw(websocket, '已连接服务器——音·创' + VER[1] + VER[0] + ' 作者:金羿(W-YI)')
|
||||||
|
length = len(Notes)
|
||||||
|
j = 1
|
||||||
|
for i in range(len(Notes)):
|
||||||
|
await fcwslib.send_command(websocket,
|
||||||
|
f'execute @a{PlayerSelect} ~ ~ ~ playsound {Instrument} @s ~ ~ ~ 1000 '
|
||||||
|
f'{Notes[i][0]} 1000')
|
||||||
|
if isProsess:
|
||||||
|
await fcwslib.send_command(websocket,
|
||||||
|
'execute @a' + PlayerSelect + ' ~ ~ ~ title @s actionbar §e▶ 播放中: §a' +
|
||||||
|
str(
|
||||||
|
j) + '/' + str(length) + ' || ' + str(int(j / length * 1000) / 10))
|
||||||
|
j += 1
|
||||||
|
time.sleep(Notes[i][1] / speed)
|
||||||
|
|
||||||
|
fcwslib.run_server(run_server)
|
||||||
|
|
||||||
|
|
||||||
|
def note2RSworld(world: str, startpos: list, notes: list, instrument: str, speed: float = 2.5,
|
||||||
|
posadder: Iterable = (1, 0, 0), baseblock: str = 'stone'): # -> bool
|
||||||
|
"""传入音符,生成以音符盒存储的红石音乐
|
||||||
|
:param 参数说明:
|
||||||
|
world: 地图文件的路径
|
||||||
|
startpos: list[int,int,int] 开始生成的坐标
|
||||||
|
notes: list[list[float,float]] 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ]
|
||||||
|
格式存储的音符列表 例如Musicreater.py的dataset[0]['musics'][NowMusic]['notes']
|
||||||
|
instrument: 播放的乐器
|
||||||
|
speed: 一拍占多少个中继器延迟(红石刻/rt)
|
||||||
|
posadder: list[int,int,int] 坐标增加规律,即红石的延长时按照此增加规律增加坐标
|
||||||
|
baseblock: 在中继器下垫着啥方块呢~
|
||||||
|
:return 是否生成成功
|
||||||
|
"""
|
||||||
|
|
||||||
|
from msctspt.values import height2note, instuments
|
||||||
|
|
||||||
|
def formNoteBlock(note: int, instrument1: str = 'note.harp', powered: bool = False):
|
||||||
|
"""生成音符盒方块
|
||||||
|
:param powered:
|
||||||
|
:param instrument1:
|
||||||
|
:param note: 0~24
|
||||||
|
:return Block()"""
|
||||||
|
if powered:
|
||||||
|
powered = 'true'
|
||||||
|
else:
|
||||||
|
powered = 'false'
|
||||||
|
return Block('universal_minecraft', 'notebooks',
|
||||||
|
{"instrument": ts(instrument1.replace("note.", '')), 'note': ts(str(note)),
|
||||||
|
'powered': ts(powered)})
|
||||||
|
|
||||||
|
def formRepeater(delay: int, facing: str, locked: bool = False, powered: bool = False):
|
||||||
|
"""生成中继器方块
|
||||||
|
:param powered:
|
||||||
|
:param locked:
|
||||||
|
:param facing:
|
||||||
|
:param delay: 1~4
|
||||||
|
:return Block()"""
|
||||||
|
if powered:
|
||||||
|
powered = 'true'
|
||||||
|
else:
|
||||||
|
powered = 'false'
|
||||||
|
if locked:
|
||||||
|
locked = 'true'
|
||||||
|
else:
|
||||||
|
locked = 'false'
|
||||||
|
return Block('universal_minecraft', 'repeater',
|
||||||
|
{"delay": ts(str(delay)), 'facing': ts(facing), 'locked': ts(locked), 'powered': ts(powered)})
|
||||||
|
|
||||||
|
level = amulet.load_level(world)
|
||||||
|
|
||||||
|
def setblock(block: Block, pos: list):
|
||||||
|
"""pos : list[int,int,int]"""
|
||||||
|
cx, cz = bc2cc(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)
|
||||||
|
chunk.changed = True
|
||||||
|
|
||||||
|
# 1拍 x 2.5 rt
|
||||||
|
def placeNoteBlock():
|
||||||
|
for i in notes:
|
||||||
|
error = True
|
||||||
|
try:
|
||||||
|
setblock(formNoteBlock(height2note[i[0]], instrument), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
setblock(Block("universal_minecraft", instuments[i[0]][1]), startpos)
|
||||||
|
error = False
|
||||||
|
except ValueError:
|
||||||
|
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
||||||
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
|
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
finally:
|
||||||
|
if error is True:
|
||||||
|
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
||||||
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
|
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
delay = int(i[1] * speed + 0.5)
|
||||||
|
if delay <= 4:
|
||||||
|
startpos[0] += 1
|
||||||
|
setblock(formRepeater(delay, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
|
else:
|
||||||
|
for j in range(int(delay / 4)):
|
||||||
|
startpos[0] += 1
|
||||||
|
setblock(formRepeater(4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
|
if delay % 4 != 0:
|
||||||
|
startpos[0] += 1
|
||||||
|
setblock(formRepeater(delay % 4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
|
startpos[0] += posadder[0]
|
||||||
|
startpos[1] += posadder[1]
|
||||||
|
startpos[2] += posadder[2]
|
||||||
|
|
||||||
|
# e = True
|
||||||
|
try:
|
||||||
|
placeNoteBlock()
|
||||||
|
# e = False
|
||||||
|
except: # ValueError
|
||||||
|
log("无法放置方块了,可能是因为区块未加载叭")
|
||||||
|
# finally:
|
||||||
|
# if e:
|
||||||
|
# log("无法放置方块了,可能是因为区块未加载叭")
|
||||||
|
level.save()
|
||||||
|
level.close()
|
||||||
|
|
||||||
|
|
||||||
|
class ryStruct:
|
||||||
|
|
||||||
|
def __init__(self, world: str) -> None:
|
||||||
|
|
||||||
|
self.RyStruct = dict()
|
||||||
|
self._world = world
|
||||||
|
self._level = amulet.load_level(world)
|
||||||
|
|
||||||
|
def reloadLevel(self):
|
||||||
|
# e = True
|
||||||
|
try:
|
||||||
|
self._level = amulet.load_level(self.world)
|
||||||
|
# e = False
|
||||||
|
except: # ValueError
|
||||||
|
log("无法重载地图")
|
||||||
|
# finally:
|
||||||
|
# if e:
|
||||||
|
# log("无法重载地图")
|
||||||
|
|
||||||
|
def closeLevel(self):
|
||||||
|
# e = True
|
||||||
|
try:
|
||||||
|
self._level.close()
|
||||||
|
# e = False
|
||||||
|
except: # ValueError
|
||||||
|
log("无法关闭地图")
|
||||||
|
# finally:
|
||||||
|
# if e:
|
||||||
|
# log("无法重载地图")
|
||||||
|
|
||||||
|
def world2Rys(self, startp: list, endp: list, includeAir: bool = False):
|
||||||
|
"""将世界转换为RyStruct字典,注意,此函数运行成功后将关闭地图,若要打开需要运行 reloadLevel
|
||||||
|
:param startp: [x,y,z] 转化的起始坐标
|
||||||
|
:param endp : [x,y,z] 转换的终止坐标,注意,终止坐标需要大于起始坐标,且最终结果包含终止坐标
|
||||||
|
:param includeAir : bool = False 是否包含空气,即空气是否在生成之时覆盖地图内容
|
||||||
|
:return dict RyStruct """
|
||||||
|
|
||||||
|
level = self._level
|
||||||
|
|
||||||
|
for x in range(startp[0], endp[0] + 1):
|
||||||
|
for y in range(startp[1], endp[1] + 1):
|
||||||
|
for z in range(startp[2], endp[2] + 1):
|
||||||
|
|
||||||
|
RyStructBlock = dict()
|
||||||
|
|
||||||
|
cx, cz = bc2cc(x, z)
|
||||||
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
|
universal_block = chunk.block_palette[chunk.blocks[x - 16 * cx, y, z - 16 * cz]]
|
||||||
|
if universal_block == Block("universal_minecraft", "air") and includeAir:
|
||||||
|
continue
|
||||||
|
universal_block_entity = chunk.block_entities.get((x, y, z), None)
|
||||||
|
|
||||||
|
RyStructBlock["block"] = str(universal_block)
|
||||||
|
RyStructBlock["blockEntity"] = str(universal_block_entity)
|
||||||
|
|
||||||
|
log("载入方块数据" + str(RyStructBlock))
|
||||||
|
|
||||||
|
self.RyStruct[(x, y, z)] = RyStructBlock
|
||||||
|
|
||||||
|
level.close()
|
||||||
|
|
||||||
|
return self.RyStruct
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
RyStruct = {
|
||||||
|
(0,0,0) = {
|
||||||
|
"block": str 完整的方块结构
|
||||||
|
"blockEntity": str | 'None'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
56
msctspt/values.py
Normal file
56
msctspt/values.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:40个
|
||||||
|
|
||||||
|
instuments = {
|
||||||
|
'note.banjo': ['班卓琴', 'hay_block'],
|
||||||
|
'note.bass': ['贝斯', 'planks'],
|
||||||
|
'note.bassattack': ['低音鼓/贝斯', 'log'],
|
||||||
|
'note.bd': ['底鼓', 'stone'], # 即basedrum
|
||||||
|
'note.bell': ['铃铛/钟琴', 'gold_block'],
|
||||||
|
'note.bit': ['比特/“芯片”(方波)', 'emerald_block'],
|
||||||
|
'note.chime': ['管钟', 'packed_ice'],
|
||||||
|
'note.cow_bell': ['牛铃', 'soul_sand'],
|
||||||
|
'note.didgeridoo': ['迪吉里杜管', 'pumpkin'],
|
||||||
|
'note.flute': ['长笛', 'clay'],
|
||||||
|
'note.guitar': ['吉他', 'wool'],
|
||||||
|
'note.harp': ['竖琴/钢琴', 'concrete'], # 任意其他类型的方块皆可
|
||||||
|
'note.hat': ['击鼓沿/架子鼓', 'glass'],
|
||||||
|
'note.iron_xylophone': ['“铁木琴”(颤音琴)', 'iron_block'],
|
||||||
|
'note.pling': ['“扣弦”(电钢琴)', 'glowstone'],
|
||||||
|
'note.snare': ['小军鼓', 'sand'],
|
||||||
|
'note.xylophone': ['木琴', 'bone_block']
|
||||||
|
}
|
||||||
|
'''乐器对照表\n
|
||||||
|
乐器英文:[中文, 对应音符盒下方块名称]
|
||||||
|
注:方块仅取一个'''
|
||||||
|
|
||||||
|
height2note = {
|
||||||
|
0.5: 0,
|
||||||
|
0.53: 1,
|
||||||
|
0.56: 2,
|
||||||
|
0.6: 3,
|
||||||
|
0.63: 4,
|
||||||
|
0.67: 5,
|
||||||
|
0.7: 6,
|
||||||
|
0.75: 7,
|
||||||
|
0.8: 8,
|
||||||
|
0.84: 9,
|
||||||
|
0.9: 10,
|
||||||
|
0.94: 11,
|
||||||
|
1.0: 12,
|
||||||
|
|
||||||
|
1.05: 13,
|
||||||
|
1.12: 14,
|
||||||
|
1.2: 15,
|
||||||
|
1.25: 16,
|
||||||
|
1.33: 17,
|
||||||
|
1.4: 18,
|
||||||
|
1.5: 19,
|
||||||
|
1.6: 20,
|
||||||
|
1.7: 21,
|
||||||
|
1.8: 22,
|
||||||
|
1.9: 23,
|
||||||
|
2.0: 24,
|
||||||
|
}
|
||||||
|
'''音高对照表\n
|
||||||
|
MC音高:音符盒音调'''
|
||||||
BIN
nmcsup/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
nmcsup/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/const.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/const.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/const.cpython-39.pyc
Normal file
BIN
nmcsup/__pycache__/const.cpython-39.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/log.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/log.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/log.cpython-39.pyc
Normal file
BIN
nmcsup/__pycache__/log.cpython-39.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/nmcreader.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/nmcreader.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/nmcreader.cpython-39.pyc
Normal file
BIN
nmcsup/__pycache__/nmcreader.cpython-39.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/trans.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/trans.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/vers.cpython-38.pyc
Normal file
BIN
nmcsup/__pycache__/vers.cpython-38.pyc
Normal file
Binary file not shown.
BIN
nmcsup/__pycache__/vers.cpython-39.pyc
Normal file
BIN
nmcsup/__pycache__/vers.cpython-39.pyc
Normal file
Binary file not shown.
312
nmcsup/const.py
Normal file
312
nmcsup/const.py
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
"""音创系列的音符对照表 以及一系列常数"""
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---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'''
|
||||||
71
nmcsup/log.py
Normal file
71
nmcsup/log.py
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
"""提供对于音创系列的日志"""
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---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 = '', isWrite: bool = True, isPrinted: bool = False, isLoggerLibRecord: bool = True):
|
||||||
|
"""
|
||||||
|
info: 信息
|
||||||
|
isPrinted: 是否print(仅限金羿log,python官方的logging照常输出)
|
||||||
|
isLoggerLibRecord: 是否同时在logger库中记录
|
||||||
|
isWrite: 是否write(仅限金羿log,python官方的logging照常输出)
|
||||||
|
"""
|
||||||
|
"""将信息连同当前时间载入日志"""
|
||||||
|
# 致后来的开发者:请让金羿的log存在吧,不然他自己都看不懂你们写了什么了
|
||||||
|
# 我指的是程序内部
|
||||||
|
# ——金羿
|
||||||
|
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()
|
||||||
128
nmcsup/nmcreader.py
Normal file
128
nmcsup/nmcreader.py
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
"""音创系列的文件读取功能"""
|
||||||
|
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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")
|
||||||
|
from bgArrayLib.reader import midi_conversion
|
||||||
|
a = midi_conversion(r"C:\Users\lc\Documents\MuseScore3\乐谱\stay2.mid")
|
||||||
|
# print(a)
|
||||||
246
nmcsup/trans.py
Normal file
246
nmcsup/trans.py
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
"""音创系列的转换功能"""
|
||||||
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---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():
|
||||||
|
|
||||||
|
|
||||||
|
# 简单载入方块
|
||||||
|
# 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])
|
||||||
@@ -1,20 +1,19 @@
|
|||||||
"""音创系列版本号和版本操作函数"""
|
"""音创系列版本号和版本操作函数"""
|
||||||
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:24个
|
||||||
|
|
||||||
|
|
||||||
|
from msctspt.bugReporter import version
|
||||||
|
import os
|
||||||
|
|
||||||
from musicreater.msctspt.bugReporter import version
|
# 以下下两个值请在 msctspt/bugReporter 的version类中修改
|
||||||
|
|
||||||
|
|
||||||
#以下下两个值请在 msctspt/bugReporter 的version类中修改
|
|
||||||
VER = version.version
|
VER = version.version
|
||||||
'''当前版本'''
|
"""当前版本"""
|
||||||
|
|
||||||
LIBS = version.libraries
|
LIBS = version.libraries
|
||||||
'''当前所需库'''
|
"""当前所需库"""
|
||||||
|
|
||||||
|
|
||||||
|
# 判断版本、临时文件与补全库
|
||||||
#判断版本、临时文件与补全库
|
|
||||||
def compver(ver1, ver2):
|
def compver(ver1, ver2):
|
||||||
"""
|
"""
|
||||||
传入不带英文的版本号,特殊情况:"10.12.2.6.5">"10.12.2.6"
|
传入不带英文的版本号,特殊情况:"10.12.2.6.5">"10.12.2.6"
|
||||||
@@ -39,6 +38,8 @@ def compver(ver1, ver2):
|
|||||||
return -1
|
return -1
|
||||||
else:
|
else:
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# ————————————————
|
# ————————————————
|
||||||
# 版权声明:上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
# 版权声明:上面的函数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
|
from os import system as run
|
||||||
for i in LIBS:
|
for i in LIBS1:
|
||||||
if not i in now:
|
if i not in now:
|
||||||
print("安装库:"+i)
|
print("安装库:" + i)
|
||||||
run("python -m pip install "+i+" -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
run("python -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
||||||
|
|
||||||
|
|
||||||
def chkver(ver = VER,libs = LIBS):
|
def chkver(ver=VER, libs=LIBS):
|
||||||
'''通过文件比对版本信息并安装库'''
|
"""通过文件比对版本信息并安装库"""
|
||||||
if not os.path.exists(os.getenv('APPDATA')+'\\Musicreater\\msct.ActiveDatas.msct'):
|
if not os.path.exists(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct'):
|
||||||
print("新安装库")
|
print("新安装库")
|
||||||
os.makedirs(os.getenv('APPDATA')+'\\Musicreater\\')
|
os.makedirs(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||||
with open(os.getenv('APPDATA')+'\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||||
f.write(ver[0]+'\n')
|
f.write(ver[0] + '\n')
|
||||||
for i in libs:
|
for i in libs:
|
||||||
f.write(i+'\n')
|
f.write(i + '\n')
|
||||||
InstallLibs([],libs)
|
InstallLibs([], libs)
|
||||||
else:
|
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()
|
v = f.readlines()
|
||||||
cp = compver(ver[0], v[0])
|
cp = compver(ver[0], v[0])
|
||||||
if cp != 0:
|
if cp != 0:
|
||||||
InstallLibs(v[1:],libs)
|
InstallLibs(v[1:], libs)
|
||||||
with open(os.getenv('APPDATA')+'\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
with open(os.getenv('APPDATA') + '\\Musicreater\\msct.ActiveDatas.msct', 'w') as f:
|
||||||
f.write(ver[0]+'\n')
|
f.write(ver[0] + '\n')
|
||||||
for i in libs:
|
for i in libs:
|
||||||
f.write(i+'\n')
|
f.write(i + '\n')
|
||||||
del cp
|
del cp
|
||||||
|
|
||||||
|
|
||||||
def resetver():
|
def resetver():
|
||||||
'''重置版本信息'''
|
"""重置版本信息"""
|
||||||
import shutil
|
import shutil
|
||||||
shutil.rmtree(os.getenv('APPDATA')+'\\Musicreater\\')
|
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
[tool.briefcase]
|
|
||||||
project_name = "Musicreater"
|
|
||||||
bundle = "com.ryoun.musicreater"
|
|
||||||
version = "0.0.1"
|
|
||||||
url = "https://musicreater.ryoun.com/musicreater"
|
|
||||||
license = "Apache Software License"
|
|
||||||
author = 'Eilles Wan'
|
|
||||||
author_email = "W-YI_DoctorYI@outlook.com"
|
|
||||||
|
|
||||||
[tool.briefcase.app.musicreater]
|
|
||||||
formal_name = "Musicreater"
|
|
||||||
description = "Musicreater is an Eilles's app that is used for creating musics in Minecraft: Bedrock Edition"
|
|
||||||
icon = "src/musicreater/resources/musicreater"
|
|
||||||
sources = ['src/musicreater']
|
|
||||||
requires = []
|
|
||||||
|
|
||||||
|
|
||||||
[tool.briefcase.app.musicreater.macOS]
|
|
||||||
requires = [
|
|
||||||
'toga-cocoa>=0.3.0.dev20',
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.briefcase.app.musicreater.linux]
|
|
||||||
requires = [
|
|
||||||
'toga-gtk>=0.3.0.dev20',
|
|
||||||
]
|
|
||||||
system_requires = [
|
|
||||||
'libgirepository1.0-dev',
|
|
||||||
'libcairo2-dev',
|
|
||||||
'libpango1.0-dev',
|
|
||||||
'libwebkitgtk-3.0-0',
|
|
||||||
'gir1.2-webkit-3.0',
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.briefcase.app.musicreater.windows]
|
|
||||||
requires = [
|
|
||||||
'toga-winforms>=0.3.0.dev20',
|
|
||||||
]
|
|
||||||
|
|
||||||
# Mobile deployments
|
|
||||||
[tool.briefcase.app.musicreater.iOS]
|
|
||||||
requires = [
|
|
||||||
'toga-iOS>=0.3.0.dev20',
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.briefcase.app.musicreater.android]
|
|
||||||
requires = [
|
|
||||||
'toga-android>=0.3.0.dev20',
|
|
||||||
]
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
音·创(Musicreater)是由金羿(W-YI)开发的一款《我的世界》基岩版音乐生成辅助软件
|
音·创(Musicreater)是由金羿(W-YI)开发的一款《我的世界》基岩版音乐生成辅助软件
|
||||||
本软件源代码依照Apache软件协议公开。
|
本软件源代码依照Apache软件协议公开。
|
||||||
|
|
||||||
Copyright © W-YI 2021
|
Copyright © W-YI 2022
|
||||||
|
|
||||||
本软件是金羿前作函数音创和世界音创的集合版本,同时增加了大量功能更新。
|
本软件是金羿前作函数音创和世界音创的集合版本,同时增加了大量功能更新。
|
||||||
|
|
||||||
@@ -10,27 +10,81 @@ Copyright © W-YI 2021
|
|||||||
1.可以导出自定义的结构文件用于存储要导入地图中的结构
|
1.可以导出自定义的结构文件用于存储要导入地图中的结构
|
||||||
2.进度条
|
2.进度条
|
||||||
3.可以将音乐写入音符盒(红乐)
|
3.可以将音乐写入音符盒(红乐)
|
||||||
4.更换tk库为briefcase库,支持安卓系统
|
|
||||||
5.支持自动给音符盒绑定更多的音色
|
5.支持自动给音符盒绑定更多的音色
|
||||||
6.可以由.schematic文件导入地图,亦可反向处理
|
6.可以由.schematic文件导入地图,亦可反向处理
|
||||||
7.支持自定义指令方块区域的长宽高等
|
|
||||||
8.支持自定义创建websockeet服务器播放音乐(感谢由 Fuckcraft <https://github.com/fuckcraft> “鸣凤鸽子”等 带来的我的世界websocket服务器功能)
|
8.支持自定义创建websockeet服务器播放音乐(感谢由 Fuckcraft <https://github.com/fuckcraft> “鸣凤鸽子”等 带来的我的世界websocket服务器功能)
|
||||||
9.支持使用红石播放指令音乐
|
9.支持使用红石播放音乐
|
||||||
10.支持采用延时的播放器
|
10.支持采用延时的播放器
|
||||||
11.支持使用bdx导出结构
|
11.支持使用bdx导出结构
|
||||||
12.支持采用tp的方法播放
|
12.支持采用tp的方法播放
|
||||||
13.支持识别曲谱图片解析音乐
|
13.支持识别曲谱图片解析音乐
|
||||||
14.支持使用瀑布流的方式播放音乐
|
14.支持使用瀑布流的方式播放音乐
|
||||||
15.帮助菜单
|
|
||||||
16.多语言
|
|
||||||
17.支持自动搜寻地图目录位置(网易&微软)
|
|
||||||
|
|
||||||
|
|
||||||
|
17.支持自动搜寻地图目录位置(网易&微软)
|
||||||
|
++++++
|
||||||
|
4.修改UI界面使之适应当前功能
|
||||||
|
7.制作软件下载器使用户更直观地操作
|
||||||
|
15.
|
||||||
|
16.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
新更新日志
|
新更新日志
|
||||||
|
|
||||||
|
|
||||||
|
Delta 0.1.5.1
|
||||||
|
2022 2 1 农历大年初一
|
||||||
|
1.修复了部分midi文件无法读取的错误
|
||||||
|
|
||||||
|
Delta 0.1.5
|
||||||
|
2022 2 1 农历大年初一
|
||||||
|
1.修复所有用户在使用过程中可遇到的bug
|
||||||
|
|
||||||
|
Delta 0.1.1
|
||||||
|
2022 1 30
|
||||||
|
1.新增设置调用方案,但未使用
|
||||||
|
2.新增整个音乐生成单个BDX的功能,但必须用新方法解析
|
||||||
|
3.发现陈年旧bug:在msctspt.funcOpera中makeFuncFiles生成的指令格式不对
|
||||||
|
4.在nmcsup.trans中新增classList_conversion_SinglePlayer使用对于每个玩家的独立播放器
|
||||||
|
|
||||||
|
Delta 0.1.0
|
||||||
|
2022 1 27
|
||||||
|
1.完成了多音色的支持,但仍需修改
|
||||||
|
|
||||||
|
Delta 0.0.2
|
||||||
|
2022 1 19
|
||||||
|
1.纠正几乎所有语法
|
||||||
|
|
||||||
|
Delta 0.0.1
|
||||||
|
2022 1 3
|
||||||
|
1.新增对翻译字符串的支持
|
||||||
|
2.把所有需要翻译的字符串用双引号字符串表示,其余全是单引号字符串
|
||||||
|
2.2.累死我了,我错了我错了,饶了我吧,以后一定遵守代码规范
|
||||||
|
3.新增多语言支持。
|
||||||
|
|
||||||
|
|
||||||
|
Delta 0.0.0
|
||||||
|
2022 1 2
|
||||||
|
1.重新采用Tk作为窗口库
|
||||||
|
2.优化界面布局
|
||||||
|
3.修改部分按钮无响应的bug
|
||||||
|
4.新增启动时的Saying
|
||||||
|
5.删除命令行模式
|
||||||
|
6.更新README文件,并增添英文README
|
||||||
|
|
||||||
|
|
||||||
|
Gamma 0.0.0
|
||||||
|
2021 12 26~2021 12 31
|
||||||
|
1.使用BeeWare作为窗口库
|
||||||
|
2.兼容安卓,但是安卓上无法运行
|
||||||
|
3.兼容窗口化系统,但是无法实现正常功能
|
||||||
|
4.引申大量bug
|
||||||
|
|
||||||
|
|
||||||
Beta 0.0.4.3
|
Beta 0.0.4.3
|
||||||
2021 11 3~2021 12 26
|
2021 11 3~2021 12 26
|
||||||
1.不断改进包以及代码可读性
|
1.不断改进包以及代码可读性
|
||||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 441 KiB After Width: | Height: | Size: 441 KiB |
43
resources/myWords.txt
Normal file
43
resources/myWords.txt
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
生命灵动 当用激情跃起奋发之力
|
||||||
|
奇偶数阵
|
||||||
|
学海无涯 应用爱意徜徉
|
||||||
|
在生命的起源寻找灵魂的慰藉
|
||||||
|
纪念那一段辉煌灿烂的青春年华
|
||||||
|
以梦想为驱使 创造属于自己的未来
|
||||||
|
集青春之力 绽放爱意之花
|
||||||
|
那个曾与我相伴的人 依稀在我的心头留恋
|
||||||
|
你是我灵魂中绽放出最艳丽的花朵
|
||||||
|
心之所向 意之所属
|
||||||
|
一个蛋从外面被敲开,注定被吃掉\n但从里面啄开,没准是只鹰 ——长津湖
|
||||||
|
音·创
|
||||||
|
辉煌的、璀璨的、无边无际、铺天盖地的晚霞\n洒下斑驳的金光,染红了整片山河
|
||||||
|
《赫兰圣殿》
|
||||||
|
风,摇曳着,轻抚着他的脸颊\n半壁残阳正留恋着人世最后一抹温暖
|
||||||
|
清晨的阳光将吹散人间的雾霭 照亮每一寸土壤
|
||||||
|
远方的山川 总会踏着白雾前来
|
||||||
|
梦中的世界 总被现实相依存
|
||||||
|
敌人都是自己树立的\n生存的道路上想要披荆斩棘,那就得学会化敌为友
|
||||||
|
有光之处必有影 有影之处必有光
|
||||||
|
一生所恋 相伴相随
|
||||||
|
你的眼眸是剔透的晶灯 散发着醉人心扉的清光
|
||||||
|
海波激出透人心脾的欢呼
|
||||||
|
英雄何必要站在光中?\n深入黑暗,我自发光。
|
||||||
|
如果我们有三生三世的时间\n那我们将渡过三百乘以三百六十个潮涨潮落
|
||||||
|
善善不能用 恶恶不能去
|
||||||
|
知行合一,格物致知;远沂博索,夕惕若厉;\n蕙心执质,嘉言懿行;怀瑾握瑜,心若芷萱。
|
||||||
|
纪念 追忆 那段不平凡的青春
|
||||||
|
守望黑夜的人,切莫忘记黎明的光彩 ——原神
|
||||||
|
与邪佞战斗的人,切莫失掉正直的心 ——原神
|
||||||
|
我的心 时刻系着祖国的山河
|
||||||
|
生命 灵动
|
||||||
|
坚如寒冰 烈似骄阳
|
||||||
|
上了战场就是英雄 ——长津湖
|
||||||
|
冰与火 恨与爱 静与情
|
||||||
|
有些枪必须开,有些可以不开 ——长津湖
|
||||||
|
夕阳西下,余辉将尽,夜幕降临,寒风凛冽 ——原神
|
||||||
|
愿风擦拭你的双眼,让你看清真相 ——原神
|
||||||
|
心愿之结晶 而何能之宝贵
|
||||||
|
神明,正倾诉着他辉煌的过去……
|
||||||
|
一切过程与结果都不重要 重要的是热爱与真情
|
||||||
|
给大家带来笑容 这就是我存在的使命
|
||||||
|
不忘本源 牢记故地
|
||||||
1401
src/Musicreater.py
1401
src/Musicreater.py
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
|||||||
briefcase
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Metadata-Version: 2.1
|
|
||||||
Briefcase-Version: 0.3.5
|
|
||||||
Name: musicreater
|
|
||||||
Formal-Name: Musicreater
|
|
||||||
App-ID: com.ryoun.musicreater.musicreater
|
|
||||||
Version: 0.0.1
|
|
||||||
Home-page: https://musicreater.ryoun.com/musicreater
|
|
||||||
Author: Eilles Wan
|
|
||||||
Author-email: W-YI_DoctorYI@outlook.com
|
|
||||||
Summary: Musicreater is an Eilles's app that is used for creating musics in Minecraft: Bedrock Edition
|
|
||||||
@@ -1,364 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
|
|
||||||
# W-YI 金羿
|
|
||||||
# QQ 2647547478
|
|
||||||
# 音·创 开发交流群 861684859
|
|
||||||
# Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com
|
|
||||||
# 版权所有 Team-Ryoun 金羿
|
|
||||||
# 若需转载或借鉴 请附作者
|
|
||||||
|
|
||||||
|
|
||||||
# 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开
|
|
||||||
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import threading
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from musicreater.msctspt.threadOpera import NewThread
|
|
||||||
from musicreater.msctspt.bugReporter import version
|
|
||||||
from musicreater.nmcsup.log import log
|
|
||||||
|
|
||||||
__version__ = version.version[1]+version.version[0]
|
|
||||||
__author__ = 'W-YI (金羿)'
|
|
||||||
|
|
||||||
|
|
||||||
log("系统工作————————加载变量及函数")
|
|
||||||
|
|
||||||
|
|
||||||
print("更新执行位置...")
|
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
os.chdir(__file__[:len(__file__)-__file__[len(__file__)::-1].index('\\')])
|
|
||||||
log("更新执行位置,当前文件位置"+__file__)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
os.chdir(__file__[:len(__file__) -
|
|
||||||
__file__[len(__file__)::-1].index('/')])
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
log("其他平台:"+sys.platform+"更新执行位置,当前文件位置"+__file__)
|
|
||||||
print('完成!')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print('建立变量,存入内存,载入字典常量函数')
|
|
||||||
|
|
||||||
# 主体部分
|
|
||||||
|
|
||||||
# 支持多文件同时操作
|
|
||||||
|
|
||||||
# dataset[{ 'mainset':{ 'x':'y' }, 'musics': [ { 'set' :{ 'A':'B' } , 'note' : [ [ 'a' , b ], ] }, ] }, ]
|
|
||||||
|
|
||||||
# 编辑:
|
|
||||||
# 修改主设置: dataset[第几个项目]['mainset']['什么设置'] = '设置啥'
|
|
||||||
# 修改音乐: dataset[第几个项目]['musics'][第几个音轨]['notes'][第几个音符][音符还是时间(0,1)] = 改成啥
|
|
||||||
# 修改音轨设置: dataset[第几个项目]['musics'][第几个音轨]['set']['什么设置'] = '设置啥'
|
|
||||||
#
|
|
||||||
# 新增音轨: dataset[第几个项目]['musics'].append(datasetmodelpart)
|
|
||||||
#
|
|
||||||
'''
|
|
||||||
dataset=[
|
|
||||||
{
|
|
||||||
'mainset':{
|
|
||||||
'PackName':"Ryoun",
|
|
||||||
'MusicTitle':'Noname',
|
|
||||||
'IsRepeat':False,
|
|
||||||
'PlayerSelect':''
|
|
||||||
},
|
|
||||||
'musics':[
|
|
||||||
{
|
|
||||||
'set':{
|
|
||||||
'EntityName':'music_support',
|
|
||||||
'ScoreboardName':'music_support',
|
|
||||||
'Instrument':'harp',
|
|
||||||
'FileName':"Music"
|
|
||||||
},
|
|
||||||
'notes':[
|
|
||||||
[0.0,1.0],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
]
|
|
||||||
'''
|
|
||||||
|
|
||||||
global dataset
|
|
||||||
|
|
||||||
dataset = [
|
|
||||||
{
|
|
||||||
'mainset': {
|
|
||||||
'PackName': "Ryoun",
|
|
||||||
'MusicTitle': 'Noname',
|
|
||||||
'IsRepeat': False,
|
|
||||||
'PlayerSelect': ''
|
|
||||||
},
|
|
||||||
'musics': [
|
|
||||||
{
|
|
||||||
'set': {
|
|
||||||
'EntityName': 'MusicSupport',
|
|
||||||
'ScoreboardName': 'MusicSupport',
|
|
||||||
'Instrument': 'note.harp',
|
|
||||||
'FileName': "Music"
|
|
||||||
},
|
|
||||||
'notes': [
|
|
||||||
[0.0, 1.0],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
global is_new_file
|
|
||||||
global is_save
|
|
||||||
global ProjectName
|
|
||||||
global NowMusic
|
|
||||||
|
|
||||||
is_new_file = True
|
|
||||||
is_save = True
|
|
||||||
ProjectName = ''
|
|
||||||
NowMusic = 0
|
|
||||||
|
|
||||||
def DMM(): # 反回字典用于编辑
|
|
||||||
datasetmodelpart = {
|
|
||||||
'set': {
|
|
||||||
'EntityName': 'MusicSupport',
|
|
||||||
'ScoreboardName': 'MusicSupport',
|
|
||||||
'Instrument': 'note.harp',
|
|
||||||
'FileName': "Music"
|
|
||||||
},
|
|
||||||
'notes': []
|
|
||||||
}
|
|
||||||
return datasetmodelpart
|
|
||||||
|
|
||||||
print("完成")
|
|
||||||
|
|
||||||
# 菜单命令
|
|
||||||
print('加载菜单命令...')
|
|
||||||
|
|
||||||
def exitapp(cmd):
|
|
||||||
|
|
||||||
log("程序正常退出", False)
|
|
||||||
global is_save
|
|
||||||
if is_save == False:
|
|
||||||
if '/s' in cmd:
|
|
||||||
saveProject()
|
|
||||||
else:
|
|
||||||
print("您尚未保存,请使用 /s 开关保存并退出")
|
|
||||||
return False
|
|
||||||
|
|
||||||
try:
|
|
||||||
global dataset
|
|
||||||
del dataset
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if '/c' in cmd:
|
|
||||||
print("清除log(此句不载入日志)")
|
|
||||||
try:
|
|
||||||
if os.path.exists("./log/"):
|
|
||||||
shutil.rmtree("./log/")
|
|
||||||
if os.path.exists("./logs/"):
|
|
||||||
shutil.rmtree("./logs/")
|
|
||||||
if os.path.exists("./cache/"):
|
|
||||||
shutil.rmtree("./cache/")
|
|
||||||
except:
|
|
||||||
print("无法清除日志及临时文件")
|
|
||||||
|
|
||||||
exit()
|
|
||||||
|
|
||||||
print('退出函数加载完成!')
|
|
||||||
|
|
||||||
print("载入文件读取函数")
|
|
||||||
|
|
||||||
def ReadFile(fn: str):
|
|
||||||
from nmcsup.nmcreader import ReadFile as fileRead
|
|
||||||
k = fileRead(fn)
|
|
||||||
if k == False:
|
|
||||||
log("找不到"+fn)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return k
|
|
||||||
|
|
||||||
def ReadMidi(midfile: str):
|
|
||||||
from nmcsup.nmcreader import ReadMidi as midiRead
|
|
||||||
k = midiRead(midfile)
|
|
||||||
if k == False:
|
|
||||||
log("找不到"+midfile)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return k
|
|
||||||
|
|
||||||
print('完成!')
|
|
||||||
|
|
||||||
print("载入命令函数")
|
|
||||||
|
|
||||||
def saveProject(cmd: list):
|
|
||||||
global is_new_file
|
|
||||||
if '/a' in cmd:
|
|
||||||
log("另存项目")
|
|
||||||
ProjectName = cmd[cmd.index('/a')+1]
|
|
||||||
else:
|
|
||||||
if is_new_file:
|
|
||||||
print("初次存储请使用 /a 开关规定存储文件名")
|
|
||||||
log("文件未保存")
|
|
||||||
return False
|
|
||||||
|
|
||||||
log("存储文件:"+ProjectName)
|
|
||||||
with open(ProjectName, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(dataset[0], f)
|
|
||||||
global is_save
|
|
||||||
is_save = True
|
|
||||||
|
|
||||||
print('保存项目函数加载完成!')
|
|
||||||
|
|
||||||
def loadMusic(cmd: list):
|
|
||||||
if '/mid' in cmd:
|
|
||||||
th = NewThread(ReadMidi, (cmd[cmd.index('/mid')+1],))
|
|
||||||
th.start()
|
|
||||||
|
|
||||||
def midiSPT(th):
|
|
||||||
for i in th.getResult():
|
|
||||||
datas = DMM()
|
|
||||||
datas['notes'] = i
|
|
||||||
dataset[0]['musics'].append(datas)
|
|
||||||
del th
|
|
||||||
global is_save
|
|
||||||
is_save = False
|
|
||||||
threading.Thread(target=midiSPT, args=(th,)).start()
|
|
||||||
del th
|
|
||||||
elif '/txt' in cmd:
|
|
||||||
th = NewThread(ReadFile, (cmd[cmd.index('/txt')+1],))
|
|
||||||
th.start()
|
|
||||||
|
|
||||||
def midiSPT(th):
|
|
||||||
for i in th.getResult():
|
|
||||||
datas = DMM()
|
|
||||||
datas['notes'] = i
|
|
||||||
dataset[0]['musics'].append(datas)
|
|
||||||
del th
|
|
||||||
global is_save
|
|
||||||
is_save = False
|
|
||||||
threading.Thread(target=midiSPT, args=(th,)).start()
|
|
||||||
elif '/input' in cmd:
|
|
||||||
datas = []
|
|
||||||
for i in cmd[cmd.index('/input')+1:]:
|
|
||||||
datas.append([str(i), 1.0])
|
|
||||||
from nmcsup.trans import note2list
|
|
||||||
datat = DMM()
|
|
||||||
datat['notes'] = note2list(datas)
|
|
||||||
dataset[0]['musics'].append(datat)
|
|
||||||
del datas, datat
|
|
||||||
global is_save
|
|
||||||
is_save = False
|
|
||||||
else:
|
|
||||||
log("无参数,无法读入。")
|
|
||||||
print("请查看帮助文件查看指令格式。")
|
|
||||||
return False
|
|
||||||
|
|
||||||
print('音轨载入函数加载完成!')
|
|
||||||
|
|
||||||
def funBuild(cmd: list):
|
|
||||||
if '/file' in cmd:
|
|
||||||
from msctspt.funcOpera import makeFuncFiles
|
|
||||||
makepath = cmd[cmd.index('/file')+1]
|
|
||||||
if makepath[-1] != '/':
|
|
||||||
makepath += '/'
|
|
||||||
makeFuncFiles(dataset[0], makepath)
|
|
||||||
elif '/directory' in cmd:
|
|
||||||
from msctspt.funcOpera import makeFunDir
|
|
||||||
makepath = cmd[cmd.index('/directory')+1]
|
|
||||||
if makepath[-1] != '/':
|
|
||||||
makepath += '/'
|
|
||||||
makeFunDir(dataset[0], makepath)
|
|
||||||
elif '/mcpack' in cmd:
|
|
||||||
import zipfile
|
|
||||||
from msctspt.funcOpera import makeFunDir
|
|
||||||
makepath = cmd[cmd.index('/mcpack')+1]
|
|
||||||
if makepath[-1] != '/':
|
|
||||||
makepath += '/'
|
|
||||||
|
|
||||||
if not os.path.exists('./temp/'):
|
|
||||||
os.makedirs('./temp/')
|
|
||||||
makeFunDir(dataset[0], './temp/')
|
|
||||||
shutil.move('./temp/'+dataset[0]['mainset']['PackName'] +
|
|
||||||
"Pack/behavior_packs/"+dataset[0]['mainset']['PackName']+"/functions", './')
|
|
||||||
shutil.move('./temp/'+dataset[0]['mainset']['PackName'] + "Pack/behavior_packs/" +
|
|
||||||
dataset[0]['mainset']['PackName']+"/manifest.json", './')
|
|
||||||
with zipfile.ZipFile(makepath+dataset[0]['mainset']['PackName']+'.mcpack', "w") as zipobj:
|
|
||||||
for i in os.listdir('./functions/'):
|
|
||||||
zipobj.write('./functions/'+i)
|
|
||||||
zipobj.write('./manifest.json')
|
|
||||||
shutil.move('./functions', './temp/')
|
|
||||||
shutil.move('./manifest.json', './temp/')
|
|
||||||
shutil.rmtree("./temp/")
|
|
||||||
else:
|
|
||||||
log("无参数,无法读入。")
|
|
||||||
print("请查看帮助文件查看指令格式。")
|
|
||||||
return False
|
|
||||||
|
|
||||||
print("函数建立函数加载完成")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __main__():
|
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
os.system("cls")
|
|
||||||
else:
|
|
||||||
os.system("clear")
|
|
||||||
|
|
||||||
if sys.platform in ('win32', 'linux'):
|
|
||||||
print("您当前的运行环境为标准桌面,您可以打开 Musicreater.py 运行窗口模式的 音·创")
|
|
||||||
print("您也可以输入 win 指令在不退出命令行模式的同时打开窗口模式\n")
|
|
||||||
|
|
||||||
print(__author__+" 音·创 —— 当前核心版本 "+__version__+'\n')
|
|
||||||
|
|
||||||
nowWorkPath = os.path.split(os.path.realpath(__file__))[0]
|
|
||||||
|
|
||||||
while True:
|
|
||||||
|
|
||||||
strcmd = input("MSCT "+nowWorkPath+">")
|
|
||||||
cmd = strcmd.lower().split(' ')
|
|
||||||
|
|
||||||
if cmd[0] == 'exit':
|
|
||||||
exitapp(cmd[1:])
|
|
||||||
elif cmd[0] == 'save':
|
|
||||||
saveProject(cmd[1:])
|
|
||||||
elif cmd[0] == 'load':
|
|
||||||
loadMusic(cmd[1:])
|
|
||||||
elif cmd[0] == 'win':
|
|
||||||
def run(cmd):
|
|
||||||
os.system(cmd)
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
NewThread(run, ("python "+os.path.split(os.path.realpath(__file__))
|
|
||||||
[0]+"/Musicreater.py",)).start()
|
|
||||||
else:
|
|
||||||
NewThread(run, ("python3 "+os.path.split(os.path.realpath(__file__))
|
|
||||||
[0]+"/Musicreater.py",)).start()
|
|
||||||
elif cmd[0] == 'chdir':
|
|
||||||
nowWorkPath = os.path.realpath(cmd[1])
|
|
||||||
os.chdir(nowWorkPath)
|
|
||||||
elif cmd[0] == 'build':
|
|
||||||
funBuild(cmd[1:])
|
|
||||||
else:
|
|
||||||
os.system(strcmd)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
__main__
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
from musicreater.app import main
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main().main_loop()
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user