mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-28 05:29:52 +08:00
AutoYuanQin【更新】 (#3042)
* 添加自动重命名本地曲谱JSON文件功能 1. 增加了自动重命名功能,现在通过任何方式生成的.json文件(包括五线谱制谱器、简谱制谱器、MIDI制谱器),在放入`score_file`文件夹前无需手动添加`000X.`的前缀,仅保留原始文件名即可 * Update manifest.json
This commit is contained in:
@@ -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试听功能
|
||||
|
||||
@@ -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。
|
||||
*/
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user