AutoYuanQin【更新】、AEscoffier_chef【修复】 (#3242)

* 更新MIDI格式、支持按键长按

* fix

* fix

* 修复已知问题

* Update README.md
This commit is contained in:
提瓦特钓鱼玳师
2026-05-28 10:54:28 +08:00
committed by GitHub
parent 96de09a95a
commit 83fa2e9a33
20 changed files with 197 additions and 64 deletions

View File

@@ -660,6 +660,10 @@
- 更新日志
<details>
<summary> 点击展开 </summary>
- ver 2.4.0
1. 修复了刷满熟料度操作流程中遇到料理名称过长的料理时会报错的BUG
- ver 2.3.10

View File

@@ -746,16 +746,17 @@
click(493, 1025); // 确认筛选
await sleep(500)
let food_name = await Ocr(116, 243, 125, 30);
if (food_name) {
food_name.Click();
let food_name_ocr = await Ocr(116, 243, 125, 30);
if (food_name_ocr) {
food_name_ocr.Click();
await sleep(500);
// 寻找对应的料理
let matchList = [];
for (let i = 0; i < Object.keys(food_msg).length; i++) {
matchList.push(await deal_string(Object.keys(food_msg)[i]));
}
food_name = await findClosestMatch(food_name.text, matchList);
let food_name = await findClosestMatch(food_name_ocr.text, matchList);
food_name = Object.keys(food_msg)[matchList.indexOf(food_name)]; // 使用料理的完整名称
log.info(`当前料理: ${food_name}`);
// let formula_num = Object.keys(food_msg["formula"]).length;
click(1686, 1018); // 制作

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "一只爱可菲",
"version": "2.3.10",
"version": "2.4.0",
"bgi_version": "0.55.0",
"description": "专精料理制作的爱可菲(自动烹饪及解锁、特殊料理、食材加工)[内置料理数据已更新至月之六]\n自动烹饪烹饪精度自定义、一键全解锁、分类选择料理、自动处理食材不足等异常\n特殊料理支持根据概率计算产出、支持全部的特殊料理\n食材加工食材持有量检测、可自选制作鱼肉的配方、可选等待加工完成或跳过、矿石加速",
"tags": [

View File

@@ -248,9 +248,20 @@ notes 字段中包含的是乐谱内容音符**必须**使用**大写字母**,
## 更新日志
更新日志于3.0开始记录, 往期更新内容都在git的记录中
- ver 3.4.0
1. 优化了MIDI制谱器导出的曲谱格式导出前会重构格式可能与页面显示的略有差异
1. 更新了本地MIDI曲谱的格式
1. 修复了MIDI曲谱在演奏时可能出现的吞音bug
1. 五线谱制谱器与简谱制谱器生成的曲谱现在支持按键长按效果
- ver 3.3.4
1. 更新了十首单曲《爱你》- 谐律键琴、《如愿》- 谐律键琴、《红色高跟鞋》- 谐律键琴、《这世界有那么多人》- 谐律键琴、《回家的路-原神五周年》- 谐律键琴、《反方向的钟》- 谐律键琴、《最伟大的作品》- 谐律键琴、《七里香》- 谐律键琴、《花海》- 谐律键琴、《蒲公英的约定(修改版)》- 谐律键琴
- ver 3.3.3
1. 更新了首单曲《オノマトペメガネ(拟声眼镜)》- 风物之诗琴
1. 更新了首单曲《オノマトペメガネ(拟声眼镜)》- 风物之诗琴、Letter(彼方的她-Aliya)- 风物之诗琴
- ver 3.3.2

View File

@@ -8,6 +8,6 @@
"type": "midi",
"composer": "曲师",
"arranger": "谱师",
"notes": "DC0|DH0|DN0|UC120|DA0|UA120|DD0|UD120|UN120|DN0|UN120|DD0|UH120|UD0|DH0|DA0|DQ0|UH120|DN120|UN120|DD0|UD120|DH0|UH120|UA120|UQ0|DC0|DD0|DE0|UC120|DN0|UN120|DA0|UA120|UD120|UE0|DC0|DQ0|DY0|UC240|UQ0|DN0|DW0|UY240|UN0|UW0|DA0|DE0|UA240|UE0|DC0|DQ0|UC240|UQ0|DN0|DW0|UN240|UW0|DD0|DH0|UD240|UH0|DN0|DQ0|UN240|UQ0|DA0|DW0|UA240|UW0|DC0|DE0|UC240|UE0|DN0|DQ0|UN240|UQ0|DA0|DW0|UA240|UW0|DD0|DH0|UD240|UH0|DA0|DC0|DQ0|UA240|UQ0|DD0|DW0|UC240|UD0|UW0|DH0|DZ0|DE0|UH480|UZ0|UE0|DZ0|DQ0|UZ240|UQ0|DB0|DW0|UB240|UW0|DA0|DH0|UA240|UH0|DB0|DQ0|UB240|UQ0|DA0|DW0|UA240|UW0|DD0|DE0|UD240|UE0|DZ0|DQ0|UZ240|UQ0|DB0|DW0|UB240|UW0|DD0|DA0|DH0|UD240|UH0|DB0|DQ0|UB240|UQ0|DD0|DW0|UD240|UW0|DG0|DE0|UA240|UG0|UE0|DS0|DN0|DQ0|US240|UQ0|DD0|DW0|UD240|UW0|DA0|DH0|UN480|UA0|UH0|DV0|DQ0|UQ240|DA0|DW0|UA240|UW0|DG0|DE0|UG240|UE0|DH0|DQ0|UV240|UH0|UQ0|DA0|DW0|UW240|DV0|DH0|UV240|UH0|DF0|DQ0|UF240|UQ0|DN0|DW0|UA240|UN0|UW0|DF0|DV0|DE0|UF240|UE0|DA0|DQ0|UA240|UQ0|DN0|DW0|UN240|UW0|DA0|DH0|UV240|UA0|UH0|DV0|DF0|DQ0|UV240|UQ0|DN0|DW0|UN240|UW0|DA0|DE0|UF480|UA0|UE0|DQ0|DV0|UQ240|UV0|DA0|DW0|UA240|UW0|DH0|DB0|UH240|UB0|DN0|DQ0|UN240|UQ0|DW0|DA0|UW240|UA0|DF0|DE0|UF240|UE0|DQ0|DG0|UQ240|UG0|DF0|DW0|UF240|UW0|DH0|DN0|DV0|UV120|DA0|UH120|UA0|DF0|DQ0|UF120|UN120|UQ0|DW0|DA0|UA120|DF0|UW120|UF0|DH0|DA0|DQ0|DE0|UH120|UQ120|UE0|DQ0|DF0|UF120|DH0|UA120|UQ0|UH0|DN0|DW0|UN120|UW120|DD0|DH0|DE0|DA0|UA120|DN0|UH120|UE0|UN0|DV0|UV120|UD120|DC0|DQ0|DY0|UC240|UQ0|DN0|DW0|UY240|UN0|UW0|DA0|DE0|UA240|UE0|DC0|DQ0|UC240|UQ0|DY0|DN0|DW0|UN240|UW0|DD0|DH0|UY240|UD0|UH0|DN0|DQ0|UN240|UQ0|DA0|DW0|UA240|UW0|DY0|DC0|DE0|UC240|UE0|DN0|DQ0|UY240|UN0|UQ0|DA0|DW0|UA240|UW0|DD0|DH0|UD240|UH0|DY0|DA0|DC0|DQ0|UA240|UQ0|DD0|DW0|UY240|UC0|UD0|UW0|DH0|DZ0|DE0|UH480|UZ0|UE0|DT0|DZ0|DQ0|UZ240|UQ0|DB0|DW0|UT240|UB0|UW0|DA0|DH0|UA240|UH0|DB0|DQ0|UB240|UQ0|DT0|DA0|DW0|UA240|UW0|DD0|DE0|UT240|UD0|UE0|DZ0|DQ0|UZ240|UQ0|DB0|DW0|UB240|UW0|DT0|DD0|DA0|DH0|UD240|UH0|DB0|DQ0|UT240|UB0|UQ0|DD0|DW0|UD240|UW0|DG0|DE0|UA240|UG0|UE0|DT0|DS0|DN0|DQ0|US240|UQ0|DD0|DW0|UT240|UD0|UW0|DA0|DH0|UN480|UA0|UH0|DY0|DR0|DV0|DQ0|UQ240|DA0|DW0|UY240|UR0|UA0|UW0|DG0|DE0|UG240|UE0|DH0|DQ0|UV240|UH0|UQ0|DY0|DR0|DA0|DW0|UW240|DV0|DH0|UY240|UR0|UV0|UH0|DF0|DQ0|UF240|UQ0|DN0|DW0|UA240|UN0|UW0|DY0|DR0|DF0|DV0|DE0|UF240|UE0|DA0|DQ0|UY240|UR0|UA0|UQ0|DN0|DW0|UN240|UW0|DA0|DH0|UV240|UA0|UH0|DY0|DR0|DV0|DF0|DQ0|UV240|UQ0|DW0|DN0|UY240|UR0|UW0|UN0|DA0|DE0|UF480|UA0|UE0|DU0|DV0|DE0|UV240|UE0|DA0|UU240|UA0|DT0|DF0|DQ0|UF240|UQ0|DH0|UT240|UH0|DE0|DA0|DQ0|UA240|UQ0|DF0|DW0|UE240|UF0|UW0|DT0|DN0|DQ0|UN240|UQ0|DE0|DY0|DD0|DA0|DH0|UT240|UE240|UY0|UD720|UA0|UH0",
"notes": "DCHN0|UC120|DA0|UA120|DD0|UD120|UN120|DN0|UN120|DD0|UH120|UD0|DHAQ0|UH120|DN120|UN120|DD0|UD120|DH0|UH120|UA120|UQ0|DCDE0|UC120|DN0|UN120|DA0|UA120|UD120|UE0|DCQY0|UC240|UQ0|DNW0|UY240|UNW0|DAE0|UA240|UE0|DCQ0|UC240|UQ0|DNW0|UN240|UW0|DDH0|UD240|UH0|DNQ0|UN240|UQ0|DAW0|UA240|UW0|DCE0|UC240|UE0|DNQ0|UN240|UQ0|DAW0|UA240|UW0|DDH0|UD240|UH0|DACQ0|UA240|UQ0|DDW0|UC240|UDW0|DHZE0|UH480|UZE0|DZQ0|UZ240|UQ0|DBW0|UB240|UW0|DAH0|UA240|UH0|DBQ0|UB240|UQ0|DAW0|UA240|UW0|DDE0|UD240|UE0|DZQ0|UZ240|UQ0|DBW0|UB240|UW0|DDAH0|UD240|UH0|DBQ0|UB240|UQ0|DDW0|UD240|UW0|DGE0|UA240|UGE0|DSNQ0|US240|UQ0|DDW0|UD240|UW0|DAH0|UN480|UAH0|DVQ0|UQ240|DAW0|UA240|UW0|DGE0|UG240|UE0|DHQ0|UV240|UHQ0|DAW0|UW240|DVH0|UV240|UH0|DFQ0|UF240|UQ0|DNW0|UA240|UNW0|DFVE0|UF240|UE0|DAQ0|UA240|UQ0|DNW0|UN240|UW0|DAH0|UV240|UAH0|DVFQ0|UV240|UQ0|DNW0|UN240|UW0|DAE0|UF480|UAE0|DQV0|UQ240|UV0|DAW0|UA240|UW0|DHB0|UH240|UB0|DNQ0|UN240|UQ0|DWA0|UW240|UA0|DFE0|UF240|UE0|DQG0|UQ240|UG0|DFW0|UF240|UW0|DHNV0|UV120|DA0|UH120|UA0|DFQ0|UF120|UN120|UQ0|DWA0|UA120|DF0|UW120|UF0|DHAQE0|UH120|UQ120|UE0|DQF0|UF120|DH0|UA120|UQH0|DNW0|UN120|UW120|DDHEA0|UA120|DN0|UH120|UEN0|DV0|UV120|UD120|DCQY0|UC240|UQ0|DNW0|UY240|UNW0|DAE0|UA240|UE0|DCQ0|UC240|UQ0|DYNW0|UN240|UW0|DDH0|UY240|UDH0|DNQ0|UN240|UQ0|DAW0|UA240|UW0|DYCE0|UC240|UE0|DNQ0|UY240|UNQ0|DAW0|UA240|UW0|DDH0|UD240|UH0|DYACQ0|UA240|UQ0|DDW0|UY240|UCDW0|DHZE0|UH480|UZE0|DTZQ0|UZ240|UQ0|DBW0|UT240|UBW0|DAH0|UA240|UH0|DBQ0|UB240|UQ0|DTAW0|UA240|UW0|DDE0|UT240|UDE0|DZQ0|UZ240|UQ0|DBW0|UB240|UW0|DTDAH0|UD240|UH0|DBQ0|UT240|UBQ0|DDW0|UD240|UW0|DGE0|UA240|UGE0|DTSNQ0|US240|UQ0|DDW0|UT240|UDW0|DAH0|UN480|UAH0|DYRVQ0|UQ240|DAW0|UY240|URAW0|DGE0|UG240|UE0|DHQ0|UV240|UHQ0|DYRAW0|UW240|DVH0|UY240|URVH0|DFQ0|UF240|UQ0|DNW0|UA240|UNW0|DYRFVE0|UF240|UE0|DAQ0|UY240|URAQ0|DNW0|UN240|UW0|DAH0|UV240|UAH0|DYRVFQ0|UV240|UQ0|DWN0|UY240|URWN0|DAE0|UF480|UAE0|DUVE0|UV240|UE0|DA0|UU240|UA0|DTFQ0|UF240|UQ0|DH0|UT240|UH0|DEAQ0|UA240|UQ0|DFW0|UE240|UFW0|DTNQ0|UN240|UQ0|DEYDAH0|UT240|UE240|UY0|UD720|UAH0",
"ticks": 480
}

View File

@@ -8,6 +8,6 @@
"type": "midi",
"composer": "曲师",
"arranger": "谱师",
"notes": "DE240|DD0|UE240|UD0|DY0|DH0|UY240|UH0|DU0|DJ0|UU240|UJ0|DY0|DE0|DQ0|DC0|UC240|DN0|UN240|DA0|UA240|DC0|UC240|DN0|UN240|DA0|UY240|UE0|UQ0|UA0|DU0|DJ0|DC0|UC240|DN0|UN240|DA0|UU240|UJ0|UA0|DY0|DH0|DN0|UN240|DA0|UY240|UH0|UA0|DU0|DJ0|DD0|UU120|UJ0|DY0|DH0|UD120|UY0|UH0|DT0|DG0|DC0|UC240|DB0|UB240|DM0|UM240|DC0|UC240|DB0|UB240|DM0|UT240|UG0|UM0|DE0|DD0|DC0|UC240|DB0|UB240|DM0|UE240|UD0|UM0|DT0|DG0|DB0|UB240|DM0|UM240|DD0|UT240|UG0|UD0|DY0|DH0|DZ0|UZ240|DV0|UV240|DN0|UN240|DV0|UV240|DN0|UN240|DA0|UY240|UH0|UA0|DT0|DG0|DX0|UX240|DB0|UB240|DM0|UT240|UG0|UM0|DR0|DF0|DB0|UB240|DM0|UM240|DS0|UR240|UF0|US0|DE0|DD0|DZ0|UZ240|DC0|UC240|DB0|UB240|DC0|UC240|DB0|UB240|DA0|UD240|UA0|DS0|DB0|UB240|DA0|UA240|DB0|US240|UB0|DD0|DC0|UE240|UC0|DW0|DB0|UW240|UB0|DZ0|DE0|UD240|UZ0|UE0|DX0|DR0|DF0|UX240|DV0|UV240|DN0|UN240|DV0|UV240|DN0|UR240|UF0|UN0|DS0|DD0|DE0|UD120|UE0|DF0|DR0|US120|UF0|UR0|DN0|DG0|DT0|UN240|DV0|UG240|UT0|UV0|DX0|DF0|DR0|UF120|UR0|DG0|DT0|UX120|UG0|UT0|DS0|DH0|DY0|US240|DN0|UH240|UY0|UN0|DV0|DG0|DT0|UG120|UT0|DH0|DY0|UV120|UH0|UY0|DC0|DY0|DE0|DQ0|UC240|DN0|UN240|DA0|UA240|DN0|UN240|DA0|UA240|DD0|UY240|UE0|UQ0|UD0|DH0|DJ0|DU0|UH240|DD0|UD240|DA0|UJ240|UU0|UA0|DH0|DY0|DD0|UD240|DA0|UA240|DN0|UH240|UY0|UN0|DC0|DJ0|DU0|UC240|DB0|UB240|DM0|UM240|DB0|UB240|DM0|UM240|DD0|UJ240|UU0|UD0|DC0|DH0|DY0|UC240|DM0|UM240|DB0|UH240|UY0|UB0|DD0|DJ0|DU0|UD240|DG0|UG240|DM0|UJ240|UU0|UM0|DJ0|DB0|DT0|DE0|DG0|DD0|UB240|DC0|UC240|DM0|UD240|UM0|DB0|UB240|DD0|UG240|UD0|DM0|UM240|DB0|UJ240|UB0|DC0|UC240|DJ0|UE240|UJ0|DE0|DD0|DM0|UE240|UD0|UM0|DY0|DH0|DC0|UT240|UY0|UH0|UC0|DM0|DJ0|DU0|UM240|UJ0|UU0|DQ0|DC0|DE0|DY0|UC240|DN0|UN240|DA0|UA240|DN0|UN240|DA0|UA240|DD0|UQ240|UE0|UY0|UD0|DJ0|DU0|DH0|UH240|DD0|UD240|DA0|UJ240|UU0|UA0|DH0|DY0|DD0|UD240|DA0|UH240|UY0|UA0|DN0|DJ0|DU0|UU120|DY0|DH0|UN120|UJ0|UY0|UH0|DC0|DG0|DT0|UC240|DB0|UB240|DM0|UM240|DB0|UB240|DM0|UM240|DD0|UG240|UT0|UD0|DE0|DD0|DG0|UG240|DC0|UC240|DM0|UE240|UD0|UM0|DT0|DG0|DC0|UC240|DM0|UM240|DB0|UT240|UG0|UB0|DH0|DY0|DV0|UV240|DA0|UA240|DF0|UF240|DA0|UH240|UY0|UA0|DY0|DH0|DF0|UF240|DN0|UY240|UH0|UN0|DB0|DJ0|DU0|UB240|DS0|UJ240|UU0|US0|DG0|DJ0|DW0|DT0|UG240|DS0|UJ240|UW0|UT0|US0|DB0|DU0|DW0|DG0|UB240|DM0|UU240|UW0|UG0|UM0|DA0|DG0|DQ0|DT0|DE0|UA240|DB0|UB240|DD0|UD240|DA0|UG240|UA0|DB0|UB240|DD0|UQ240|UD0|DA0|UA240|DD0|UE240|UD0|DG0|UG240|DQ0|UT240|UQ0|DD0|DW0|DH0|UD240|UW0|UH0|DG0|DW0|DE0|UG240|UW0|UE0|DW0|DY0|DE0|UW240|UY0|UE0|DH0|DR0|UH240|UR0|DF0|DY0|DE0|UF240|UY0|UE0|DS0|DR0|DW0|US240|UR0|UW0|DH0|DE0|UH240|UE0|DF0|DR0|DW0|UF240|UR0|UW0|DS0|DW0|DQ0|US240|UW0|UQ0|DN0|DW0|UN240|UW0|DF0|DW0|DQ0|UF240|UW0|UQ0|DU0|DN0|DJ0|UU240|UN0|UJ0|DA0|DQ0|UA240|UQ0|DJ0|DU0|DD0|UJ240|UU0|UD0|DC0|DH0|DY0|UC240|UH0|UY0|DN0|DG0|UN240|UG0|DA0|DH0|DY0|UA240|UH0|UY0|DN0|DJ0|DE0|UN240|UJ0|UE0|DA0|DH0|UA240|UH0|DD0|DJ0|DE0|UD240|UJ0|UE0|DH0|DY0|DQ0|UH240|UY0|UQ0|DD0|DJ0|UD240|UJ0|DA0|DY0|DQ0|UA240|UY0|UQ0|DE0|DD0|DW0|UE240|UD0|UW0|DA0|DQ0|UA240|UQ0|DN0|DE0|DW0|UN240|UE0|UW0|DV0|DQ0|DY0|DE0|UY60|UE0|DU0|DR0|UU60|UR0|DY0|DE0|UY60|UE0|DU0|DR0|UV60|UQ0|UU0|UR0|DA0|DY0|DE0|UA240|DH0|DQ0|UH240|UQ0|DV0|DF0|UV240|UF0|DA0|UA240|DH0|DF0|UH240|UF0|DA0|UA240|DH0|UH240|DF0|UF240|DQ0|UQ240|DH0|UH240|DA0|UY240|UE0|UA0|DD0|DE0|DT0|UE60|UT0|DR0|DY0|UR60|UY0|DE0|DT0|UE60|UT0|DR0|DY0|UD60|UR0|UY0|DG0|DE0|DT0|UG240|DJ0|UJ240|DG0|UG240|DJ0|UJ240|DD0|UD240|DG0|UG240|DD0|UD240|DM0|UM240|DD0|UD240|DG0|UG240|DJ0|UE240|UT0|UJ0|DC0|DD0|DH120|UC120|DN0|DQ0|DE120|UN120|DA0|DY0|UA240|DN0|UN240|DA0|UA240|DD0|UD240|DH0|UH240|DD0|UD240|DQ0|UQ240|DH0|UH240|DE0|UD240|UE0|DQ0|UH120|UQ120|UQ0|DY0|UE120|UY120|UY0",
"notes": "DE240|DD0|UE240|UD0|DYH0|UY240|UH0|DUJ0|UU240|UJ0|DYEQC0|UC240|DN0|UN240|DA0|UA240|DC0|UC240|DN0|UN240|DA0|UY240|UEQA0|DUJC0|UC240|DN0|UN240|DA0|UU240|UJA0|DYHN0|UN240|DA0|UY240|UHA0|DUJD0|UU120|UJ0|DYH0|UD120|UYH0|DTGC0|UC240|DB0|UB240|DM0|UM240|DC0|UC240|DB0|UB240|DM0|UT240|UGM0|DEDC0|UC240|DB0|UB240|DM0|UE240|UDM0|DTGB0|UB240|DM0|UM240|DD0|UT240|UGD0|DYHZ0|UZ240|DV0|UV240|DN0|UN240|DV0|UV240|DN0|UN240|DA0|UY240|UHA0|DTGX0|UX240|DB0|UB240|DM0|UT240|UGM0|DRFB0|UB240|DM0|UM240|DS0|UR240|UFS0|DEDZ0|UZ240|DC0|UC240|DB0|UB240|DC0|UC240|DB0|UB240|DA0|UD240|UA0|DSB0|UB240|DA0|UA240|DB0|US240|UB0|DDC0|UE240|UC0|DWB0|UW240|UB0|DZE0|UD240|UZE0|DXRF0|UX240|DV0|UV240|DN0|UN240|DV0|UV240|DN0|UR240|UFN0|DSDE0|UD120|UE0|DFR0|US120|UFR0|DNGT0|UN240|DV0|UG240|UTV0|DXFR0|UF120|UR0|DGT0|UX120|UGT0|DSHY0|US240|DN0|UH240|UYN0|DVGT0|UG120|UT0|DHY0|UV120|UHY0|DCYEQ0|UC240|DN0|UN240|DA0|UA240|DN0|UN240|DA0|UA240|DD0|UY240|UEQD0|DHJU0|UH240|DD0|UD240|DA0|UJ240|UUA0|DHYD0|UD240|DA0|UA240|DN0|UH240|UYN0|DCJU0|UC240|DB0|UB240|DM0|UM240|DB0|UB240|DM0|UM240|DD0|UJ240|UUD0|DCHY0|UC240|DM0|UM240|DB0|UH240|UYB0|DDJU0|UD240|DG0|UG240|DM0|UJ240|UUM0|DJBTEGD0|UB240|DC0|UC240|DM0|UD240|UM0|DB0|UB240|DD0|UG240|UD0|DM0|UM240|DB0|UJ240|UB0|DC0|UC240|DJ0|UE240|UJ0|DEDM0|UE240|UDM0|DYHC0|UT240|UYHC0|DMJU0|UM240|UJU0|DQCEY0|UC240|DN0|UN240|DA0|UA240|DN0|UN240|DA0|UA240|DD0|UQ240|UEYD0|DJUH0|UH240|DD0|UD240|DA0|UJ240|UUA0|DHYD0|UD240|DA0|UH240|UYA0|DNJU0|UU120|DYH0|UN120|UJYH0|DCGT0|UC240|DB0|UB240|DM0|UM240|DB0|UB240|DM0|UM240|DD0|UG240|UTD0|DEDG0|UG240|DC0|UC240|DM0|UE240|UDM0|DTGC0|UC240|DM0|UM240|DB0|UT240|UGB0|DHYV0|UV240|DA0|UA240|DF0|UF240|DA0|UH240|UYA0|DYHF0|UF240|DN0|UY240|UHN0|DBJU0|UB240|DS0|UJ240|UUS0|DGJWT0|UG240|DS0|UJ240|UWTS0|DBUWG0|UB240|DM0|UU240|UWGM0|DAGQTE0|UA240|DB0|UB240|DD0|UD240|DA0|UG240|UA0|DB0|UB240|DD0|UQ240|UD0|DA0|UA240|DD0|UE240|UD0|DG0|UG240|DQ0|UT240|UQ0|DDWH0|UD240|UWH0|DGWE0|UG240|UWE0|DWYE0|UW240|UYE0|DHR0|UH240|UR0|DFYE0|UF240|UYE0|DSRW0|US240|URW0|DHE0|UH240|UE0|DFRW0|UF240|URW0|DSWQ0|US240|UWQ0|DNW0|UN240|UW0|DFWQ0|UF240|UWQ0|DUNJ0|UU240|UNJ0|DAQ0|UA240|UQ0|DJUD0|UJ240|UUD0|DCHY0|UC240|UHY0|DNG0|UN240|UG0|DAHY0|UA240|UHY0|DNJE0|UN240|UJE0|DAH0|UA240|UH0|DDJE0|UD240|UJE0|DHYQ0|UH240|UYQ0|DDJ0|UD240|UJ0|DAYQ0|UA240|UYQ0|DEDW0|UE240|UDW0|DAQ0|UA240|UQ0|DNEW0|UN240|UEW0|DVQYE0|UY60|UE0|DUR0|UU60|UR0|DYE0|UY60|UE0|DUR0|UV60|UQUR0|DAYE0|UA240|DHQ0|UH240|UQ0|DVF0|UV240|UF0|DA0|UA240|DHF0|UH240|UF0|DA0|UA240|DH0|UH240|DF0|UF240|DQ0|UQ240|DH0|UH240|DA0|UY240|UEA0|DDET0|UE60|UT0|DRY0|UR60|UY0|DET0|UE60|UT0|DRY0|UD60|URY0|DGET0|UG240|DJ0|UJ240|DG0|UG240|DJ0|UJ240|DD0|UD240|DG0|UG240|DD0|UD240|DM0|UM240|DD0|UD240|DG0|UG240|DJ0|UE240|UTJ0|DCD0|DH120|UC120|DNQ0|DE120|UN120|DAY0|UA240|DN0|UN240|DA0|UA240|DD0|UD240|DH0|UH240|DD0|UD240|DQ0|UQ240|DH0|UH240|DE0|UD240|UE0|DQ0|UH120|UQ120|UQ0|DY0|UE120|UY120|UY0",
"ticks": 480
}

View File

@@ -10,4 +10,4 @@
"notes": "V[4]A[4]E[2]|\nV[4]A[4]W[2]|\nV[4]A[4]Q[4]J[4]|\nQ[4]J[4]G[4]D[4]|\nV[4]A[4]E[2]|\nV[4]A[4]W[2]|\nV[4]A[4]Q[4]J[4]|\n\nQ[4]T[4]E[2]|\nV[4]A[4](HE)[2]|\nB[4]S[4](JW)[2]|\nN[4]D[4](HQ)[4]J[4]|\nQ[4]J[4]G[4]D[4]|\nV[4]A[4](HE)[2]|\nB[4]S[4](JW)[2]|\nN[4]D[4](QE)[4](JW)[4]|\n\n(HQ)[2]W[4]E[4]|\n(VH)[4]A[4]E[2]|\n(BW)[4]S[4]E[4-#]W[4]H[4]|\nN[4]D[4](HQ)[4]J[4]|\nQ[4]J[4]G[4]D[4]|\n(VH)[4]A[4]E[2]|\n(MW)[4]S[4](ET)[4]E[4]|\nN[4](CD)[4](SH)[4](DJ)[4]|\n\nQ[4]U[4]Y[4]T[4]|\n(VHY)[4]A[4]E[2]|\n(BW)[4]S[4](EY)[4]H[4]|\nN[4]D[4](HQ)[4]J[4]|\nQ[4](JD)[4]G[4]D[4]|\n(VH)[4]A[4]E[2]|\n(MW)[4]S[4]E[4-#]W[4]Y[4]|\n\nN[4]D[4]H[4]J[4]|\nQ[2]W[4]E[4]|\n(HV)[4](ZA)[4](NE)[2]|\n(BW)[4](XS)[4]E[4-#](WM)[4](HA)[4]|\nN[4](CD)[4](NQ)[4]J[4]|\nQ[4]J[4]G[4]D[4]|\n(HV)[4](ZA)[4](NE)[2]|\n\n(BW)[4](XS)[4](MET)[4]E[4]|\nN[4](CD)[4](SH)[4](DJ)[4]|\nQ[4]U[4](SY)[4](DT)[4]|\n(VHY)[4](ZA)[4](NE)[2]|\n(BW)[4](XS)[4](EY)[4](AH)[4]|\nN[4](CD)[4](NQ)[4]J[4]|\nQ[4](JDN)[4](GA)[4]D[4]|\n\n(VH)[4]A[4](NE)[2]|\n(BW)[4]S[4]E[4-#](MW)[4]Y[4]|\nN[4]D[4]H[4]J[4]|\n(NQ)[1]|\nV[4]A[4]E[2]|\nB[4]S[4]W[2]|\nN[4]D[4]Q[4]J[4]|\nQ[4]J[4]G[4]D[4]|\n\nV[4]A[4]E[2]|\nB[4]S[4]W[2]|\nN[4]D[4]H[4]J[4]|\nQ[1]",
"type": "yuanqin",
"ticks": 480
}
}

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

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

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
{
"name": "蒲公英的约定",
"author": "MidiTrans",
"instrument": "风物之诗琴",
"instrument": "谐律键琴",
"type": "midi",
"description": "曲谱信息",
"time_signature": "4/4",

View File

@@ -1032,13 +1032,58 @@
jsonOutput.textContent = JSON.stringify(outputJson, null, 2);
});
// 下载 JSON
// 新增将给定的notes字符串按照指定规则合并相邻代码项从Python实现转换而来
function mergeCodes(s) {
if (typeof s !== 'string') return s;
const pattern = /^([DU])([A-Z]+)(\d+)$/;
const codes = s.split('|');
const merged = [];
for (let code of codes) {
const m = code.match(pattern);
if (!m) {
// 非匹配项直接保留原始字符串
merged.push({ raw: code });
continue;
}
const prefix = m[1];
const middle = m[2];
const numStr = m[3];
const num = parseInt(numStr, 10);
if (merged.length > 0 && merged[merged.length - 1].prefix === prefix) {
const last = merged[merged.length - 1];
const lastNum = parseInt(last.numStr, 10);
if ((lastNum === 0 || lastNum === 1) && (num === 0 || num === 1)) {
// 合并:保留首字母(prefix),拼接中间字母,数字取右侧项的数字
last.middle = last.middle + middle;
last.numStr = numStr;
continue;
}
}
merged.push({ prefix: prefix, middle: middle, numStr: numStr });
}
const resultParts = merged.map(item => {
if (item.raw !== undefined) return item.raw;
return `${item.prefix}${item.middle}${item.numStr}`;
});
return resultParts.join('|');
}
// 下载 JSON在提供下载前先对notes字段做mergeCodes处理
downloadBtn.addEventListener('click', () => {
if (!lastGeneratedJson) {
alert('请先生成JSON');
return;
}
const jsonStr = JSON.stringify(lastGeneratedJson, null, 2);
// 在下载前处理notes字段
const processedNotes = mergeCodes(lastGeneratedJson.notes);
const jsonObjForDownload = Object.assign({}, lastGeneratedJson, { notes: processedNotes });
const jsonStr = JSON.stringify(jsonObjForDownload, null, 2);
const blob = new Blob([jsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');

View File

@@ -509,24 +509,46 @@
* 执行单音
*
* @param key {string}
* @param status 按键模式 press down up
*
*/
async function play_note(key) {
keyDown(key);
keyUp(key);
async function play_note(key, status = "press") {
if (status === "press") {
keyDown(key);
keyUp(key);
} else if (status === "down") {
keyDown(key);
} else if (status === "up") {
keyUp(key);
await sleep(4);
}
}
/**
*
* 执行和弦
*
* @param keys {Array.string}
* @param keys {string}
* @param status 按键模式 press down up
*
*/
async function play_chord(keys) {
for (const key of keys) {
play_note(key);
async function play_chord(keys, status = "press") {
if (status === "press") {
for (const key of keys) {
play_note(key, status);
}
} else if (status === "down") {
for (const key of keys) {
keyDown(key);
}
} else if (status === "up") {
for (const key of keys) {
keyUp(key);
}
await sleep(4);
}
}
/**
@@ -911,16 +933,39 @@
let play_sheet = sheet_list.split("|");
let base_time = 60000 / (bpm * ticks); // second per beat - 每tick多少毫秒
for (let i = 0; i < play_sheet.length; i++) {
let current_note = play_sheet[i];
log.debug(`${current_note[0]}-${current_note[1]}-${current_note.slice(2)}`);
let current_ticks = Math.round(current_note.slice(2));
let wait_time = Math.round(current_ticks * base_time);
await sleep(wait_time);
if (current_note[1] === "@") continue;
if (current_note[0] === "D") {
keyDown(current_note[1]);
// 正则表达式首字母A-Z中间字母串A-Z@数字部分0-9
const regex = /^([A-Z])([A-Z@]+)(\d+)$/;
let current_note = play_sheet[i];
const match = current_note.match(regex);
const status = match[1];
const notes = match[2];
const ticks = Math.round(match[3]);
if (settings.debug_mode === "启用") {
log.info(`${status}-${notes}-${ticks}`);
}
let wait_time = Math.round(ticks * base_time);
if (wait_time >= 2) {
await sleep(wait_time);
} else if (status === "D"){
await sleep(4);
}
if (notes === "@") continue;
if (status === "D") {
if (notes.length > 1) {
await play_chord(notes, "down");
} else {
await play_note(notes, "down");
}
} else {
keyUp(current_note[1]);
if (notes.length > 1) {
await play_chord(notes, "up");
} else {
await play_note(notes, "up");
}
}
}
} else {
@@ -940,19 +985,25 @@
log.info(`${sheet_list[i]["note"]}[${sheet_list[i]["type"]}-${sheet_list[i]["spl"]}]`);
}
if (sheet_list[i]["spl"] === 'none') { // 单音、休止符或和弦
let sleep_time = cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i);
if (sheet_list[i]["chord"]) {
await play_chord(sheet_list[i]["note"]); // 和弦
await play_chord(sheet_list[i]["note"], "down"); // 和弦
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
await play_chord(sheet_list[i]["note"], "up");
} else {
if (sheet_list[i]["note"] === '@') { // 休止符
// pass
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
} else {
await play_note(sheet_list[i]["note"]); // 单音
await play_note(sheet_list[i]["note"], "down"); // 单音
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
await play_note(sheet_list[i]["note"], "up");
}
}
if (i !== sheet_list.length - 1) {
await sleep(cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i));
}
// if (i !== sheet_list.length - 1) {
// await sleep(cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i));
// }
} else if (sheet_list[i]["spl"] === '#') { // 装饰音不会包含休止符时值为symbol的时值的1/16
if (sheet_list[i]["chord"]) {
await play_chord(sheet_list[i]["note"]); // 和弦
@@ -987,45 +1038,66 @@
for (let j = 0; j < temp_legato.length; j++) {
// 当前音符时长
let time_current = Math.round(time_legato * (1 / parseInt(temp_legato[j]["spl"].split(/\./)[0], 0)) / time_all);
if (temp_legato[j]["chord"]) {
await play_chord(temp_legato[j]["note"]); // 和弦
} else {
if (temp_legato[j]["note"] === '@') { // 休止符
// pass
} else {
await play_note(temp_legato[j]["note"]); // 单音
}
}
let sleep_time = 0;
if (count < temp_legato.length) {
await sleep(time_current);
sleep_time = time_current;
} else if (count === temp_legato.length - 1) {
if (i !== sheet_list.length - 1) {
// 计算连音的最后一个音的时值(计算装饰音)
await sleep(cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i, time_current));
sleep_time = cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i, time_current);
}
} else if (i !== sheet_list.length - 1) {
await sleep(time_current);
sleep_time = time_current;
}
if (temp_legato[j]["chord"]) {
await play_chord(temp_legato[j]["note"], "down"); // 和弦
await sleep(sleep_time);
await play_chord(temp_legato[j]["note"], "up");
} else {
if (temp_legato[j]["note"] === '@') { // 休止符
await sleep(sleep_time);
} else {
await play_note(temp_legato[j]["note"], "down"); // 单音
await sleep(sleep_time);
await play_note(temp_legato[j]["note"], "up");
}
}
// if (count < temp_legato.length) {
// await sleep(time_current);
// } else if (count === temp_legato.length - 1) {
// if (i !== sheet_list.length - 1) {
// // 计算连音的最后一个音的时值(计算装饰音)
// await sleep(cal_time_ornament(sheet_list, symbol_time, symbol, sheet_list[i]["type"], i, time_current));
// }
// } else if (i !== sheet_list.length - 1) {
// await sleep(time_current);
// }
count += 1;
}
// 重置连音缓存区
temp_legato = [];
}
} else if (sheet_list[i]["spl"] === '*') { // 附点音符
let sleep_time = cal_time_ornament(sheet_list, symbol_time * 1.5, symbol, sheet_list[i]["type"], i);
if (sheet_list[i]["chord"]) {
await play_chord(sheet_list[i]["note"]); // 和弦
await play_chord(sheet_list[i]["note"], "down"); // 和弦
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
await play_chord(sheet_list[i]["note"], "up");
} else {
if (sheet_list[i]["note"] === '@') { // 休止符
// pass
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
} else {
await play_note(sheet_list[i]["note"]); // 单音
await play_note(sheet_list[i]["note"], "down"); // 单音
await sleep(i !== sheet_list.length - 1 ? sleep_time: 0);
await play_note(sheet_list[i]["note"], "up");
}
}
// 排除尾音
if (i !== sheet_list.length - 1) {
await sleep(cal_time_ornament(sheet_list, symbol_time * 1.5, symbol, sheet_list[i]["type"], i));
}
// // 排除尾音
// if (i !== sheet_list.length - 1) {
// await sleep(cal_time_ornament(sheet_list, symbol_time * 1.5, symbol, sheet_list[i]["type"], i));
// }
} else {
log.info(`错误: ${sheet_list[i]["spl"]}`);
return null;

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "原琴·乐曲转换、自动演奏",
"version": "3.3.4",
"version": "3.4.0",
"bgi_version": "0.60.1",
"description": "功能描述:功能及其强大的原琴脚本\n核心功能------------------------------>\n1.轻松实现根据五线谱翻版琴谱,支持单音、和弦\n2.曲谱支持录入BPM、拍号\n3.特殊音符支持休止符、浮点音符、(三/六)连音、(三/六)连音标记线、装饰音·倚音\n4.含有制谱器,方便制作曲谱\n注意事项------------------------------>\n1.使用前请装备原琴\n2.音域只有3个八度受原琴音域限制本脚本的上限取决于翻谱的大佬卑微\n3.实际上装饰音·倚音的时长视为基础时值单位(比如拍号2/4的基础时值单位就是4分音符)的1/16\n4.制铺说明曲谱JSON文件的notes必须保证为一行且不能包括空白符换行符除外小节之间用|隔开,|不是必要的,作用是方便曲谱维护\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"authors": [