From 296a1b54204cf8639bb88f501cdbc7b749c06cef Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Mon, 28 Sep 2026 17:53:06 +0800 Subject: [PATCH] feat(tone): ship the 0928 rhythm pack with Hall2 reverb and PEQ Load the updated 1.bin and apply the sound-designer Hall2 and four-band EQ at startup. Version 0.2.39. Co-authored-by: Cursor --- Global/Global.c | 2 +- UI/UI_Idle.c | 2 + midi/midi_send.c | 68 ++++++++++++++++++++++++++++++++ midi/midi_send.h | 2 + project/inc/ExtFlash_Tone_Addr.h | 6 +-- tools/gen_sysset_font.py | 4 +- tools/pack_extflash_tone_0903.py | 8 ++-- tools/publish_k1_release.py | 10 ++--- 8 files changed, 87 insertions(+), 15 deletions(-) diff --git a/Global/Global.c b/Global/Global.c index 4877171..647387a 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -111,7 +111,7 @@ int16_t MIC_VOL_MAP[11]= {-9000,-7000,-5000,-3000,-1000,1000,3000,5000,7000,9000 uint8_t TOUCH_AREA_NUM = (sizeof(Touch_Areas)/sizeof(Touch_AreaTypeDef)); -const uint8_t Version[3] = {0,2,38}; /* major.minor.patch — 0.2.38: 去掉样机功放EQ,电量 6.8V 显示 10% */ +const uint8_t Version[3] = {0,2,39}; /* major.minor.patch — 0.2.39: 0928 节奏包,Hall2 混响与四段 PEQ */ uint8_t Led = 8; bool PressFlag = 0; diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index ad882cc..8c38071 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -124,6 +124,8 @@ void LoadConfig(void) SendVolumeChangeMidiEvent(0,(faders[1].val * 127) / 10); + Dream_ApplyEditorParams(); + AW816_Set_Volume(MIC_VOL_MAP[faders[2].val]); AW816_Set_Reverb(faders[3].val * 10); diff --git a/midi/midi_send.c b/midi/midi_send.c index 6dce55f..06d1a13 100644 --- a/midi/midi_send.c +++ b/midi/midi_send.c @@ -49,6 +49,74 @@ void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt) USART2_SendData(buff,cnt); } +/* Roland/Dream GS:checksum = 0x80 - (addr+data 低 7 位) */ +static void Dream_Dt1(uint8_t ah, uint8_t am, uint8_t al, const uint8_t *data, uint8_t n) +{ + uint8_t msg[16]; + uint8_t i; + uint8_t sum; + + msg[0] = 0xF0; + msg[1] = 0x41; + msg[2] = 0x00; + msg[3] = 0x42; + msg[4] = 0x12; + msg[5] = ah; + msg[6] = am; + msg[7] = al; + sum = (uint8_t)(ah + am + al); + for (i = 0; i < n; i++) + { + msg[8 + i] = data[i]; + sum = (uint8_t)(sum + data[i]); + } + msg[8 + n] = (uint8_t)((0x80u - (sum & 0x7Fu)) & 0x7Fu); + msg[9 + n] = 0xF7; + SendMidiDataToDreamDSP(msg, (uint16_t)(10u + n)); +} + +static void Dream_Dt1Byte(uint8_t ah, uint8_t am, uint8_t al, uint8_t data) +{ + Dream_Dt1(ah, am, al, &data, 1); +} + +/* 音师编辑器 B:Reverb / E:PEQ Normal。 + 混响是 GS 系统区 40 01 30:Hall2=4,Size=Character,PreLP,Level,Time,Delay Feedback。 + PEQ 为同一套 4 段参量:增益按 0.1 dB/档、0=0 dB;频率按 Hz 的 14 位原值;Q 按 0.1 显示(2.00→20)。 */ +void Dream_ApplyEditorParams(void) +{ + uint8_t hz[2]; + + Dream_Dt1Byte(0x40, 0x01, 0x30, 4); /* Type Hall2 */ + Dream_Dt1Byte(0x40, 0x01, 0x31, 4); /* Size */ + Dream_Dt1Byte(0x40, 0x01, 0x32, 2); /* PreLP */ + Dream_Dt1Byte(0x40, 0x01, 0x33, 85); /* Level */ + Dream_Dt1Byte(0x40, 0x01, 0x34, 64); /* Time */ + Dream_Dt1Byte(0x40, 0x01, 0x35, 0); /* DelFdbck */ + + /* 40 04 00.. 与编辑器从左到右、从上到下一致 */ + Dream_Dt1Byte(0x40, 0x04, 0x00, 81); /* GainLow 8.1 dB */ + Dream_Dt1Byte(0x40, 0x04, 0x01, 12); /* GainLoMid 1.2 dB */ + Dream_Dt1Byte(0x40, 0x04, 0x02, 7); /* GainHiMid 0.7 dB */ + Dream_Dt1Byte(0x40, 0x04, 0x03, 28); /* GainHigh 2.8 dB */ + + hz[0] = (uint8_t)((412 >> 7) & 0x7F); + hz[1] = (uint8_t)(412 & 0x7F); + Dream_Dt1(0x40, 0x04, 0x04, hz, 2); /* FreqLow 412 Hz */ + hz[0] = (uint8_t)((2294 >> 7) & 0x7F); + hz[1] = (uint8_t)(2294 & 0x7F); + Dream_Dt1(0x40, 0x04, 0x06, hz, 2); /* FreqLoMid 2294 Hz */ + hz[0] = (uint8_t)((6048 >> 7) & 0x7F); + hz[1] = (uint8_t)(6048 & 0x7F); + Dream_Dt1(0x40, 0x04, 0x08, hz, 2); /* FreqHiMid 6048 Hz */ + hz[0] = (uint8_t)((3126 >> 7) & 0x7F); + hz[1] = (uint8_t)(3126 & 0x7F); + Dream_Dt1(0x40, 0x04, 0x0A, hz, 2); /* FreqHigh 3126 Hz */ + + Dream_Dt1Byte(0x40, 0x04, 0x0C, 20); /* Q-LoMid 2.00 */ + Dream_Dt1Byte(0x40, 0x04, 0x0D, 20); /* Q-HiMid 2.00 */ +} + #define AT32_UID_BASE 0x1FFFF7E8UL void BleBuildDeviceName(char *out) diff --git a/midi/midi_send.h b/midi/midi_send.h index 50d835e..09f107d 100644 --- a/midi/midi_send.h +++ b/midi/midi_send.h @@ -14,6 +14,8 @@ void SendBankChangeMidiEvent(uint8_t channel, uint8_t bank); void SendProgramWithBankMidiEvent(uint8_t channel, uint8_t bank, uint8_t program); void SendVolumeChangeMidiEvent(uint8_t channel, uint8_t CC); void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt); +/* 开机/进模式:音师照片中的 Hall2 混响和 Normal 四段 PEQ */ +void Dream_ApplyEditorParams(void); void DefaultTask_SendMsg(uint16_t Data1, uint16_t Data2, uint16_t Data3, uint16_t Data4); /* Unique BLE/BT name from AT32 UID: "PHON_" + 6 hex (last 3 UID bytes). out >= 12. */ diff --git a/project/inc/ExtFlash_Tone_Addr.h b/project/inc/ExtFlash_Tone_Addr.h index d85d49a..1ac6591 100644 --- a/project/inc/ExtFlash_Tone_Addr.h +++ b/project/inc/ExtFlash_Tone_Addr.h @@ -4,10 +4,10 @@ /* Auto-generated by tools/pack_extflash_tone_0903.py — do not hand-edit. */ /* W25Q128 absolute offsets. Boot logo display uses UI0902_BOOT_LOGO_ADDR. */ /* Tone resource pack has no in-bin version field; release tag = EXTFLASH_TONE_RES_VER. */ -#define EXTFLASH_TONE_RES_VER "0916" +#define EXTFLASH_TONE_RES_VER "0928" #define EXTFLASH_TONE_RES_VER_MAJOR 0 #define EXTFLASH_TONE_RES_VER_MINOR 9 -#define EXTFLASH_TONE_RES_VER_PATCH 16 +#define EXTFLASH_TONE_RES_VER_PATCH 28 #define EXTFLASH_LOGO_ADDR 0x00000000UL #define EXTFLASH_LOGO_SIZE 52080UL @@ -18,7 +18,7 @@ #define EXTFLASH_CHARGING_H 190 #define EXTFLASH_BIN1_RHYTHM_ADDR 0x0001B8F0UL -#define EXTFLASH_BIN1_RHYTHM_SIZE 506746UL +#define EXTFLASH_BIN1_RHYTHM_SIZE 509556UL #define EXTFLASH_BIN2_SONG_HAITIAN_ADDR 0x0009D07DUL #define EXTFLASH_BIN2_SONG_HAITIAN_SIZE 41914UL diff --git a/tools/gen_sysset_font.py b/tools/gen_sysset_font.py index df836a3..e902ef8 100644 --- a/tools/gen_sysset_font.py +++ b/tools/gen_sysset_font.py @@ -194,7 +194,7 @@ def main(): raise SystemExit( "USB row overflow: label ends %d, left arrow at %d" % (label_end, tril_x) ) - ver_w = text_w("0.2.38", glyphs) + ver_w = text_w("0.2.39", glyphs) gh = glyphs["0"][0].size[1] pill_h = gh + 8 pill_w = ver_w + 18 @@ -377,7 +377,7 @@ def preview(pics, glyphs, back, back_xy, chev, chev_xy, tri_l, tl, tri_r, tr, paste(canvas, tri_l, tl[0], row_y + (tl[1] - (CARD_Y0 + CARD_PITCH))) paste(canvas, tri_r, tr[0], row_y + (tr[1] - (CARD_Y0 + CARD_PITCH))) fill_round(canvas, CARD_X + pill_dx, CARD_Y0 + pill_dy, pill_w, pill_h, 6, (0, 8, 19)) - ver = "0.2.38" + ver = "0.2.39" tw = text_w(ver, glyphs) gh = glyphs["0"][0].size[1] draw_text(canvas, CARD_X + pill_dx + (pill_w - tw) // 2, diff --git a/tools/pack_extflash_tone_0903.py b/tools/pack_extflash_tone_0903.py index 22433a0..8671bda 100644 --- a/tools/pack_extflash_tone_0903.py +++ b/tools/pack_extflash_tone_0903.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -"""Pack external W25Q128 tone/logo image for K1 (0916_bank). +"""Pack external W25Q128 tone/logo image for K1 (0928). Layout (absolute W25Q128 offsets): 0x00000000 logo.bin (legacy pad; boot UI uses UI0902 full-screen logo) @@ -25,7 +25,7 @@ from pathlib import Path ROOT = Path(__file__).resolve().parents[1] # firmware project root REPO = ROOT.parent.parent # 一诺国际吉他 OUT_DIR = ROOT / "tools" / "out" -TONE_TAG = "0916" +TONE_TAG = "0928" OUT_BIN = OUT_DIR / f"extflash_tone_{TONE_TAG}.bin" OUT_RES = OUT_DIR / f"extflash_tone_{TONE_TAG}.res" OUT_ALL_RES = OUT_DIR / f"extflash_ALL_tone{TONE_TAG}_ui0902.res" @@ -34,7 +34,7 @@ OUT_BIN_LEGACY = OUT_DIR / "extflash_tone_0903.bin" OUT_RES_LEGACY = OUT_DIR / "extflash_tone_0903.res" OUT_ALL_LEGACY = OUT_DIR / "extflash_ALL_tone0903_ui0902.res" OUT_HDR = ROOT / "project" / "inc" / "ExtFlash_Tone_Addr.h" -TONE_DIR = REPO / "Doc" / "音色文件" / "0916_bank" +TONE_DIR = REPO / "Doc" / "音色文件" / "0928" OUT_MAP = TONE_DIR / "FLASH_MAP.txt" UI0902_BIN = OUT_DIR / "ui0902_res.bin" @@ -163,7 +163,7 @@ def main() -> None: #define EXTFLASH_TONE_RES_VER "{TONE_TAG}" #define EXTFLASH_TONE_RES_VER_MAJOR 0 #define EXTFLASH_TONE_RES_VER_MINOR 9 -#define EXTFLASH_TONE_RES_VER_PATCH 16 +#define EXTFLASH_TONE_RES_VER_PATCH 28 #define EXTFLASH_LOGO_ADDR 0x{by_name['LOGO'][1]:08X}UL #define EXTFLASH_LOGO_SIZE {by_name['LOGO'][2]}UL diff --git a/tools/publish_k1_release.py b/tools/publish_k1_release.py index f86eb4a..4b67b9d 100644 --- a/tools/publish_k1_release.py +++ b/tools/publish_k1_release.py @@ -30,15 +30,15 @@ BOOT_BIN = ( / "Exe" / "AT32F403ARCT7_BOOT.bin" ) -TONE_RES_VER = "0916" +TONE_RES_VER = "0928" TONE_BIN = PROJ / "tools" / "out" / f"extflash_tone_{TONE_RES_VER}.bin" UI0902_BIN = PROJ / "tools" / "out" / "ui0902_res.bin" -MAP_TXT = REPO / "Doc" / "音色文件" / "0916_bank" / "FLASH_MAP.txt" +MAP_TXT = REPO / "Doc" / "音色文件" / "0928" / "FLASH_MAP.txt" TONE_HDR = PROJ / "project" / "inc" / "ExtFlash_Tone_Addr.h" IAP_DIR = REPO / "升级" / "MCU主控升级" OUT_ROOT = REPO / "tools" / "out" -FW_VER = "0.2.38" +FW_VER = "0.2.39" UI0902_RES_BASE = 0x00100000 BOOT_FLASH_ADDR = 0x08000000 APP_FLASH_ADDR = 0x08008000 @@ -91,7 +91,7 @@ def verify_tone_layout(tone: bytes, check_sources: bool = True) -> None: """Refuse to ship ALL.res if logo/charg/1/2/3.bin missing, shifted, or mismatch.""" dab = b"\xABDAB" addrs = read_tone_addrs() - tone_dir = REPO / "Doc" / "音色文件" / "0916_bank" + tone_dir = REPO / "Doc" / "音色文件" / "0928" ziliao = None for p in REPO.iterdir(): if p.is_dir() and (p / "logo.bin").is_file() and (p / "Charg.bin").is_file(): @@ -234,7 +234,7 @@ def main() -> None: "说明:", " - Boot 进入 USB IAP 时显示 UI0902_FLASH_MODE;资源未烧录时白字黑底兜底。", " - 开机全屏 Logo、关机充电全屏画面在 UI0902,不在音色包里的 logo.bin/Charg.bin 占位。", - f" - 本包音色来源 Doc/音色文件/0916_bank/(tag {TONE_RES_VER});BIN3 随 2.bin 长度后移。", + f" - 本包音色来源 Doc/音色文件/0928/(tag {TONE_RES_VER});BIN3 随 2.bin 长度后移。", "", "附件: SoundWalkerIAP.exe / 升级步骤.docx / FLASH_MAP.txt", "",