JS脚本:自动原琴(五线谱版)【更新】、提瓦特全自动钓鱼【修复】 (#1850)

* Delete repo/js/AutoYuanQin directory

* 更新:自定义开始时间,本地曲谱识别

* 修复:定时关闭时间异常延长
This commit is contained in:
提瓦特钓鱼玳师
2025-09-10 17:15:22 +08:00
committed by GitHub
parent aa80815473
commit e65ab450f3
16 changed files with 152 additions and 102 deletions

View File

@@ -671,8 +671,8 @@
if (is_time_kill) {
let now = new Date();
time_target.setHours(parseInt(kill_hour), 10);
time_target.setMinutes(parseInt(kill_minute), 10);
time_target.setHours(parseInt(kill_hour, 10));
time_target.setMinutes(parseInt(kill_minute, 10));
time_target.setSeconds(0);
time_target.setMilliseconds(0);
if (time_target < now) { // 不是当天终止,天数+1

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "提瓦特自动钓鱼(全流程+自选)",
"version": "2.2.6",
"version": "2.2.7",
"bgi_version": "0.47.0",
"description": "支持自动追踪并垂钓bgi支持的全提瓦特垂钓点",
"authors": [

View File

@@ -13,10 +13,10 @@
3.发送邮件到hijiwos@hotmail.com并说明你的谱子将会在一段时间内更新到仓库
## MIDI翻谱器使用方法
**MIDI翻谱器: AutoYuanQin\assets\tutorial_file\MIDI翻谱器.html(请确保 五线谱注解.png与制谱器位于同一目录下)**
**声明:本谱器生成的曲谱文件为标准格式区别于五线谱制谱器生成的是MIDI版本的JSON标准格式**
**MIDI翻谱器路径: AutoYuanQin\assets\tutorial_file\MIDI翻谱器.html**
**声明:本谱器生成的曲谱文件为标准格式区别于五线谱制谱器生成的是MIDI版本的JSON标准格式**
使用浏览器打开```MIDI翻谱器.html```即可,注意**千万不要手动修改生成的JSON文件中的author**
使用浏览器打开```MIDI翻谱器.html```即可,注意**千万不要手动修改翻谱器生成的JSON文件中的author**
## 曲谱制作器使用方法
**制谱器路径: AutoYuanQin\assets\tutorial_file\五线谱制谱器.html(请确保 五线谱注解.png与制谱器位于同一目录下)**

View File

@@ -1,19 +1,20 @@
(async function () { // 待解决问题: 连音总时值如果为3个四分音符无法表示
// 乐曲名(带序号)
const music_list = [
"1.小星星",
"2.小星星变奏曲",
"3.Unknown Mother Goose [アンノウン・マザーグース]",
"4.铃芽之旅[Suzume]",
"5.Flower Dance",
"6.起风了",
"7.千本樱 (Eric Chen)",
"8.春よ、来い(春天,来吧)",
"9.One Last Kiss",
"10.卡农(MIDI转谱)"
]
// // 乐曲名(带序号)
// const music_list = [
// "0001.小星星",
// "0002.小星星变奏曲",
// "0003.Unknown Mother Goose [アンノウン・マザーグース]",
// "0004.铃芽之旅[Suzume]",
// "0005.Flower Dance",
// "0006.起风了",
// "0007.千本樱 (Eric Chen)",
// "0008.春よ、来い(春天,来吧)",
// "0009.One Last Kiss",
// "0010.卡农(MIDI转谱)"
// ]
const base_path = "assets/score_file/"
const regex_name = /(?<=score_file\\)[\s\S]*?(?=.json)/
/**
*
@@ -108,8 +109,10 @@
* - music {string}|{Array.string} 乐曲名type为"single"时为 {string}, type为"queue"时为 {Array.<string>}
*
*/
function get_settings() {
function get_settings(music_list) {
try{
// 读取开始时间
let music_start = typeof(settings.music_start) === 'undefined' ? "" : settings.music_start;
// 读取选择的单曲
let music_single = typeof(settings.music_selector) === 'undefined' ? 0 : settings.music_selector;
// 读取循环次数
@@ -137,6 +140,7 @@
if (music_single !== 0) {
return {
"type": "single",
"start": music_start,
"repeat": music_repeat,
"repeat_interval": repeat_interval,
"music": local_music_dic[music_single.split(".")[0]]
@@ -158,9 +162,9 @@
}
}
return {
"type": "queue",
"start": music_start,
"repeat": music_repeat,
"repeat_interval": repeat_interval,
"repeat_mode": repeat_mode,
@@ -198,39 +202,14 @@
log.info(`文件读取成功: ${music_path}`);
}
let music_msg_dic = {};
// 正则表达式,用于匹配如下内容
let regex_name = /(?<="name": ")[\s\S]*?(?=")/
let regex_author = /(?<="author": ")[\s\S]*?(?=")/
let regex_description = /(?<="description": ")[\s\S]*?(?=")/
let regex_bpm = /(?<="bpm": ")[\s\S]*?(?=")/
let regex_time_signature = /(?<="time_signature": ")[\s\S]*?(?=")/
let regex_composer = /(?<="composer": ")[\s\S]*?(?=")/
let regex_arranger = /(?<="arranger": ")[\s\S]*?(?=")/
let regex_notes = /(?<="notes": ")[\s\S]*?(?=")/
let regex_blank = /[\\n]/g
let music_msg_dic = JSON.parse(file_text);
let regex_blank = /[\n]/g
try {
// 歌曲名
music_msg_dic["name"] = file_text.match(regex_name)[0];
// 录谱人
music_msg_dic["author"] = file_text.match(regex_author)[0];
// 描述
music_msg_dic["description"] = file_text.match(regex_description)[0];
// 歌曲BPM
music_msg_dic["bpm"] = file_text.match(regex_bpm)[0];
// 拍号
music_msg_dic["time_signature"] = file_text.match(regex_time_signature)[0];
// 曲师
music_msg_dic["composer"] = file_text.match(regex_composer)[0];
// 谱师
music_msg_dic["arranger"] = file_text.match(regex_arranger)[0];
// 曲谱内容(删除换行符)
if (music_msg_dic["author"] !== "MidiTrans") {
music_msg_dic["notes"] = file_text.match(regex_notes)[0].replace(regex_blank, '');
music_msg_dic["notes"] = music_msg_dic["notes"].replace(regex_blank, '');
} else {
music_msg_dic["notes"] = JSON.parse(file_text)["notes"];
music_msg_dic["notes"] = JSON.parse(music_msg_dic["notes"])["notes"];
}
} catch(error) {
log.info(`曲谱解析错误:${error}\n请检查曲谱文件格式是否正确`);
@@ -445,10 +424,76 @@
}
async function main() {
const settings_msg = get_settings();
if (settings_msg == null) {
return null
// 首先检测本地曲谱文件与主程序中是否一致(本地已有的曲谱为最高优先级)
// 1.读取本地所有JSON曲谱文件
let music_list = [];
const all_scores = Array.from(file.readPathSync("assets/score_file")).filter(p => !file.isFolder(p) && p.endsWith(".json"));
for (let i = 0; i < all_scores.length; i++) {
music_list.push(all_scores[i].match(regex_name)[0]);
}
// 2.读取JS脚本配置中的曲谱列表
let setting_list = [];
let ori_set_list = JSON.parse(file.readTextSync("settings.json"))[1]["options"];
for (let i = 0; i < ori_set_list.length; i++) {
setting_list.push(ori_set_list[i]);
}
// 3.核对
if (!(setting_list.sort().join() == music_list.sort().join())) { // 曲谱配置不相同
// 以本地曲谱为准
let temp_json = JSON.parse(file.readTextSync("settings.json"));
temp_json[0]["options"] = music_list;
file.writeTextSync("settings.json", JSON.stringify(temp_json, null, 2)); // 覆写settings
log.warn("检测到曲谱文件不一致已自动修改settings(以本地曲谱文件为基准)...");
log.warn("JS脚本配置已更新请重新运行脚本");
return null;
}
const settings_msg = get_settings(music_list);
// 检测开始时间
// if (settings_msg["start"] !== "") {
// let target_time = new Date();
// for (let i = 0; i < settings_msg["start"].length; i++) {
// if (i == 0) {
// time_target.setHours(parseInt(settings_msg["start"][i], 10));
// time_target.setMinutes(0);
// time_target.setSeconds(0);
// time_target.setMilliseconds(0);
// } else if (i == 1) {
// time_target.setMinutes(parseInt(settings_msg["start"][i], 10));
// time_target.setSeconds(0);
// time_target.setMilliseconds(0);
// } else if (i == 2) {
// time_target.setSeconds(parseInt(settings_msg["start"][i], 10));
// time_target.setMilliseconds(0);
// } else if (i == 3) {
// time_target.setMilliseconds(parseInt(settings_msg["start"][i], 10));
// }
// }
// }
let time_target = new Date();
if (settings_msg.start !== "") {
const setters = ["setHours", "setMinutes", "setSeconds", "setMilliseconds"];
let start_time_list = settings_msg.start.split(":");
start_time_list.forEach((val, i) => {
time_target[setters[i]](parseInt(val, 10));
// 清零更小的单位
for (let j = i + 1; j < setters.length; j++) {
time_target[setters[j]](0);
}
});
// 如果剩余时间大于 1 秒,先等待到目标时间前 1 秒
let diff = time_target - new Date();
if (diff > 1000) await sleep(diff - 1000);
// 最后 1 秒内用短间隔检查
while (new Date() < time_target) {
continue;
}
}
// if (settings_msg == null) {
// return null
// }
// try {
if (settings_msg["type"] === "single") { // 单曲
// 读取乐谱

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "原琴·五线谱版",
"version": "3.0",
"version": "3.0.1",
"bgi_version": "0.43.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": [

View File

@@ -1,48 +1,53 @@
[
{
"name": "music_selector",
"type": "select",
"label": "选择乐曲(队列执行启用后该选项失效)",
"options": [
"1.小星星-[0:36]",
"2.小星星变奏曲-[7:57]",
"3.Unknown Mother Goose [アンノウン・マザーグース]-[4:08]",
"4.铃芽之旅[Suzume]-[3:52]",
"5.Flower Dance-[5:20]",
"6.起风了-[3:22]",
"7.千本樱 (Eric Chen)-[4:03]",
"8.春よ、来い(春天,来吧)-[4:02]",
"9.One Last Kiss-[4:12]",
"10.卡农(MIDI转谱).json"
]
},
{
"name": "music_repeat",
"type": "input-text",
"label": "循环执行次数(不填默认不循环)"
},
{
"name": "repeat_interval",
"type": "input-text",
"label": "循环间隔时间单位s, 循环执行启用时生效不填默认0s"
},
{
"name": "repeat_mode",
"type": "select",
"label": "循环模式(不填默认为单曲循环)",
"options": [
"单曲循环",
"队列循环"
]
},
{
"name": "music_queue",
"type": "input-text",
"label": "队列执行(填写数字[乐曲前的序号],空格隔开,不填默认不启用)"
},
{
"name": "music_interval",
"type": "input-text",
"label": "队列内间隔时间单位s, 队列执行启用时生效"
}
]
[
{
"name": "music_start",
"type": "input-text",
"label": "开始时间(留空则不启用,示例 00:00:00 )"
},
{
"name": "music_selector",
"type": "select",
"label": "选择乐曲(队列执行启用后该选项失效)",
"options": [
"0001.小星星",
"0002.小星星变奏曲",
"0003.Unknown Mother Goose [アンノウン・マザーグース]",
"0004.铃芽之旅[Suzume]",
"0005.Flower Dance",
"0006.起风了",
"0007.千本樱 (Eric Chen)",
"0008.春よ、来い(春天,来吧)",
"0009.One Last Kiss",
"0010.卡农(MIDI转谱)"
]
},
{
"name": "music_repeat",
"type": "input-text",
"label": "循环执行次数(不填默认不循环)"
},
{
"name": "repeat_interval",
"type": "input-text",
"label": "循环间隔时间单位s, 循环执行启用时生效不填默认0s"
},
{
"name": "repeat_mode",
"type": "select",
"label": "循环模式(不填默认为单曲循环)",
"options": [
"单曲循环",
"队列循环"
]
},
{
"name": "music_queue",
"type": "input-text",
"label": "队列执行(填写数字[乐曲前的序号],空格隔开,不填默认不启用"
},
{
"name": "music_interval",
"type": "input-text",
"label": "队列内间隔时间单位s, 队列执行启用时生效)"
}
]