mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2026-07-24 01:02:32 +00:00
还不能用的新版本
This commit is contained in:
+1584
-1375
File diff suppressed because it is too large
Load Diff
+75
-75
@@ -1,76 +1,76 @@
|
|||||||
# Musicreater
|
# Musicreater
|
||||||
|
|
||||||
### Introduction
|
### Introduction
|
||||||
Musicreater(音·创) is an Eilles(*W-YI*)'s app that is used for creating musics in **Minecraft: Bedrock Edition**.
|
Musicreater(音·创) is an Eilles(*W-YI*)'s app that is used for creating musics in **Minecraft: Bedrock Edition**.
|
||||||
|
|
||||||
Welcome to join our QQ group: 861684859
|
Welcome to join our QQ group: 861684859
|
||||||
|
|
||||||
### Framework
|
### Framework
|
||||||
|
|
||||||
Using *Python* to develop, using Tkinter as a graphics library.
|
Using *Python* to develop, using Tkinter as a graphics library.
|
||||||
|
|
||||||
Support Windows7+ && Linux (that supports Python3.8)
|
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!!!***
|
***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!!!***
|
||||||
|
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
Comming soon...
|
Comming soon...
|
||||||
|
|
||||||
### Run with Source Code
|
### Run with Source Code
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
0. First, download the source code pack of Musicreater.
|
0. First, download the source code pack of Musicreater.
|
||||||
[Download from Gitee (Need to Login)](https://gitee.com/EillesWan/Musicreater/repository/archive/master.zip)
|
[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)
|
[Download from Github](https://github.com/EillesWan/Musicreater/archive/refs/heads/master.zip)
|
||||||
1. Install Python 3.8.10
|
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 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)
|
[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 :
|
2. After completing installation, we need to install the libraries :
|
||||||
- Open "Start Menu" and find `cmd`
|
- Open "Start Menu" and find `cmd`
|
||||||
- Run `cmd` as Administrator
|
- Run `cmd` as Administrator
|
||||||
- Drag "补全库.py" into the opened window and press Enter
|
- Drag "补全库.py" into the opened window and press Enter
|
||||||
3. After completing installation,double click Musicreater.py to run
|
3. After completing installation,double click Musicreater.py to run
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
|
|
||||||
0. If you 're not sure whether your environment is good enough, please run these commands on Terminal
|
0. If you 're not sure whether your environment is good enough, please run these commands on Terminal
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get upgrade
|
sudo apt-get upgrade
|
||||||
sudo apt-get install python3
|
sudo apt-get install python3
|
||||||
sudo apt-get install python3-pip
|
sudo apt-get install python3-pip
|
||||||
sudo apt-get install git
|
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
|
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
|
```bash
|
||||||
sudo git clone https://gitee.com/EillesWan/Musicreater.git
|
sudo git clone https://gitee.com/EillesWan/Musicreater.git
|
||||||
cd Musicreater
|
cd Musicreater
|
||||||
python3 补全库.py
|
python3 补全库.py
|
||||||
python3 Musicreater.py
|
python3 Musicreater.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Instructions
|
### Instructions
|
||||||
|
|
||||||
1. Just make u understand the Chinese
|
1. Just make u understand the Chinese
|
||||||
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.
|
||||||
|
|
||||||
### 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) “鸣凤鸽子”and so on 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.
|
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. Thanks for a lot of groupmates who support me and help me to test the program.
|
||||||
6. If u have give me some help but u haven't been in the list, please contact me.
|
6. If u have give me some help but u haven't been in the list, please contact me.
|
||||||
|
|
||||||
|
|
||||||
### Contact *Eilles(W-YI)*(金羿)
|
### Contact *Eilles(W-YI)*(金羿)
|
||||||
|
|
||||||
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
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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(mf):
|
||||||
|
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(mf):
|
||||||
|
mid = mido.MidiFile(mf)
|
||||||
|
answer = 60000000/mid.ticks_per_beat
|
||||||
|
print(answer)
|
||||||
|
return answer
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
get(r"C:\Users\lc\Documents\MuseScore3\乐谱\乐谱\Bad style - Time back.mid")
|
||||||
|
compute(r"C:\Users\lc\Documents\MuseScore3\乐谱\乐谱\Bad style - Time back.mid")
|
||||||
@@ -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
|
||||||
@@ -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])
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
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 not os.path.isfile("./bgArrayLib/resourcesPath.rpposi") and newPath != "":
|
||||||
|
path = newPath
|
||||||
|
with open("./bgArrayLib/resourcesPath.rpposi", 'w') as w:
|
||||||
|
path = 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"):
|
||||||
|
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"L:\0WorldMusicCreater-MFMS new edition\框架\v0.3.2\Musicreater\1.pkl", 'rb') as rb:
|
||||||
|
instrument = list(pickle.load(rb))
|
||||||
|
print(instrument)
|
||||||
|
except FileNotFoundError:
|
||||||
|
try:
|
||||||
|
with open(r"L:\0WorldMusicCreater-MFMS new edition\框架\v0.3.2\Musicreater\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
-170
@@ -1,170 +1,170 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:2个---未解决;警告(二级)错误:2个;语法(一级)错误:17个
|
# 统计:致命(三级)错误:2个---未解决;警告(二级)错误:2个;语法(一级)错误:17个
|
||||||
|
|
||||||
|
|
||||||
__version__ = '0.0.1'
|
__version__ = '0.0.1'
|
||||||
__all__ = []
|
__all__ = []
|
||||||
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Fuckcraft Websocket Library (FCWSLIB)
|
Fuckcraft Websocket Library (FCWSLIB)
|
||||||
A library to develop minecraft websocket server easily.
|
A library to develop minecraft websocket server easily.
|
||||||
|
|
||||||
Copyright (C) 2021 Fuckcraft
|
Copyright (C) 2021 Fuckcraft
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU Affero General Public License as
|
it under the terms of the GNU Affero General Public License as
|
||||||
published by the Free Software Foundation, either version 3 of the
|
published by the Free Software Foundation, either version 3 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU Affero General Public License for more details.
|
GNU Affero General Public License for more details.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
from main import *
|
from main import *
|
||||||
|
|
||||||
# import os
|
# import os
|
||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
# import logging
|
# import logging
|
||||||
import asyncio
|
import asyncio
|
||||||
import time
|
import time
|
||||||
import websockets
|
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
|
||||||
"""
|
"""
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'body': {
|
'body': {
|
||||||
'eventName': str(event_name) # 示例:PlayerMessage
|
'eventName': str(event_name) # 示例:PlayerMessage
|
||||||
},
|
},
|
||||||
'header': {
|
'header': {
|
||||||
'requestId': str(uuid.uuid4()),
|
'requestId': str(uuid.uuid4()),
|
||||||
'messagePurpose': 'subscribe',
|
'messagePurpose': 'subscribe',
|
||||||
'version': 1,
|
'version': 1,
|
||||||
'messageType': 'commandRequest'
|
'messageType': 'commandRequest'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
await websocket.send(response)
|
await websocket.send(response)
|
||||||
|
|
||||||
|
|
||||||
# 此函数用于向 Minecraft 消除订阅请求
|
# 此函数用于向 Minecraft 消除订阅请求
|
||||||
async def unsubscribe(webscket):
|
async def unsubscribe(webscket):
|
||||||
"""
|
"""
|
||||||
参数:
|
参数:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: event_name : 需要消除订阅的请求 :
|
: event_name : 需要消除订阅的请求 :
|
||||||
|
|
||||||
返回:
|
返回:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
print(webscket)
|
print(webscket)
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
"body": {
|
"body": {
|
||||||
"eventName": str(event_name) # PlayerMessage
|
"eventName": str(event_name) # PlayerMessage
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"requestId": str(uuid.uuid4()),
|
"requestId": str(uuid.uuid4()),
|
||||||
"messagePurpose": "unsubscribe",
|
"messagePurpose": "unsubscribe",
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"messageType": "commandRequest"
|
"messageType": "commandRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
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
|
||||||
"""
|
"""
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'body': {
|
'body': {
|
||||||
'origin': {
|
'origin': {
|
||||||
'type': 'player'
|
'type': 'player'
|
||||||
},
|
},
|
||||||
'commandLine': str(command),
|
'commandLine': str(command),
|
||||||
'version': 1
|
'version': 1
|
||||||
},
|
},
|
||||||
'header': {
|
'header': {
|
||||||
'requestId': str(uuid.uuid4()),
|
'requestId': str(uuid.uuid4()),
|
||||||
'messagePurpose': 'commandRequest',
|
'messagePurpose': 'commandRequest',
|
||||||
'version': 1,
|
'version': 1,
|
||||||
'messageType': 'commandRequest'
|
'messageType': 'commandRequest'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
await websocket.send(response)
|
await websocket.send(response)
|
||||||
|
|
||||||
|
|
||||||
# 此函数用于向 Minecraft 发送消息
|
# 此函数用于向 Minecraft 发送消息
|
||||||
async def tellraw(websocket, message):
|
async def tellraw(websocket, message):
|
||||||
"""
|
"""
|
||||||
参数:
|
参数:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: message : 发送的消息 :
|
: message : 发送的消息 :
|
||||||
|
|
||||||
返回:
|
返回:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
command = {
|
command = {
|
||||||
'rawtext': [
|
'rawtext': [
|
||||||
{
|
{
|
||||||
'text': '[{}] {}'.format(time.asctime(), message)
|
'text': '[{}] {}'.format(time.asctime(), message)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 可读性
|
# 增加 json 可读性
|
||||||
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
command = json.dumps(command)
|
command = json.dumps(command)
|
||||||
command = 'tellraw @a {}'.format(command)
|
command = 'tellraw @a {}'.format(command)
|
||||||
|
|
||||||
await send_command(websocket, command)
|
await send_command(websocket, command)
|
||||||
|
|
||||||
|
|
||||||
def run_server(function):
|
def run_server(function):
|
||||||
# 修改 ip 地址和端口
|
# 修改 ip 地址和端口
|
||||||
start_server = websockets.serve(function, 'localhost', 8080)
|
start_server = websockets.serve(function, 'localhost', 8080)
|
||||||
asyncio.get_event_loop().run_until_complete(start_server)
|
asyncio.get_event_loop().run_until_complete(start_server)
|
||||||
asyncio.get_event_loop().run_forever()
|
asyncio.get_event_loop().run_forever()
|
||||||
|
|||||||
+160
-160
@@ -1,160 +1,160 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
__version__ = '0.0.1'
|
__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)
|
Fuckcraft Websocket Library (FCWSLIB)
|
||||||
A library to develop minecraft websocket server easily.
|
A library to develop minecraft websocket server easily.
|
||||||
|
|
||||||
Copyright (C) 2021 Fuckcraft
|
Copyright (C) 2021 Fuckcraft
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU Affero General Public License as
|
it under the terms of the GNU Affero General Public License as
|
||||||
published by the Free Software Foundation, either version 3 of the
|
published by the Free Software Foundation, either version 3 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU Affero General Public License for more details.
|
GNU Affero General Public License for more details.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
import logging
|
import logging
|
||||||
import asyncio
|
import asyncio
|
||||||
import time
|
import time
|
||||||
import websockets
|
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
|
||||||
'''
|
'''
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'body': {
|
'body': {
|
||||||
'eventName': str(event_name) # 示例:PlayerMessage
|
'eventName': str(event_name) # 示例:PlayerMessage
|
||||||
},
|
},
|
||||||
'header': {
|
'header': {
|
||||||
'requestId': str(uuid.uuid4()),
|
'requestId': str(uuid.uuid4()),
|
||||||
'messagePurpose': 'subscribe',
|
'messagePurpose': 'subscribe',
|
||||||
'version': 1,
|
'version': 1,
|
||||||
'messageType': 'commandRequest'
|
'messageType': 'commandRequest'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
await websocket.send(response)
|
await websocket.send(response)
|
||||||
|
|
||||||
# 此函数用于向 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()),
|
||||||
"messagePurpose": "unsubscribe",
|
"messagePurpose": "unsubscribe",
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"messageType": "commandRequest"
|
"messageType": "commandRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
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
|
||||||
'''
|
'''
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
'body': {
|
'body': {
|
||||||
'origin': {
|
'origin': {
|
||||||
'type': 'player'
|
'type': 'player'
|
||||||
},
|
},
|
||||||
'commandLine': str(command),
|
'commandLine': str(command),
|
||||||
'version': 1
|
'version': 1
|
||||||
},
|
},
|
||||||
'header': {
|
'header': {
|
||||||
'requestId': str(uuid.uuid4()),
|
'requestId': str(uuid.uuid4()),
|
||||||
'messagePurpose': 'commandRequest',
|
'messagePurpose': 'commandRequest',
|
||||||
'version': 1,
|
'version': 1,
|
||||||
'messageType': 'commandRequest'
|
'messageType': 'commandRequest'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 的可读性
|
# 增加 json 的可读性
|
||||||
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
response = json.dumps(response)
|
response = json.dumps(response)
|
||||||
|
|
||||||
await websocket.send(response)
|
await websocket.send(response)
|
||||||
|
|
||||||
# 此函数用于向 Minecraft 发送消息
|
# 此函数用于向 Minecraft 发送消息
|
||||||
async def tellraw(websocket, message):
|
async def tellraw(websocket, message):
|
||||||
'''
|
'''
|
||||||
输入:
|
输入:
|
||||||
: websocket : websocket 对象 :
|
: websocket : websocket 对象 :
|
||||||
: message : 发送的消息 :
|
: message : 发送的消息 :
|
||||||
|
|
||||||
输出:
|
输出:
|
||||||
None
|
None
|
||||||
'''
|
'''
|
||||||
|
|
||||||
command = {
|
command = {
|
||||||
'rawtext':[
|
'rawtext':[
|
||||||
{
|
{
|
||||||
'text':'[{}] {}'.format(time.asctime(), message)
|
'text':'[{}] {}'.format(time.asctime(), message)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
# 增加 json 可读性
|
# 增加 json 可读性
|
||||||
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
||||||
command = json.dumps(command)
|
command = json.dumps(command)
|
||||||
command = 'tellraw @a {}'.format(command)
|
command = 'tellraw @a {}'.format(command)
|
||||||
|
|
||||||
await send_command(websocket, command)
|
await send_command(websocket, command)
|
||||||
|
|
||||||
def run_server(function):
|
def run_server(function):
|
||||||
# 修改 ip 地址和端口
|
# 修改 ip 地址和端口
|
||||||
start_server = websockets.serve(function, 'localhost', 8080)
|
start_server = websockets.serve(function, 'localhost', 8080)
|
||||||
asyncio.get_event_loop().run_until_complete(start_server)
|
asyncio.get_event_loop().run_until_complete(start_server)
|
||||||
asyncio.get_event_loop().run_forever()
|
asyncio.get_event_loop().run_forever()
|
||||||
|
|
||||||
|
|||||||
+96
-96
@@ -1,96 +1,96 @@
|
|||||||
# -*- coding:utf-8 -*-
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
# W-YI 金羿
|
# W-YI 金羿
|
||||||
# QQ 2647547478
|
# QQ 2647547478
|
||||||
# 音·创 开发交流群 861684859
|
# 音·创 开发交流群 861684859
|
||||||
# Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
# Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com
|
||||||
# 版权所有 Team-Ryoun 金羿
|
# 版权所有 Team-Ryoun 金羿
|
||||||
# 若需转载或借鉴 请附作者
|
# 若需转载或借鉴 请附作者
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Copyright 2022 Eilles Wan (金羿)
|
Copyright 2022 Eilles Wan (金羿)
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an 'AS IS' BASIS,
|
distributed under the License is distributed on an 'AS IS' BASIS,
|
||||||
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.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开
|
# 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开
|
||||||
|
|
||||||
# -----------------------------分割线-----------------------------
|
# -----------------------------分割线-----------------------------
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:12个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:12个
|
||||||
# 目前我的Pycharm并没有显示任何错误,有错误可以向:
|
# 目前我的Pycharm并没有显示任何错误,有错误可以向:
|
||||||
# bgArray 诸葛亮与八卦阵
|
# bgArray 诸葛亮与八卦阵
|
||||||
# QQ 474037765 或最好加入:音·创 开发交流群 861684859
|
# QQ 474037765 或最好加入:音·创 开发交流群 861684859
|
||||||
# ------------------------- split line-----------------------------
|
# ------------------------- split line-----------------------------
|
||||||
# Zhuge Liang and Bagua array help to modify the grammar date: -- January 19, 2022
|
# 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
|
# 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
|
# 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
|
# Bgarray Zhuge Liang and Bagua array
|
||||||
# QQ 474037765 or better join: Musicreater development exchange group 861684859
|
# QQ 474037765 or better join: Musicreater development exchange group 861684859
|
||||||
# ------------------------- split line-----------------------------
|
# ------------------------- split line-----------------------------
|
||||||
|
|
||||||
# 下面为正文
|
# 下面为正文
|
||||||
|
|
||||||
|
|
||||||
# 将程序中用双引号""括起来的字符串
|
# 将程序中用双引号""括起来的字符串
|
||||||
# 转为字符串列表 list[str, str, ...]
|
# 转为字符串列表 list[str, str, ...]
|
||||||
# 方便进行语言翻译支持。
|
# 方便进行语言翻译支持。
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
startWith = 0
|
startWith = 0
|
||||||
|
|
||||||
|
|
||||||
def __main__():
|
def __main__():
|
||||||
textList = []
|
textList = []
|
||||||
for fileName in sys.argv[1:]:
|
for fileName in sys.argv[1:]:
|
||||||
print('读取文件: {}'.format(fileName))
|
print('读取文件: {}'.format(fileName))
|
||||||
fileText = []
|
fileText = []
|
||||||
for line in open(fileName, 'r', encoding='utf-8'):
|
for line in open(fileName, 'r', encoding='utf-8'):
|
||||||
while line.count('"') >= 2:
|
while line.count('"') >= 2:
|
||||||
# 只有上帝看得懂我在写什么。
|
# 只有上帝看得懂我在写什么。
|
||||||
if line[
|
if line[
|
||||||
line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])] in textList:
|
line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])] in textList:
|
||||||
thisText = textList.index(
|
thisText = textList.index(
|
||||||
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
||||||
else:
|
else:
|
||||||
thisText = len(textList)
|
thisText = len(textList)
|
||||||
textList.append(
|
textList.append(
|
||||||
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])])
|
||||||
line = line.replace(
|
line = line.replace(
|
||||||
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])],
|
line[line.index('"'):2 + line[line.index('"') + 1:].index('"') + len(line[:line.index('"')])],
|
||||||
'READABLETEXT[{}]'.format(thisText + startWith)
|
'READABLETEXT[{}]'.format(thisText + startWith)
|
||||||
)
|
)
|
||||||
fileText.append(line)
|
fileText.append(line)
|
||||||
|
|
||||||
open(fileName + '_C', 'w', encoding='utf-8').writelines(fileText)
|
open(fileName + '_C', 'w', encoding='utf-8').writelines(fileText)
|
||||||
|
|
||||||
outFile = open('lang__.py', 'w', encoding='utf-8')
|
outFile = open('lang__.py', 'w', encoding='utf-8')
|
||||||
outFile.write('''# -*- coding:utf-8 -*-
|
outFile.write('''# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
# 由金羿翻译工具生成字符串列表
|
# 由金羿翻译工具生成字符串列表
|
||||||
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
READABLETEXT = {
|
READABLETEXT = {
|
||||||
''')
|
''')
|
||||||
for i in range(len(textList)):
|
for i in range(len(textList)):
|
||||||
outFile.write(" {}:{},\n".format(i + startWith, textList[i]))
|
outFile.write(" {}:{},\n".format(i + startWith, textList[i]))
|
||||||
outFile.write('}')
|
outFile.write('}')
|
||||||
outFile.close()
|
outFile.close()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
__main__()
|
__main__()
|
||||||
|
|||||||
+162
-162
@@ -1,162 +1,162 @@
|
|||||||
# -*- coding:utf-8 -*-
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
# 由金羿翻译工具生成字符串列表
|
# 由金羿翻译工具生成字符串列表
|
||||||
# 请在所需翻译的文件前from 此文件 import READABLETEXT
|
# 请在所需翻译的文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
READABLETEXT = {
|
READABLETEXT = {
|
||||||
'Translator': (("Eilles Wan (金羿)", True),),
|
'Translator': (("Eilles Wan (金羿)", True),),
|
||||||
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
0: "ERROR❌",
|
0: "ERROR❌",
|
||||||
1: "TIPS❗",
|
1: "TIPS❗",
|
||||||
2: "Clearing log(this wont be in the file)",
|
2: "Clearing log(this wont be in the file)",
|
||||||
3: "Could not clear the temporary files or logs",
|
3: "Could not clear the temporary files or logs",
|
||||||
4: "saved",
|
4: "saved",
|
||||||
5: "New Musicreater Project",
|
5: "New Musicreater Project",
|
||||||
6: "Select old-type project",
|
6: "Select old-type project",
|
||||||
7: "Select Musicreater Project",
|
7: "Select Musicreater Project",
|
||||||
8: "Cant open:{}, please check if youve entered the right name",
|
8: "Cant open:{}, please check if youve entered the right name",
|
||||||
9: "Musicreat - About",
|
9: "Musicreat - About",
|
||||||
10: "Musicreater",
|
10: "Musicreater",
|
||||||
11: "Ver. {}",
|
11: "Ver. {}",
|
||||||
12: """Team-Ryoun for Minecraft\n×\nTeam-Ryoun for Software Development""",
|
12: """Team-Ryoun for Minecraft\n×\nTeam-Ryoun for Software Development""",
|
||||||
13: "OK",
|
13: "OK",
|
||||||
14: "Inpute Notes",
|
14: "Inpute Notes",
|
||||||
15: (("- Developers -", False),
|
15: (("- Developers -", False),
|
||||||
("Eilles Wan (金羿)", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
("Eilles Wan (金羿)", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
||||||
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False)),
|
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False)),
|
||||||
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
16: "- Translators -",
|
16: "- Translators -",
|
||||||
# 17:"",
|
# 17:"",
|
||||||
18: "QQ Group: 861684859",
|
18: "QQ Group: 861684859",
|
||||||
19: "Musicreater - Help",
|
19: "Musicreater - Help",
|
||||||
20: "Select sound file",
|
20: "Select sound file",
|
||||||
21: "Select MIDI file",
|
21: "Select MIDI file",
|
||||||
22: "Select NoteText file",
|
22: "Select NoteText file",
|
||||||
23: "Get Note info",
|
23: "Get Note info",
|
||||||
24: "Write in Note info: {}",
|
24: "Write in Note info: {}",
|
||||||
25: "Select generating file",
|
25: "Select generating file",
|
||||||
26: "Select generating folder",
|
26: "Select generating folder",
|
||||||
27: "Select generating .mcpack file",
|
27: "Select generating .mcpack file",
|
||||||
28: "Input position info",
|
28: "Input position info",
|
||||||
29: "Select generating world folder",
|
29: "Select generating world folder",
|
||||||
30: "Select generating Function Pack",
|
30: "Select generating Function Pack",
|
||||||
31: "Select .mcfunction file ",
|
31: "Select .mcfunction file ",
|
||||||
32: "Select .bdx file ",
|
32: "Select .bdx file ",
|
||||||
33: "DONE✔",
|
33: "DONE✔",
|
||||||
34: "Input playing rate",
|
34: "Input playing rate",
|
||||||
35: "Generating",
|
35: "Generating",
|
||||||
36: "Select a world folder",
|
36: "Select a world folder",
|
||||||
37: "Make sure",
|
37: "Make sure",
|
||||||
38: "Generate .RyStruct file",
|
38: "Generate .RyStruct file",
|
||||||
39: "FAILED❌",
|
39: "FAILED❌",
|
||||||
40: "Report message inpution",
|
40: "Report message inpution",
|
||||||
41: "Musicreater - Eilles - {}",
|
41: "Musicreater - Eilles - {}",
|
||||||
42: "ExecutingEntityName: {}",
|
42: "ExecutingEntityName: {}",
|
||||||
43: "ScoreboardName: {}",
|
43: "ScoreboardName: {}",
|
||||||
44: "Instrument: {}",
|
44: "Instrument: {}",
|
||||||
45: "TrackName: {}",
|
45: "TrackName: {}",
|
||||||
46: "PackName: {}",
|
46: "PackName: {}",
|
||||||
47: "MusicTitle: {}",
|
47: "MusicTitle: {}",
|
||||||
48: "IsRepeat?: {}",
|
48: "IsRepeat?: {}",
|
||||||
49: "Player'sTargetSelector: {}",
|
49: "Player'sTargetSelector: {}",
|
||||||
50: "Modify Main Option",
|
50: "Modify Main Option",
|
||||||
51: "Modify Track Option",
|
51: "Modify Track Option",
|
||||||
52: "Default Instrument: Enter English\n",
|
52: "Default Instrument: Enter English\n",
|
||||||
53: "Open...",
|
53: "Open...",
|
||||||
54: "Open Old Project...",
|
54: "Open Old Project...",
|
||||||
55: "Save",
|
55: "Save",
|
||||||
56: "Save as...",
|
56: "Save as...",
|
||||||
57: "Exit",
|
57: "Exit",
|
||||||
58: "File",
|
58: "File",
|
||||||
59: "Load tracks from sound",
|
59: "Load tracks from sound",
|
||||||
60: "Load tracks from Midi",
|
60: "Load tracks from Midi",
|
||||||
61: "Load tracks from Text",
|
61: "Load tracks from Text",
|
||||||
62: "Input notes to track",
|
62: "Input notes to track",
|
||||||
63: "Edit",
|
63: "Edit",
|
||||||
64: "Generate file...",
|
64: "Generate file...",
|
||||||
65: "Generate function pack...",
|
65: "Generate function pack...",
|
||||||
66: "Generate .mcpack file...",
|
66: "Generate .mcpack file...",
|
||||||
67: "Functions(Pack)",
|
67: "Functions(Pack)",
|
||||||
68: "Save music as blocks into a map",
|
68: "Save music as blocks into a map",
|
||||||
69: "Save music as blocks into a exist map...",
|
69: "Save music as blocks into a exist map...",
|
||||||
70: "Save music as commands into a map",
|
70: "Save music as commands into a map",
|
||||||
71: "Save music as commands into a exist map...",
|
71: "Save music as commands into a exist map...",
|
||||||
72: "Save music as notebox into a map",
|
72: "Save music as notebox into a map",
|
||||||
73: "Save music as notebox into a exist map...",
|
73: "Save music as notebox into a exist map...",
|
||||||
74: "World",
|
74: "World",
|
||||||
75: "Generate a function that fits current music...",
|
75: "Generate a function that fits current music...",
|
||||||
76: "Save selected track as commands in .bdx file...",
|
76: "Save selected track as commands in .bdx file...",
|
||||||
77: "Export .bdx file from map...",
|
77: "Export .bdx file from map...",
|
||||||
78: "Export .RyStruct file from map...",
|
78: "Export .RyStruct file from map...",
|
||||||
79: "Load functions into a world...",
|
79: "Load functions into a world...",
|
||||||
80: "Separate long .mcfunction file into small ones and set them into a world as a chain...",
|
80: "Separate long .mcfunction file into small ones and set them into a world as a chain...",
|
||||||
81: "Additional Functions",
|
81: "Additional Functions",
|
||||||
82: "Show generating result",
|
82: "Show generating result",
|
||||||
83: "Set a websocket server on localhost:8080 and play the selected track",
|
83: "Set a websocket server on localhost:8080 and play the selected track",
|
||||||
84: "Experimental Functions",
|
84: "Experimental Functions",
|
||||||
85: "Clear log file",
|
85: "Clear log file",
|
||||||
86: "Clear save file(obsolete)",
|
86: "Clear save file(obsolete)",
|
||||||
87: "Help",
|
87: "Help",
|
||||||
88: "About",
|
88: "About",
|
||||||
89: "Send a bug report",
|
89: "Send a bug report",
|
||||||
90: "Q&A",
|
90: "Q&A",
|
||||||
91: "Main Options",
|
91: "Main Options",
|
||||||
# 92:"",
|
# 92:"",
|
||||||
# 93:"",
|
# 93:"",
|
||||||
# 94:"",
|
# 94:"",
|
||||||
# 95:"",
|
# 95:"",
|
||||||
96: "Reset Main Options",
|
96: "Reset Main Options",
|
||||||
97: "Track Options",
|
97: "Track Options",
|
||||||
# 98:"",
|
# 98:"",
|
||||||
# 99:"",
|
# 99:"",
|
||||||
# 100:"",
|
# 100:"",
|
||||||
# 101:"",
|
# 101:"",
|
||||||
102: "Delete Selected Track",
|
102: "Delete Selected Track",
|
||||||
# 103:"",
|
# 103:"",
|
||||||
# 104:"",
|
# 104:"",
|
||||||
|
|
||||||
105: "找不到或无法读取文件😢:{}",
|
105: "找不到或无法读取文件😢:{}",
|
||||||
106: "您当前的项目已修改但未存储,是否先保存当前项目?",
|
106: "您当前的项目已修改但未存储,是否先保存当前项目?",
|
||||||
107: "项目已经存储至:{}",
|
107: "项目已经存储至:{}",
|
||||||
108: "音·创工程文件",
|
108: "音·创工程文件",
|
||||||
109: "任意类型",
|
109: "任意类型",
|
||||||
110: "函数音创工程文件",
|
110: "函数音创工程文件",
|
||||||
111: "MMFM0.0.6版本工程文件",
|
111: "MMFM0.0.6版本工程文件",
|
||||||
112: "全部类型",
|
112: "全部类型",
|
||||||
113: "钢琴声音的音频文件",
|
113: "钢琴声音的音频文件",
|
||||||
114: "Midi文件",
|
114: "Midi文件",
|
||||||
115: "文本文件",
|
115: "文本文件",
|
||||||
116: "请输入坐标:",
|
116: "请输入坐标:",
|
||||||
117: "您输入的格式有误,请重新输入!",
|
117: "您输入的格式有误,请重新输入!",
|
||||||
118: "我的世界指令函数文件",
|
118: "我的世界指令函数文件",
|
||||||
119: "请输入执行链生成坐标:",
|
119: "请输入执行链生成坐标:",
|
||||||
120: "您输入的格式有误,请重新输入。",
|
120: "您输入的格式有误,请重新输入。",
|
||||||
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
||||||
122: "请输入执行链生成相对坐标:",
|
122: "请输入执行链生成相对坐标:",
|
||||||
123: "FastBuilder结构文件",
|
123: "FastBuilder结构文件",
|
||||||
124: "转换结束!\n{}",
|
124: "转换结束!\n{}",
|
||||||
125: "一秒,音乐走几拍?",
|
125: "一秒,音乐走几拍?",
|
||||||
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
||||||
127: "请输入区域选择的开始坐标:",
|
127: "请输入区域选择的开始坐标:",
|
||||||
128: "请输入区域选择的结束坐标:",
|
128: "请输入区域选择的结束坐标:",
|
||||||
129: "所选区块导出时是否需要保留空气方块?",
|
129: "所选区块导出时是否需要保留空气方块?",
|
||||||
130: "音·创结构文件",
|
130: "音·创结构文件",
|
||||||
131: "文件已生成\n{}",
|
131: "文件已生成\n{}",
|
||||||
132: "文件无法生成\n{}\n{}",
|
132: "文件无法生成\n{}\n{}",
|
||||||
133: "本功能尚未开发。",
|
133: "本功能尚未开发。",
|
||||||
134: "您的称呼",
|
134: "您的称呼",
|
||||||
135: "您的联系方式",
|
135: "您的联系方式",
|
||||||
136: "您对问题的描述",
|
136: "您对问题的描述",
|
||||||
137: "在程序结束后将清除日志及临时文件信息。",
|
137: "在程序结束后将清除日志及临时文件信息。",
|
||||||
138: "在程序结束后将不会清除日志及临时文件信息。",
|
138: "在程序结束后将不会清除日志及临时文件信息。",
|
||||||
139: "修改包名",
|
139: "修改包名",
|
||||||
140: "修改音乐标题",
|
140: "修改音乐标题",
|
||||||
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
||||||
142: "修改本音轨的执行实体名",
|
142: "修改本音轨的执行实体名",
|
||||||
143: "修改本音轨所用的积分板",
|
143: "修改本音轨所用的积分板",
|
||||||
144: "修改本音轨所用乐器",
|
144: "修改本音轨所用乐器",
|
||||||
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
||||||
146: "修改本音轨生成的文件名",
|
146: "修改本音轨生成的文件名",
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-20
@@ -1,20 +1,20 @@
|
|||||||
# -*- coding:utf-8 -*-
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
DEFAULTLANGUAGE = 'zh-CN'
|
DEFAULTLANGUAGE = 'zh-CN'
|
||||||
|
|
||||||
LANGUAGELIST = {
|
LANGUAGELIST = {
|
||||||
'zh-CN': (
|
'zh-CN': (
|
||||||
"简体中文 中国大陆",
|
"简体中文 中国大陆",
|
||||||
"Simplified Chinese, China Mainland",
|
"Simplified Chinese, China Mainland",
|
||||||
),
|
),
|
||||||
'en-GB': (
|
'en-GB': (
|
||||||
"英式英语 大不列颠",
|
"英式英语 大不列颠",
|
||||||
"British English, Great Britain",
|
"British English, Great Britain",
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
if DEFAULTLANGUAGE == 'zh-CN':
|
if DEFAULTLANGUAGE == 'zh-CN':
|
||||||
from languages.zhCN import READABLETEXT
|
from languages.zhCN import READABLETEXT
|
||||||
elif DEFAULTLANGUAGE == 'en-GB':
|
elif DEFAULTLANGUAGE == 'en-GB':
|
||||||
from languages.enGB import READABLETEXT
|
from languages.enGB import READABLETEXT
|
||||||
|
|||||||
+172
-162
@@ -1,162 +1,172 @@
|
|||||||
# -*- coding:utf-8 -*-
|
# -*- coding:utf-8 -*-
|
||||||
|
|
||||||
# 由金羿翻译工具生成字符串列表
|
# 由金羿翻译工具生成字符串列表
|
||||||
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
# 请在所需翻译文件前from 此文件 import READABLETEXT
|
||||||
|
|
||||||
|
|
||||||
READABLETEXT = {
|
READABLETEXT = {
|
||||||
'Translator': (("金羿 Eilles 原稿", True),),
|
'Translator': (("金羿 Eilles 原稿", True),),
|
||||||
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
# 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
0: "错误❌",
|
0: "错误❌",
|
||||||
1: "提示❗",
|
1: "提示❗",
|
||||||
2: "清除log(此句不载入日志)",
|
2: "清除log(此句不载入日志)",
|
||||||
3: "无法清除日志及临时文件",
|
3: "无法清除日志及临时文件",
|
||||||
4: "已存储",
|
4: "已存储",
|
||||||
5: "新建 音·创 项目",
|
5: "新建 音·创 项目",
|
||||||
6: "请选择旧类型的项目",
|
6: "请选择旧类型的项目",
|
||||||
7: "请选择 音·创 项目",
|
7: "请选择 音·创 项目",
|
||||||
8: "无法打开文件:{},请查看您是否输入正确",
|
8: "无法打开文件:{},请查看您是否输入正确",
|
||||||
9: "音·创 - 关于",
|
9: "音·创 - 关于",
|
||||||
10: "音·创 Musicreater",
|
10: "音·创 Musicreater",
|
||||||
11: "当前版本:{}",
|
11: "当前版本:{}",
|
||||||
12: """凌云我的世界开发团队\n×\n凌云计算机应用软件开发团队""",
|
12: """凌云我的世界开发团队\n×\n凌云计算机应用软件开发团队""",
|
||||||
13: "确定",
|
13: "确定",
|
||||||
14: "请输入音符",
|
14: "请输入音符",
|
||||||
15: (("- 开发者 -", False),
|
15: (("- 开发者 -", False),
|
||||||
("金羿 Eilles", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
("金羿 Eilles", True), ("EillesWan@outlook.com", False), ("QQ 2647547478", False),
|
||||||
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False),
|
("bgArray “诸葛亮与八卦阵”", True), ("QQ 474037765", False),
|
||||||
),
|
),
|
||||||
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
# 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字
|
||||||
16: "- 翻译者 -",
|
16: "- 翻译者 -",
|
||||||
# 17:"",
|
# 17:"",
|
||||||
18: "讨论群: 861684859",
|
18: "讨论群: 861684859",
|
||||||
19: "音·创 - 帮助",
|
19: "音·创 - 帮助",
|
||||||
20: "请选择钢琴声音的音乐文件",
|
20: "请选择钢琴声音的音乐文件",
|
||||||
21: "请选择 MIDI 文件",
|
21: "请选择 MIDI 文件",
|
||||||
22: "请选择 音符文本 文件",
|
22: "请选择 音符文本 文件",
|
||||||
23: "获取音符信息",
|
23: "获取音符信息",
|
||||||
24: "音符数据写入{}",
|
24: "音符数据写入{}",
|
||||||
25: "请选择文件生成的位置",
|
25: "请选择文件生成的位置",
|
||||||
26: "请选择文件夹生成的位置",
|
26: "请选择文件夹生成的位置",
|
||||||
27: "请选择.mcpack文件生成的位置",
|
27: "请选择.mcpack文件生成的位置",
|
||||||
28: "坐标信息输入",
|
28: "坐标信息输入",
|
||||||
29: "请选择世界文件夹生成的位置",
|
29: "请选择世界文件夹生成的位置",
|
||||||
30: "请选择函数包生成的位置",
|
30: "请选择函数包生成的位置",
|
||||||
31: "请选择 .mcfunction 文件",
|
31: "请选择 .mcfunction 文件",
|
||||||
32: "请选择需要生成的.bdx文件",
|
32: "请选择需要生成的.bdx文件",
|
||||||
33: "完成✔",
|
33: "完成✔",
|
||||||
34: "输入播放速度",
|
34: "输入播放速度",
|
||||||
35: "创建中",
|
35: "创建中",
|
||||||
36: "请选择世界文件夹所在的位置",
|
36: "请选择世界文件夹所在的位置",
|
||||||
37: "请确认",
|
37: "请确认",
|
||||||
38: "生成.RyStruct文件",
|
38: "生成.RyStruct文件",
|
||||||
39: "失败❌",
|
39: "失败❌",
|
||||||
40: "邮件反馈信息输入",
|
40: "邮件反馈信息输入",
|
||||||
41: "音·创 - 金羿 - {}",
|
41: "音·创 - 金羿 - {}",
|
||||||
42: "执行实体名:{}",
|
42: "执行实体名:{}",
|
||||||
43: "使用计分板:{}",
|
43: "使用计分板:{}",
|
||||||
44: "所用的乐器:{}",
|
44: "所用的乐器:{}",
|
||||||
45: "当前音轨名:{}",
|
45: "当前音轨名:{}",
|
||||||
46: "包名:{}",
|
46: "包名:{}",
|
||||||
47: "音乐标题:{}",
|
47: "音乐标题:{}",
|
||||||
48: "是否重复:{}",
|
48: "是否重复:{}",
|
||||||
49: "玩家选择器:{}",
|
49: "玩家选择器:{}",
|
||||||
50: "修改主设置",
|
50: "修改主设置",
|
||||||
51: "修改节设置",
|
51: "修改节设置",
|
||||||
52: "游戏内置乐器如下:请输入英文\n",
|
52: "游戏内置乐器如下:请输入英文\n",
|
||||||
53: "打开音·创项目...",
|
53: "打开音·创项目...",
|
||||||
54: "打开旧项目...",
|
54: "打开旧项目...",
|
||||||
55: "保存项目",
|
55: "保存项目",
|
||||||
56: "另存为...",
|
56: "另存为...",
|
||||||
57: "退出",
|
57: "退出",
|
||||||
58: "文件",
|
58: "文件",
|
||||||
59: "从钢琴MP3导入音轨",
|
59: "从钢琴MP3导入音轨",
|
||||||
60: "从midi导入音轨",
|
60: "从midi导入音轨",
|
||||||
61: "从文本文件导入音轨",
|
61: "从文本文件导入音轨",
|
||||||
62: "输入音符至音轨",
|
62: "输入音符至音轨",
|
||||||
63: "编辑",
|
63: "编辑",
|
||||||
64: "生成文件至...",
|
64: "生成文件至...",
|
||||||
65: "生成函数包至...",
|
65: "生成函数包至...",
|
||||||
66: "生成附加包文件至...",
|
66: "生成附加包文件至...",
|
||||||
67: "函数(包)",
|
67: "函数(包)",
|
||||||
68: "将音乐以方块存储生成地图",
|
68: "将音乐以方块存储生成地图",
|
||||||
69: "将音乐以方块存储载入地图…",
|
69: "将音乐以方块存储载入地图…",
|
||||||
70: "将音乐以指令存储生成地图",
|
70: "将音乐以指令存储生成地图",
|
||||||
71: "将音乐以指令存储载入地图…",
|
71: "将音乐以指令存储载入地图…",
|
||||||
72: "将音乐以音符盒存储生成地图",
|
72: "将音乐以音符盒存储生成地图",
|
||||||
73: "将音乐以音符盒存储载入地图…",
|
73: "将音乐以音符盒存储载入地图…",
|
||||||
74: "世界",
|
74: "世界",
|
||||||
75: "生成符合当前音乐的函数播放器…",
|
75: "生成符合当前音乐的函数播放器…",
|
||||||
76: "将选中音轨以指令存储生成.bdx文件…",
|
76: "将选中音轨以指令存储生成.bdx文件…",
|
||||||
77: "由地图导出至.bdx文件…",
|
77: "由地图导出至.bdx文件…",
|
||||||
78: "由地图导出至.RyStruct文件…",
|
78: "由地图导出至.RyStruct文件…",
|
||||||
79: "将函数载入世界…",
|
79: "将函数载入世界…",
|
||||||
80: "将大函数分割并建立执行链…",
|
80: "将大函数分割并建立执行链…",
|
||||||
81: "辅助功能",
|
81: "辅助功能",
|
||||||
82: "展示生成结果",
|
82: "展示生成结果",
|
||||||
83: "建立位于localhost:8080上的websocket服务器播放选中音轨",
|
83: "建立位于localhost:8080上的websocket服务器播放选中音轨",
|
||||||
84: "实验性功能",
|
84: "实验性功能",
|
||||||
85: "清除日志文件",
|
85: "清除日志文件",
|
||||||
86: "清除早期版本的存储文件",
|
86: "清除早期版本的存储文件",
|
||||||
87: "帮助",
|
87: "帮助",
|
||||||
88: "关于",
|
88: "关于",
|
||||||
89: "发送错误日志反馈",
|
89: "发送错误日志反馈",
|
||||||
90: "帮助与疑问",
|
90: "帮助与疑问",
|
||||||
91: "音乐总设置(项目设置)",
|
91: "音乐总设置(项目设置)",
|
||||||
# 92:"",
|
# 92:"",
|
||||||
# 93:"",
|
# 93:"",
|
||||||
# 94:"",
|
# 94:"",
|
||||||
# 95:"",
|
# 95:"",
|
||||||
96: "重置项目设置",
|
96: "重置项目设置",
|
||||||
97: "当前音轨设置(段落设置)",
|
97: "当前音轨设置(段落设置)",
|
||||||
# 98:"",
|
# 98:"",
|
||||||
# 99:"",
|
# 99:"",
|
||||||
# 100:"",
|
# 100:"",
|
||||||
# 101:"",
|
# 101:"",
|
||||||
102: "删除选中音轨",
|
102: "删除选中音轨",
|
||||||
# 103:"",
|
# 103:"",
|
||||||
# 104:"",
|
# 104:"",
|
||||||
105: "找不到或无法读取文件😢:{}",
|
105: "找不到或无法读取文件😢:{}",
|
||||||
106: "您当前的项目已修改但未存储,是否先保存当前项目?",
|
106: "您当前的项目已修改但未存储,是否先保存当前项目?",
|
||||||
107: "项目已经存储至:{}",
|
107: "项目已经存储至:{}",
|
||||||
108: "音·创工程文件",
|
108: "音·创工程文件",
|
||||||
109: "任意类型",
|
109: "任意类型",
|
||||||
110: "函数音创工程文件",
|
110: "函数音创工程文件",
|
||||||
111: "MMFM0.0.6版本工程文件",
|
111: "MMFM0.0.6版本工程文件",
|
||||||
112: "全部类型",
|
112: "全部类型",
|
||||||
113: "钢琴声音的音频文件",
|
113: "钢琴声音的音频文件",
|
||||||
114: "Midi文件",
|
114: "Midi文件",
|
||||||
115: "文本文件",
|
115: "文本文件",
|
||||||
116: "请输入坐标:",
|
116: "请输入坐标:",
|
||||||
117: "您输入的格式有误,请重新输入!",
|
117: "您输入的格式有误,请重新输入!",
|
||||||
118: "我的世界指令函数文件",
|
118: "我的世界指令函数文件",
|
||||||
119: "请输入执行链生成坐标:",
|
119: "请输入执行链生成坐标:",
|
||||||
120: "您输入的格式有误,请重新输入。",
|
120: "您输入的格式有误,请重新输入。",
|
||||||
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
121: "您的函数文件不大于一万条指令,无需进行分割操作。",
|
||||||
122: "请输入执行链生成相对坐标:",
|
122: "请输入执行链生成相对坐标:",
|
||||||
123: "FastBuilder结构文件",
|
123: "FastBuilder结构文件",
|
||||||
124: "转换结束!\n{}",
|
124: "转换结束!\n{}",
|
||||||
125: "一秒,音乐走几拍?",
|
125: "一秒,音乐走几拍?",
|
||||||
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
126: "按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放",
|
||||||
127: "请输入区域选择的开始坐标:",
|
127: "请输入区域选择的开始坐标:",
|
||||||
128: "请输入区域选择的结束坐标:",
|
128: "请输入区域选择的结束坐标:",
|
||||||
129: "所选区块导出时是否需要保留空气方块?",
|
129: "所选区块导出时是否需要保留空气方块?",
|
||||||
130: "音·创结构文件",
|
130: "音·创结构文件",
|
||||||
131: "文件已生成\n{}",
|
131: "文件已生成\n{}",
|
||||||
132: "文件无法生成\n{}\n{}",
|
132: "文件无法生成\n{}\n{}",
|
||||||
133: "本功能尚未开发。",
|
133: "本功能尚未开发。",
|
||||||
134: "您的称呼",
|
134: "您的称呼",
|
||||||
135: "您的联系方式",
|
135: "您的联系方式",
|
||||||
136: "您对问题的描述",
|
136: "您对问题的描述",
|
||||||
137: "在程序结束后将清除日志及临时文件信息。",
|
137: "在程序结束后将清除日志及临时文件信息。",
|
||||||
138: "在程序结束后将不会清除日志及临时文件信息。",
|
138: "在程序结束后将不会清除日志及临时文件信息。",
|
||||||
139: "修改包名",
|
139: "修改包名",
|
||||||
140: "修改音乐标题",
|
140: "修改音乐标题",
|
||||||
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
141: "修改玩家选择器\n注意!要加上中括号“[]”",
|
||||||
142: "修改本音轨的执行实体名",
|
142: "修改本音轨的执行实体名",
|
||||||
143: "修改本音轨所用的积分板",
|
143: "修改本音轨所用的积分板",
|
||||||
144: "修改本音轨所用乐器",
|
144: "修改本音轨所用乐器",
|
||||||
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
145: "您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?",
|
||||||
146: "修改本音轨生成的文件名",
|
146: "修改本音轨生成的文件名",
|
||||||
|
# -----2022.1.25更新
|
||||||
}
|
147: "生成新文件至...",
|
||||||
|
148: "从midi导入音轨且用新方法解析",
|
||||||
|
149: "打开 新: 音·创项目...",
|
||||||
|
150: "保存为新项目",
|
||||||
|
151: "另存为新项...",
|
||||||
|
152: "(开发调试)关闭本次日志记录",
|
||||||
|
153: "生成新函数包至...",
|
||||||
|
154: "生成新函数附加包文件至...",
|
||||||
|
155: "生成新函数附加包文件,并将神羽资源包以散包形式放置至...",
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Binary file not shown.
+221
-221
@@ -1,221 +1,221 @@
|
|||||||
import os
|
import os
|
||||||
import brotli
|
import brotli
|
||||||
|
|
||||||
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
'''感谢由 Charlie_Ping “查理平” 带来的bdx转换代码'''
|
||||||
|
|
||||||
|
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:7个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:7个
|
||||||
|
|
||||||
|
|
||||||
class BdxConverter:
|
class BdxConverter:
|
||||||
__header = "BD@"
|
__header = "BD@"
|
||||||
__bin_header = b"BDX"
|
__bin_header = b"BDX"
|
||||||
__generator_author = b"&Charlie_Ping"
|
__generator_author = b"&Charlie_Ping"
|
||||||
|
|
||||||
keys = {
|
keys = {
|
||||||
# x--, x++, addSmallX(-128~127), addX(-32768~32767), addBigX(-2147483648~2147483647)
|
# x--, x++, addSmallX(-128~127), addX(-32768~32767), addBigX(-2147483648~2147483647)
|
||||||
"x": [b"\x0f", b"\x0e", b"\x1c", b"\x14", b"\x15"],
|
"x": [b"\x0f", b"\x0e", b"\x1c", b"\x14", b"\x15"],
|
||||||
"y": [b"\x11", b"\x10", b"\x1d", b"\x16", b"\x17"],
|
"y": [b"\x11", b"\x10", b"\x1d", b"\x16", b"\x17"],
|
||||||
"z": [b"\x13", b"\x12", b"\x1e", b"\x18", b"\x19"],
|
"z": [b"\x13", b"\x12", b"\x1e", b"\x18", b"\x19"],
|
||||||
"end": b"\x58",
|
"end": b"\x58",
|
||||||
"isSigned": b"\x5a",
|
"isSigned": b"\x5a",
|
||||||
"placeCommandBlockWithData": b"\x1b",
|
"placeCommandBlockWithData": b"\x1b",
|
||||||
"placeBlock": b"\x07"
|
"placeBlock": b"\x07"
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, file_path: str, author: str, blocks):
|
def __init__(self, file_path: str, author: str, blocks):
|
||||||
self.author = author
|
self.author = author
|
||||||
self.blocks = blocks
|
self.blocks = blocks
|
||||||
self.file_path = file_path
|
self.file_path = file_path
|
||||||
self.direction = [0, 0, 0]
|
self.direction = [0, 0, 0]
|
||||||
self.block_type = self.get_block_type
|
self.block_type = self.get_block_type
|
||||||
self.__file = self.create_and_upload_file
|
self.__file = self.create_and_upload_file
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def get_block_type(self):
|
def get_block_type(self):
|
||||||
"""
|
"""
|
||||||
blocks
|
blocks
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"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,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
: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
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def create_and_upload_file(self):
|
def create_and_upload_file(self):
|
||||||
"""
|
"""
|
||||||
(瞎用property? 害怕
|
(瞎用property? 害怕
|
||||||
创建一个bdx文件
|
创建一个bdx文件
|
||||||
要close!
|
要close!
|
||||||
:return: 一个文件对象
|
:return: 一个文件对象
|
||||||
"""
|
"""
|
||||||
_dir = os.path.dirname(self.file_path)
|
_dir = os.path.dirname(self.file_path)
|
||||||
if not os.path.isdir(_dir):
|
if not os.path.isdir(_dir):
|
||||||
os.makedirs(_dir)
|
os.makedirs(_dir)
|
||||||
_bytes = self.__bin_header
|
_bytes = self.__bin_header
|
||||||
_bytes += b"\x00"
|
_bytes += b"\x00"
|
||||||
_bytes += self.author.encode("utf-8") + self.__generator_author
|
_bytes += self.author.encode("utf-8") + self.__generator_author
|
||||||
for i in self.block_type:
|
for i in self.block_type:
|
||||||
_bytes += b"\x00\x01"
|
_bytes += b"\x00\x01"
|
||||||
_bytes += bytes(i, encoding="utf-8")
|
_bytes += bytes(i, encoding="utf-8")
|
||||||
_bytes += b"\x00"
|
_bytes += b"\x00"
|
||||||
_bytes += self.upload_blocks()
|
_bytes += self.upload_blocks()
|
||||||
_bytes += b"X"
|
_bytes += b"X"
|
||||||
with open(self.file_path, "w+") as f:
|
with open(self.file_path, "w+") as f:
|
||||||
f.write("BD@")
|
f.write("BD@")
|
||||||
f.close()
|
f.close()
|
||||||
with open(self.file_path, "ab+") as f:
|
with open(self.file_path, "ab+") as f:
|
||||||
f.write(brotli.compress(_bytes))
|
f.write(brotli.compress(_bytes))
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
def upload_blocks(self):
|
def upload_blocks(self):
|
||||||
"""
|
"""
|
||||||
计算差值
|
计算差值
|
||||||
写入移动过程
|
写入移动过程
|
||||||
写入方块
|
写入方块
|
||||||
更新差值
|
更新差值
|
||||||
: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):
|
||||||
"""
|
"""
|
||||||
给出 两个[x, y, z]坐标,返回pointer的移动过程
|
给出 两个[x, y, z]坐标,返回pointer的移动过程
|
||||||
:param direction: 坐标 1
|
:param direction: 坐标 1
|
||||||
:param new_direction: 坐标 2
|
:param new_direction: 坐标 2
|
||||||
:return: bytes
|
:return: bytes
|
||||||
"""
|
"""
|
||||||
_bytes = b""
|
_bytes = b""
|
||||||
for i, sign in enumerate(["x", "y", "z"]):
|
for i, sign in enumerate(["x", "y", "z"]):
|
||||||
# print(f"<{sign}> 新-旧={new_direction[i]-direction[i]}")
|
# print(f"<{sign}> 新-旧={new_direction[i]-direction[i]}")
|
||||||
distance = new_direction[i] - direction[i]
|
distance = new_direction[i] - direction[i]
|
||||||
if distance == 0:
|
if distance == 0:
|
||||||
# print("距离是0?跳过了")
|
# print("距离是0?跳过了")
|
||||||
continue
|
continue
|
||||||
_bytes += self.obtain_pointer_type(distance, sign)
|
_bytes += self.obtain_pointer_type(distance, sign)
|
||||||
# print(f"向 {sign} 运动了 {distance} 格子")
|
# print(f"向 {sign} 运动了 {distance} 格子")
|
||||||
return _bytes
|
return _bytes
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def obtain_pointer_type(cls, num: int, coordinate: str):
|
def obtain_pointer_type(cls, num: int, coordinate: str):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
用于确定辅助玩家以某一数据类型走指定长度
|
用于确定辅助玩家以某一数据类型走指定长度
|
||||||
|
|
||||||
-1 -> 0
|
-1 -> 0
|
||||||
1 -> 1
|
1 -> 1
|
||||||
[128, 127] -> 2
|
[128, 127] -> 2
|
||||||
[-32768, 32767] -> 3
|
[-32768, 32767] -> 3
|
||||||
[-2147483648, 2147483647] -> 4
|
[-2147483648, 2147483647] -> 4
|
||||||
:param num:
|
:param num:
|
||||||
:param coordinate: 坐标轴种类,x y 或 z
|
:param coordinate: 坐标轴种类,x y 或 z
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
if num == 0:
|
if num == 0:
|
||||||
return
|
return
|
||||||
pointer = 0
|
pointer = 0
|
||||||
condition = (num != -1, # byte=0, pointer=1
|
condition = (num != -1, # byte=0, pointer=1
|
||||||
num < -1 or num > 1, # byte=1, pointer=2
|
num < -1 or num > 1, # byte=1, pointer=2
|
||||||
num < -128 or num > 127, # byte=2, pointer=3
|
num < -128 or num > 127, # byte=2, pointer=3
|
||||||
num < -32768 or num > 32767, # byte=4, pointer=4
|
num < -32768 or num > 32767, # byte=4, pointer=4
|
||||||
)
|
)
|
||||||
for i in condition:
|
for i in condition:
|
||||||
if i:
|
if i:
|
||||||
pointer += 1
|
pointer += 1
|
||||||
pointer_type = cls.keys[coordinate][pointer]
|
pointer_type = cls.keys[coordinate][pointer]
|
||||||
|
|
||||||
byte_len = 2 ** (pointer - 2)
|
byte_len = 2 ** (pointer - 2)
|
||||||
if byte_len >= 1:
|
if byte_len >= 1:
|
||||||
num_byte = num.to_bytes(byte_len, byteorder="big", signed=True)
|
num_byte = num.to_bytes(byte_len, byteorder="big", signed=True)
|
||||||
return pointer_type + num_byte
|
return pointer_type + num_byte
|
||||||
return pointer_type
|
return pointer_type
|
||||||
|
|
||||||
def obtain_universal_block(self, block1):
|
def obtain_universal_block(self, block1):
|
||||||
"""
|
"""
|
||||||
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
给定一个方块, 返回此方块在这个bdx中的id和方块data
|
||||||
:param block1: {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(block1["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 = block1["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, block1):
|
def obtain_command_block(self, block1):
|
||||||
"""
|
"""
|
||||||
给定一个命令方块,返回命令方块各种数据
|
给定一个命令方块,返回命令方块各种数据
|
||||||
:param block1: {
|
: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,
|
||||||
"impluse": int, # unsigned_int32
|
"impluse": int, # unsigned_int32
|
||||||
"command": str,
|
"command": str,
|
||||||
"customName": str,
|
"customName": str,
|
||||||
"lastOutput": str, # 没特殊要求写个\x00就得了
|
"lastOutput": str, # 没特殊要求写个\x00就得了
|
||||||
"tickdelay": int, # int32
|
"tickdelay": int, # int32
|
||||||
"executeOnFirstTick": int, # 1 bytes
|
"executeOnFirstTick": int, # 1 bytes
|
||||||
"trackOutput": int, # 1 bytes
|
"trackOutput": int, # 1 bytes
|
||||||
"conditional": int, # 1 bytes
|
"conditional": int, # 1 bytes
|
||||||
"needRedstone": int # 1 bytes
|
"needRedstone": int # 1 bytes
|
||||||
}
|
}
|
||||||
:return: bytes of command_block
|
:return: bytes of command_block
|
||||||
"""
|
"""
|
||||||
|
|
||||||
block_id = b"\x1b" + self.block_type.index(block1["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 = block1["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 [
|
||||||
block1["impluse"].to_bytes(4, byteorder="big", signed=False),
|
block1["impluse"].to_bytes(4, byteorder="big", signed=False),
|
||||||
bytes(block1["command"], encoding="utf-8") + b"\x00",
|
bytes(block1["command"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block1["customName"], encoding="utf-8") + b"\x00",
|
bytes(block1["customName"], encoding="utf-8") + b"\x00",
|
||||||
bytes(block1["lastOutput"], encoding="utf-8") + b"\x00",
|
bytes(block1["lastOutput"], encoding="utf-8") + b"\x00",
|
||||||
block1["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
block1["tickdelay"].to_bytes(4, byteorder="big", signed=True),
|
||||||
block1["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
block1["executeOnFirstTick"].to_bytes(1, byteorder="big"),
|
||||||
block1["trackOutput"].to_bytes(1, byteorder="big"),
|
block1["trackOutput"].to_bytes(1, byteorder="big"),
|
||||||
block1["conditional"].to_bytes(1, byteorder="big"),
|
block1["conditional"].to_bytes(1, byteorder="big"),
|
||||||
block1["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},
|
||||||
{"direction": [2, 4, 1], "block_name": "command_block", "particular_value": 3,
|
{"direction": [2, 4, 1], "block_name": "command_block", "particular_value": 3,
|
||||||
"impluse": 0,
|
"impluse": 0,
|
||||||
"command": "say A generator test",
|
"command": "say A generator test",
|
||||||
"customName": "test",
|
"customName": "test",
|
||||||
"lastOutput": "",
|
"lastOutput": "",
|
||||||
"tickdelay": 24,
|
"tickdelay": 24,
|
||||||
"executeOnFirstTick": 0,
|
"executeOnFirstTick": 0,
|
||||||
"trackOutput": 0,
|
"trackOutput": 0,
|
||||||
"conditional": 0,
|
"conditional": 0,
|
||||||
"needRedstone": 1
|
"needRedstone": 1
|
||||||
},
|
},
|
||||||
{"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)
|
||||||
|
|||||||
+130
-130
@@ -1,130 +1,130 @@
|
|||||||
# -*- coding: UTF-8 -*-
|
# -*- coding: UTF-8 -*-
|
||||||
"""提供错误报告的基本操作及方法 顺便提供版本更新、安装库等功能"""
|
"""提供错误报告的基本操作及方法 顺便提供版本更新、安装库等功能"""
|
||||||
|
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:1个;语法(一级)错误:72个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:1个;语法(一级)错误:72个
|
||||||
import os
|
import os
|
||||||
import zipfile
|
import zipfile
|
||||||
|
|
||||||
|
|
||||||
def makeZip(sourceDir, outFilename, compression=8, exceptFile=None):
|
def makeZip(sourceDir, outFilename, compression=8, exceptFile=None):
|
||||||
"""使用compression指定的算法打包目录为zip文件\n
|
"""使用compression指定的算法打包目录为zip文件\n
|
||||||
默认算法为DEFLATED(8),可用算法如下:\n
|
默认算法为DEFLATED(8),可用算法如下:\n
|
||||||
STORED = 0\n
|
STORED = 0\n
|
||||||
DEFLATED = 8\n
|
DEFLATED = 8\n
|
||||||
BZIP2 = 12\n
|
BZIP2 = 12\n
|
||||||
LZMA = 14\n
|
LZMA = 14\n
|
||||||
"""
|
"""
|
||||||
zipf = zipfile.ZipFile(outFilename, 'w', compression)
|
zipf = zipfile.ZipFile(outFilename, 'w', compression)
|
||||||
pre_len = len(os.path.dirname(sourceDir))
|
pre_len = len(os.path.dirname(sourceDir))
|
||||||
for parent, dirnames, filenames in os.walk(sourceDir):
|
for parent, dirnames, filenames in os.walk(sourceDir):
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
if filename == exceptFile:
|
if filename == exceptFile:
|
||||||
continue
|
continue
|
||||||
print(filename)
|
print(filename)
|
||||||
pathfile = os.path.join(parent, filename)
|
pathfile = os.path.join(parent, filename)
|
||||||
arcname = pathfile[pre_len:].strip(os.path.sep) # 相对路径
|
arcname = pathfile[pre_len:].strip(os.path.sep) # 相对路径
|
||||||
zipf.write(pathfile, arcname)
|
zipf.write(pathfile, arcname)
|
||||||
|
|
||||||
zipf.close()
|
zipf.close()
|
||||||
del zipf, pre_len
|
del zipf, pre_len
|
||||||
|
|
||||||
|
|
||||||
# 以上函数节选并修改自 正在攀登的小蜗牛 的博客:https://blog.csdn.net/qq_21127151/article/details/107503942
|
# 以上函数节选并修改自 正在攀登的小蜗牛 的博客:https://blog.csdn.net/qq_21127151/article/details/107503942
|
||||||
|
|
||||||
|
|
||||||
class report:
|
class report:
|
||||||
"""发送报告以及相应的任务处理"""
|
"""发送报告以及相应的任务处理"""
|
||||||
|
|
||||||
def __init__(self, senderName: str = 'Unknown', senderContact: str = 'None', describetion: str = ''):
|
def __init__(self, senderName: str = 'Unknown', senderContact: str = 'None', describetion: str = ''):
|
||||||
""":param senderName 发送者名称
|
""":param senderName 发送者名称
|
||||||
:param senderContact 发送者联系方式
|
:param senderContact 发送者联系方式
|
||||||
:param describetion 问题描述"""
|
:param describetion 问题描述"""
|
||||||
self.senderName = senderName
|
self.senderName = senderName
|
||||||
self.senderContact = senderContact
|
self.senderContact = senderContact
|
||||||
self.describetion = describetion
|
self.describetion = describetion
|
||||||
if not self.senderName:
|
if not self.senderName:
|
||||||
self.senderName = 'Unknown'
|
self.senderName = 'Unknown'
|
||||||
if not self.senderContact:
|
if not self.senderContact:
|
||||||
self.senderContact = 'None'
|
self.senderContact = 'None'
|
||||||
|
|
||||||
def emailReport(self):
|
def emailReport(self):
|
||||||
"""使用E-mail方法发送当前的日志和临时文件等"""
|
"""使用E-mail方法发送当前的日志和临时文件等"""
|
||||||
import smtplib
|
import smtplib
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
from email.header import Header
|
from email.header import Header
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
log("发送错误报告")
|
log("发送错误报告")
|
||||||
import os
|
import os
|
||||||
log("添加标题与正文")
|
log("添加标题与正文")
|
||||||
msg = MIMEMultipart()
|
msg = MIMEMultipart()
|
||||||
# 发送者与接收者显示名称
|
# 发送者与接收者显示名称
|
||||||
msg["From"] = Header(self.senderName, 'utf-8')
|
msg["From"] = Header(self.senderName, 'utf-8')
|
||||||
msg["To"] = Header("W-YI (QQ2647547478)", 'utf-8')
|
msg["To"] = Header("W-YI (QQ2647547478)", 'utf-8')
|
||||||
# 标题
|
# 标题
|
||||||
msg["Subject"] = '音·创 - 来自 ' + self.senderName + ' 的错误报告'
|
msg["Subject"] = '音·创 - 来自 ' + self.senderName + ' 的错误报告'
|
||||||
# 正文
|
# 正文
|
||||||
msg.attach(
|
msg.attach(
|
||||||
MIMEText("来自" + self.senderName + "( " + self.senderContact + " )的错误描述:\n" + self.describetion,
|
MIMEText("来自" + self.senderName + "( " + self.senderContact + " )的错误描述:\n" + self.describetion,
|
||||||
'utf-8'))
|
'utf-8'))
|
||||||
log("添加完毕,正在生成压缩包...")
|
log("添加完毕,正在生成压缩包...")
|
||||||
makeZip("./", "Temps&Logs.zip", exceptFile="Temps&Logs.zip")
|
makeZip("./", "Temps&Logs.zip", exceptFile="Temps&Logs.zip")
|
||||||
attafile = MIMEText(str(open("Temps&Logs.zip", 'rb').read()), "base64", 'gb2312')
|
attafile = MIMEText(str(open("Temps&Logs.zip", 'rb').read()), "base64", 'gb2312')
|
||||||
attafile["Content-Type"] = 'application/octet-stream'
|
attafile["Content-Type"] = 'application/octet-stream'
|
||||||
attafile["Content-Disposition"] = 'attachmentfilename="BugReport_from_' + self.senderName + '.zip"'
|
attafile["Content-Disposition"] = 'attachmentfilename="BugReport_from_' + self.senderName + '.zip"'
|
||||||
msg.attach(attafile)
|
msg.attach(attafile)
|
||||||
log("完毕,准备发送")
|
log("完毕,准备发送")
|
||||||
try:
|
try:
|
||||||
smtp = smtplib.SMTP()
|
smtp = smtplib.SMTP()
|
||||||
smtp.connect("smtp.163.com")
|
smtp.connect("smtp.163.com")
|
||||||
# smtp.login("RyounDevTeam@163.com","RyounDaiYi99")
|
# smtp.login("RyounDevTeam@163.com","RyounDaiYi99")
|
||||||
# SIQQKQQYCZRVIDFJ是授权密码
|
# SIQQKQQYCZRVIDFJ是授权密码
|
||||||
smtp.login("RyounDevTeam@163.com", "SIQQKQQYCZRVIDFJ")
|
smtp.login("RyounDevTeam@163.com", "SIQQKQQYCZRVIDFJ")
|
||||||
smtp.sendmail("RyounDevTeam@163.com", ["RyounDevTeam@163.com", ], msg.as_string())
|
smtp.sendmail("RyounDevTeam@163.com", ["RyounDevTeam@163.com", ], msg.as_string())
|
||||||
log("错误汇报邮件已发送")
|
log("错误汇报邮件已发送")
|
||||||
except smtplib.SMTPException as e:
|
except smtplib.SMTPException as e:
|
||||||
log("错误汇报邮件发送失败:\n" + str(e))
|
log("错误汇报邮件发送失败:\n" + str(e))
|
||||||
log("清空内存和临时文件")
|
log("清空内存和临时文件")
|
||||||
del msg, attafile
|
del msg, attafile
|
||||||
os.remove("./Temps&Logs.zip")
|
os.remove("./Temps&Logs.zip")
|
||||||
|
|
||||||
|
|
||||||
class version:
|
class version:
|
||||||
libraries = (
|
libraries = (
|
||||||
'mido', 'amulet', 'amulet-core', 'amulet-nbt', 'piano_transcription_inference', 'pypinyin',
|
'mido', 'amulet', 'amulet-core', 'amulet-nbt', 'piano_transcription_inference', 'pypinyin',
|
||||||
'pyinstaller','py7zr','websockets', 'torch'
|
'pyinstaller','py7zr','websockets', 'torch'
|
||||||
)
|
)
|
||||||
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
||||||
|
|
||||||
version = ('0.0.1', 'Delta',)
|
version = ('0.0.1', 'Delta',)
|
||||||
"""当前版本"""
|
"""当前版本"""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
||||||
self.libraries = version.libraries
|
self.libraries = version.libraries
|
||||||
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
"""当前所需库,有一些是开发用的,用户不需要安装"""
|
||||||
|
|
||||||
self.version = version.version
|
self.version = version.version
|
||||||
"""当前版本"""
|
"""当前版本"""
|
||||||
|
|
||||||
def installLibraries(self):
|
def installLibraries(self):
|
||||||
"""安装全部开发用库"""
|
"""安装全部开发用库"""
|
||||||
from sys import platform
|
from sys import platform
|
||||||
import os
|
import os
|
||||||
if platform == 'win32':
|
if platform == 'win32':
|
||||||
import shutil
|
import shutil
|
||||||
try:
|
try:
|
||||||
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
|
||||||
except FloatingPointError:
|
except FloatingPointError:
|
||||||
pass
|
pass
|
||||||
for i in self.libraries:
|
for i in self.libraries:
|
||||||
print("安装库:" + i)
|
print("安装库:" + i)
|
||||||
os.system("python -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
os.system("python -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
||||||
elif platform == 'linux':
|
elif platform == 'linux':
|
||||||
os.system("sudo apt-get install python3-pip")
|
os.system("sudo apt-get install python3-pip")
|
||||||
os.system("sudo apt-get install python3-tk")
|
os.system("sudo apt-get install python3-tk")
|
||||||
os.system("sudo apt-get install python3-tkinter")
|
os.system("sudo apt-get install python3-tkinter")
|
||||||
for i in self.libraries:
|
for i in self.libraries:
|
||||||
print("安装库:" + i)
|
print("安装库:" + i)
|
||||||
os.system("sudo python3 -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
os.system("sudo python3 -m pip install " + i + " -i https://pypi.tuna.tsinghua.edu.cn/simple")
|
||||||
|
|||||||
+301
-233
@@ -1,233 +1,301 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""音·创 的函数操作和一些其他功能"""
|
"""音·创 的函数操作和一些其他功能"""
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:91个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:91个
|
||||||
|
|
||||||
|
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
|
|
||||||
|
|
||||||
def delPart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
def delPart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
||||||
"""删除序列从starter物件到ender物件之间的部分\n
|
"""删除序列从starter物件到ender物件之间的部分\n
|
||||||
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
||||||
starter与ender若为None则默认从首或尾开始"""
|
starter与ender若为None则默认从首或尾开始"""
|
||||||
e = True
|
try:
|
||||||
try:
|
if starter is None:
|
||||||
if starter is None:
|
includeStart = True
|
||||||
includeStart = True
|
starter = Data[0]
|
||||||
starter = Data[0]
|
if ender is None:
|
||||||
if ender is None:
|
includend = True
|
||||||
includend = True
|
ender = Data[len(Data) - 1]
|
||||||
ender = Data[len(Data) - 1]
|
if includend:
|
||||||
if includend:
|
if includeStart:
|
||||||
if includeStart:
|
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender)]
|
||||||
e = False
|
else:
|
||||||
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender)]
|
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender)]
|
||||||
else:
|
else:
|
||||||
e = False
|
if includeStart:
|
||||||
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender)]
|
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
||||||
else:
|
else:
|
||||||
if includeStart:
|
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
||||||
e = False
|
except:
|
||||||
return Data[Data.index(starter):len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
return 0
|
||||||
else:
|
|
||||||
e = False
|
|
||||||
return Data[Data.index(starter) + 1:len(Data) - Data[len(Data)::-1].index(ender) - 1]
|
def keepart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
||||||
except ValueError:
|
"""保留序列从starter物件到ender物件之间的部分\n
|
||||||
return 0
|
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
||||||
finally:
|
starter与ender若为None则默认从首或尾开始"""
|
||||||
if e is True:
|
try:
|
||||||
return 0
|
if starter is None:
|
||||||
|
includeStart = True
|
||||||
|
starter = Data[0]
|
||||||
def keepart(Data, starter, ender, includeStart: bool = True, includend: bool = True):
|
if ender is None:
|
||||||
"""保留序列从starter物件到ender物件之间的部分\n
|
includend = True
|
||||||
includeStart与inclodend分别控制此函数是否包括starter和ender物件所在部分,默认为真\n
|
ender = Data[len(Data) - 1]
|
||||||
starter与ender若为None则默认从首或尾开始"""
|
if includend:
|
||||||
e = True
|
if includeStart:
|
||||||
try:
|
return Data[Data.index(starter):Data.index(ender) + 1]
|
||||||
if starter is None:
|
else:
|
||||||
includeStart = True
|
return Data[Data.index(starter) + 1:Data.index(ender) + 1]
|
||||||
starter = Data[0]
|
else:
|
||||||
if ender is None:
|
if includeStart:
|
||||||
includend = True
|
return Data[Data.index(starter):Data.index(ender)]
|
||||||
ender = Data[len(Data) - 1]
|
else:
|
||||||
if includend:
|
return Data[Data.index(starter) + 1:Data.index(ender)]
|
||||||
if includeStart:
|
except:
|
||||||
e = False
|
return 0
|
||||||
return Data[Data.index(starter):Data.index(ender) + 1]
|
|
||||||
else:
|
|
||||||
e = False
|
def lenFunction(fun) -> int:
|
||||||
return Data[Data.index(starter) + 1:Data.index(ender) + 1]
|
"""取得函数指令部分长度,即忽略#开头的注释"""
|
||||||
else:
|
try:
|
||||||
if includeStart:
|
f = 0
|
||||||
e = False
|
for i in fun:
|
||||||
return Data[Data.index(starter):Data.index(ender)]
|
if i.replace(" ", '')[0] == '#':
|
||||||
else:
|
f += 1
|
||||||
e = False
|
return len(fun) - f
|
||||||
return Data[Data.index(starter) + 1:Data.index(ender)]
|
except:
|
||||||
except ValueError:
|
return -1
|
||||||
return 0
|
|
||||||
finally:
|
|
||||||
if e is True:
|
def funSplit(bigFile, maxCmdLen: int = 10000):
|
||||||
return 0
|
"""分割bigFile大的函数文件,bigFile需要读入文件流\n
|
||||||
|
返回的部分,每行指令皆带有行尾换行符\\n\n
|
||||||
|
返回-1为大小低于maxCmdLen最长函数指令长度"""
|
||||||
def lenFunction(fun) -> int:
|
bigFile = bigFile.readlines()
|
||||||
"""取得函数指令部分长度,即忽略#开头的注释"""
|
if lenFunction(bigFile) < maxCmdLen:
|
||||||
e = True
|
return -1
|
||||||
try:
|
part = []
|
||||||
f = 0
|
parts = []
|
||||||
for i in fun:
|
h = 0
|
||||||
if i.replace(" ", '')[0] == '#':
|
for i in bigFile:
|
||||||
f += 1
|
if i.replace(" ", '')[0] == '#':
|
||||||
e = False
|
part.append(i + '\n')
|
||||||
return len(fun) - f
|
else:
|
||||||
except IndexError:
|
part.append(i + '\n')
|
||||||
return -1
|
h += 1
|
||||||
finally:
|
if h >= 10000:
|
||||||
if e is True:
|
parts.append(part)
|
||||||
return -1
|
part = []
|
||||||
|
h = 0
|
||||||
|
return parts
|
||||||
def funSplit(bigFile, maxCmdLen: int = 10000):
|
|
||||||
"""分割bigFile大的函数文件,bigFile需要读入文件流\n
|
|
||||||
返回的部分,每行指令皆带有行尾换行符\\n\n
|
def makeFuncFiles(musicset, path='./'):
|
||||||
返回-1为大小低于maxCmdLen最长函数指令长度"""
|
"""在指定目录下生成函数文件"""
|
||||||
bigFile = bigFile.readlines()
|
from nmcsup.trans import Note2Cmd
|
||||||
if lenFunction(bigFile) < maxCmdLen:
|
commands = []
|
||||||
return -1
|
starts = []
|
||||||
part = []
|
log("=========================正在在此处生成文件:" + path)
|
||||||
parts = []
|
maxlen = -1
|
||||||
h = 0
|
for i in range(len(musicset['musics'])):
|
||||||
for i in bigFile:
|
log('写入第' + str(i) + '个数据')
|
||||||
if i.replace(" ", '')[0] == '#':
|
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\"] " +
|
||||||
part.append(i + '\n')
|
musicset['musics'][i]['set']['ScoreboardName'] + " 1\n")
|
||||||
else:
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
part.append(i + '\n')
|
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
||||||
h += 1
|
'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
||||||
if h >= 10000:
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
parts.append(part)
|
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
||||||
part = []
|
'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
||||||
h = 0
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
return parts
|
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')
|
||||||
def makeFuncFiles(musicset, path='./'):
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
"""在指定目录下生成函数文件"""
|
encoding='UTF-8') as f:
|
||||||
from nmcsup.trans import Note2Cmd
|
f.writelines(Note2Cmd(musicset['musics'][i]['notes'], musicset['musics'][i]['set']['ScoreboardName'],
|
||||||
commands = []
|
musicset['musics'][i]['set']['Instrument'], musicset['mainset']['PlayerSelect'],
|
||||||
starts = []
|
True))
|
||||||
log("=========================正在在此处生成文件:" + path)
|
if musicset['mainset']['IsRepeat']:
|
||||||
maxlen = -1
|
log("增加重复语句")
|
||||||
for i in range(len(musicset['musics'])):
|
for i in range(len(musicset['musics'])):
|
||||||
log('写入第' + str(i) + '个数据')
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\"] " +
|
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
||||||
musicset['musics'][i]['set']['ScoreboardName'] + " 1\n")
|
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
||||||
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
||||||
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
log("增加版权语句")
|
||||||
'PlayerSelect'] + " title " + musicset['mainset']['MusicTitle'] + "\n")
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
log("写入支持文件")
|
||||||
'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
if len(musicset['musics'][i]['notes']) > maxlen:
|
f.writelines(commands)
|
||||||
maxlen = len(musicset['musics'][i]['notes'])
|
log("写入开始文件")
|
||||||
starts.append("scoreboard objectives add " + musicset['musics'][i]['set']['ScoreboardName'] + " dummy\n")
|
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
starts.append("summon armor_stand " + musicset['musics'][i]['set']['EntityName'] + '\n')
|
f.writelines(starts)
|
||||||
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
del commands, starts, maxlen
|
||||||
encoding='UTF-8') as f:
|
log("完成============================")
|
||||||
f.writelines(Note2Cmd(musicset['musics'][i]['notes'], musicset['musics'][i]['set']['ScoreboardName'],
|
|
||||||
musicset['musics'][i]['set']['Instrument'], musicset['mainset']['PlayerSelect'],
|
|
||||||
True))
|
def makeNewFuncFiles(musicset, path='./'):
|
||||||
if musicset['mainset']['IsRepeat']:
|
"""在指定目录下生成函数文件"""
|
||||||
log("增加重复语句")
|
from nmcsup.trans import classList_conversion
|
||||||
for i in range(len(musicset['musics'])):
|
commands = []
|
||||||
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
starts = []
|
||||||
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
starts.__len__()
|
||||||
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
starts.append("scoreboard objectives add " + musicset['musics'][0]['set']['ScoreboardName'] + " dummy\n")
|
||||||
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
starts.append("summon armor_stand " + musicset['musics'][0]['set']['EntityName'] + '\n')
|
||||||
log("增加版权语句")
|
starts.append("scoreboard objectives setdisplay sidebar " + musicset['musics'][0]['set']['ScoreboardName'] + '\n')
|
||||||
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
starts.append("scoreboard players set @e[type=armor_stand, name=\"" + musicset['musics'][0]['set']['EntityName'] +
|
||||||
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
"\"] " + musicset['musics'][0]['set']['ScoreboardName'] + " 0" + '\n')
|
||||||
log("写入支持文件")
|
log("=========================正在在此处生成文件:" + path)
|
||||||
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
commands.append("scoreboard players add @e[name=\"" + musicset['musics'][0]['set']['EntityName'] + "\"] " +
|
||||||
f.writelines(commands)
|
musicset['musics'][0]['set']['ScoreboardName'] + " 1\n")
|
||||||
log("写入开始文件")
|
maxlen = -1
|
||||||
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
for i in range(len(musicset['musics'])):
|
||||||
f.writelines(starts)
|
log('写入第' + str(i) + '个数据')
|
||||||
del commands, starts, maxlen
|
# commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
log("完成============================")
|
# 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={" +
|
||||||
def makeFunDir(musicset, path='./'):
|
# musicset['musics'][i]['set']['ScoreboardName'] + "=1..10}] ~~~ title @a" + musicset['mainset'][
|
||||||
"""在指定目录下生成函数包文件夹"""
|
# 'PlayerSelect'] + " subtitle 本函数乐曲由§b§l凌云§r§3函数音乐创建§r生成\n")
|
||||||
import os
|
if len(musicset['musics'][i]['notes']) > maxlen:
|
||||||
import uuid
|
maxlen = len(musicset['musics'][i]['notes'])
|
||||||
log("=============================生成函数包文件夹")
|
with open(path + musicset['mainset']['MusicTitle'] + '_Part' + str(i) + '.mcfunction', 'w',
|
||||||
# note,packname="Ryoun",FileName="Music",EntityName_='music_support',ScoreboardName_='music_support',
|
encoding='UTF-8') as f:
|
||||||
# MusicTitle_='Noname',PlayerSelect_='',Repeat_=False,Instrument_='harp'
|
f.writelines(classList_conversion(musicset['musics'][i]['notes'],
|
||||||
try:
|
musicset['musics'][i]['set']['ScoreboardName']))
|
||||||
os.makedirs(path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
if musicset['mainset']['IsRepeat']:
|
||||||
'PackName'] + "/functions")
|
log("增加重复语句")
|
||||||
log("已创建目录" + path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
for i in range(len(musicset['musics'])):
|
||||||
'PackName'] + "/functions")
|
commands.append("execute @e[name=\"" + musicset['musics'][i]['set']['EntityName'] + "\",scores={" +
|
||||||
except FileExistsError:
|
musicset['musics'][i]['set']['ScoreboardName'] + "=" + str(
|
||||||
log("目录已有无需创建")
|
(maxlen + 2) * 10) + "}] ~~~ scoreboard players set @e[name=\"" + musicset['musics'][i]['set'][
|
||||||
pass
|
'EntityName'] + "\"] " + musicset['musics'][i]['set']['ScoreboardName'] + " -1\n")
|
||||||
# 判断文件皆存在
|
log("增加版权语句")
|
||||||
if not (os.path.exists(
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json") and os.path.exists(
|
starts.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿),bgArray(诸葛亮与八卦阵)\n")
|
||||||
path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
log("写入支持文件")
|
||||||
'PackName'] + "/manifest.json")):
|
with open(path + musicset['mainset']['MusicTitle'] + '_Support.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
log("创建manifest.json以及world_behavior_packs.json")
|
f.writelines(commands)
|
||||||
behaviorUuid = uuid.uuid4()
|
log("写入开始文件")
|
||||||
with open(path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json", "w") as f:
|
with open(path + 'Start_' + musicset['mainset']['MusicTitle'] + '.mcfunction', 'w', encoding='UTF-8') as f:
|
||||||
f.write("[\n {\"pack_id\": \"" + str(behaviorUuid) + "\",\n \"version\": [ 0, 0, 1 ]}\n]")
|
f.writelines(starts)
|
||||||
p = path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset']['PackName'] + \
|
del commands, starts, maxlen
|
||||||
"/manifest.json"
|
log("完成============================")
|
||||||
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\": \"" +
|
def makeNewFunDir(musicset, path='./'):
|
||||||
musicset['mainset']['PackName'] + "Pack\",\n \"uuid\": \"" + str(
|
"""在指定目录下生成函数包文件夹"""
|
||||||
behaviorUuid) + "\"\n },\n \"modules\": [\n {\n \"description\": \"" + musicset['mainset'][
|
import os
|
||||||
'PackName'] + " Pack : behavior pack\",\n \"type\": \"data\",\n \"version\":"
|
import uuid
|
||||||
" [ 0, 0, 1 ],\n \"uuid\": \"" + str(
|
log("=============================生成函数包文件夹")
|
||||||
uuid.uuid4()) + "\"\n }\n ]\n}")
|
# note,packname="Ryoun",FileName="Music",EntityName_='music_support',ScoreboardName_='music_support',
|
||||||
makeFuncFiles(musicset, path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
# MusicTitle_='Noname',PlayerSelect_='',Repeat_=False,Instrument_='harp'
|
||||||
'PackName'] + "/functions/")
|
try:
|
||||||
log("完成============================")
|
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("目录已有无需创建")
|
||||||
#存在于 Musicreater.py 播放(试听)音乐
|
pass
|
||||||
def PlayNote(Notes, t=480): # Notes是音符列表,t是一拍占有的毫秒数
|
# 判断文件皆存在
|
||||||
tkinter.messagebox.showinfo(title='提示!', message="播放发音不一定标准\n说不定还会坏音响/(ㄒoㄒ)/~~qwq\n请注意。")
|
if not (os.path.exists(
|
||||||
import winsound
|
path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json") and os.path.exists(
|
||||||
import time
|
path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
from nmcsup.trans import mcnote2freq
|
'PackName'] + "/manifest.json")):
|
||||||
Notes = mcnote2freq(Notes)
|
log("创建manifest.json以及world_behavior_packs.json")
|
||||||
for frequency, duration in Notes:
|
behaviorUuid = uuid.uuid4()
|
||||||
log("播放:"+str([int(frequency), int(duration*t)]))
|
with open(path + musicset['mainset']['PackName'] + "Pack/world_behavior_packs.json", "w") as f:
|
||||||
if int(frequency) != 0:
|
f.write("[\n {\"pack_id\": \"" + str(behaviorUuid) + "\",\n \"version\": [ 0, 0, 1 ]}\n]")
|
||||||
winsound.Beep(int(frequency), int(duration*t))
|
p = path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset']['PackName'] + \
|
||||||
elif int(frequency) == 0:
|
"/manifest.json"
|
||||||
time.sleep(duration*t/1000)
|
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\": \"" +
|
||||||
def PlayOne():
|
musicset['mainset']['PackName'] + "Pack\",\n \"uuid\": \"" + str(
|
||||||
log("试听")
|
behaviorUuid) + "\"\n },\n \"modules\": [\n {\n \"description\": \"" + musicset['mainset'][
|
||||||
tkinter.messagebox.showwarning(title="警告⚠", message="试听音质可能引起您的不适,更可能引起您的扬声器的不适,请酌情播放。")
|
'PackName'] + " Pack : behavior pack\",\n \"type\": \"data\",\n \"version\":"
|
||||||
global NowMusic
|
" [ 0, 0, 1 ],\n \"uuid\": \"" + str(
|
||||||
PlayNote(dataset[0]['musics'][NowMusic]['notes'])
|
uuid.uuid4()) + "\"\n }\n ]\n}")
|
||||||
|
makeNewFuncFiles(musicset, path + musicset['mainset']['PackName'] + "Pack/behavior_packs/" + musicset['mainset'][
|
||||||
|
'PackName'] + "/functions/")
|
||||||
|
log("完成============================")
|
||||||
#同上,是早期 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']
|
def makeFunDir(musicset, path='./'):
|
||||||
i]['set']["Instrument"])
|
"""在指定目录下生成函数包文件夹"""
|
||||||
|
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("完成============================")
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
这里是往事,用于记载一些用不到的功能
|
||||||
|
|
||||||
|
#存在于 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"])
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|||||||
+31
-31
@@ -1,31 +1,31 @@
|
|||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个--未解决1个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个--未解决1个
|
||||||
|
|
||||||
|
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
|
||||||
class NewThread(threading.Thread):
|
class NewThread(threading.Thread):
|
||||||
"""新建一个进程来运行函数,函数运行完毕后可以使用.getResult方法获取其返回值"""
|
"""新建一个进程来运行函数,函数运行完毕后可以使用.getResult方法获取其返回值"""
|
||||||
|
|
||||||
def __init__(self, func, args=()):
|
def __init__(self, func, args=()):
|
||||||
super(NewThread, self).__init__()
|
super(NewThread, self).__init__()
|
||||||
self.func = func
|
self.func = func
|
||||||
self.args = args
|
self.args = args
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.result = self.func(*self.args)
|
self.result = self.func(*self.args)
|
||||||
|
|
||||||
def getResult(self):
|
def getResult(self):
|
||||||
threading.Thread.join(self) # 等待线程执行完毕
|
threading.Thread.join(self) # 等待线程执行完毕
|
||||||
try:
|
try:
|
||||||
return self.result
|
return self.result
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
#
|
#
|
||||||
# ————————————————
|
# ————————————————
|
||||||
# 版权声明:上面的类NewThread修改自CSDN博主「星火燎愿」的原创文章中的内容,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
# 版权声明:上面的类NewThread修改自CSDN博主「星火燎愿」的原创文章中的内容,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
||||||
# 原文链接:https://blog.csdn.net/xpt211314/article/details/109543014
|
# 原文链接:https://blog.csdn.net/xpt211314/article/details/109543014
|
||||||
# ————————————————
|
# ————————————————
|
||||||
#
|
#
|
||||||
|
|||||||
+342
-343
@@ -1,343 +1,342 @@
|
|||||||
"""音·创 的转换工具库"""
|
"""音·创 的转换工具库"""
|
||||||
|
|
||||||
|
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:4个--未解决1个;语法(一级)错误:302个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:4个--未解决1个;语法(一级)错误:302个
|
||||||
|
|
||||||
|
|
||||||
import amulet
|
import amulet
|
||||||
from amulet.api.block import Block
|
from amulet.api.block import Block
|
||||||
from amulet.utils.world_utils import block_coords_to_chunk_coords as bc2cc
|
from amulet.utils.world_utils import block_coords_to_chunk_coords as bc2cc
|
||||||
from amulet_nbt import TAG_String as ts
|
from amulet_nbt import TAG_String as ts
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
|
|
||||||
|
|
||||||
def hans2pinyin(hans, style=3):
|
def hans2pinyin(hans, style=3):
|
||||||
"""将汉字字符串转化为拼音字符串"""
|
"""将汉字字符串转化为拼音字符串"""
|
||||||
from pypinyin import lazy_pinyin
|
from pypinyin import lazy_pinyin
|
||||||
result = lazy_pinyin(hans=hans, style=style)
|
result = lazy_pinyin(hans=hans, style=style)
|
||||||
final = ''
|
final = ''
|
||||||
for i in result:
|
for i in result:
|
||||||
final += i
|
final += i
|
||||||
return final
|
return final
|
||||||
|
|
||||||
|
|
||||||
def formCmdBlock(direction: list, command: str, particularValue: int, impluse: int, condition: bool = False,
|
def formCmdBlock(direction: list, command: str, particularValue: int, impluse: int, condition: bool = False,
|
||||||
needRedstone: bool = True, tickDelay: int = 0, customName: str = '', lastOutput: str = '',
|
needRedstone: bool = True, tickDelay: int = 0, customName: str = '', lastOutput: str = '',
|
||||||
executeOnFirstTick: bool = False, trackOutput: bool = True):
|
executeOnFirstTick: bool = False, trackOutput: bool = True):
|
||||||
"""
|
"""
|
||||||
使用指定项目返回指定的指令方块格式字典
|
使用指定项目返回指定的指令方块格式字典
|
||||||
:param trackOutput:
|
:param trackOutput:
|
||||||
:param executeOnFirstTick:
|
:param executeOnFirstTick:
|
||||||
:param lastOutput:
|
:param lastOutput:
|
||||||
:param customName:
|
:param customName:
|
||||||
:param tickDelay:
|
:param tickDelay:
|
||||||
:param needRedstone:
|
:param needRedstone:
|
||||||
:param condition:
|
:param condition:
|
||||||
:param impluse:
|
:param impluse:
|
||||||
:param particularValue:
|
:param particularValue:
|
||||||
:param command:
|
:param command:
|
||||||
:param direction:
|
:param direction:
|
||||||
|
|
||||||
:return: 指令方块字典结构
|
:return: 指令方块字典结构
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
:param block: {
|
:param block: {
|
||||||
"direction": [x: int, y: int, z: int] #方块位置
|
"direction": [x: int, y: int, z: int] #方块位置
|
||||||
"block_name": str, #方块名称(无需指定,默认为command_block)
|
"block_name": str, #方块名称(无需指定,默认为command_block)
|
||||||
"particular_value": int, #方块特殊值
|
"particular_value": int, #方块特殊值
|
||||||
"impluse": int, #方块类型0脉冲 1循环 2连锁 unsigned_int32
|
"impluse": int, #方块类型0脉冲 1循环 2连锁 unsigned_int32
|
||||||
"command": str, #指令
|
"command": str, #指令
|
||||||
"customName": str, #悬浮字
|
"customName": str, #悬浮字
|
||||||
"lastOutput": str, #上次输出
|
"lastOutput": str, #上次输出
|
||||||
"tickdelay": int, #方块延时 int32
|
"tickdelay": int, #方块延时 int32
|
||||||
"executeOnFirstTick": int, #执行第一个选项 1 bytes
|
"executeOnFirstTick": int, #执行第一个选项 1 bytes
|
||||||
"trackOutput": int, #是否输出 1 bytes
|
"trackOutput": int, #是否输出 1 bytes
|
||||||
"conditional": int, #是否有条件 1 bytes
|
"conditional": int, #是否有条件 1 bytes
|
||||||
"needRedstone": int #是否需要红石 1 bytes
|
"needRedstone": int #是否需要红石 1 bytes
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
return {"direction": direction,
|
return {"direction": direction,
|
||||||
"block_name": "command_block",
|
"block_name": "command_block",
|
||||||
"particular_value": particularValue,
|
"particular_value": particularValue,
|
||||||
"impluse": impluse,
|
"impluse": impluse,
|
||||||
"command": command,
|
"command": command,
|
||||||
"customName": customName,
|
"customName": customName,
|
||||||
"lastOutput": lastOutput,
|
"lastOutput": lastOutput,
|
||||||
"tickdelay": tickDelay,
|
"tickdelay": tickDelay,
|
||||||
"executeOnFirstTick": executeOnFirstTick,
|
"executeOnFirstTick": executeOnFirstTick,
|
||||||
"trackOutput": trackOutput,
|
"trackOutput": trackOutput,
|
||||||
"conditional": condition,
|
"conditional": condition,
|
||||||
"needRedstone": needRedstone
|
"needRedstone": needRedstone
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def note2bdx(filePath: str, dire: list, Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
def note2bdx(filePath: str, dire: list, Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
||||||
isProsess: bool = False, height: int = 200):
|
isProsess: bool = False, height: int = 200):
|
||||||
"""使用方法同Note2Cmd
|
"""使用方法同Note2Cmd
|
||||||
:param 参数说明:
|
:param 参数说明:
|
||||||
filePath: 生成.bdx文件的位置
|
filePath: 生成.bdx文件的位置
|
||||||
dire: 指令方块在地图中生成的起始位置(相对位置)
|
dire: 指令方块在地图中生成的起始位置(相对位置)
|
||||||
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
||||||
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
||||||
ScoreboardName: 用于执行的计分板名称
|
ScoreboardName: 用于执行的计分板名称
|
||||||
Instrument: 播放的乐器
|
Instrument: 播放的乐器
|
||||||
PlayerSelect: 执行的玩家选择器
|
PlayerSelect: 执行的玩家选择器
|
||||||
isProsess: 是否显示进度条(会很卡)
|
isProsess: 是否显示进度条(会很卡)
|
||||||
height: 生成结构的最高高度
|
height: 生成结构的最高高度
|
||||||
:return 返回一个BdxConverter类(实际上没研究过),同时在指定位置生成.bdx文件"""
|
:return 返回一个BdxConverter类(实际上没研究过),同时在指定位置生成.bdx文件"""
|
||||||
|
|
||||||
from msctspt.transfer import formCmdBlock
|
# from msctspt.transfer import formCmdBlock
|
||||||
from nmcsup.trans import Note2Cmd
|
from nmcsup.trans import Note2Cmd
|
||||||
from msctspt.bdxOpera_CP import BdxConverter
|
from msctspt.bdxOpera_CP import BdxConverter
|
||||||
cmd = Note2Cmd(Notes, ScoreboardName, Instrument, PlayerSelect, isProsess)
|
cmd = Note2Cmd(Notes, ScoreboardName, Instrument, PlayerSelect, isProsess)
|
||||||
cdl = []
|
cdl = []
|
||||||
for i in cmd:
|
for i in cmd:
|
||||||
e = True
|
# e = True
|
||||||
try:
|
try:
|
||||||
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
||||||
cdl.append(i[:i.index('#')])
|
cdl.append(i[:i.index('#')])
|
||||||
e = False
|
# e = False
|
||||||
except ValueError:
|
except: # ValueError
|
||||||
cdl.append(i)
|
cdl.append(i)
|
||||||
finally:
|
# finally:
|
||||||
if e is True:
|
# if e is True:
|
||||||
cdl.append(i)
|
# cdl.append(i)
|
||||||
i = 0
|
i = 0
|
||||||
down = False
|
down = False
|
||||||
blocks = [formCmdBlock(dire, cdl.pop(0), 1, 1)]
|
blocks = [formCmdBlock(dire, cdl.pop(0), 1, 1)]
|
||||||
dire[1] += 1
|
dire[1] += 1
|
||||||
for j in cdl:
|
for j in cdl:
|
||||||
if dire[1] + i > height:
|
if dire[1] + i > height:
|
||||||
dire[0] += 1
|
dire[0] += 1
|
||||||
i = 0
|
i = 0
|
||||||
down = not down
|
down = not down
|
||||||
if dire[1] + i == height:
|
if dire[1] + i == height:
|
||||||
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 5, 2, False, False))
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 5, 2, False, False))
|
||||||
else:
|
else:
|
||||||
if down:
|
if down:
|
||||||
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 0, 2, False, False))
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 0, 2, False, False))
|
||||||
else:
|
else:
|
||||||
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 1, 2, False, False))
|
blocks.append(formCmdBlock([dire[0], dire[1] + i, dire[2]], j, 1, 2, False, False))
|
||||||
i += 1
|
i += 1
|
||||||
del i, cdl, down, cmd
|
del i, cdl, down, cmd
|
||||||
return BdxConverter(filePath, 'Build by RyounMusicreater', blocks)
|
return BdxConverter(filePath, 'Build by RyounMusicreater', blocks)
|
||||||
|
|
||||||
|
|
||||||
def note2webs(Notes: list, Instrument: str, speed: float = 5.0, PlayerSelect: str = '', isProsess: bool = False):
|
def note2webs(Notes: list, Instrument: str, speed: float = 5.0, PlayerSelect: str = '', isProsess: bool = False):
|
||||||
"""传入音符,在oaclhost:8080上建立websocket服务器以供我的世界connect/wssever指令连接
|
"""传入音符,在oaclhost:8080上建立websocket服务器以供我的世界connect/wssever指令连接
|
||||||
:param 参数说明:
|
:param 参数说明:
|
||||||
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
Notes: 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ] 格式存储的音符列表
|
||||||
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
例如Musicreater.py的(dataset[0]['musics'][NowMusic]['notes'])
|
||||||
Instrument: 播放的乐器
|
Instrument: 播放的乐器
|
||||||
speed: 用于控制播放速度,数值越大,播放速度越快,相当于把一秒变为几拍
|
speed: 用于控制播放速度,数值越大,播放速度越快,相当于把一秒变为几拍
|
||||||
PlayerSelect: 执行的玩家选择器
|
PlayerSelect: 执行的玩家选择器
|
||||||
isProsess: 是否显示进度条
|
isProsess: 是否显示进度条
|
||||||
:return None"""
|
:return None"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import fcwslib
|
import fcwslib
|
||||||
import asyncio
|
# import asyncio
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
from nmcsup.vers import VER
|
from nmcsup.vers import VER
|
||||||
|
|
||||||
async def run_server(websocket): # , path
|
async def run_server(websocket): # , path
|
||||||
log('服务器连接创建')
|
log('服务器连接创建')
|
||||||
await fcwslib.tellraw(websocket, '已连接服务器——音·创' + VER[1] + VER[0] + ' 作者:金羿(W-YI)')
|
await fcwslib.tellraw(websocket, '已连接服务器——音·创' + VER[1] + VER[0] + ' 作者:金羿(W-YI)')
|
||||||
length = len(Notes)
|
length = len(Notes)
|
||||||
j = 1
|
j = 1
|
||||||
if isProsess:
|
for i in range(len(Notes)):
|
||||||
length = len(Notes)
|
await fcwslib.send_command(websocket,
|
||||||
j = 1
|
f'execute @a{PlayerSelect} ~ ~ ~ playsound {Instrument} @s ~ ~ ~ 1000 '
|
||||||
for i in range(len(Notes)):
|
f'{Notes[i][0]} 1000')
|
||||||
await fcwslib.send_command(websocket,
|
if isProsess:
|
||||||
f'execute @a{PlayerSelect} ~ ~ ~ playsound {Instrument} @s ~ ~ ~ 1000 {Notes[i][0]} 1000')
|
await fcwslib.send_command(websocket,
|
||||||
if isProsess:
|
'execute @a' + PlayerSelect + ' ~ ~ ~ title @s actionbar §e▶ 播放中: §a' +
|
||||||
fcwslib.send_command(websocket,
|
str(
|
||||||
'execute @a' + PlayerSelect + ' ~ ~ ~ title @s actionbar §e▶ 播放中: §a' + str(
|
j) + '/' + str(length) + ' || ' + str(int(j / length * 1000) / 10))
|
||||||
j) + '/' + str(length) + ' || ' + str(int(j / length * 1000) / 10))
|
j += 1
|
||||||
j += 1
|
time.sleep(Notes[i][1] / speed)
|
||||||
time.sleep(Notes[i][1] / speed)
|
|
||||||
|
fcwslib.run_server(run_server)
|
||||||
fcwslib.run_server(run_server)
|
|
||||||
|
|
||||||
|
def note2RSworld(world: str, startpos: list, notes: list, instrument: str, speed: float = 2.5,
|
||||||
def note2RSworld(world: str, startpos: list, notes: list, instrument: str, speed: float = 2.5,
|
posadder: list = [1, 0, 0], baseblock: str = 'stone'): # -> bool
|
||||||
posadder: list = [1, 0, 0], baseblock: str = 'stone'): # -> bool
|
"""传入音符,生成以音符盒存储的红石音乐
|
||||||
"""传入音符,生成以音符盒存储的红石音乐
|
:param 参数说明:
|
||||||
:param 参数说明:
|
world: 地图文件的路径
|
||||||
world: 地图文件的路径
|
startpos: list[int,int,int] 开始生成的坐标
|
||||||
startpos: list[int,int,int] 开始生成的坐标
|
notes: list[list[float,float]] 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ]
|
||||||
notes: list[list[float,float]] 以 list[ list[ float我的世界playsound指令音调 , float延续时常(单位s) ] ]
|
格式存储的音符列表 例如Musicreater.py的dataset[0]['musics'][NowMusic]['notes']
|
||||||
格式存储的音符列表 例如Musicreater.py的dataset[0]['musics'][NowMusic]['notes']
|
instrument: 播放的乐器
|
||||||
instrument: 播放的乐器
|
speed: 一拍占多少个中继器延迟(红石刻/rt)
|
||||||
speed: 一拍占多少个中继器延迟(红石刻/rt)
|
posadder: list[int,int,int] 坐标增加规律,即红石的延长时按照此增加规律增加坐标
|
||||||
posadder: list[int,int,int] 坐标增加规律,即红石的延长时按照此增加规律增加坐标
|
baseblock: 在中继器下垫着啥方块呢~
|
||||||
baseblock: 在中继器下垫着啥方块呢~
|
:return 是否生成成功
|
||||||
:return 是否生成成功
|
"""
|
||||||
"""
|
|
||||||
|
from msctspt.values import height2note, instuments
|
||||||
from msctspt.values import height2note, instuments
|
|
||||||
|
def formNoteBlock(note: int, instrument1: str = 'note.harp', powered: bool = False):
|
||||||
def formNoteBlock(note: int, instrument1: str = 'note.harp', powered: bool = False):
|
"""生成音符盒方块
|
||||||
"""生成音符盒方块
|
:param powered:
|
||||||
:param powered:
|
:param instrument1:
|
||||||
:param instrument1:
|
:param note: 0~24
|
||||||
:param note: 0~24
|
:return Block()"""
|
||||||
:return Block()"""
|
if powered:
|
||||||
if powered:
|
powered = 'true'
|
||||||
powered = 'true'
|
else:
|
||||||
else:
|
powered = 'false'
|
||||||
powered = 'false'
|
return Block('universal_minecraft', 'noteblock',
|
||||||
return Block('universal_minecraft', 'noteblock',
|
{"instrument": ts(instrument1.replace("note.", '')), 'note': ts(str(note)),
|
||||||
{"instrument": ts(instrument1.replace("note.", '')), 'note': ts(str(note)),
|
'powered': ts(powered)})
|
||||||
'powered': ts(powered)})
|
|
||||||
|
def formRepeater(delay: int, facing: str, locked: bool = False, powered: bool = False):
|
||||||
def formRepeater(delay: int, facing: str, locked: bool = False, powered: bool = False):
|
"""生成中继器方块
|
||||||
"""生成中继器方块
|
:param powered:
|
||||||
:param powered:
|
:param locked:
|
||||||
:param locked:
|
:param facing:
|
||||||
:param facing:
|
:param delay: 1~4
|
||||||
:param delay: 1~4
|
:return Block()"""
|
||||||
:return Block()"""
|
if powered:
|
||||||
if powered:
|
powered = 'true'
|
||||||
powered = 'true'
|
else:
|
||||||
else:
|
powered = 'false'
|
||||||
powered = 'false'
|
if locked:
|
||||||
if locked:
|
locked = 'true'
|
||||||
locked = 'true'
|
else:
|
||||||
else:
|
locked = 'false'
|
||||||
locked = 'false'
|
return Block('universal_minecraft', 'repeater',
|
||||||
return Block('universal_minecraft', 'repeater',
|
{"delay": ts(str(delay)), 'facing': ts(facing), 'locked': ts(locked), 'powered': ts(powered)})
|
||||||
{"delay": ts(str(delay)), 'facing': ts(facing), 'locked': ts(locked), 'powered': ts(powered)})
|
|
||||||
|
level = amulet.load_level(world)
|
||||||
level = amulet.load_level(world)
|
|
||||||
|
def setblock(block: Block, pos: list):
|
||||||
def setblock(block: Block, pos: list):
|
"""pos : list[int,int,int]"""
|
||||||
"""pos : list[int,int,int]"""
|
cx, cz = bc2cc(pos[0], pos[2])
|
||||||
cx, cz = bc2cc(pos[0], pos[2])
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
offset_x, offset_z = pos[0] - 16 * cx, pos[2] - 16 * cz
|
||||||
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.blocks[offset_x, pos[1], offset_z] = level.block_palette.get_add_block(block)
|
chunk.changed = True
|
||||||
chunk.changed = True
|
|
||||||
|
# 1拍 x 2.5 rt
|
||||||
# 1拍 x 2.5 rt
|
def placeNoteBlock():
|
||||||
def placeNoteBlock():
|
for i in notes:
|
||||||
for i in notes:
|
error = True
|
||||||
error = True
|
try:
|
||||||
try:
|
setblock(formNoteBlock(height2note[i[0]], instrument), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(formNoteBlock(height2note[i[0]], instrument), [startpos[0], startpos[1] + 1, startpos[2]])
|
setblock(Block("universal_minecraft", instuments[i[0]][1]), startpos)
|
||||||
setblock(Block("universal_minecraft", instuments[i[0]][1]), startpos)
|
error = False
|
||||||
error = False
|
except ValueError:
|
||||||
except ValueError:
|
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
||||||
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
setblock(Block("universal_minecraft", baseblock), startpos)
|
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
finally:
|
||||||
finally:
|
if error is True:
|
||||||
if error is True:
|
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
||||||
log("无法放置音符:" + str(i) + '于' + str(startpos))
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
setblock(Block("universal_minecraft", baseblock), startpos)
|
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(Block("universal_minecraft", baseblock), [startpos[0], startpos[1] + 1, startpos[2]])
|
delay = int(i[1] * speed + 0.5)
|
||||||
delay = int(i[1] * speed + 0.5)
|
if delay <= 4:
|
||||||
if delay <= 4:
|
startpos[0] += 1
|
||||||
startpos[0] += 1
|
setblock(formRepeater(delay, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(formRepeater(delay, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
setblock(Block("universal_minecraft", baseblock), startpos)
|
else:
|
||||||
else:
|
for j in range(int(delay / 4)):
|
||||||
for j in range(int(delay / 4)):
|
startpos[0] += 1
|
||||||
startpos[0] += 1
|
setblock(formRepeater(4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(formRepeater(4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
setblock(Block("universal_minecraft", baseblock), startpos)
|
if delay % 4 != 0:
|
||||||
if delay % 4 != 0:
|
startpos[0] += 1
|
||||||
startpos[0] += 1
|
setblock(formRepeater(delay % 4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
||||||
setblock(formRepeater(delay % 4, 'west'), [startpos[0], startpos[1] + 1, startpos[2]])
|
setblock(Block("universal_minecraft", baseblock), startpos)
|
||||||
setblock(Block("universal_minecraft", baseblock), startpos)
|
startpos[0] += posadder[0]
|
||||||
startpos[0] += posadder[0]
|
startpos[1] += posadder[1]
|
||||||
startpos[1] += posadder[1]
|
startpos[2] += posadder[2]
|
||||||
startpos[2] += posadder[2]
|
|
||||||
|
# e = True
|
||||||
e = True
|
try:
|
||||||
try:
|
placeNoteBlock()
|
||||||
placeNoteBlock()
|
# e = False
|
||||||
e = False
|
except: # ValueError
|
||||||
except ValueError:
|
log("无法放置方块了,可能是因为区块未加载叭")
|
||||||
log("无法放置方块了,可能是因为区块未加载叭")
|
# finally:
|
||||||
finally:
|
# if e:
|
||||||
if e:
|
# log("无法放置方块了,可能是因为区块未加载叭")
|
||||||
log("无法放置方块了,可能是因为区块未加载叭")
|
level.save()
|
||||||
level.save()
|
level.close()
|
||||||
level.close()
|
|
||||||
|
|
||||||
|
class ryStruct:
|
||||||
class ryStruct:
|
|
||||||
|
def __init__(self, world: str) -> None:
|
||||||
def __init__(self, world: str) -> None:
|
|
||||||
|
self.RyStruct = dict()
|
||||||
self.RyStruct = dict()
|
self._world = world
|
||||||
self._world = world
|
self._level = amulet.load_level(world)
|
||||||
self._level = amulet.load_level(world)
|
|
||||||
|
def reloadLevel(self):
|
||||||
def reloadLevel(self):
|
# e = True
|
||||||
e = True
|
try:
|
||||||
try:
|
self._level = amulet.load_level(self.world)
|
||||||
self._level = amulet.load_level(self.world)
|
# e = False
|
||||||
e = False
|
except: # ValueError
|
||||||
except ValueError:
|
log("无法重载地图")
|
||||||
log("无法重载地图")
|
# finally:
|
||||||
finally:
|
# if e:
|
||||||
if e:
|
# log("无法重载地图")
|
||||||
log("无法重载地图")
|
|
||||||
|
def closeLevel(self):
|
||||||
def closeLevel(self):
|
# e = True
|
||||||
e = True
|
try:
|
||||||
try:
|
self._level.close()
|
||||||
self._level.close()
|
# e = False
|
||||||
e = False
|
except: # ValueError
|
||||||
except ValueError:
|
log("无法关闭地图")
|
||||||
log("无法关闭地图")
|
# finally:
|
||||||
finally:
|
# if e:
|
||||||
if e:
|
# log("无法重载地图")
|
||||||
log("无法重载地图")
|
|
||||||
|
def world2Rys(self, startp: list, endp: list, includeAir: bool = False):
|
||||||
def world2Rys(self, startp: list, endp: list, includeAir: bool = False):
|
"""将世界转换为RyStruct字典,注意,此函数运行成功后将关闭地图,若要打开需要运行 reloadLevel
|
||||||
"""将世界转换为RyStruct字典,注意,此函数运行成功后将关闭地图,若要打开需要运行 reloadLevel
|
:param startp: [x,y,z] 转化的起始坐标
|
||||||
:param startp: [x,y,z] 转化的起始坐标
|
:param endp : [x,y,z] 转换的终止坐标,注意,终止坐标需要大于起始坐标,且最终结果包含终止坐标
|
||||||
:param endp : [x,y,z] 转换的终止坐标,注意,终止坐标需要大于起始坐标,且最终结果包含终止坐标
|
:param includeAir : bool = False 是否包含空气,即空气是否在生成之时覆盖地图内容
|
||||||
:param includeAir : bool = False 是否包含空气,即空气是否在生成之时覆盖地图内容
|
:return dict RyStruct """
|
||||||
:return dict RyStruct """
|
|
||||||
|
level = self._level
|
||||||
level = self._level
|
|
||||||
|
for x in range(startp[0], endp[0] + 1):
|
||||||
for x in range(startp[0], endp[0] + 1):
|
for y in range(startp[1], endp[1] + 1):
|
||||||
for y in range(startp[1], endp[1] + 1):
|
for z in range(startp[2], endp[2] + 1):
|
||||||
for z in range(startp[2], endp[2] + 1):
|
|
||||||
|
RyStructBlock = dict()
|
||||||
RyStructBlock = dict()
|
|
||||||
|
cx, cz = bc2cc(x, z)
|
||||||
cx, cz = bc2cc(x, z)
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
universal_block = chunk.block_palette[chunk.blocks[x - 16 * cx, y, z - 16 * cz]]
|
||||||
universal_block = chunk.block_palette[chunk.blocks[x - 16 * cx, y, z - 16 * cz]]
|
if universal_block == Block("universal_minecraft", "air") and includeAir:
|
||||||
if universal_block == Block("universal_minecraft", "air") and includeAir:
|
continue
|
||||||
continue
|
universal_block_entity = chunk.block_entities.get((x, y, z), None)
|
||||||
universal_block_entity = chunk.block_entities.get((x, y, z), None)
|
|
||||||
|
RyStructBlock["block"] = str(universal_block)
|
||||||
RyStructBlock["block"] = str(universal_block)
|
RyStructBlock["blockEntity"] = str(universal_block_entity)
|
||||||
RyStructBlock["blockEntity"] = str(universal_block_entity)
|
|
||||||
|
log("载入方块数据" + str(RyStructBlock))
|
||||||
log("载入方块数据" + str(RyStructBlock))
|
|
||||||
|
self.RyStruct[(x, y, z)] = RyStructBlock
|
||||||
self.RyStruct[(x, y, z)] = RyStructBlock
|
|
||||||
|
level.close()
|
||||||
level.close()
|
|
||||||
|
return self.RyStruct
|
||||||
return self.RyStruct
|
|
||||||
|
|
||||||
|
"""
|
||||||
"""
|
RyStruct = {
|
||||||
RyStruct = {
|
(0,0,0) = {
|
||||||
(0,0,0) = {
|
"block": str 完整的方块结构
|
||||||
"block": str 完整的方块结构
|
"blockEntity": str | 'None'
|
||||||
"blockEntity": str | 'None'
|
}
|
||||||
}
|
}
|
||||||
}
|
"""
|
||||||
"""
|
|
||||||
|
|||||||
+56
-56
@@ -1,56 +1,56 @@
|
|||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:40个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:40个
|
||||||
|
|
||||||
instuments = {
|
instuments = {
|
||||||
'note.banjo': ['班卓琴', 'hay_block'],
|
'note.banjo': ['班卓琴', 'hay_block'],
|
||||||
'note.bass': ['贝斯', 'planks'],
|
'note.bass': ['贝斯', 'planks'],
|
||||||
'note.bassattack': ['低音鼓/贝斯', 'log'],
|
'note.bassattack': ['低音鼓/贝斯', 'log'],
|
||||||
'note.bd': ['底鼓', 'stone'], # 即basedrum
|
'note.bd': ['底鼓', 'stone'], # 即basedrum
|
||||||
'note.bell': ['铃铛/钟琴', 'gold_block'],
|
'note.bell': ['铃铛/钟琴', 'gold_block'],
|
||||||
'note.bit': ['比特/“芯片”(方波)', 'emerald_block'],
|
'note.bit': ['比特/“芯片”(方波)', 'emerald_block'],
|
||||||
'note.chime': ['管钟', 'packed_ice'],
|
'note.chime': ['管钟', 'packed_ice'],
|
||||||
'note.cow_bell': ['牛铃', 'soul_sand'],
|
'note.cow_bell': ['牛铃', 'soul_sand'],
|
||||||
'note.didgeridoo': ['迪吉里杜管', 'pumpkin'],
|
'note.didgeridoo': ['迪吉里杜管', 'pumpkin'],
|
||||||
'note.flute': ['长笛', 'clay'],
|
'note.flute': ['长笛', 'clay'],
|
||||||
'note.guitar': ['吉他', 'wool'],
|
'note.guitar': ['吉他', 'wool'],
|
||||||
'note.harp': ['竖琴/钢琴', 'concrete'], # 任意其他类型的方块皆可
|
'note.harp': ['竖琴/钢琴', 'concrete'], # 任意其他类型的方块皆可
|
||||||
'note.hat': ['击鼓沿/架子鼓', 'glass'],
|
'note.hat': ['击鼓沿/架子鼓', 'glass'],
|
||||||
'note.iron_xylophone': ['“铁木琴”(颤音琴)', 'iron_block'],
|
'note.iron_xylophone': ['“铁木琴”(颤音琴)', 'iron_block'],
|
||||||
'note.pling': ['“扣弦”(电钢琴)', 'glowstone'],
|
'note.pling': ['“扣弦”(电钢琴)', 'glowstone'],
|
||||||
'note.snare': ['小军鼓', 'sand'],
|
'note.snare': ['小军鼓', 'sand'],
|
||||||
'note.xylophone': ['木琴', 'bone_block']
|
'note.xylophone': ['木琴', 'bone_block']
|
||||||
}
|
}
|
||||||
'''乐器对照表\n
|
'''乐器对照表\n
|
||||||
乐器英文:[中文, 对应音符盒下方块名称]
|
乐器英文:[中文, 对应音符盒下方块名称]
|
||||||
注:方块仅取一个'''
|
注:方块仅取一个'''
|
||||||
|
|
||||||
height2note = {
|
height2note = {
|
||||||
0.5: 0,
|
0.5: 0,
|
||||||
0.53: 1,
|
0.53: 1,
|
||||||
0.56: 2,
|
0.56: 2,
|
||||||
0.6: 3,
|
0.6: 3,
|
||||||
0.63: 4,
|
0.63: 4,
|
||||||
0.67: 5,
|
0.67: 5,
|
||||||
0.7: 6,
|
0.7: 6,
|
||||||
0.75: 7,
|
0.75: 7,
|
||||||
0.8: 8,
|
0.8: 8,
|
||||||
0.84: 9,
|
0.84: 9,
|
||||||
0.9: 10,
|
0.9: 10,
|
||||||
0.94: 11,
|
0.94: 11,
|
||||||
1.0: 12,
|
1.0: 12,
|
||||||
|
|
||||||
1.05: 13,
|
1.05: 13,
|
||||||
1.12: 14,
|
1.12: 14,
|
||||||
1.2: 15,
|
1.2: 15,
|
||||||
1.25: 16,
|
1.25: 16,
|
||||||
1.33: 17,
|
1.33: 17,
|
||||||
1.4: 18,
|
1.4: 18,
|
||||||
1.5: 19,
|
1.5: 19,
|
||||||
1.6: 20,
|
1.6: 20,
|
||||||
1.7: 21,
|
1.7: 21,
|
||||||
1.8: 22,
|
1.8: 22,
|
||||||
1.9: 23,
|
1.9: 23,
|
||||||
2.0: 24,
|
2.0: 24,
|
||||||
}
|
}
|
||||||
'''音高对照表\n
|
'''音高对照表\n
|
||||||
MC音高:音符盒音调'''
|
MC音高:音符盒音调'''
|
||||||
|
|||||||
+71
-71
@@ -1,72 +1,72 @@
|
|||||||
从此日志开始,我的世界函数音乐构建更名为 函数音创 NoteFunCreater(谐音NotFun[狗头]),版本号更为0.1.0开始
|
从此日志开始,我的世界函数音乐构建更名为 函数音创 NoteFunCreater(谐音NotFun[狗头]),版本号更为0.1.0开始
|
||||||
|
|
||||||
注意,运行此文件需要第三方库:
|
注意,运行此文件需要第三方库:
|
||||||
1. mido 用于对midi文件的解码
|
1. mido 用于对midi文件的解码
|
||||||
2. py7zr 用于对7z压缩包的压缩与解压等(需pycparser, cffi, texttable, pyzstd, pyppmd, pycryptodomex, multivolumefile, brotli, bcj-cffi支持) -(从0.1.3开始不需要)
|
2. py7zr 用于对7z压缩包的压缩与解压等(需pycparser, cffi, texttable, pyzstd, pyppmd, pycryptodomex, multivolumefile, brotli, bcj-cffi支持) -(从0.1.3开始不需要)
|
||||||
3. zipfile 用于自动生成函数包的压缩
|
3. zipfile 用于自动生成函数包的压缩
|
||||||
4. pystray 用于支持窗口任务栏
|
4. pystray 用于支持窗口任务栏
|
||||||
5. pillow (相当于Python2的PIL)用于绘图
|
5. pillow (相当于Python2的PIL)用于绘图
|
||||||
|
|
||||||
|
|
||||||
0.1.0
|
0.1.0
|
||||||
2021 7 10 - 2021 7 12
|
2021 7 10 - 2021 7 12
|
||||||
1.程序窗口化
|
1.程序窗口化
|
||||||
2.仅支持基本的菜单操作
|
2.仅支持基本的菜单操作
|
||||||
3.程序文件皆储存至其相应目录下
|
3.程序文件皆储存至其相应目录下
|
||||||
4.程序./bin/目录下文件将会自动防修改
|
4.程序./bin/目录下文件将会自动防修改
|
||||||
5.删除了彩蛋
|
5.删除了彩蛋
|
||||||
|
|
||||||
|
|
||||||
0.1.1
|
0.1.1
|
||||||
2021 7 14
|
2021 7 14
|
||||||
1.新增版本辨别的提示
|
1.新增版本辨别的提示
|
||||||
2.窗口中显示歌曲信息
|
2.窗口中显示歌曲信息
|
||||||
|
|
||||||
|
|
||||||
0.1.2
|
0.1.2
|
||||||
2021 7 14 - 2021 7 15
|
2021 7 14 - 2021 7 15
|
||||||
1.在没运行过的机器上会自动安装库
|
1.在没运行过的机器上会自动安装库
|
||||||
2.从midi导入时不会删除其他音轨
|
2.从midi导入时不会删除其他音轨
|
||||||
3.改进UI样式
|
3.改进UI样式
|
||||||
4.支持对于单个音轨设置的修改以及音乐主设置的修改
|
4.支持对于单个音轨设置的修改以及音乐主设置的修改
|
||||||
5.当未保存便退出时,会询问存储
|
5.当未保存便退出时,会询问存储
|
||||||
6.新增加载进度提示
|
6.新增加载进度提示
|
||||||
|
|
||||||
|
|
||||||
0.1.3
|
0.1.3
|
||||||
2021 7 15 - 2021 7 19
|
2021 7 15 - 2021 7 19
|
||||||
1.不再从文件中读取音符及乐器信息(所以包更小了)
|
1.不再从文件中读取音符及乐器信息(所以包更小了)
|
||||||
2.改进UI
|
2.改进UI
|
||||||
3.修复了修改玩家选择器时变更了音乐标题的bug
|
3.修复了修改玩家选择器时变更了音乐标题的bug
|
||||||
4.新增删除当前选定音轨按钮
|
4.新增删除当前选定音轨按钮
|
||||||
5.新增重置设置按钮(将音乐总设置设置为开始时的设置)
|
5.新增重置设置按钮(将音乐总设置设置为开始时的设置)
|
||||||
6.运用多线程加载函数与文件等,程序运行效率更高
|
6.运用多线程加载函数与文件等,程序运行效率更高
|
||||||
7.修复变量作用域混淆问题
|
7.修复变量作用域混淆问题
|
||||||
|
|
||||||
|
|
||||||
0.1.3.1
|
0.1.3.1
|
||||||
2021 7 19
|
2021 7 19
|
||||||
1.修复了菜单中无法退出程序的问题
|
1.修复了菜单中无法退出程序的问题
|
||||||
|
|
||||||
|
|
||||||
0.1.4
|
0.1.4
|
||||||
2021 7 22
|
2021 7 22
|
||||||
1.支持显示指令于列表中
|
1.支持显示指令于列表中
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TO-DO
|
TO-DO
|
||||||
1.支持从midi文件的元信息中收取音符信息并自动生成
|
1.支持从midi文件的元信息中收取音符信息并自动生成
|
||||||
2.支持生成zip函数包
|
2.支持生成zip函数包
|
||||||
3.支持使用WebSocket接口自动播放已编辑的音乐
|
3.支持使用WebSocket接口自动播放已编辑的音乐
|
||||||
4.可以编辑多个项目
|
4.可以编辑多个项目
|
||||||
5.能够自动将一个长串的音乐分成多个函数文件
|
5.能够自动将一个长串的音乐分成多个函数文件
|
||||||
6.支持用户导入自己的乐器
|
6.支持用户导入自己的乐器
|
||||||
7.支持汇报崩溃记录(通过邮件附件的方式)
|
7.支持汇报崩溃记录(通过邮件附件的方式)
|
||||||
8.支持播放字幕
|
8.支持播放字幕
|
||||||
9.支持任务栏角标与通知
|
9.支持任务栏角标与通知
|
||||||
10.将控制台版本的彩蛋移植到此版本,开启了任务栏
|
10.将控制台版本的彩蛋移植到此版本,开启了任务栏
|
||||||
11.可编辑音符
|
11.可编辑音符
|
||||||
+36
-36
@@ -1,36 +1,36 @@
|
|||||||
世界音创(NoteMapCreater)是金羿开发的一款用于生成我的世界中各类有关音乐的物件的软件
|
世界音创(NoteMapCreater)是金羿开发的一款用于生成我的世界中各类有关音乐的物件的软件
|
||||||
软件禁止商用,源代码始终公开,如使用未经授权的音乐经过此软件生成的任何物件侵犯了他人权利与本软件及其作者无关
|
软件禁止商用,源代码始终公开,如使用未经授权的音乐经过此软件生成的任何物件侵犯了他人权利与本软件及其作者无关
|
||||||
|
|
||||||
Copyright © W-YI 2021
|
Copyright © W-YI 2021
|
||||||
|
|
||||||
开头,特别感谢:
|
开头,特别感谢:
|
||||||
KCINE:提供Cinemusicedit函数包(虽然函数包没怎么用过)
|
KCINE:提供Cinemusicedit函数包(虽然函数包没怎么用过)
|
||||||
Charlie_Ping:提供MusiCreaterBot(音乐地图生成QQ机器人)源码核心以及时不时的催更(虽然源码没有抄)
|
Charlie_Ping:提供MusiCreaterBot(音乐地图生成QQ机器人)源码核心以及时不时的催更(虽然源码没有抄)
|
||||||
金羿(作者本人):提供NoteFunCreater(函数音创)的制作经验以及时不时的摸鱼(虽然不是很支持函数音创)
|
金羿(作者本人):提供NoteFunCreater(函数音创)的制作经验以及时不时的摸鱼(虽然不是很支持函数音创)
|
||||||
广大群友:高效的催更作业让我以蜗牛的速度前进
|
广大群友:高效的催更作业让我以蜗牛的速度前进
|
||||||
|
|
||||||
Alpha 0.0.0
|
Alpha 0.0.0
|
||||||
2021 8 1 - 2021 8 10
|
2021 8 1 - 2021 8 10
|
||||||
1.确定了大概的功能
|
1.确定了大概的功能
|
||||||
2.不支持无参数传入
|
2.不支持无参数传入
|
||||||
3.可以查看帮助,但是帮助大多功能没实现
|
3.可以查看帮助,但是帮助大多功能没实现
|
||||||
4.可以从格式文本、midi文件、钢琴声音MP3导入音轨
|
4.可以从格式文本、midi文件、钢琴声音MP3导入音轨
|
||||||
5.可以生成一些方块到世界里,但是没有播放器(半支持bw开关)
|
5.可以生成一些方块到世界里,但是没有播放器(半支持bw开关)
|
||||||
5.提供了修改文件地址的方法,但是不能修改
|
5.提供了修改文件地址的方法,但是不能修改
|
||||||
|
|
||||||
Alpha 0.0.1
|
Alpha 0.0.1
|
||||||
2021 8 10
|
2021 8 10
|
||||||
1.可以从函数音创的工程文件读取音轨
|
1.可以从函数音创的工程文件读取音轨
|
||||||
2.可以新建一个空白世界来生成
|
2.可以新建一个空白世界来生成
|
||||||
3.支持修改输出文件地址
|
3.支持修改输出文件地址
|
||||||
4.支持修改输出方块起始位置
|
4.支持修改输出方块起始位置
|
||||||
5.支持指定播放乐器,执行实体,执行积分板,播放玩家选择器
|
5.支持指定播放乐器,执行实体,执行积分板,播放玩家选择器
|
||||||
6.可以生成指令音乐地图(完全支持-w开关)
|
6.可以生成指令音乐地图(完全支持-w开关)
|
||||||
|
|
||||||
Beta 0.0.0
|
Beta 0.0.0
|
||||||
2021 8 X?
|
2021 8 X?
|
||||||
1.除了-nw 和 -f 开关不支持以外都支持了
|
1.除了-nw 和 -f 开关不支持以外都支持了
|
||||||
|
|
||||||
Beta 0.0.1
|
Beta 0.0.1
|
||||||
2021 8 19
|
2021 8 19
|
||||||
1.修复了大量bug
|
1.修复了大量bug
|
||||||
|
|||||||
+446
-312
@@ -1,312 +1,446 @@
|
|||||||
"""音创系列的音符对照表 以及一系列常数"""
|
"""音创系列的音符对照表 以及一系列常数"""
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:109个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:109个
|
||||||
|
|
||||||
|
|
||||||
notes = {
|
notes = {
|
||||||
'....A': [0.074, 27.5, 'wood', 8],
|
'....A': [0.074, 27.5, 'wood', 8],
|
||||||
'....A#': [0.0787, 29.135, 'wood', 9],
|
'....A#': [0.0787, 29.135, 'wood', 9],
|
||||||
'....B': [0.083, 30.868, 'wood', 10],
|
'....B': [0.083, 30.868, 'wood', 10],
|
||||||
'...C': [0.088, 32.703, 'wood', 11],
|
'...C': [0.088, 32.703, 'wood', 11],
|
||||||
'...C#': [0.094, 34.648, 'wood', 12],
|
'...C#': [0.094, 34.648, 'wood', 12],
|
||||||
'...D': [0.1, 36.708, 'wood', 13],
|
'...D': [0.1, 36.708, 'wood', 13],
|
||||||
'...D#': [0.105, 38.891, 'log', 0],
|
'...D#': [0.105, 38.891, 'log', 0],
|
||||||
'...E': [0.11, 41.203, 'log', 1],
|
'...E': [0.11, 41.203, 'log', 1],
|
||||||
'...F': [0.12, 43.654, 'log', 2],
|
'...F': [0.12, 43.654, 'log', 2],
|
||||||
'...F#': [0.125, 46.249, 'wood', 0],
|
'...F#': [0.125, 46.249, 'wood', 0],
|
||||||
'...G': [0.13, 48.999, 'wood', 1],
|
'...G': [0.13, 48.999, 'wood', 1],
|
||||||
'...G#': [0.14, 51.913, 'wood', 2],
|
'...G#': [0.14, 51.913, 'wood', 2],
|
||||||
'...A': [0.15, 55.0, 'wood', 3],
|
'...A': [0.15, 55.0, 'wood', 3],
|
||||||
'...A#': [0.16, 58.27, 'wood', 4],
|
'...A#': [0.16, 58.27, 'wood', 4],
|
||||||
'...B': [0.17, 61.735, 'wood', 5],
|
'...B': [0.17, 61.735, 'wood', 5],
|
||||||
'..C': [0.18, 65.406, 'wool', 0],
|
'..C': [0.18, 65.406, 'wool', 0],
|
||||||
'..C#': [0.19, 69.296, 'wool', 1],
|
'..C#': [0.19, 69.296, 'wool', 1],
|
||||||
'..D': [0.2, 73.416, 'wool', 2],
|
'..D': [0.2, 73.416, 'wool', 2],
|
||||||
'..D#': [0.21, 77.782, 'wool', 3],
|
'..D#': [0.21, 77.782, 'wool', 3],
|
||||||
'..E': [0.22, 82.407, 'wool', 4],
|
'..E': [0.22, 82.407, 'wool', 4],
|
||||||
'..F': [0.235, 87.307, 'wool', 5],
|
'..F': [0.235, 87.307, 'wool', 5],
|
||||||
'..F#': [0.25, 92.499, 'concretepowder', 0],
|
'..F#': [0.25, 92.499, 'concretepowder', 0],
|
||||||
'..G': [0.26, 97.999, 'concretepowder', 1],
|
'..G': [0.26, 97.999, 'concretepowder', 1],
|
||||||
'..G#': [0.28, 103.826, 'concretepowder', 2],
|
'..G#': [0.28, 103.826, 'concretepowder', 2],
|
||||||
'..A': [0.3, 110.0, 'concretepowder', 3],
|
'..A': [0.3, 110.0, 'concretepowder', 3],
|
||||||
'..A#': [0.31, 116.541, 'concretepowder', 4],
|
'..A#': [0.31, 116.541, 'concretepowder', 4],
|
||||||
'..B': [0.33, 123.471, 'concretepowder', 5],
|
'..B': [0.33, 123.471, 'concretepowder', 5],
|
||||||
'.C': [0.35, 130.813, 'concretepowder', 6],
|
'.C': [0.35, 130.813, 'concretepowder', 6],
|
||||||
'.C#': [0.37, 138.591, 'concretepowder', 7],
|
'.C#': [0.37, 138.591, 'concretepowder', 7],
|
||||||
'.D': [0.4, 146.832, 'concretepowder', 8],
|
'.D': [0.4, 146.832, 'concretepowder', 8],
|
||||||
'.D#': [0.42, 155.563, 'concretepowder', 9],
|
'.D#': [0.42, 155.563, 'concretepowder', 9],
|
||||||
'.E': [0.44, 164.814, 'concretepowder', 10],
|
'.E': [0.44, 164.814, 'concretepowder', 10],
|
||||||
'.F': [0.47, 174.614, 'concretepowder', 11],
|
'.F': [0.47, 174.614, 'concretepowder', 11],
|
||||||
'.F#': [0.5, 184.997, 'concretepowder', 12],
|
'.F#': [0.5, 184.997, 'concretepowder', 12],
|
||||||
'.G': [0.53, 195.998, 'concretepowder', 13],
|
'.G': [0.53, 195.998, 'concretepowder', 13],
|
||||||
'.G#': [0.56, 207.652, 'concretepowder', 14],
|
'.G#': [0.56, 207.652, 'concretepowder', 14],
|
||||||
'.A': [0.6, 220.0, 'concretepowder', 15],
|
'.A': [0.6, 220.0, 'concretepowder', 15],
|
||||||
'.A#': [0.63, 233.082, 'concrete', 0],
|
'.A#': [0.63, 233.082, 'concrete', 0],
|
||||||
'.B': [0.67, 246.942, 'concrete', 1],
|
'.B': [0.67, 246.942, 'concrete', 1],
|
||||||
'C': [0.7, 261.626, 'concrete', 2],
|
'C': [0.7, 261.626, 'concrete', 2],
|
||||||
'C#': [0.75, 277.183, 'concrete', 3],
|
'C#': [0.75, 277.183, 'concrete', 3],
|
||||||
'D': [0.8, 293.665, 'concrete', 4],
|
'D': [0.8, 293.665, 'concrete', 4],
|
||||||
'D#': [0.84, 311.127, 'concrete', 5],
|
'D#': [0.84, 311.127, 'concrete', 5],
|
||||||
'E': [0.9, 329.628, 'concrete', 6],
|
'E': [0.9, 329.628, 'concrete', 6],
|
||||||
'F': [0.94, 349.228, 'concrete', 7],
|
'F': [0.94, 349.228, 'concrete', 7],
|
||||||
'F#': [1.0, 369.994, 'concrete', 8],
|
'F#': [1.0, 369.994, 'concrete', 8],
|
||||||
'G': [1.05, 391.995, 'concrete', 9],
|
'G': [1.05, 391.995, 'concrete', 9],
|
||||||
'G#': [1.12, 415.305, 'concrete', 10],
|
'G#': [1.12, 415.305, 'concrete', 10],
|
||||||
'A': [1.2, 440.0, 'concrete', 11],
|
'A': [1.2, 440.0, 'concrete', 11],
|
||||||
'A#': [1.25, 466.164, 'concrete', 12],
|
'A#': [1.25, 466.164, 'concrete', 12],
|
||||||
'B': [1.33, 493.883, 'concrete', 13],
|
'B': [1.33, 493.883, 'concrete', 13],
|
||||||
'`C': [1.4, 523.251, 'concrete', 14],
|
'`C': [1.4, 523.251, 'concrete', 14],
|
||||||
'`C#': [1.5, 554.365, 'concrete', 15],
|
'`C#': [1.5, 554.365, 'concrete', 15],
|
||||||
'`D': [1.6, 587.33, 'stained_hardened_clay', 0],
|
'`D': [1.6, 587.33, 'stained_hardened_clay', 0],
|
||||||
'`D#': [1.7, 622.254, 'stained_hardened_clay', 1],
|
'`D#': [1.7, 622.254, 'stained_hardened_clay', 1],
|
||||||
'`E': [1.8, 659.255, 'stained_hardened_clay', 2],
|
'`E': [1.8, 659.255, 'stained_hardened_clay', 2],
|
||||||
'`F': [1.9, 698.456, 'stained_hardened_clay', 3],
|
'`F': [1.9, 698.456, 'stained_hardened_clay', 3],
|
||||||
'`F#': [2.0, 739.989, 'stained_hardened_clay', 4],
|
'`F#': [2.0, 739.989, 'stained_hardened_clay', 4],
|
||||||
'`G': [2.1, 783.991, 'stained_hardened_clay', 5],
|
'`G': [2.1, 783.991, 'stained_hardened_clay', 5],
|
||||||
'`G#': [2.24, 830.609, 'stained_hardened_clay', 6],
|
'`G#': [2.24, 830.609, 'stained_hardened_clay', 6],
|
||||||
'`A': [2.4, 880.0, 'stained_hardened_clay', 7],
|
'`A': [2.4, 880.0, 'stained_hardened_clay', 7],
|
||||||
'`A#': [2.5, 932.328, 'stained_hardened_clay', 8],
|
'`A#': [2.5, 932.328, 'stained_hardened_clay', 8],
|
||||||
'`B': [2.67, 987.767, 'stained_hardened_clay', 9],
|
'`B': [2.67, 987.767, 'stained_hardened_clay', 9],
|
||||||
'``C': [2.83, 1046.502, 'stained_hardened_clay', 10],
|
'``C': [2.83, 1046.502, 'stained_hardened_clay', 10],
|
||||||
'``C#': [3.0, 1108.731, 'stained_hardened_clay', 11],
|
'``C#': [3.0, 1108.731, 'stained_hardened_clay', 11],
|
||||||
'``D': [3.17, 1174.659, 'stained_hardened_clay', 12],
|
'``D': [3.17, 1174.659, 'stained_hardened_clay', 12],
|
||||||
'``D#': [3.36, 1244.508, 'stained_hardened_clay', 13],
|
'``D#': [3.36, 1244.508, 'stained_hardened_clay', 13],
|
||||||
'``E': [3.56, 1318.51, 'stained_hardened_clay', 14],
|
'``E': [3.56, 1318.51, 'stained_hardened_clay', 14],
|
||||||
'``F': [3.78, 1396.913, 'stained_hardened_clay', 15],
|
'``F': [3.78, 1396.913, 'stained_hardened_clay', 15],
|
||||||
'``F#': [4.0, 1479.978, 'white_glazed_terracotta', 0],
|
'``F#': [4.0, 1479.978, 'white_glazed_terracotta', 0],
|
||||||
'``G': [4.24, 1567.982, 'orange_glazed_terracotta', 0],
|
'``G': [4.24, 1567.982, 'orange_glazed_terracotta', 0],
|
||||||
'``G#': [4.5, 1661.219, 'magenta_glazed_terracotta', 0],
|
'``G#': [4.5, 1661.219, 'magenta_glazed_terracotta', 0],
|
||||||
'``A': [4.76, 1760.0, 'light_blue_glazed_terracotta', 0],
|
'``A': [4.76, 1760.0, 'light_blue_glazed_terracotta', 0],
|
||||||
'``A#': [5.04, 1864.655, 'yellow_glazed_terracotta', 0],
|
'``A#': [5.04, 1864.655, 'yellow_glazed_terracotta', 0],
|
||||||
'``B': [5.34, 1975.533, 'lime_glazed_terracotta', 0],
|
'``B': [5.34, 1975.533, 'lime_glazed_terracotta', 0],
|
||||||
'```C': [5.66, 2093.005, 'pink_glazed_terracotta', 0],
|
'```C': [5.66, 2093.005, 'pink_glazed_terracotta', 0],
|
||||||
'```C#': [6.0, 2217.461, 'gray_glazed_terracotta', 0],
|
'```C#': [6.0, 2217.461, 'gray_glazed_terracotta', 0],
|
||||||
'```D': [6.35, 2349.318, 'silver_glazed_terracotta', 0],
|
'```D': [6.35, 2349.318, 'silver_glazed_terracotta', 0],
|
||||||
'```D#': [6.73, 2489.016, 'cyan_glazed_terracotta', 0],
|
'```D#': [6.73, 2489.016, 'cyan_glazed_terracotta', 0],
|
||||||
'```E': [7.13, 2637.02, 'purple_glazed_terracotta', 0],
|
'```E': [7.13, 2637.02, 'purple_glazed_terracotta', 0],
|
||||||
'```F': [7.55, 2793.826, 'blue_glazed_terracotta', 0],
|
'```F': [7.55, 2793.826, 'blue_glazed_terracotta', 0],
|
||||||
'```F#': [8.0, 2959.955, 'brown_glazed_terracotta', 0],
|
'```F#': [8.0, 2959.955, 'brown_glazed_terracotta', 0],
|
||||||
'```G': [8.47, 3135.963, 'green_glazed_terracotta', 0],
|
'```G': [8.47, 3135.963, 'green_glazed_terracotta', 0],
|
||||||
'```G#': [8.98, 3322.438, 'red_glazed_terracotta', 0],
|
'```G#': [8.98, 3322.438, 'red_glazed_terracotta', 0],
|
||||||
'```A': [9.51, 3520.0, 'black_glazed_terracotta', 0],
|
'```A': [9.51, 3520.0, 'black_glazed_terracotta', 0],
|
||||||
'```A#': [10.08, 3729.31, 'stained_glass', 0],
|
'```A#': [10.08, 3729.31, 'stained_glass', 0],
|
||||||
'```B': [10.68, 3951.066, 'stained_glass', 1],
|
'```B': [10.68, 3951.066, 'stained_glass', 1],
|
||||||
'````C': [11.31, 4186.009, 'stained_glass', 2],
|
'````C': [11.31, 4186.009, 'stained_glass', 2],
|
||||||
'0': [0.0, 0.0, 'glass', 0]
|
'0': [0.0, 0.0, 'glass', 0]
|
||||||
}
|
}
|
||||||
'''音符对照表\n
|
'''音符对照表\n
|
||||||
音符:[MC音调, 声音频率, 方块名称, 数据值]'''
|
音符:[MC音调, 声音频率, 方块名称, 数据值]'''
|
||||||
|
|
||||||
# 方块
|
# 方块
|
||||||
'''
|
'''
|
||||||
blocks = {
|
blocks = {
|
||||||
0.074 : ['stained_glass', 3],
|
0.074 : ['stained_glass', 3],
|
||||||
0.0787 : ['stained_glass', 4],
|
0.0787 : ['stained_glass', 4],
|
||||||
0.083 : ['stained_glass', 5],
|
0.083 : ['stained_glass', 5],
|
||||||
0.088 : ['stained_glass', 6],
|
0.088 : ['stained_glass', 6],
|
||||||
0.094 : ['stained_glass', 7],
|
0.094 : ['stained_glass', 7],
|
||||||
0.1 : ['stained_glass', 8],
|
0.1 : ['stained_glass', 8],
|
||||||
0.105 : ['stained_glass', 9],
|
0.105 : ['stained_glass', 9],
|
||||||
0.11 : ['stained_glass', 10],
|
0.11 : ['stained_glass', 10],
|
||||||
0.12 : ['stained_glass', 11],
|
0.12 : ['stained_glass', 11],
|
||||||
0.125 : ['stained_glass', 12],
|
0.125 : ['stained_glass', 12],
|
||||||
0.13 : ['stained_glass', 13],
|
0.13 : ['stained_glass', 13],
|
||||||
0.14 : ['stained_glass', 14],
|
0.14 : ['stained_glass', 14],
|
||||||
0.15 : ['stained_glass', 15],
|
0.15 : ['stained_glass', 15],
|
||||||
0.16 : ['wool', 0],
|
0.16 : ['wool', 0],
|
||||||
0.17 : ['wool', 1],
|
0.17 : ['wool', 1],
|
||||||
0.18 : ['wool', 2],
|
0.18 : ['wool', 2],
|
||||||
0.19 : ['wool', 3],
|
0.19 : ['wool', 3],
|
||||||
0.2 : ['wool', 4],
|
0.2 : ['wool', 4],
|
||||||
0.21 : ['wool', 5],
|
0.21 : ['wool', 5],
|
||||||
0.22 : ['wool', 6],
|
0.22 : ['wool', 6],
|
||||||
0.235 : ['wool', 7],
|
0.235 : ['wool', 7],
|
||||||
0.25 : ['concretepowder', 0],
|
0.25 : ['concretepowder', 0],
|
||||||
0.26 : ['concretepowder', 1],
|
0.26 : ['concretepowder', 1],
|
||||||
0.28 : ['concretepowder', 2],
|
0.28 : ['concretepowder', 2],
|
||||||
0.3 : ['concretepowder', 3],
|
0.3 : ['concretepowder', 3],
|
||||||
0.31 : ['concretepowder', 4],
|
0.31 : ['concretepowder', 4],
|
||||||
0.33 : ['concretepowder', 5],
|
0.33 : ['concretepowder', 5],
|
||||||
0.35 : ['concretepowder', 6],
|
0.35 : ['concretepowder', 6],
|
||||||
0.37 : ['concretepowder', 7],
|
0.37 : ['concretepowder', 7],
|
||||||
0.4 : ['concretepowder', 8],
|
0.4 : ['concretepowder', 8],
|
||||||
0.42 : ['concretepowder', 9],
|
0.42 : ['concretepowder', 9],
|
||||||
0.44 : ['concretepowder', 10],
|
0.44 : ['concretepowder', 10],
|
||||||
0.47 : ['concretepowder', 11],
|
0.47 : ['concretepowder', 11],
|
||||||
0.5 : ['concretepowder', 12],
|
0.5 : ['concretepowder', 12],
|
||||||
0.53 : ['concretepowder', 13],
|
0.53 : ['concretepowder', 13],
|
||||||
0.56 : ['concretepowder', 14],
|
0.56 : ['concretepowder', 14],
|
||||||
0.6 : ['concretepowder', 15],
|
0.6 : ['concretepowder', 15],
|
||||||
0.63 : ['concrete', 0],
|
0.63 : ['concrete', 0],
|
||||||
0.67 : ['concrete', 1],
|
0.67 : ['concrete', 1],
|
||||||
0.7 : ['concrete', 2],
|
0.7 : ['concrete', 2],
|
||||||
0.75 : ['concrete', 3],
|
0.75 : ['concrete', 3],
|
||||||
0.8 : ['concrete', 4],
|
0.8 : ['concrete', 4],
|
||||||
0.84 : ['concrete', 5],
|
0.84 : ['concrete', 5],
|
||||||
0.9 : ['concrete', 6],
|
0.9 : ['concrete', 6],
|
||||||
0.94 : ['concrete', 7],
|
0.94 : ['concrete', 7],
|
||||||
1.0 : ['concrete', 8],
|
1.0 : ['concrete', 8],
|
||||||
1.05 : ['concrete', 9],
|
1.05 : ['concrete', 9],
|
||||||
1.12 : ['concrete', 10],
|
1.12 : ['concrete', 10],
|
||||||
1.2 : ['concrete', 11],
|
1.2 : ['concrete', 11],
|
||||||
1.25 : ['concrete', 12],
|
1.25 : ['concrete', 12],
|
||||||
1.33 : ['concrete', 13],
|
1.33 : ['concrete', 13],
|
||||||
1.4 : ['concrete', 14],
|
1.4 : ['concrete', 14],
|
||||||
1.5 : ['concrete', 15],
|
1.5 : ['concrete', 15],
|
||||||
1.6 : ['stained_hardened_clay', 0],
|
1.6 : ['stained_hardened_clay', 0],
|
||||||
1.7 : ['stained_hardened_clay', 1],
|
1.7 : ['stained_hardened_clay', 1],
|
||||||
1.8 : ['stained_hardened_clay', 2],
|
1.8 : ['stained_hardened_clay', 2],
|
||||||
1.9 : ['stained_hardened_clay', 3],
|
1.9 : ['stained_hardened_clay', 3],
|
||||||
2.0 : ['stained_hardened_clay', 4],
|
2.0 : ['stained_hardened_clay', 4],
|
||||||
2.1 : ['stained_hardened_clay', 5],
|
2.1 : ['stained_hardened_clay', 5],
|
||||||
2.24 : ['stained_hardened_clay', 6],
|
2.24 : ['stained_hardened_clay', 6],
|
||||||
2.4 : ['stained_hardened_clay', 7],
|
2.4 : ['stained_hardened_clay', 7],
|
||||||
2.5 : ['stained_hardened_clay', 8],
|
2.5 : ['stained_hardened_clay', 8],
|
||||||
2.67 : ['stained_hardened_clay', 9],
|
2.67 : ['stained_hardened_clay', 9],
|
||||||
2.83 : ['stained_hardened_clay', 10],
|
2.83 : ['stained_hardened_clay', 10],
|
||||||
3.0 : ['stained_hardened_clay', 11],
|
3.0 : ['stained_hardened_clay', 11],
|
||||||
3.17 : ['stained_hardened_clay', 12],
|
3.17 : ['stained_hardened_clay', 12],
|
||||||
3.36 : ['stained_hardened_clay', 13],
|
3.36 : ['stained_hardened_clay', 13],
|
||||||
3.56 : ['stained_hardened_clay', 14],
|
3.56 : ['stained_hardened_clay', 14],
|
||||||
3.78 : ['stained_hardened_clay', 15],
|
3.78 : ['stained_hardened_clay', 15],
|
||||||
4.0 : ['stained_glass_pane', 0],
|
4.0 : ['stained_glass_pane', 0],
|
||||||
4.24 : ['stained_glass_pane', 1],
|
4.24 : ['stained_glass_pane', 1],
|
||||||
4.5 : ['stained_glass_pane', 2],
|
4.5 : ['stained_glass_pane', 2],
|
||||||
4.76 : ['stained_glass_pane', 3],
|
4.76 : ['stained_glass_pane', 3],
|
||||||
5.04 : ['stained_glass_pane', 4],
|
5.04 : ['stained_glass_pane', 4],
|
||||||
5.34 : ['stained_glass_pane', 5],
|
5.34 : ['stained_glass_pane', 5],
|
||||||
5.66 : ['stained_glass_pane', 6],
|
5.66 : ['stained_glass_pane', 6],
|
||||||
6.0 : ['stained_glass_pane', 7],
|
6.0 : ['stained_glass_pane', 7],
|
||||||
6.35 : ['stained_glass_pane', 8],
|
6.35 : ['stained_glass_pane', 8],
|
||||||
6.73 : ['stained_glass_pane', 9],
|
6.73 : ['stained_glass_pane', 9],
|
||||||
7.13 : ['stained_glass_pane', 10],
|
7.13 : ['stained_glass_pane', 10],
|
||||||
7.55 : ['stained_glass_pane', 11],
|
7.55 : ['stained_glass_pane', 11],
|
||||||
8.0 : ['stained_glass_pane', 12],
|
8.0 : ['stained_glass_pane', 12],
|
||||||
8.47 : ['stained_glass_pane', 13],
|
8.47 : ['stained_glass_pane', 13],
|
||||||
8.98 : ['stained_glass_pane', 14],
|
8.98 : ['stained_glass_pane', 14],
|
||||||
9.51 : ['stained_glass_pane', 15],
|
9.51 : ['stained_glass_pane', 15],
|
||||||
10.08 : ['stained_glass', 0],
|
10.08 : ['stained_glass', 0],
|
||||||
10.68 : ['stained_glass', 1],
|
10.68 : ['stained_glass', 1],
|
||||||
11.31 : ['stained_glass', 2],
|
11.31 : ['stained_glass', 2],
|
||||||
0.0 : ['glass', 0]
|
0.0 : ['glass', 0]
|
||||||
}
|
}
|
||||||
#向查理平致敬!!!!!
|
#向查理平致敬!!!!!
|
||||||
'''
|
'''
|
||||||
|
|
||||||
Blocks = {
|
Blocks = {
|
||||||
0.074: 'barrel',
|
0.074: 'barrel',
|
||||||
0.0787: 'beacon',
|
0.0787: 'beacon',
|
||||||
0.083: 'bedrock',
|
0.083: 'bedrock',
|
||||||
0.088: 'black_glazed_terracotta',
|
0.088: 'black_glazed_terracotta',
|
||||||
0.094: 'blast_furnace',
|
0.094: 'blast_furnace',
|
||||||
0.1: 'blue_glazed_terracotta',
|
0.1: 'blue_glazed_terracotta',
|
||||||
0.105: 'blue_ice',
|
0.105: 'blue_ice',
|
||||||
0.11: 'bone_block',
|
0.11: 'bone_block',
|
||||||
0.12: 'bookshelf',
|
0.12: 'bookshelf',
|
||||||
0.125: 'brick_block',
|
0.125: 'brick_block',
|
||||||
0.13: 'brown_glazed_terracotta',
|
0.13: 'brown_glazed_terracotta',
|
||||||
0.14: 'cartography_table',
|
0.14: 'cartography_table',
|
||||||
0.15: 'carved_pumpkin',
|
0.15: 'carved_pumpkin',
|
||||||
0.16: 'clay',
|
0.16: 'clay',
|
||||||
0.17: 'coal_block',
|
0.17: 'coal_block',
|
||||||
0.18: 'coal_ore',
|
0.18: 'coal_ore',
|
||||||
0.19: 'cobblestone',
|
0.19: 'cobblestone',
|
||||||
0.2: 'concrete',
|
0.2: 'concrete',
|
||||||
0.21: 'crafting_table',
|
0.21: 'crafting_table',
|
||||||
0.22: 'cyan_glazed_terracotta',
|
0.22: 'cyan_glazed_terracotta',
|
||||||
0.235: 'diamond_block',
|
0.235: 'diamond_block',
|
||||||
0.25: 'diamond_ore',
|
0.25: 'diamond_ore',
|
||||||
0.26: 'white_glazed_terracotta',
|
0.26: 'white_glazed_terracotta',
|
||||||
0.28: 'dispenser',
|
0.28: 'dispenser',
|
||||||
0.3: 'dried_kelp_block',
|
0.3: 'dried_kelp_block',
|
||||||
0.31: 'dropper',
|
0.31: 'dropper',
|
||||||
0.33: 'emerald_block',
|
0.33: 'emerald_block',
|
||||||
0.35: 'emerald_ore',
|
0.35: 'emerald_ore',
|
||||||
0.37: 'end_bricks',
|
0.37: 'end_bricks',
|
||||||
0.4: 'end_stone',
|
0.4: 'end_stone',
|
||||||
0.42: 'fletching_table',
|
0.42: 'fletching_table',
|
||||||
0.44: 'furnace',
|
0.44: 'furnace',
|
||||||
0.47: 'glass',
|
0.47: 'glass',
|
||||||
0.5: 'glowingobsidian',
|
0.5: 'glowingobsidian',
|
||||||
0.53: 'glowstone',
|
0.53: 'glowstone',
|
||||||
0.56: 'gold_block',
|
0.56: 'gold_block',
|
||||||
0.6: 'gold_ore',
|
0.6: 'gold_ore',
|
||||||
0.63: 'grass',
|
0.63: 'grass',
|
||||||
0.67: 'gray_glazed_terracotta',
|
0.67: 'gray_glazed_terracotta',
|
||||||
0.7: 'green_glazed_terracotta',
|
0.7: 'green_glazed_terracotta',
|
||||||
0.75: 'hardened_clay',
|
0.75: 'hardened_clay',
|
||||||
0.8: 'hay_block',
|
0.8: 'hay_block',
|
||||||
0.84: 'iron_block',
|
0.84: 'iron_block',
|
||||||
0.9: 'iron_ore',
|
0.9: 'iron_ore',
|
||||||
0.94: 'jukebox',
|
0.94: 'jukebox',
|
||||||
1.0: 'lapis_block',
|
1.0: 'lapis_block',
|
||||||
1.05: 'lapis_ore',
|
1.05: 'lapis_ore',
|
||||||
1.12: 'light_blue_glazed_terracotta',
|
1.12: 'light_blue_glazed_terracotta',
|
||||||
1.2: 'lime_glazed_terracotta',
|
1.2: 'lime_glazed_terracotta',
|
||||||
1.25: 'lit_pumpkin',
|
1.25: 'lit_pumpkin',
|
||||||
1.33: 'log',
|
1.33: 'log',
|
||||||
1.4: 'loom',
|
1.4: 'loom',
|
||||||
1.5: 'magenta_glazed_terracotta',
|
1.5: 'magenta_glazed_terracotta',
|
||||||
1.6: 'magma',
|
1.6: 'magma',
|
||||||
1.7: 'melon_block',
|
1.7: 'melon_block',
|
||||||
1.8: 'web',
|
1.8: 'web',
|
||||||
1.9: 'mossy_cobblestone',
|
1.9: 'mossy_cobblestone',
|
||||||
2.0: 'nether_brick',
|
2.0: 'nether_brick',
|
||||||
2.1: 'nether_wart_block',
|
2.1: 'nether_wart_block',
|
||||||
2.24: 'netherrack',
|
2.24: 'netherrack',
|
||||||
2.4: 'noteblock',
|
2.4: 'noteblock',
|
||||||
2.5: 'observer',
|
2.5: 'observer',
|
||||||
2.67: 'obsidian',
|
2.67: 'obsidian',
|
||||||
2.83: 'orange_glazed_terracotta',
|
2.83: 'orange_glazed_terracotta',
|
||||||
3.0: 'pink_glazed_terracotta',
|
3.0: 'pink_glazed_terracotta',
|
||||||
3.17: 'piston',
|
3.17: 'piston',
|
||||||
3.36: 'planks',
|
3.36: 'planks',
|
||||||
3.56: 'prismarine',
|
3.56: 'prismarine',
|
||||||
3.78: 'pumpkin',
|
3.78: 'pumpkin',
|
||||||
4.0: 'purple_glazed_terracotta',
|
4.0: 'purple_glazed_terracotta',
|
||||||
4.24: 'purpur_block',
|
4.24: 'purpur_block',
|
||||||
4.5: 'quartz_block',
|
4.5: 'quartz_block',
|
||||||
4.76: 'quartz_ore',
|
4.76: 'quartz_ore',
|
||||||
5.04: 'red_glazed_terracotta',
|
5.04: 'red_glazed_terracotta',
|
||||||
5.34: 'red_nether_brick',
|
5.34: 'red_nether_brick',
|
||||||
5.66: 'red_sandstone',
|
5.66: 'red_sandstone',
|
||||||
6.0: 'redstone_block',
|
6.0: 'redstone_block',
|
||||||
6.35: 'yellow_glazed_terracotta',
|
6.35: 'yellow_glazed_terracotta',
|
||||||
6.73: 'sandstone',
|
6.73: 'sandstone',
|
||||||
7.13: 'stonebrick',
|
7.13: 'stonebrick',
|
||||||
7.55: 'silver_glazed_terracotta',
|
7.55: 'silver_glazed_terracotta',
|
||||||
8.0: 'slime',
|
8.0: 'slime',
|
||||||
8.47: 'smithing_table',
|
8.47: 'smithing_table',
|
||||||
8.98: 'smoker',
|
8.98: 'smoker',
|
||||||
9.51: 'smooth_stone',
|
9.51: 'smooth_stone',
|
||||||
10.08: 'snow',
|
10.08: 'snow',
|
||||||
10.68: 'soul_sand',
|
10.68: 'soul_sand',
|
||||||
11.31: 'sponge',
|
11.31: 'sponge',
|
||||||
0.0: 'stone'
|
0.0: 'stone'
|
||||||
}
|
}
|
||||||
'''频率对照表\n
|
'''频率对照表\n
|
||||||
MC音调:方块名称'''
|
MC音调:方块名称'''
|
||||||
|
|
||||||
# 乐器
|
# 乐器
|
||||||
Instuments = {
|
Instuments = {
|
||||||
'note.banjo': '班卓',
|
'note.banjo': '班卓',
|
||||||
'note.bass': '低音',
|
'note.bass': '低音',
|
||||||
'note.bassattack': '贝斯',
|
'note.bassattack': '贝斯',
|
||||||
'note.bd': '鼓声',
|
'note.bd': '鼓声',
|
||||||
'note.bell': '铃声',
|
'note.bell': '铃声',
|
||||||
'note.bit': '比特',
|
'note.bit': '比特',
|
||||||
'note.cow_bell': '牛铃',
|
'note.cow_bell': '牛铃',
|
||||||
'note.didgeridoo': '迪吉',
|
'note.didgeridoo': '迪吉',
|
||||||
'note.flute': '长笛',
|
'note.flute': '长笛',
|
||||||
'note.guitar': '吉他',
|
'note.guitar': '吉他',
|
||||||
'note.harp': '竖琴',
|
'note.harp': '竖琴',
|
||||||
'note.hat': '架鼓',
|
'note.hat': '架鼓',
|
||||||
'note.chime': '钟声',
|
'note.chime': '钟声',
|
||||||
'note.iron_xylophone': '铁琴',
|
'note.iron_xylophone': '铁琴',
|
||||||
'note.pling': '叮叮',
|
'note.pling': '叮叮',
|
||||||
'note.snare': '响弦',
|
'note.snare': '响弦',
|
||||||
'note.xylophone': '木琴'
|
'note.xylophone': '木琴'
|
||||||
}
|
}
|
||||||
'''乐器对照表\n
|
'''乐器对照表\n
|
||||||
乐器英文:中文
|
乐器英文:中文
|
||||||
翻译:雪莹工坊Fun-Fer'''
|
翻译:雪莹工坊Fun-Fer'''
|
||||||
|
pitch = {
|
||||||
|
'0': '0.0220970869120796',
|
||||||
|
'1': '0.0234110480761981',
|
||||||
|
'2': '0.0248031414370031',
|
||||||
|
'3': '0.0262780129766786',
|
||||||
|
'4': '0.0278405849418856',
|
||||||
|
'5': '0.0294960722713029',
|
||||||
|
'6': '0.03125',
|
||||||
|
'7': '0.033108221698728',
|
||||||
|
'8': '0.0350769390096679',
|
||||||
|
'9': '0.037162722343835',
|
||||||
|
'10': '0.0393725328092148',
|
||||||
|
'11': '0.0417137454428136',
|
||||||
|
'12': '0.0441941738241592',
|
||||||
|
'13': '0.0468220961523963',
|
||||||
|
'14': '0.0496062828740062',
|
||||||
|
'15': '0.0525560259533572',
|
||||||
|
'16': '0.0556811698837712',
|
||||||
|
'17': '0.0589921445426059',
|
||||||
|
'18': '0.0625',
|
||||||
|
'19': '0.066216443397456',
|
||||||
|
'20': '0.0701538780193358',
|
||||||
|
'21': '0.0743254446876701',
|
||||||
|
'22': '0.0787450656184296',
|
||||||
|
'23': '0.0834274908856271',
|
||||||
|
'24': '0.0883883476483184',
|
||||||
|
'25': '0.0936441923047926',
|
||||||
|
'26': '0.0992125657480125',
|
||||||
|
'27': '0.105112051906714',
|
||||||
|
'28': '0.111362339767542',
|
||||||
|
'29': '0.117984289085212',
|
||||||
|
'30': '0.125',
|
||||||
|
'31': '0.132432886794912',
|
||||||
|
'32': '0.140307756038672',
|
||||||
|
'33': '0.14865088937534',
|
||||||
|
'34': '0.157490131236859',
|
||||||
|
'35': '0.166854981771254',
|
||||||
|
'36': '0.176776695296637',
|
||||||
|
'37': '0.187288384609585',
|
||||||
|
'38': '0.198425131496025',
|
||||||
|
'39': '0.210224103813429',
|
||||||
|
'40': '0.222724679535085',
|
||||||
|
'41': '0.235968578170423',
|
||||||
|
'42': '0.25',
|
||||||
|
'43': '0.264865773589824',
|
||||||
|
'44': '0.280615512077343',
|
||||||
|
'45': '0.29730177875068',
|
||||||
|
'46': '0.314980262473718',
|
||||||
|
'47': '0.333709963542509',
|
||||||
|
'48': '0.353553390593274',
|
||||||
|
'49': '0.37457676921917',
|
||||||
|
'50': '0.39685026299205',
|
||||||
|
'51': '0.420448207626857',
|
||||||
|
'52': '0.44544935907017',
|
||||||
|
'53': '0.471937156340847',
|
||||||
|
'54': '0.5',
|
||||||
|
'55': '0.529731547179648',
|
||||||
|
'56': '0.561231024154687',
|
||||||
|
'57': '0.594603557501361',
|
||||||
|
'58': '0.629960524947437',
|
||||||
|
'59': '0.667419927085017',
|
||||||
|
'60': '0.707106781186548',
|
||||||
|
'61': '0.749153538438341',
|
||||||
|
'62': '0.7937005259841',
|
||||||
|
'63': '0.840896415253715',
|
||||||
|
'64': '0.890898718140339',
|
||||||
|
'65': '0.943874312681694',
|
||||||
|
'66': '1',
|
||||||
|
'67': '1.0594630943593',
|
||||||
|
'68': '1.12246204830937',
|
||||||
|
'69': '1.18920711500272',
|
||||||
|
'70': '1.25992104989487',
|
||||||
|
'71': '1.33483985417003',
|
||||||
|
'72': '1.4142135623731',
|
||||||
|
'73': '1.49830707687668',
|
||||||
|
'74': '1.5874010519682',
|
||||||
|
'75': '1.68179283050743',
|
||||||
|
'76': '1.78179743628068',
|
||||||
|
'77': '1.88774862536339',
|
||||||
|
'78': '2',
|
||||||
|
'79': '2.11892618871859',
|
||||||
|
'80': '2.24492409661875',
|
||||||
|
'81': '2.37841423000544',
|
||||||
|
'82': '2.51984209978975',
|
||||||
|
'83': '2.66967970834007',
|
||||||
|
'84': '2.82842712474619',
|
||||||
|
'85': '2.99661415375336',
|
||||||
|
'86': '3.1748021039364',
|
||||||
|
'87': '3.36358566101486',
|
||||||
|
'88': '3.56359487256136',
|
||||||
|
'89': '3.77549725072677',
|
||||||
|
'90': '4',
|
||||||
|
'91': '4.23785237743718',
|
||||||
|
'92': '4.48984819323749',
|
||||||
|
'93': '4.75682846001088',
|
||||||
|
'94': '5.03968419957949',
|
||||||
|
'95': '5.33935941668014',
|
||||||
|
'96': '5.65685424949238',
|
||||||
|
'97': '5.99322830750673',
|
||||||
|
'98': '6.3496042078728',
|
||||||
|
'99': '6.72717132202972',
|
||||||
|
'100': '7.12718974512272',
|
||||||
|
'101': '7.55099450145355',
|
||||||
|
'102': '8',
|
||||||
|
'103': '8.47570475487436',
|
||||||
|
'104': '8.97969638647498',
|
||||||
|
'105': '9.51365692002177',
|
||||||
|
'106': '10.079368399159',
|
||||||
|
'107': '10.6787188333603',
|
||||||
|
'108': '11.3137084989848',
|
||||||
|
'109': '11.9864566150135',
|
||||||
|
'110': '12.6992084157456',
|
||||||
|
'111': '13.4543426440594',
|
||||||
|
'112': '14.2543794902454',
|
||||||
|
'113': '15.1019890029071',
|
||||||
|
'114': '16',
|
||||||
|
'115': '16.9514095097487',
|
||||||
|
'116': '17.95939277295',
|
||||||
|
'117': '19.0273138400435',
|
||||||
|
'118': '20.158736798318',
|
||||||
|
'119': '21.3574376667206',
|
||||||
|
'120': '22.6274169979695',
|
||||||
|
'121': '23.9729132300269',
|
||||||
|
'122': '25.3984168314912',
|
||||||
|
'123': '26.9086852881189',
|
||||||
|
'124': '28.5087589804909',
|
||||||
|
'125': '30.2039780058142',
|
||||||
|
'126': '32',
|
||||||
|
'127': '33.9028190194974',
|
||||||
|
'128': '35.9187855458999',
|
||||||
|
'129': '38.0546276800871',
|
||||||
|
'130': '40.3174735966359',
|
||||||
|
'131': '42.7148753334411'
|
||||||
|
}
|
||||||
|
|||||||
+68
-56
@@ -1,56 +1,68 @@
|
|||||||
"""提供对于音创系列的日志"""
|
"""提供对于音创系列的日志"""
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:9个
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import datetime
|
import datetime
|
||||||
import sys
|
|
||||||
|
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
time = StrStartTime
|
||||||
time = StrStartTime
|
|
||||||
|
main_path = './log/'
|
||||||
main_path = './log/'
|
|
||||||
|
position = main_path + time
|
||||||
position = main_path + time
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
if not os.path.exists('./log/'):
|
logger.setLevel(level=logging.INFO)
|
||||||
os.makedirs('./log/')
|
|
||||||
|
if not os.path.exists('./log/'):
|
||||||
logger = logging.getLogger(__name__)
|
os.makedirs('./log/')
|
||||||
logger.setLevel(level=logging.INFO)
|
|
||||||
handler = logging.FileHandler(position + ".logger")
|
# try:
|
||||||
print(position + ".logger")
|
# handler = logging.FileHandler(position + ".logger")
|
||||||
|
# except FileNotFoundError:
|
||||||
handler.setLevel(logging.INFO)
|
# os.makedirs('./log/')
|
||||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
handler = logging.FileHandler(position + ".logger")
|
||||||
handler.setFormatter(formatter)
|
print(position + ".logger")
|
||||||
|
|
||||||
console = logging.StreamHandler()
|
handler.setLevel(logging.INFO)
|
||||||
console.setLevel(logging.INFO)
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
handler.setFormatter(formatter)
|
||||||
logger.addHandler(handler)
|
|
||||||
logger.addHandler(console)
|
console = logging.StreamHandler()
|
||||||
|
console.setLevel(logging.INFO)
|
||||||
print("using Timbre_resources_package_generator_lib \n --made by 诸葛亮与八卦阵")
|
|
||||||
print(sys.path[0].replace("nmcsup\\logger", "log\\"))
|
logger.addHandler(handler)
|
||||||
|
logger.addHandler(console)
|
||||||
# import logger
|
|
||||||
|
# import logger
|
||||||
# 载入日志功能
|
|
||||||
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
# 载入日志功能
|
||||||
# logger.setting(StrStartTime)
|
StrStartTime = str(datetime.datetime.now()).replace(':', '_')[:-7]
|
||||||
"""字符串型的程序开始时间"""
|
# logger.setting(StrStartTime)
|
||||||
|
"""字符串型的程序开始时间"""
|
||||||
|
|
||||||
def log(info: str = '', isPrinted: bool = True, isLoggerLibRecord: bool = True):
|
|
||||||
# isLoggerLibRecord: 是否同时在logger库中记录
|
def log(info: str = '', isPrinted: bool = False, isLoggerLibRecord: bool = True, isWrite: bool = False):
|
||||||
"""将信息连同当前时间载入日志"""
|
"""
|
||||||
if not os.path.exists('./log/'):
|
info: 信息
|
||||||
os.makedirs('./log/')
|
isPrinted: 是否print(仅限金羿log,python官方的logging照常输出)
|
||||||
with open('./log/' + StrStartTime + '.msct.log', 'a', encoding='UTF-8') as f:
|
isLoggerLibRecord: 是否同时在logger库中记录
|
||||||
f.write(str(datetime.datetime.now())[11:19] + ' ' + info + '\n')
|
isWrite: 是否write(仅限金羿log,python官方的logging照常输出)
|
||||||
if isPrinted:
|
"""
|
||||||
print(str(datetime.datetime.now())[11:19] + ' ' + info)
|
"""将信息连同当前时间载入日志"""
|
||||||
if isLoggerLibRecord:
|
if not os.path.exists('./log/'):
|
||||||
logger.info(info)
|
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()
|
||||||
|
|||||||
+201
-84
@@ -1,84 +1,201 @@
|
|||||||
"""音创系列的文件读取功能"""
|
"""音创系列的文件读取功能"""
|
||||||
|
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:3个;语法(一级)错误:22个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:3个;语法(一级)错误:22个
|
||||||
|
|
||||||
|
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
from nmcsup.const import notes
|
from nmcsup.const import notes
|
||||||
|
import pickle
|
||||||
|
|
||||||
# 从格式文本文件读入一个音轨并存入一个列表
|
|
||||||
def ReadFile(fn: str): # -> list
|
# 从格式文本文件读入一个音轨并存入一个列表
|
||||||
from nmcsup.trans import note2list
|
def ReadFile(fn: str): # -> list
|
||||||
log('打开' + fn + "并读取音符")
|
from nmcsup.trans import note2list
|
||||||
try:
|
log('打开' + fn + "并读取音符")
|
||||||
nat = open(fn, 'r', encoding='UTF-8').read().split(" ")
|
try:
|
||||||
del fn
|
nat = open(fn, 'r', encoding='UTF-8').read().split(" ")
|
||||||
except FileNotFoundError:
|
del fn
|
||||||
log("找不到读取目标文件")
|
except FileNotFoundError:
|
||||||
return False
|
log("找不到读取目标文件")
|
||||||
Notes = []
|
return False
|
||||||
log(str(nat) + "已读取")
|
Notes = []
|
||||||
for i in range(int(len(nat) / 2)):
|
log(str(nat) + "已读取")
|
||||||
Notes.append([nat[i * 2], float(nat[i * 2 + 1])])
|
for i in range(int(len(nat) / 2)):
|
||||||
Notes = note2list(Notes)
|
Notes.append([nat[i * 2], float(nat[i * 2 + 1])])
|
||||||
log('音符数据更新' + str(Notes))
|
Notes = note2list(Notes)
|
||||||
return [Notes, ]
|
log('音符数据更新' + str(Notes))
|
||||||
|
return [Notes, ]
|
||||||
|
|
||||||
# 从midi读入多个音轨,返回多个音轨列表
|
|
||||||
def ReadMidi(midfile: str): # -> list
|
# 从midi读入多个音轨,返回多个音轨列表
|
||||||
import mido
|
def ReadMidi(midfile: str): # -> list
|
||||||
from msctspt.threadOpera import NewThread
|
import mido
|
||||||
Notes = []
|
from msctspt.threadOpera import NewThread
|
||||||
try:
|
Notes = []
|
||||||
mid = mido.MidiFile(midfile)
|
try:
|
||||||
except FileNotFoundError:
|
mid = mido.MidiFile(midfile)
|
||||||
log("找不到文件或无法读取文件" + midfile)
|
except FileNotFoundError:
|
||||||
return False
|
log("找不到文件或无法读取文件" + midfile)
|
||||||
# 解析
|
return False
|
||||||
ks = list(notes.values())
|
# 解析
|
||||||
|
ks = list(notes.values())
|
||||||
def loadMidi(track1):
|
|
||||||
datas = []
|
def loadMidi(track1):
|
||||||
for i in track1:
|
datas = []
|
||||||
if i.is_meta:
|
for i in track1:
|
||||||
log('元信息' + str(i))
|
if i.is_meta:
|
||||||
pass # 不处理元信息
|
log('元信息' + str(i))
|
||||||
elif 'note_on' in str(i):
|
pass # 不处理元信息
|
||||||
msg = str(i).replace("note=", '').replace("time=", '').split(" ")
|
elif 'note_on' in str(i):
|
||||||
log('音符on消息,处理后:' + str(msg))
|
msg = str(i).replace("note=", '').replace("time=", '').split(" ")
|
||||||
if msg[4] == '0':
|
log('音符on消息,处理后:' + str(msg))
|
||||||
datas.append([ks[int(msg[2]) - 20][0], 1.0])
|
if msg[4] == '0':
|
||||||
log('延续时间0tick--:添加音符' + str([ks[int(msg[2]) - 20][0], 1.0]))
|
datas.append([ks[int(msg[2]) - 20][0], 1.0])
|
||||||
else:
|
log('延续时间0tick--:添加音符' + str([ks[int(msg[2]) - 20][0], 1.0]))
|
||||||
datas.append([ks[int(msg[2]) - 20][0], float(msg[4]) / 480])
|
else:
|
||||||
log('延续时间' + msg[4] + 'tick--:添加音符' + str([ks[int(msg[2]) - 20][0], float(msg[4]) / 480]))
|
datas.append([ks[int(msg[2]) - 20][0], float(msg[4]) / 480])
|
||||||
del msg
|
log('延续时间' + msg[4] + 'tick--:添加音符' + str([ks[int(msg[2]) - 20][0], float(msg[4]) / 480]))
|
||||||
log('音符增加' + str(datas))
|
del msg
|
||||||
return datas
|
log('音符增加' + str(datas))
|
||||||
|
return datas
|
||||||
for j, track in enumerate(mid.tracks):
|
|
||||||
th = NewThread(loadMidi, (track,))
|
for j, track in enumerate(mid.tracks):
|
||||||
th.start()
|
th = NewThread(loadMidi, (track,))
|
||||||
Notes.append(th.getResult())
|
th.start()
|
||||||
del ks
|
Notes.append(th.getResult())
|
||||||
return Notes
|
del ks
|
||||||
|
return Notes
|
||||||
|
|
||||||
def ReadOldProject(fn: str): # -> list
|
|
||||||
import json
|
class Note:
|
||||||
from nmcsup.trans import note2list
|
def __init__(self, channel, pitch, velocity, time, time_position, instrument):
|
||||||
log("读取文件:" + fn)
|
self.channel = channel
|
||||||
try:
|
self.pitch = pitch
|
||||||
with open(fn, 'r', encoding='UTF-8') as c:
|
self.velocity = velocity
|
||||||
dataset = json.load(c)
|
self.delay = time
|
||||||
except FileNotFoundError:
|
self.time_position = time_position
|
||||||
print('找不到文件:' + fn + ",请查看您是否输入正确")
|
self.instrument = instrument
|
||||||
log("丢失" + fn)
|
self.CD = "d"
|
||||||
return False
|
|
||||||
for i in range(len(dataset['musics'])):
|
def get_CD(self, start, end):
|
||||||
dataset['musics'][i]['notes'] = note2list(dataset['musics'][i]['notes'])
|
if end - start > 1.00:
|
||||||
# 返回 音轨列表 选择器
|
self.CD = "c"
|
||||||
return dataset
|
else:
|
||||||
|
self.CD = "d"
|
||||||
|
|
||||||
|
|
||||||
|
def midi_conversion(midfile: str):
|
||||||
|
import mido
|
||||||
|
# from msctspt.threadOpera import NewThread
|
||||||
|
from bgArrayLib.bpm import get
|
||||||
|
|
||||||
|
def Time(mt, tpb_a, bpm_a):
|
||||||
|
return round(mt / tpb_a / bpm_a * 60 * 20)
|
||||||
|
Notes = []
|
||||||
|
tracks = []
|
||||||
|
note_list = []
|
||||||
|
close = []
|
||||||
|
on = []
|
||||||
|
off = []
|
||||||
|
instruments = []
|
||||||
|
isPercussion = False
|
||||||
|
try:
|
||||||
|
mid = mido.MidiFile(midfile)
|
||||||
|
except FileNotFoundError:
|
||||||
|
log("找不到文件或无法读取文件" + midfile)
|
||||||
|
return False
|
||||||
|
tpb = mid.ticks_per_beat
|
||||||
|
bpm = get(midfile)
|
||||||
|
# 解析
|
||||||
|
# def loadMidi(track1):
|
||||||
|
for track in mid.tracks:
|
||||||
|
overallTime = 0.0
|
||||||
|
instrument = 0
|
||||||
|
for i in track:
|
||||||
|
overallTime += i.time
|
||||||
|
try:
|
||||||
|
if i.channel != 9:
|
||||||
|
# try:
|
||||||
|
# log("event_type(事件): " + str(i.type) + " channel(音轨): " + str(i.channel) + " note/pitch(音高): " +
|
||||||
|
# str(i[2]) +
|
||||||
|
# " velocity(力度): " + str(i.velocity) + " time(间隔时间): " + str(i.time) +
|
||||||
|
# " overallTime/globalTime/timePosition: " + str(overallTime) + " \n")
|
||||||
|
# except AttributeError:
|
||||||
|
# log("event_type(事件): " + str(i.type) + " thing(内容):" + str(i) + " \n")
|
||||||
|
if 'program_change' in str(i):
|
||||||
|
instrument = i.program
|
||||||
|
if instrument > 119: # 音色不够
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
instruments.append(i.program)
|
||||||
|
if 'note_on' in str(i) and i.velocity > 0:
|
||||||
|
print(i)
|
||||||
|
# print(i.note)
|
||||||
|
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||||
|
tracks.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||||
|
note_list.append([i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument])
|
||||||
|
on.append([i.note, Time(overallTime, tpb, bpm)])
|
||||||
|
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||||
|
if 'note_off' in str(i) or 'note_on' in str(i) and i.velocity == 0:
|
||||||
|
# print(i)
|
||||||
|
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm))])
|
||||||
|
close.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), instrument)])
|
||||||
|
off.append([i.note, Time(overallTime, tpb, bpm)])
|
||||||
|
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
if 'note_on' in str(i) and i.channel == 9:
|
||||||
|
if 'note_on' in str(i) and i.velocity > 0:
|
||||||
|
print(i)
|
||||||
|
# print(i.note)
|
||||||
|
# print([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1)])
|
||||||
|
tracks.append([Note(i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1)])
|
||||||
|
note_list.append([i.channel, i.note, i.velocity, i.time, Time(overallTime, tpb, bpm), -1])
|
||||||
|
on.append([i.note, Time(overallTime, tpb, bpm)])
|
||||||
|
isPercussion = True
|
||||||
|
# return [Note(i.channel, i, i.velocity, i.time, Time(overallTime, tpb, bpm))]
|
||||||
|
Notes.append(tracks)
|
||||||
|
if instruments is []:
|
||||||
|
instruments.append(0)
|
||||||
|
instruments = list(set(instruments))
|
||||||
|
with open("1.pkl", 'wb') as b:
|
||||||
|
pickle.dump([instruments, isPercussion], b)
|
||||||
|
|
||||||
|
# for j, track in enumerate(mid.tracks):
|
||||||
|
# th = NewThread(loadMidi, (track,))
|
||||||
|
# th.start()
|
||||||
|
# Notes.append(th.getResult())
|
||||||
|
|
||||||
|
# print(Notes)
|
||||||
|
print(Notes.__len__())
|
||||||
|
# print(note_list)
|
||||||
|
print(instruments)
|
||||||
|
return Notes
|
||||||
|
# return [Notes, note_list]
|
||||||
|
|
||||||
|
|
||||||
|
def ReadOldProject(fn: str): # -> list
|
||||||
|
import json
|
||||||
|
from nmcsup.trans import note2list
|
||||||
|
log("读取文件:" + fn)
|
||||||
|
try:
|
||||||
|
with open(fn, 'r', encoding='UTF-8') as c:
|
||||||
|
dataset = json.load(c)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print('找不到文件:' + fn + ",请查看您是否输入正确")
|
||||||
|
log("丢失" + fn)
|
||||||
|
return False
|
||||||
|
for i in range(len(dataset['musics'])):
|
||||||
|
dataset['musics'][i]['notes'] = note2list(dataset['musics'][i]['notes'])
|
||||||
|
# 返回 音轨列表 选择器
|
||||||
|
return dataset
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# a = midi_conversion("L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\同道殊途标准.mid")
|
||||||
|
# midi_conversion("L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\"
|
||||||
|
# "Illusionary_Daytime_--------幻昼.mid")
|
||||||
|
# a = midi_conversion(r"C:\Users\lc\Documents\MuseScore3\乐谱\架子鼓.mid")
|
||||||
|
a = midi_conversion(r"C:\Users\lc\Documents\MuseScore3\乐谱\stay2.mid")
|
||||||
|
# print(a)
|
||||||
|
|||||||
+289
-245
@@ -1,245 +1,289 @@
|
|||||||
"""音创系列的转换功能"""
|
"""音创系列的转换功能"""
|
||||||
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:2个;语法(一级)错误:192个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:2个;语法(一级)错误:192个
|
||||||
|
|
||||||
|
|
||||||
from nmcsup.log import log
|
from nmcsup.log import log
|
||||||
|
|
||||||
|
|
||||||
import amulet
|
import amulet
|
||||||
import amulet_nbt
|
import amulet_nbt
|
||||||
from amulet.api.block import Block
|
from amulet.api.block import Block
|
||||||
from amulet.api.block_entity import BlockEntity
|
from amulet.api.block_entity import BlockEntity
|
||||||
from amulet.utils.world_utils import block_coords_to_chunk_coords
|
from amulet.utils.world_utils import block_coords_to_chunk_coords
|
||||||
from amulet_nbt import TAG_String, TAG_Compound, TAG_Byte
|
from amulet_nbt import TAG_String, TAG_Compound, TAG_Byte
|
||||||
|
|
||||||
|
|
||||||
# 输入一个列表 [ [str, float ], [], ... ] 音符str 值为持续时间float
|
# 输入一个列表 [ [str, float ], [], ... ] 音符str 值为持续时间float
|
||||||
def note2list(Notes: list) -> list:
|
def note2list(Notes: list) -> list:
|
||||||
from nmcsup.const import notes
|
from nmcsup.const import notes
|
||||||
|
|
||||||
def change(base):
|
def change(base):
|
||||||
enwo = {
|
enwo = {
|
||||||
'a': 'A',
|
'a': 'A',
|
||||||
'b': 'B',
|
'b': 'B',
|
||||||
'c': 'C',
|
'c': 'C',
|
||||||
'd': "D",
|
'd': "D",
|
||||||
"e": "E",
|
"e": "E",
|
||||||
'f': 'F',
|
'f': 'F',
|
||||||
'g': "G"
|
'g': "G"
|
||||||
}
|
}
|
||||||
nuwo = {
|
nuwo = {
|
||||||
'6': 'A',
|
'6': 'A',
|
||||||
'7': 'B',
|
'7': 'B',
|
||||||
'1': 'C',
|
'1': 'C',
|
||||||
'2': "D",
|
'2': "D",
|
||||||
"3": "E",
|
"3": "E",
|
||||||
'4': 'F',
|
'4': 'F',
|
||||||
'5': "G"
|
'5': "G"
|
||||||
}
|
}
|
||||||
for k, v in enwo.items():
|
for k, v in enwo.items():
|
||||||
if k in base:
|
if k in base:
|
||||||
base = base.replace(k, v)
|
base = base.replace(k, v)
|
||||||
for k, v in nuwo.items():
|
for k, v in nuwo.items():
|
||||||
if k in base:
|
if k in base:
|
||||||
base = base.replace(k, v)
|
base = base.replace(k, v)
|
||||||
return base
|
return base
|
||||||
|
|
||||||
res = []
|
res = []
|
||||||
log(" === 音符列表=>音调列表")
|
log(" === 音符列表=>音调列表")
|
||||||
for i in Notes:
|
for i in Notes:
|
||||||
s2 = change(i[0])
|
s2 = change(i[0])
|
||||||
log(' === 正在操作音符' + i[0] + '->' + s2)
|
log(' === 正在操作音符' + i[0] + '->' + s2)
|
||||||
if s2 in notes.keys():
|
if s2 in notes.keys():
|
||||||
log(" === 找到此音符,加入:" + str(notes[s2][0]))
|
log(" === 找到此音符,加入:" + str(notes[s2][0]))
|
||||||
res.append([notes[s2][0], float(i[1])])
|
res.append([notes[s2][0], float(i[1])])
|
||||||
else:
|
else:
|
||||||
log(' === ' + s2 + '不在音符表内,此处自动替换为 休止符0 ')
|
log(' === ' + s2 + '不在音符表内,此处自动替换为 休止符0 ')
|
||||||
res.append(['0', float(i[1])])
|
res.append(['0', float(i[1])])
|
||||||
log(' === 最终反回' + str(res))
|
log(' === 最终反回' + str(res))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def mcnote2freq(Notes):
|
def mcnote2freq(Notes):
|
||||||
from nmcsup.const import notes
|
from nmcsup.const import notes
|
||||||
mcnback = {}
|
mcnback = {}
|
||||||
for i, j in notes.items():
|
for i, j in notes.items():
|
||||||
mcnback[j[0]] = i
|
mcnback[j[0]] = i
|
||||||
res = []
|
res = []
|
||||||
log(" === 我的世界音调表=>频率列表")
|
log(" === 我的世界音调表=>频率列表")
|
||||||
for i in Notes:
|
for i in Notes:
|
||||||
log(' === 正在操作音符' + i[0] + '->' + mcnback[i[0]])
|
log(' === 正在操作音符' + i[0] + '->' + mcnback[i[0]])
|
||||||
res.append([notes[mcnback[i[0]]][1], float(i[1])])
|
res.append([notes[mcnback[i[0]]][1], float(i[1])])
|
||||||
log(' === 最终反回' + str(res))
|
log(' === 最终反回' + str(res))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
# MP3文件转midi文件
|
# MP3文件转midi文件
|
||||||
def Mp32Mid(mp3File, midFile):
|
def Mp32Mid(mp3File, midFile):
|
||||||
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio
|
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio
|
||||||
# 加载
|
# 加载
|
||||||
(audio, _) = load_audio(mp3File, sr=sample_rate) # , mono=True
|
(audio, _) = load_audio(mp3File, sr=sample_rate) # , mono=True
|
||||||
# 实例化并转换
|
# 实例化并转换
|
||||||
PianoTranscription(device="cpu").transcribe(audio, midFile)
|
PianoTranscription(device="cpu").transcribe(audio, midFile)
|
||||||
|
|
||||||
|
|
||||||
# 传入一个音符列表转为指令列表
|
# 传入一个音符列表转为指令列表
|
||||||
def Note2Cmd(Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
def Note2Cmd(Notes: list, ScoreboardName: str, Instrument: str, PlayerSelect: str = '',
|
||||||
isProsess: bool = False) -> list:
|
isProsess: bool = False) -> list:
|
||||||
commands = []
|
commands = []
|
||||||
a = 0.0
|
a = 0.0
|
||||||
if isProsess:
|
length = len(Notes)
|
||||||
length = len(Notes)
|
j = 1
|
||||||
j = 1
|
for i in range(len(Notes)):
|
||||||
for i in range(len(Notes)):
|
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||||
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ playsound " + Instrument + " @s ~ ~ ~ 1000 " + str(
|
||||||
int((a + 2) * 5 + int(Notes[i][1] * 5))) + "}] ~ ~ ~ playsound " + Instrument + " @s ~ ~ ~ 1000 " + str(
|
Notes[i][0]) + " 1000\n")
|
||||||
Notes[i][0]) + " 1000\n")
|
a += Notes[i][1]
|
||||||
a += Notes[i][1]
|
if isProsess:
|
||||||
if isProsess:
|
commands.append("execute @a" + PlayerSelect + " ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" + str(
|
||||||
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(
|
||||||
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) + "/" + str(length) + " || " + str(int(j / length * 1000) / 10) + "\n")
|
j += 1
|
||||||
j += 1
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
return commands
|
||||||
return commands
|
# def newDataStructureCounterChange():
|
||||||
|
|
||||||
|
|
||||||
# 简单载入方块
|
def classList_conversion(List: list, ScoreboardName: str,
|
||||||
# level.set_version_block(posx,posy,posz,"minecraft:overworld",("bedrock", (1, 16, 20)),Block(namespace, name))
|
isProsess: bool = False) -> list:
|
||||||
|
from bgArrayLib.compute import round_up
|
||||||
|
commands = []
|
||||||
# 转入指令列表与位置信息转至世界
|
length = len(List)
|
||||||
def Cmd2World(cmd: list, world: str, dire: list):
|
j = 1
|
||||||
"""将指令以命令链的形式载入世界\n
|
print(List)
|
||||||
cmd指令列表位为一个序列,中包含指令字符串\n
|
for k in range(len(List)):
|
||||||
world为地图所在位置,需要指向文件夹,dire为指令方块生成之位置"""
|
i = List[k][0]
|
||||||
level = amulet.load_level(world)
|
print(i)
|
||||||
cdl = []
|
print(type(i))
|
||||||
for i in cmd:
|
try:
|
||||||
e = True
|
if i.instrument > 119:
|
||||||
try:
|
pass
|
||||||
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
else:
|
||||||
cdl.append(i[:i.index('#')])
|
commands.append("execute @e[scores={" +
|
||||||
e = False
|
ScoreboardName + "=" + str(round_up(i.time_position)).replace(".0", "") + "}] ~ ~" +
|
||||||
except ValueError:
|
str(127 - i.velocity) +
|
||||||
cdl.append(i)
|
" ~ playsound " +
|
||||||
finally:
|
str(i.instrument) +
|
||||||
if e is True:
|
str(i.CD) + "." +
|
||||||
cdl.append(i)
|
str(i.pitch)
|
||||||
i = 0
|
+ " @a ~ ~ ~ 1000 1.0 1000\n")
|
||||||
# 第一个是特殊
|
if isProsess:
|
||||||
universal_block = Block('universal_minecraft', 'command_block',
|
commands.append("execute @a"" ~ ~ ~ execute @s[scores={" + ScoreboardName + "=" +
|
||||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
str(round_up(i.time_position)).replace(".0", "") +
|
||||||
'mode': TAG_String("repeating")})
|
"}] ~ ~ ~ title @s actionbar §e▶ 播放中: §a" +
|
||||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
str(j) + "/" + str(length) + " || " + str(int(j / length * 1000) / 10) + "\n")
|
||||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
j += 1
|
||||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
except AttributeError:
|
||||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1], dire[2],
|
pass
|
||||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
# a += List[i][1]
|
||||||
{'auto': TAG_Byte(0), 'Command': TAG_String(cdl.pop(0))})})))
|
commands.append("\n\n# 凌云我的世界开发团队 x 凌云软件开发团队 : W-YI(金羿)\n")
|
||||||
chunk.blocks[offset_x, dire[1], offset_z] = level.block_palette.get_add_block(universal_block)
|
print(commands)
|
||||||
chunk.block_entities[(dire[0], dire[1], dire[2])] = universal_block_entity
|
return commands
|
||||||
chunk.changed = True
|
|
||||||
# 集体上移
|
|
||||||
dire[1] += 1
|
# 简单载入方块
|
||||||
# 真正开始
|
# level.set_version_block(posx,posy,posz,"minecraft:overworld",("bedrock", (1, 16, 20)),Block(namespace, name))
|
||||||
down = False
|
|
||||||
for j in cdl:
|
|
||||||
if dire[1] + i >= 255:
|
# 转入指令列表与位置信息转至世界
|
||||||
dire[0] += 1
|
def Cmd2World(cmd: list, world: str, dire: list):
|
||||||
i = 0
|
"""将指令以命令链的形式载入世界\n
|
||||||
down = not down
|
cmd指令列表位为一个序列,中包含指令字符串\n
|
||||||
# 定义此方块
|
world为地图所在位置,需要指向文件夹,dire为指令方块生成之位置"""
|
||||||
if dire[1] + i == 254:
|
level = amulet.load_level(world)
|
||||||
universal_block = Block('universal_minecraft', 'command_block',
|
cdl = []
|
||||||
{'conditional': TAG_String("false"), 'facing': TAG_String('east'),
|
for i in cmd:
|
||||||
'mode': TAG_String("chain")})
|
# e = True
|
||||||
else:
|
try:
|
||||||
if down:
|
if (i[:i.index('#')].replace(' ', '') != '\n') and (i[:i.index('#')].replace(' ', '') != ''):
|
||||||
universal_block = Block('universal_minecraft', 'command_block',
|
cdl.append(i[:i.index('#')])
|
||||||
{'conditional': TAG_String("false"), 'facing': TAG_String('down'),
|
# e = False
|
||||||
'mode': TAG_String("chain")})
|
except:
|
||||||
else:
|
cdl.append(i)
|
||||||
universal_block = Block('universal_minecraft', 'command_block',
|
# finally:
|
||||||
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
# if e is True:
|
||||||
'mode': TAG_String("chain")})
|
# cdl.append(i)
|
||||||
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
i = 0
|
||||||
# 获取区块
|
# 第一个是特殊
|
||||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
universal_block = Block('universal_minecraft', 'command_block',
|
||||||
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||||
if down:
|
'mode': TAG_String("repeating")})
|
||||||
# 定义方块实体
|
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], 254 - i, dire[2],
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
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, 254 - i, offset_z] = level.block_palette.get_add_block(universal_block)
|
chunk.blocks[offset_x, dire[1], offset_z] = level.block_palette.get_add_block(universal_block)
|
||||||
chunk.block_entities[(dire[0], 254 - i, dire[2])] = universal_block_entity
|
chunk.block_entities[(dire[0], dire[1], dire[2])] = universal_block_entity
|
||||||
else:
|
chunk.changed = True
|
||||||
# 定义方块实体
|
# 集体上移
|
||||||
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], dire[1] + i, dire[2],
|
dire[1] += 1
|
||||||
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
# 真正开始
|
||||||
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
down = False
|
||||||
|
for j in cdl:
|
||||||
# 将方块加入世界
|
if dire[1] + i >= 255:
|
||||||
chunk.blocks[offset_x, dire[1] + i, offset_z] = level.block_palette.get_add_block(universal_block)
|
dire[0] += 1
|
||||||
chunk.block_entities[(dire[0], dire[1] + i, dire[2])] = universal_block_entity
|
i = 0
|
||||||
# 设置为已更新区块
|
down = not down
|
||||||
chunk.changed = True
|
# 定义此方块
|
||||||
i += 1
|
if dire[1] + i == 254:
|
||||||
del i, cdl
|
universal_block = Block('universal_minecraft', 'command_block',
|
||||||
# 保存世界并退出
|
{'conditional': TAG_String("false"), 'facing': TAG_String('east'),
|
||||||
level.save()
|
'mode': TAG_String("chain")})
|
||||||
level.close()
|
else:
|
||||||
|
if down:
|
||||||
|
universal_block = Block('universal_minecraft', 'command_block',
|
||||||
# 音符转成方块再加载到世界里头
|
{'conditional': TAG_String("false"), 'facing': TAG_String('down'),
|
||||||
def Blocks2World(world: str, dire: list, Datas: list):
|
'mode': TAG_String("chain")})
|
||||||
from nmcsup.const import Blocks
|
else:
|
||||||
level = amulet.load_level(world)
|
universal_block = Block('universal_minecraft', 'command_block',
|
||||||
i = 0
|
{'conditional': TAG_String("false"), 'facing': TAG_String('up'),
|
||||||
|
'mode': TAG_String("chain")})
|
||||||
def setblock(block: str, pos: list):
|
cx, cz = block_coords_to_chunk_coords(dire[0], dire[2])
|
||||||
"""pos : list[int,int,int]"""
|
# 获取区块
|
||||||
cx, cz = block_coords_to_chunk_coords(pos[0], pos[2])
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
offset_x, offset_z = dire[0] - 16 * cx, dire[2] - 16 * cz
|
||||||
offset_x, offset_z = pos[0] - 16 * cx, pos[2] - 16 * cz
|
if down:
|
||||||
chunk.blocks[offset_x, pos[1], offset_z] = level.block_palette.get_add_block(Block("minecraft", block))
|
# 定义方块实体
|
||||||
chunk.changed = True
|
universal_block_entity = BlockEntity('universal_minecraft', 'command_block', dire[0], 254 - i, dire[2],
|
||||||
|
amulet_nbt.NBTFile(TAG_Compound({'utags': TAG_Compound(
|
||||||
for j in Datas:
|
{'auto': TAG_Byte(1), 'Command': TAG_String(j)})})))
|
||||||
if dire[1] + 1 >= 255:
|
|
||||||
i = 0
|
# 将方块加入世界
|
||||||
dire[0] += 1
|
chunk.blocks[offset_x, 254 - i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||||
setblock(Blocks[j[0]], [dire[0], dire[1] + i, dire[2]])
|
chunk.block_entities[(dire[0], 254 - i, dire[2])] = universal_block_entity
|
||||||
i = int(i + j[1] + 0.5) # 四舍五入
|
else:
|
||||||
level.save()
|
# 定义方块实体
|
||||||
level.close()
|
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)})})))
|
||||||
# 传入音符列表制作播放器指令
|
|
||||||
def Notes2Player(Note, dire: list, CmdData: dict):
|
# 将方块加入世界
|
||||||
"""传入音符列表、坐标、指令数据,生成播放器指令"""
|
chunk.blocks[offset_x, dire[1] + i, offset_z] = level.block_palette.get_add_block(universal_block)
|
||||||
Notes = {}
|
chunk.block_entities[(dire[0], dire[1] + i, dire[2])] = universal_block_entity
|
||||||
for i in Note:
|
# 设置为已更新区块
|
||||||
Notes[i[0]] = ''
|
chunk.changed = True
|
||||||
Notes = list(Notes.keys())
|
i += 1
|
||||||
from nmcsup.const import Blocks
|
del i, cdl
|
||||||
Cmds = []
|
# 保存世界并退出
|
||||||
for j in Notes:
|
level.save()
|
||||||
Cmds.append('execute @e[x=' + str(dire[0]) + ',y=' + str(dire[1]) + ',z=' + str(dire[2]) + ',dy=' + str(
|
level.close()
|
||||||
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',
|
def Blocks2World(world: str, dire: list, Datas: list):
|
||||||
'execute @e[y=255,dy=100,name=' + CmdData['Ent'] + '] ~ ~ ~ tp ~1 ' + str(dire[1]) + ' ~\n',
|
from nmcsup.const import Blocks
|
||||||
'#音·创 开发交流群 861684859']
|
level = amulet.load_level(world)
|
||||||
return Cmds
|
i = 0
|
||||||
|
|
||||||
|
def setblock(block: str, pos: list):
|
||||||
# 传入音符列表生成方块至世界
|
"""pos : list[int,int,int]"""
|
||||||
def Datas2BlkWorld(NoteData, world: str, dire: list):
|
cx, cz = block_coords_to_chunk_coords(pos[0], pos[2])
|
||||||
for i in range(len(NoteData)):
|
chunk = level.get_chunk(cx, cz, "minecraft:overworld")
|
||||||
Blocks2World(world, [dire[0], dire[1], dire[2] + i], NoteData[i])
|
offset_x, offset_z = pos[0] - 16 * cx, pos[2] - 16 * cz
|
||||||
|
chunk.blocks[offset_x, pos[1], offset_z] = level.block_palette.get_add_block(Block("minecraft", block))
|
||||||
|
chunk.changed = True
|
||||||
|
|
||||||
|
for j in Datas:
|
||||||
|
if dire[1] + 1 >= 255:
|
||||||
|
i = 0
|
||||||
|
dire[0] += 1
|
||||||
|
setblock(Blocks[j[0]], [dire[0], dire[1] + i, dire[2]])
|
||||||
|
i = int(i + j[1] + 0.5) # 四舍五入
|
||||||
|
level.save()
|
||||||
|
level.close()
|
||||||
|
|
||||||
|
|
||||||
|
# 传入音符列表制作播放器指令
|
||||||
|
def Notes2Player(Note, dire: list, CmdData: dict):
|
||||||
|
"""传入音符列表、坐标、指令数据,生成播放器指令"""
|
||||||
|
Notes = {}
|
||||||
|
for i in Note:
|
||||||
|
Notes[i[0]] = ''
|
||||||
|
Notes = list(Notes.keys())
|
||||||
|
from nmcsup.const import Blocks
|
||||||
|
Cmds = []
|
||||||
|
for j in Notes:
|
||||||
|
Cmds.append('execute @e[x=' + str(dire[0]) + ',y=' + str(dire[1]) + ',z=' + str(dire[2]) + ',dy=' + str(
|
||||||
|
255 - dire[1]) + ',name=' + CmdData['Ent'] + '] ~ ~ ~ detect ~ ~ ~ ' + Blocks[j] + ' 0 execute @a ' +
|
||||||
|
CmdData['Pls'] + ' ~ ~ ~ playsound ' + CmdData['Ins'] + ' @s ~ ~ ~ 1000 ' + str(j) + ' 1000\n')
|
||||||
|
Cmds += ['#本函数由 金羿 音·创 生成\n', 'execute @e[y=' + str(dire[1]) + ',dy=' + str(255 - dire[1]) + ',name=' + CmdData[
|
||||||
|
'Ent'] + '] ~ ~ ~ tp ~ ~1 ~\n',
|
||||||
|
'execute @e[y=255,dy=100,name=' + CmdData['Ent'] + '] ~ ~ ~ tp ~1 ' + str(dire[1]) + ' ~\n',
|
||||||
|
'#音·创 开发交流群 861684859']
|
||||||
|
return Cmds
|
||||||
|
|
||||||
|
|
||||||
|
# 传入音符列表生成方块至世界
|
||||||
|
def Datas2BlkWorld(NoteData, world: str, dire: list):
|
||||||
|
for i in range(len(NoteData)):
|
||||||
|
Blocks2World(world, [dire[0], dire[1], dire[2] + i], NoteData[i])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from nmcreader import midi_conversion
|
||||||
|
path = "L:\\0WorldMusicCreater-MFMS new edition\\框架\\v0.3.2\\Musicreater\\测试用\\同道殊途标准.mid"
|
||||||
|
b = midi_conversion(path)
|
||||||
|
classList_conversion(b, "n")
|
||||||
|
|||||||
+86
-86
@@ -1,86 +1,86 @@
|
|||||||
"""音创系列版本号和版本操作函数"""
|
"""音创系列版本号和版本操作函数"""
|
||||||
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:24个
|
# 统计:致命(三级)错误:0个;警告(二级)错误:0个;语法(一级)错误:24个
|
||||||
|
|
||||||
|
|
||||||
from msctspt.bugReporter import version
|
from msctspt.bugReporter import version
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# 以下下两个值请在 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"
|
||||||
:param ver1: 版本号1
|
:param ver1: 版本号1
|
||||||
:param ver2: 版本号2
|
:param ver2: 版本号2
|
||||||
:return: ver1< = >ver2返回-1/0/1
|
:return: ver1< = >ver2返回-1/0/1
|
||||||
"""
|
"""
|
||||||
list1 = str(ver1).split(".")
|
list1 = str(ver1).split(".")
|
||||||
list2 = str(ver2).split(".")
|
list2 = str(ver2).split(".")
|
||||||
# 循环次数为短的列表的len
|
# 循环次数为短的列表的len
|
||||||
for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)):
|
for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)):
|
||||||
if int(list1[i]) == int(list2[i]):
|
if int(list1[i]) == int(list2[i]):
|
||||||
pass
|
pass
|
||||||
elif int(list1[i]) < int(list2[i]):
|
elif int(list1[i]) < int(list2[i]):
|
||||||
return -1
|
return -1
|
||||||
else:
|
else:
|
||||||
return 1
|
return 1
|
||||||
# 循环结束,哪个列表长哪个版本号高
|
# 循环结束,哪个列表长哪个版本号高
|
||||||
if len(list1) == len(list2):
|
if len(list1) == len(list2):
|
||||||
return 0
|
return 0
|
||||||
elif len(list1) < len(list2):
|
elif len(list1) < len(list2):
|
||||||
return -1
|
return -1
|
||||||
else:
|
else:
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# ————————————————
|
# ————————————————
|
||||||
# 版权声明:上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
# 版权声明:上面的函数compver为CSDN博主「基友死得早」的原创文章中的函数,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
||||||
# 原文链接:https://blog.csdn.net/tinyjm/article/details/93514261
|
# 原文链接:https://blog.csdn.net/tinyjm/article/details/93514261
|
||||||
# ————————————————
|
# ————————————————
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def InstallLibs(now, LIBS1):
|
def InstallLibs(now, LIBS1):
|
||||||
"""比对库信息并安装库"""
|
"""比对库信息并安装库"""
|
||||||
from os import system as run
|
from os import system as run
|
||||||
for i in LIBS1:
|
for i in LIBS1:
|
||||||
if i not 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,27 +1,27 @@
|
|||||||
# -*- conding: utf8 -*-
|
# -*- conding: utf8 -*-
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from msctspt.funcOpera import keepart
|
from msctspt.funcOpera import keepart
|
||||||
|
|
||||||
|
|
||||||
l = 0
|
l = 0
|
||||||
|
|
||||||
for path,dir_list,file_list in os.walk(r"./") :
|
for path,dir_list,file_list in os.walk(r"./") :
|
||||||
for file_name in file_list:
|
for file_name in file_list:
|
||||||
if keepart(file_name,'.',None) == '.py':
|
if keepart(file_name,'.',None) == '.py':
|
||||||
file = os.path.join(path, file_name)
|
file = os.path.join(path, file_name)
|
||||||
print("得到文件名:"+str(file))
|
print("得到文件名:"+str(file))
|
||||||
for i in open(file,'r',encoding="utf-8"):
|
for i in open(file,'r',encoding="utf-8"):
|
||||||
code = i.replace(' ','').replace('\n','')
|
code = i.replace(' ','').replace('\n','')
|
||||||
try:
|
try:
|
||||||
code -= code[code.index('#'):]
|
code -= code[code.index('#'):]
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if code:
|
if code:
|
||||||
print("\t"+code)
|
print("\t"+code)
|
||||||
l+=1
|
l+=1
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
input("\n最终代码行数为:"+str(l))
|
input("\n最终代码行数为:"+str(l))
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
+223
-223
@@ -1,224 +1,224 @@
|
|||||||
{
|
{
|
||||||
"mainset": {
|
"mainset": {
|
||||||
"PackName": "RyounTeamSong",
|
"PackName": "RyounTeamSong",
|
||||||
"MusicTitle": "RyounUp",
|
"MusicTitle": "RyounUp",
|
||||||
"IsRepeat": false,
|
"IsRepeat": false,
|
||||||
"PlayerSelect": ""
|
"PlayerSelect": ""
|
||||||
},
|
},
|
||||||
"musics": [
|
"musics": [
|
||||||
{
|
{
|
||||||
"set": {
|
"set": {
|
||||||
"EntityName": "MusicSupport",
|
"EntityName": "MusicSupport",
|
||||||
"ScoreboardName": "MusicSupport",
|
"ScoreboardName": "MusicSupport",
|
||||||
"Instrument": "harp",
|
"Instrument": "harp",
|
||||||
"FileName": "RyounUp_RyounTeamSong"
|
"FileName": "RyounUp_RyounTeamSong"
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
[
|
[
|
||||||
".5",
|
".5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.5
|
1.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.5
|
1.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.5
|
1.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
".6",
|
".6",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
".5",
|
".5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.5
|
1.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"6",
|
"6",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0",
|
"0",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
".5",
|
".5",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
".6",
|
".6",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"6",
|
"6",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"2",
|
"2",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"5",
|
"5",
|
||||||
1.5
|
1.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
".5",
|
".5",
|
||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0",
|
"0",
|
||||||
1.0
|
1.0
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0",
|
"0",
|
||||||
1.0
|
1.0
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user