K1Guitar/tools/build_artist_kit.py

186 lines
7.2 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Assemble portable K1 artist tone-update kit + zip for handoff."""
from __future__ import annotations
import shutil
import zipfile
from datetime import datetime
from pathlib import Path
REPO = Path(__file__).resolve().parents[3] # 一诺国际吉他 (tools->proj->Code->repo)
# __file__ = .../YNGJ.../tools/build_artist_kit.py → parents[0]=tools [1]=proj [2]=Code [3]=repo
PROJ = Path(__file__).resolve().parents[1]
TOOLS = Path(__file__).resolve().parent
def main() -> None:
# Fix REPO: tools -> project -> Code -> 一诺国际吉他
repo = TOOLS.parents[1] # Code's parent? TOOLS.parent=proj, TOOLS.parents[1]=Code, [2]=repo
repo = TOOLS.parents[2]
proj = TOOLS.parent
day = datetime.now().strftime("%Y%m%d")
kit_name = f"K1_音师音色更新工具_{day}"
out_root = repo / "tools" / "out"
out_root.mkdir(parents=True, exist_ok=True)
kit = out_root / kit_name
if kit.exists():
shutil.rmtree(kit)
kit.mkdir(parents=True)
baseline = kit / "基线"
drop = kit / "投放"
outdir = kit / "输出"
baseline.mkdir()
drop.mkdir()
outdir.mkdir()
shutil.copy2(TOOLS / "tone_artist_pack.py", kit / "tone_artist_pack.py")
bat = """@echo off
chcp 65001 >nul
setlocal
cd /d "%~dp0"
echo.
echo ========================================
echo K1 音师音色更新工具 (USB / SoundWalkerIAP)
echo 依赖: Python 3无需 pip / 无需 J-Link
echo ========================================
echo.
where python >nul 2>&1
if errorlevel 1 (
echo [错误] 未找到 python请安装 Python 3安装时勾选 Add python.exe to PATH
echo 下载: https://www.python.org/downloads/
pause
exit /b 1
)
echo 默认读取投放目录中的 1.bin 2.bin 3.bin
echo 也可传参例如: 音师更新音色.bat --bin1 .\\1.bin --bin2 .\\2.bin --bin3 .\\3.bin
echo.
python "%~dp0tone_artist_pack.py" --open %*
set ERR=%ERRORLEVEL%
echo.
if not "%ERR%"=="0" (
echo 打包失败查看: python "%~dp0tone_artist_pack.py" -h
pause
exit /b %ERR%
)
echo 完成请打开输出\\音师音色包_日期 请这样刷.txt SoundWalkerIAP 刷机
pause
exit /b 0
"""
(kit / "音师更新音色.bat").write_text(bat, encoding="utf-8", newline="\r\n")
ziliao = next(
p
for p in repo.iterdir()
if p.is_dir() and (p / "logo.bin").is_file() and (p / "Charg.bin").is_file()
)
shutil.copy2(ziliao / "logo.bin", baseline / "logo.bin")
shutil.copy2(ziliao / "Charg.bin", baseline / "Charg.bin")
shutil.copy2(proj / "tools" / "out" / "ui0902_res.bin", baseline / "ui0902_res.bin")
iap = repo / "升级" / "MCU主控升级"
shutil.copy2(iap / "SoundWalkerIAP.exe", kit / "SoundWalkerIAP.exe")
doc = iap / "升级步骤.docx"
if doc.is_file():
shutil.copy2(doc, kit / "升级步骤.docx")
src0909 = repo / "Doc" / "音色文件" / "0909"
for n in ("1.bin", "2.bin", "3.bin"):
shutil.copy2(src0909 / n, drop / n)
(drop / "说明.txt").write_text(
"请把新的 1.bin / 2.bin / 3.bin 放到本目录(覆盖即可),然后双击上一级「音师更新音色.bat」。\n"
"\n"
"也可用命令指定任意路径:\n"
" 音师更新音色.bat --bin1 路径\\1.bin --bin2 路径\\2.bin --bin3 路径\\3.bin\n",
encoding="utf-8",
newline="\n",
)
(kit / "使用说明.txt").write_text(
"\n".join(
[
"K1 音师音色更新工具 — 使用说明",
"================================",
"",
"【需要准备】",
" 1. 安装 Python 3https://www.python.org/downloads/ ,勾选 Add to PATH",
" 只需标准库,不用 pip 装任何包",
" 2. 本工具包(解压到任意目录,如桌面)",
" 3. 吉他 + USB 线SoundWalkerIAP 升级,不需要 J-Link",
"",
"【目录说明】",
" 投放\\ ← 把新的 1.bin 2.bin 3.bin 放这里",
" 基线\\ ← logo / Charg / UI 底图(勿改)",
" 输出\\ ← 打包结果(自动生成)",
" 音师更新音色.bat",
" tone_artist_pack.py",
" SoundWalkerIAP.exe",
" 升级步骤.docx",
" 使用说明.txt ← 本文件",
"",
"【日常步骤】",
" 1. 用新文件覆盖 投放\\1.bin、2.bin、3.bin",
" 2. 双击「音师更新音色.bat」",
" 3. 在弹出的「输出\\音师音色包_日期」里:",
" - 打开 SoundWalkerIAP.exe",
" - 吉他进入 USB 升级模式(见 升级步骤.docx",
" - 擦除外部 Flash",
" - 把 extflash_ALL_artist_*.res 烧到地址 0x00000000",
" 4. 退出升级模式,重启试听",
"",
"【命令参数示例】",
" 音师更新音色.bat",
" 音师更新音色.bat --drop 投放",
" 音师更新音色.bat --bin1 .\\投放\\1.bin --bin2 .\\投放\\2.bin --bin3 .\\投放\\3.bin",
" 音师更新音色.bat --bin1 D:\\我的音色\\1.bin --bin2 D:\\我的音色\\2.bin --bin3 D:\\我的音色\\3.bin",
" python tone_artist_pack.py -h",
"",
"【生成的包格式】(与开发正式发布的 ALL.res 相同)",
" 0x00000000 logo.bin",
" 0x0000CB70 Charg.bin",
" 0x0001B8F0 1.bin节奏",
" 0x0009D07D 2.bin本地曲≤41KB",
" 0x000A71AC 3.bin万能",
" 0x00100000 UI 界面图",
"",
"【注意】",
" - 必须刷 ALL.res不要只刷单独的 1/2/3.bin否则模式选择花屏",
" - 一般只需刷外部 Flash不用重刷 MCU 固件",
" - 若增删本地曲目或改曲名,需联系开发同步固件后再测",
" - 「投放」里已带示例 1/2/3.bin可先双击 bat 试跑流程",
"",
"【出问题】",
" - 提示找不到 python → 安装 Python 3 并勾选 PATH重开窗口",
" - DAB/大小校验失败 → 检查 bin 是否完整2.bin 是否超过 41KB",
" - 其它问题把黑色窗口全文截图发给开发",
"",
]
),
encoding="utf-8",
newline="\n",
)
zip_path = out_root / f"{kit_name}.zip"
if zip_path.exists():
zip_path.unlink()
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
for f in kit.rglob("*"):
if f.is_file():
zf.write(f, f.relative_to(out_root).as_posix())
print(f"KIT {kit}")
print(f"ZIP {zip_path}")
print(f"ZIP size = {zip_path.stat().st_size} bytes")
for p in sorted(kit.iterdir()):
print(f" {p.name}")
if __name__ == "__main__":
main()