From 80add66c495a6f8407293a7c3af53fd6d0a4a199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8F=90=E7=93=A6=E7=89=B9=E9=92=93=E9=B1=BC=E7=8E=B3?= =?UTF-8?q?=E5=B8=88?= Date: Fri, 27 Mar 2026 11:13:02 +0800 Subject: [PATCH] =?UTF-8?q?AutoYuanQin=E3=80=90=E6=9B=B4=E6=96=B0=E3=80=91?= =?UTF-8?q?=20(#3042)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加自动重命名本地曲谱JSON文件功能 1. 增加了自动重命名功能,现在通过任何方式生成的.json文件(包括五线谱制谱器、简谱制谱器、MIDI制谱器),在放入`score_file`文件夹前无需手动添加`000X.`的前缀,仅保留原始文件名即可 * Update manifest.json --- repo/js/AutoYuanQin/README.md | 25 +++++----- repo/js/AutoYuanQin/main.js | 77 ++++++++++++++++++++++++++++--- repo/js/AutoYuanQin/manifest.json | 4 +- 3 files changed, 86 insertions(+), 20 deletions(-) diff --git a/repo/js/AutoYuanQin/README.md b/repo/js/AutoYuanQin/README.md index b7d86749a..2c3c556aa 100644 --- a/repo/js/AutoYuanQin/README.md +++ b/repo/js/AutoYuanQin/README.md @@ -5,17 +5,16 @@ 1. 右键原琴 - 修改脚本自定义配置 按照说明填写 1. 点击运行开始播放音乐 - tips: - - `AutoYuanQin/assets/tutorial_file`文件夹下的制谱软件(`五线谱制谱器.html`)为早期制谱用软件 - - 现在有更自动化的`AutoYuanQin/tools/MIDI制谱器.html`提供自动的MIDI文件转*AutoYuanQin*格式的乐谱 - - `AutoYuanQin/assets/tutorial_file`目录下有文档供曲谱制作人阅读 + - `AutoYuanQin/assets/tutorial_file`文件夹下的制谱软件(`五线谱制谱器.html` `简谱制谱器.html`)为有一定五线谱和简谱基础的用户提供,这两个制谱器制作出的谱子是最精确还原原谱的,但是需要花费一定的时间和精力去录谱 + - 现在有更自动化的`AutoYuanQin/tools/MIDI制谱器.html`提供自动的MIDI文件转*AutoYuanQin*格式的乐谱,改方案转换的谱子在精准度上略有瑕疵,尽量使用只有两个及以下通道的midi文件,录谱花费的时间和精力非常小 - 本文档下文会详细说明一个标准格式的曲谱.json文件格式, 包括各个字段的解释以及曲谱内容的格式要求 - - 将你制作的曲谱的JSON文件置于正确的路径运行脚本时会自动重置settings并退出脚本 + - 将你制作的曲谱的JSON文件置于正确的路径(`AutoYuanQin/assets/score_file`)运行脚本时会自动重置settings并退出脚本 - 如果你愿意慷慨的将自己的乐曲上传至仓库我们会很满足 ### 上传至仓库 -1. 上传到BetterGI脚本仓库的[路径](https://github.com/babalae/bettergi-scripts-list/tree/main/repo/js/AutoYuanQin/assets)下, 根据已存在的曲谱在你的文件名前添加序号`例如 10.曲名.json`, 完成后请联系BetterGI v7群主更新JS脚本 -1. 联系BetterGI v7(1029539994)群主帮你更新到仓库 -1. 发送邮件到*hijiwos@hotmail.com*并说明, 你的谱子将会在一段时间内更新到仓库 +1. 将你的JSON曲谱放在`AutoYuanQin/assets/score_file`目录下(文件名会自动适配),运行脚本检查无误后将`0001.小星星.json`格式的JSON文件保存,完成后请联系作者(提瓦特钓鱼玳师)更新JS脚本 +1. 加入BetterGI v7(1029539994)群,让群主帮你更新到仓库 +1. (推荐)发送邮件到*hijiwos@hotmail.com*并说明, 你的谱子将会在一段时间后更新到仓库 ## MIDI制谱器 1. 翻谱器位于`AutoYuanQin/tools/MIDI制谱器.html`,请使用浏览器打开 @@ -48,13 +47,13 @@ ## 曲谱制作解答 1. `/assets/tutorial_file/五线谱注解.png` 包含了五线谱(高音区和低音区)对应的3组键盘键位(相邻的红蓝大写字母为一组, 每组音域为三个八度) -1. 有不懂的地方请在 `/assets/tutorial_file/example.json` 内找, 这个谱子内包含了该脚本的五线谱相关的所有功能 +1. 有不懂的地方请在 `/assets/tutorial_file/example.json` 内找, 这个谱子内包含了该脚本的五线谱相关的大部分音符形式 ## 曲谱文件位置 1. 所有的曲谱文件应放置于 `AutoYuanQin/assets/score_file` 路径下 ## 文件结构 -一个标准的曲谱.json文件的基本结构如下: +一个标准的曲谱.json文件的基本结构如下(五线谱制谱器/简谱制谱器格式): ```json { "name": "", @@ -105,7 +104,7 @@ "name": "示例曲谱", "author": "录谱人A", "bpm": "120", - "description": 预计时长: xxxxx, 五线谱网址: xxx.xxxx.xxx, + "description": "预计时长: xxxxx, 五线谱网址: xxx.xxxx.xxx", "time_signature": "4/4", "composer": "曲师B", "arranger": "谱师C", @@ -113,7 +112,7 @@ } ``` ### 代码美化 -曲谱JSON文件的"notes"的值视作一个字符串, 在这个字符串内仅可以使用**换行符**美化代码, 通过这种方法可以使用记事本等软件从.json文件中获取带有换行的曲谱代码(**notes内的换行符不会被读取执行**) +曲谱JSON文件的"notes"的值视作一个字符串, 在这个字符串内仅可以使用**换行符**美化代码, 通过这种方法可以使用记事本等软件从.json文件中获取带有换行的曲谱代码(**notes内的换行符不会被读取执行**,所以不用担心多加的换行符会影响脚本读取) ## Notes 解析规则 @@ -249,6 +248,10 @@ notes 字段中包含的是乐谱内容音符**必须**使用**大写字母**, ## 更新日志 由于更新日志于3.0开始记录, 往期更新内容应该都在git的记录中, 不过我懒得翻了 +- ver 3.3.1 + +1. 增加了自动重命名功能,现在通过任何方式生成的.json文件(包括五线谱制谱器、简谱制谱器、MIDI制谱器),在放入`score_file`文件夹前无需手动添加`000X.`的前缀,仅保留原始文件名即可 + - ver 3.3.0 1. 更新了MIDI制谱器 - 可自选MIDI通道(支持多通道合并),并且支持MIDI试听功能 diff --git a/repo/js/AutoYuanQin/main.js b/repo/js/AutoYuanQin/main.js index 57da012cf..39f7f8365 100644 --- a/repo/js/AutoYuanQin/main.js +++ b/repo/js/AutoYuanQin/main.js @@ -11,15 +11,78 @@ /** * -------- 工具函数 -------- */ + // /** + // * + // * @returns {Array} 本地曲谱文件列表 + // */ + // const musicList = () => { + // const scoreFiles = Array.from(file.readPathSync(base_path)).filter(path => !file.isFolder(path) && path.endsWith(".json")); + // const localMusicList = scoreFiles.map(path => path.match(regex_name)[0]); + // return localMusicList; + // } + /** - * - * @returns {Array} 本地曲谱文件列表 + * 读取本地曲谱文件夹下的所有 .json 文件,并返回文件名列表。 + * 同时自动修正不合规的文件名:格式为 000X.任意字符.json(X 为四位数字,不足补零)。 + * 重命名规则:对于不合规文件,分配当前未使用的最小四位数字作为前缀,保留原文件名主体。 + * @returns {Array} 本地曲谱文件列表(合规文件名) */ const musicList = () => { - const scoreFiles = Array.from(file.readPathSync(base_path)).filter(path => !file.isFolder(path) && path.endsWith(".json")); - const localMusicList = scoreFiles.map(path => path.match(regex_name)[0]); - return localMusicList; - } + const usedNumbers = new Set(); + const finalList = []; + + // readPathSync(base_path) 返回完整相对路径 + const entries = Array.from(file.readPathSync(base_path)); + const jsonEntries = entries.filter(entry => !file.isFolder(entry) && entry.endsWith('.json')); + + // 统计已有编号 + jsonEntries.forEach(entry => { + const fileName = entry.split(/[/\\]/).pop(); + if (/^\d{4}\..*\.json$/.test(fileName)) { + usedNumbers.add(parseInt(fileName.substring(0, 4), 10)); + } + }); + + // 处理每个文件 + jsonEntries.forEach(entry => { + const fileName = entry.split(/[/\\]/).pop(); + const dirPath = entry.slice(0, entry.length - fileName.length); + + if (/^\d{4}\..*\.json$/.test(fileName)) { + // 合规:返回不带 .json 的文件名 + finalList.push(fileName.replace(/\.json$/, '')); + } else { + // 不合规:自动补零 + const baseName = fileName.replace(/\.json$/, ''); + + let newNum = 1; + while (usedNumbers.has(newNum)) newNum++; + + const newPrefix = newNum.toString().padStart(4, '0'); + const newFileName = `${newPrefix}.${baseName}.json`; + + const oldPath = entry; + const newPath = dirPath + newFileName; + log.debug(`${oldPath} -> ${newPath}`); + + file.renamePathSync(oldPath, newPath); + + finalList.push(`${newPrefix}.${baseName}`); + usedNumbers.add(newNum); + } + }); + + // 排序 + finalList.sort((a, b) => { + const na = parseInt(a.substring(0, 4), 10); + const nb = parseInt(b.substring(0, 4), 10); + return na - nb; + }); + + return finalList; // 返回不带 .json 的文件名 + }; + + /** * * 根据乐曲文件名生成乐曲文件路径 @@ -751,7 +814,7 @@ } /** - * 检查本地曲谱文件与主程序配置是否一致,并自动修正配置文件。 + * 检查本地曲谱文件与主程序配置是否一致,并自动修正配置settings文件。 * * @returns {boolean} 如果一致返回 true,否则返回 false。 */ diff --git a/repo/js/AutoYuanQin/manifest.json b/repo/js/AutoYuanQin/manifest.json index f3c8336bd..2555f9a07 100644 --- a/repo/js/AutoYuanQin/manifest.json +++ b/repo/js/AutoYuanQin/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 1, "name": "原琴·乐曲转换、自动演奏", - "version": "3.3.0", - "bgi_version": "0.43.1", + "version": "3.3.1", + "bgi_version": "0.59.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": [ {