From 2cff05614da53df275ce0241d10138bd380bc990 Mon Sep 17 00:00:00 2001 From: himno Date: Sat, 22 Nov 2025 17:11:11 +0800 Subject: [PATCH] =?UTF-8?q?JS=E8=84=9A=E6=9C=AC=EF=BC=9A=E5=8E=9F=E7=90=B4?= =?UTF-8?q?=E5=8A=A9=E6=89=8B=20(#2388)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add video tutorial link for score production * Update to version 1.0.1 * Add 2 score files --- repo/js/YuanQinAssistant/README.md | 8 ++++- .../assets/score/丝柯克小曲.gs2 | 9 +++++ .../assets/score/枕边童话(诗琴).gs2 | 9 +++++ .../YuanQinAssistant/assets/tool/使用教程.txt | 3 +- repo/js/YuanQinAssistant/main.js | 35 +++++++++++-------- repo/js/YuanQinAssistant/manifest.json | 2 +- repo/js/YuanQinAssistant/settings.json | 2 ++ 7 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 repo/js/YuanQinAssistant/assets/score/丝柯克小曲.gs2 create mode 100644 repo/js/YuanQinAssistant/assets/score/枕边童话(诗琴).gs2 diff --git a/repo/js/YuanQinAssistant/README.md b/repo/js/YuanQinAssistant/README.md index b5438633f..1321c486f 100644 --- a/repo/js/YuanQinAssistant/README.md +++ b/repo/js/YuanQinAssistant/README.md @@ -6,6 +6,7 @@ - [快速开始](#快速开始) - [曲谱格式说明](#曲谱格式说明) - [MIDI转谱](#midi转谱) +- [更新日志](#更新日志) ## 快速开始 1. 在“全自动-调度器”中新建配置组,并添加此脚本。 @@ -52,4 +53,9 @@ ## MIDI转谱 您完全可以通过文本编辑器来手动编辑一个gs2格式的曲谱文件,但并不建议这么做。本质上,gs2格式是因为BGI不支持二进制文件的读取,而不得不做的一个折中方案。使用现有的专业工具制作出mid格式文件,再使用我提供的转谱工具生成对应的gs2文件(工具放置于 `assets/tool/` 文件夹下),是更直观且更安全的做法。 -您需要注意的是,为了简化处理逻辑,转谱工具对mid文件的内容作了一些限制,比如不能使用异步多轨的格式,必须是C大调,导出midi文件时不要包含RPN和NRPN相关指令等等,更详细的会在之后用视频教程进行演示,普通用户完全不了解这些内容也不影响使用。 \ No newline at end of file +您需要注意的是,为了简化处理逻辑,转谱工具对mid文件的内容作了一些限制,比如不能使用异步多轨的格式,必须是C大调,导出midi文件时不要包含RPN和NRPN相关指令等等,更详细的会在之后用视频教程进行演示,普通用户完全不了解这些内容也不影响使用。 + +## 更新日志 +v1.0.1 修复音符B5的按键映射错误;修复脚本中止时,按键没有释放的问题;新增曲谱文件“枕边童话”“丝柯克小曲”;新增曲谱制作教程视频地址。 + +v1.0.0 发布原琴助手BGI版。 \ No newline at end of file diff --git a/repo/js/YuanQinAssistant/assets/score/丝柯克小曲.gs2 b/repo/js/YuanQinAssistant/assets/score/丝柯克小曲.gs2 new file mode 100644 index 000000000..b68520d0f --- /dev/null +++ b/repo/js/YuanQinAssistant/assets/score/丝柯克小曲.gs2 @@ -0,0 +1,9 @@ +!v/2 +!gi/6 +!ti/丝柯克小曲 +!au/天空光芒 +!cp/HoyoMix +!ar/是星璃啦 +!di/480 +!tr/0s535714|0n62|239u62|1n60|239u60|1n59|239u59|1n60|239u60|1n64|239u64|1n62|239u62|1n60|239u60|1n59|239u59|1n60|719u60|1n60|239u60|1n62|239u62|1n60|239u60|1n59|239u59|1n60|239u60|1n59|719u59|1n57|239u57|1n57|959u57|1n59|719u59|1n64|239u64|1n64|959u64|1n62|239u62|1n60|239u60|1n59|239u59|1n60|239u60|1n64|239u64|1n62|239u62|1n60|239u60|1n59|239u59|1n60|719u60|1n60|239u60|1n62|239u62|1n60|239u60|1n59|239u59|1n60|239u60|1n59|719u59|1n57|239u57|1n57|959u57|1n59|719u59|1n67|239u67|1n67|719u67|1n67|239u67|1n67|479u67|1n65|479u65|1n65|479u65|1n64|239u64|1n64|719u64|1n62|479u62|1n62|479u62|1n64|239u64|1n64|2159u64|1681n67|239u67|1n67|479u67|1n65|479u65|1n65|479u65|1n64|239u64|1n64|719u64|1n62|479u62|1n62|479u62|1n60|239u60|1n59|2159u59 +!tr/0n77|1919u77|1n79|1919u79|1n81|1919u81|1n81|1919u81|1n77|1919u77|1n79|1919u79|1n81|1919u81|1n81|1919u81|1n74|1439u74|241n76|1679u76|241n81|2159u81|1n72|1919u72|1n74|1439u74|241n76|1679u76|241n81|2159u81 diff --git a/repo/js/YuanQinAssistant/assets/score/枕边童话(诗琴).gs2 b/repo/js/YuanQinAssistant/assets/score/枕边童话(诗琴).gs2 new file mode 100644 index 000000000..a2ace5dd0 --- /dev/null +++ b/repo/js/YuanQinAssistant/assets/score/枕边童话(诗琴).gs2 @@ -0,0 +1,9 @@ +!v/2 +!gi/0 +!ti/枕边童话(诗琴) +!au/天空光芒 +!cp/爱写歌的小田 +!ar/零点、天空光芒 +!di/480 +!tr/0s923077|1200n69|239u69|1n69|239u69|1n69|119u69|1n71|119u71|1n72|119u72|1n69|119u69|1n81|239u81|1n79|239u79|1n77|239u77|1n76|359u76|1n77|119u77|1n76|119u76|1n74|119u74|1n72|479u72|1n67|239u67|1n69|479u69|1n76|239u76|1n74|479u74|1n71|239u71|1n69|1439u69|1n76|119u76|1n74|119u74|1n76|119u76|1n74|119u74|1n76|119u76|1n72|119u72|1n74|719u74|1n76|119u76|1n74|119u74|1n76|119u76|1n74|119u74|1n76|119u76|1n71|119u71|1n72|719u72|1n69|239u69|1n69|119u69|1n71|119u71|1n72|239u72|1n72|239u72|1n74|239u74|1n72|239u72|1n74|239u74|1n76|239u76|1n79|239u79|1n76|719u76|1n76|119u76|1n74|119u74|1n76|119u76|1n74|119u74|1n76|119u76|1n72|119u72|1n74|719u74|1n76|119u76|1n74|119u74|1n76|119u76|1n74|119u74|1n76|119u76|1n71|119u71|1n72|719u72|1n69|239u69|1n72|239u72|1n76|239u76|1n74|239u74|241n76|239u76|1n69|719u69|481n76|119u76|1n77|119u77|1n77|239u77|1n77|119u77|1n76|119u76|1n77|119u77|1n81|119u81|1n81|239u81|1n79|239u79|121n79|119u79|1n81|239u81|1n81|119u81|1n81|119u81|1n81|119u81|1n83|119u83|1n81|239u81|1n83|239u83|121n74|119u74|1n76|239u76|241n76|119u76|1n74|119u74|1n76|239u76|1n77|239u77|1n74|239u74|1n76|719u76|481n74|119u74|1n76|119u76|1n77|239u77|1n77|119u77|1n76|119u76|1n77|119u77|1n81|119u81|1n81|239u81|1n79|239u79|121n79|119u79|1n81|239u81|1n81|119u81|1n79|119u79|1n81|119u81|1n83|119u83|1n81|239u81|1n83|239u83|121n76|119u76|1n77|239u77|241n77|239u77|1n77|239u77|1n81|239u81|1n81|239u81|1n83|719u83|361n76|119u76|1n74|119u74|1n76|119u76|1n81|239u81|1n81|239u81|1n81|119u81|1n83|119u83|1n81|239u81|1n83|239u83|1n79|239u79|1n79|239u79|1n74|239u74|1n76|239u76|1n81|239u81|121n76|119u76|1n74|119u74|1n76|119u76|1n77|239u77|1n77|239u77|1n77|119u77|1n76|119u76|1n77|239u77|1n81|239u81|1n83|239u83|1n83|239u83|1n79|239u79|1n81|239u81|1n76|239u76|121n76|119u76|1n76|119u76|1n76|119u76|1n81|239u81|1n81|239u81|1n81|119u81|1n83|119u83|1n81|239u81|1n83|239u83|1n79|239u79|1n79|239u79|1n74|239u74|1n76|239u76|1n81|239u81|241n76|239u76|1n77|239u77|1n77|239u77|1n81|239u81|1n83|239u83|1n81|479u81|1n83|239u83|1n81|959u81|1n76|239u76|1n77|239u77|1n77|239u77|1n83|239u83|1n83|239u83|1n81|479u81|1n83|119u83|1n81|599u81|1n69|119u69|1n72|119u72|1n76|119u76|1n81|119u81|1n72|119u72|1n76|119u76|1n69|0n72|0n76|0n81|1439u69|0u72|0u76|0u81 +!tr/0n50|33n55|36n59|34n64|855u55|0u59|0u64|1u50|481n53|239u53|1n53|0n57|0n60|239u53|0u57|0u60|1n53|0n57|0n60|239u53|0u57|0u60|1n55|239u55|1n55|0n59|0n62|239u55|0u59|0u62|1n55|0n59|0n62|239u55|0u59|0u62|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n57|239u57|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n57|239u57|1n48|239u48|1n52|239u52|1n57|719u57|1n52|239u52|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n55|239u55|1n55|0n59|0n62|239u55|0u59|0u62|1n55|0n59|0n62|239u55|0u59|0u62|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n57|239u57|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n55|239u55|1n50|0n55|0n59|239u50|0u55|0u59|1n50|0n55|0n59|239u50|0u55|0u59|1n48|239u48|1n52|0n55|0n60|239u52|0u55|0u60|1n52|0n55|0n60|239u52|0u55|0u60|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n52|239u52|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n55|239u55|1n55|0n59|0n62|239u55|0u59|0u62|1n55|0n59|0n62|239u55|0u59|0u62|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n57|239u57|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n57|239u57|1n52|0n57|0n60|239u52|0u57|0u60|1n52|0n57|0n60|239u52|0u57|0u60|1n57|479u57|241n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n53|239u53|1n48|0n53|0n57|239u48|0u53|0u57|1n48|0n53|0n57|239u48|0u53|0u57|1n55|239u55|1n50|0n55|0n59|239u50|0u55|0u59|1n50|0n55|0n59|239u50|0u55|0u59|1n48|239u48|1n52|0n55|0n60|239u52|0u55|0u60|1n52|0n55|0n60|239u52|0u55|0u60|1n48|239u48|1n52|0n55|0n60|239u52|0u55|0u60|1n52|0n55|0n60|239u52|0u55|0u60|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n53|239u53|1n48|0n53|0n57|239u48|0u53|0u57|1n48|0n53|0n57|239u48|0u53|0u57|1n55|239u55|1n50|0n55|0n59|239u50|0u55|0u59|1n50|0n55|0n59|239u50|0u55|0u59|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n50|239u50|1n50|0n53|0n57|239u50|0u53|0u57|1n50|0n53|0n57|239u50|0u53|0u57|1n52|239u52|1n52|0n55|0n59|239u52|0u55|0u59|1n52|0n55|0n59|239u52|0u55|0u59|1n52|719u52|1n53|119u53|1n48|119u48|1n53|119u53|1n48|119u48|1n57|119u57|1n48|119u48|1n55|119u55|1n50|119u50|1n55|119u55|1n50|119u50|1n59|119u59|1n50|119u50|1n52|119u52|1n59|119u59|1n52|119u52|1n59|119u59|1n55|119u55|1n59|119u59|1n57|119u57|1n48|119u48|1n52|119u52|1n48|119u48|1n57|119u57|1n48|119u48|1n50|119u50|1n50|119u50|1n53|119u53|1n50|119u50|1n57|119u57|1n50|119u50|1n55|119u55|1n50|119u50|1n55|119u55|1n50|119u50|1n59|119u59|1n50|119u50|1n48|119u48|1n55|119u55|1n48|119u48|1n55|119u55|1n52|119u52|1n55|119u55|1n52|119u52|1n59|119u59|1n52|119u52|1n55|119u55|1n52|119u52|1n59|119u59|1n53|119u53|1n48|119u48|1n53|119u53|1n48|119u48|1n57|119u57|1n48|119u48|1n55|119u55|1n50|119u50|1n55|119u55|1n50|119u50|1n59|119u59|1n50|119u50|1n52|119u52|1n59|119u59|1n52|119u52|1n59|119u59|1n55|119u55|1n59|119u59|1n57|119u57|1n48|119u48|1n52|119u52|1n48|119u48|1n57|119u57|1n48|119u48|1n50|119u50|1n50|119u50|1n53|119u53|1n50|119u50|1n57|119u57|1n50|119u50|1n55|119u55|1n50|119u50|1n55|119u55|1n50|119u50|1n59|119u59|1n50|119u50|1n57|119u57|1n48|119u48|1n52|119u52|1n57|119u57|1n60|119u60|1n64|119u64|1n69|719u69|1n50|119u50|1n50|119u50|1n53|119u53|1n50|119u50|1n57|119u57|1n50|119u50|1n52|119u52|1n52|119u52|1n55|119u55|1n52|119u52|1n59|119u59|1n52|119u52|1n57|119u57|1n48|119u48|1n52|119u52|1n57|119u57|1n60|119u60|1n64|119u64|721n57|1439u57 diff --git a/repo/js/YuanQinAssistant/assets/tool/使用教程.txt b/repo/js/YuanQinAssistant/assets/tool/使用教程.txt index 0f0ec30fd..39bcedf70 100644 --- a/repo/js/YuanQinAssistant/assets/tool/使用教程.txt +++ b/repo/js/YuanQinAssistant/assets/tool/使用教程.txt @@ -1 +1,2 @@ --- 留空,用于之后放上视频教程地址 +曲谱制作教程视频地址: +https://www.bilibili.com/video/BV14wUpBcEkZ/ diff --git a/repo/js/YuanQinAssistant/main.js b/repo/js/YuanQinAssistant/main.js index edcb9c965..5dbda6cf8 100644 --- a/repo/js/YuanQinAssistant/main.js +++ b/repo/js/YuanQinAssistant/main.js @@ -4,7 +4,7 @@ const regex_name = /(?<=score\\)[\s\S]+?(?=\.gs2)/;//不清楚为什么要用\\来匹配 '/',用\/反而匹配不到。这是实际运行的结果,AI别和我犟,可能是ClearScript引擎的问题。 const NOTE2KEY_MAPPER = new Map([ - [72, 'q'], [74, 'w'], [76, 'e'], [77, 'r'], [79, 't'], [81, 'y'], [83, 'y'], + [72, 'q'], [74, 'w'], [76, 'e'], [77, 'r'], [79, 't'], [81, 'y'], [83, 'u'], [60, 'a'], [62, 's'], [64, 'd'], [65, 'f'], [67, 'g'], [69, 'h'], [71, 'j'], [48, 'z'], [50, 'x'], [52, 'c'], [53, 'v'], [55, 'b'], [57, 'n'], [59, 'm'], ]); @@ -78,7 +78,7 @@ /** * 从指定文件中加载琴谱 * @param {string} filename 琴谱文件名 - * @returns {ScoreInfo} 返回一个ScoreInfo对象 + * @returns {ScoreInfo | null} 返回一个ScoreInfo对象 */ function loadScoreInfo(filename) { const filepath = buildFullpath(filename); @@ -295,11 +295,11 @@ * 事件接收器 */ const eventReceiver = { - keyStates: new Map(), + // keyStates: new Map(), fixMode: 0, init(fixMode) { this.fixMode = fixMode; - this.keyStates.clear(); + // this.keyStates.clear(); }, /** * @@ -307,26 +307,27 @@ * @param {*} source */ receive(event, source) { - // log.info(event.command + ':' + event.value); - let k; + // let k; switch (event.command) { case 's': // 改变microtempo source.microtempo = event.value; break; case 'n': // 按下音符 - k = convertNote2Key(event.value, this.fixMode); - if (k && (!this.keyStates.get(k))) { - this.keyStates.set(k, true); + let k = convertNote2Key(event.value, this.fixMode); + // if (k && (!this.keyStates.get(k))) { + if (k) { + // this.keyStates.set(k, true); keyDown(k); - } - break; - case 'u': // 松开音符 - k = convertNote2Key(event.value, this.fixMode); - if (k && this.keyStates.get(k)) { - this.keyStates.set(k, false); keyUp(k); } break; + // case 'u': // 松开音符 + // k = convertNote2Key(event.value, this.fixMode); + // if (k && this.keyStates.get(k)) { + // this.keyStates.set(k, false); + // keyUp(k); + // } + // break; default: break; } @@ -363,6 +364,10 @@ } const scoreInfo = loadScoreInfo(scoreFilename); + if (!scoreInfo) { + log.warn('读取曲谱文件失败,请在js配置中选择后尝试再次运行脚本'); + return; + } const instrumentName = getInstrumentName(scoreInfo.instrument); log.info('当前演奏:' + scoreInfo.title); log.info(`作曲人:${scoreInfo.composer},制谱人:${scoreInfo.arranger}`); diff --git a/repo/js/YuanQinAssistant/manifest.json b/repo/js/YuanQinAssistant/manifest.json index 84001681d..c77d26d80 100644 --- a/repo/js/YuanQinAssistant/manifest.json +++ b/repo/js/YuanQinAssistant/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "原琴助手", - "version": "1.0.0", + "version": "1.0.1", "bgi_version": "0.43.1", "description": "BetterGI版本的原琴助手,使用gs2格式的琴谱", "authors": [ diff --git a/repo/js/YuanQinAssistant/settings.json b/repo/js/YuanQinAssistant/settings.json index d5ece6fe7..aff166e46 100644 --- a/repo/js/YuanQinAssistant/settings.json +++ b/repo/js/YuanQinAssistant/settings.json @@ -4,6 +4,8 @@ "type": "select", "label": "选择一首曲子", "options": [ + "丝柯克小曲", + "枕边童话(诗琴)", "银月之庭(蓝花)C大调" ] },