AutoYuanQin【更新】 (#3042)

* 添加自动重命名本地曲谱JSON文件功能

1. 增加了自动重命名功能,现在通过任何方式生成的.json文件(包括五线谱制谱器、简谱制谱器、MIDI制谱器),在放入`score_file`文件夹前无需手动添加`000X.`的前缀,仅保留原始文件名即可

* Update manifest.json
This commit is contained in:
提瓦特钓鱼玳师
2026-03-27 11:13:02 +08:00
committed by GitHub
parent 71655d106a
commit 80add66c49
3 changed files with 86 additions and 20 deletions

View File

@@ -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制谱器 <a id="MIDI制谱器"></a>
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 解析规则 <a id="解析规则"></a>
@@ -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试听功能

View File

@@ -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.任意字符.jsonX 为四位数字,不足补零)。
* 重命名规则:对于不合规文件,分配当前未使用的最小四位数字作为前缀,保留原文件名主体。
* @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。
*/

View File

@@ -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": [
{