diff --git a/Global/Global.c b/Global/Global.c index ab7da0e..87d9670 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -101,8 +101,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,14}; /* major.minor.patch — 0.2.14: local song mid-play no Stop+Start; power-on reset KEY_ID */ - +const uint8_t Version[3] = {0,2,14}; /* major.minor.patch — 0.2.14: local song mid-play fix + power-on KEY_ID reset + dual MIDI bank (merge) */ uint8_t Led = 8; bool PressFlag = 0; diff --git a/MyCode/App_Auto.c b/MyCode/App_Auto.c index 5762bf1..19b8b36 100644 --- a/MyCode/App_Auto.c +++ b/MyCode/App_Auto.c @@ -329,9 +329,19 @@ static int App_Auto_MapNoteOn(int channel, int key) static void Func_CallBack_ProgramChange(int channel, int program) { MidiFifoItem_t midimsg; + uint8_t ch = (uint8_t)(channel & 0x0F); LOG_I("REG", "pc ch%u prog=%d", (unsigned)channel, program); - midimsg.msg[0] = 0xc0 | (channel & 0x0F); - midimsg.msg[1] = program; + /* 双音色库:伴奏一律先切 Bank0(CC0 MSB=0, CC32 LSB=0)再 PC */ + midimsg.msg[0] = 0xb0 | ch; + midimsg.msg[1] = 0x00; /* CC0 Bank MSB */ + midimsg.msg[2] = MIDI_BANK_ACCOMP; + midimsg.msglen = 3; + mymidififo_InQueue(&m_MidiSendFifo,&midimsg); + midimsg.msg[1] = 0x20; /* CC32 Bank LSB */ + midimsg.msg[2] = 0; + mymidififo_InQueue(&m_MidiSendFifo,&midimsg); + midimsg.msg[0] = 0xc0 | ch; + midimsg.msg[1] = (uint8_t)program; midimsg.msg[2] = 0; midimsg.msglen = 2; mymidififo_InQueue(&m_MidiSendFifo,&midimsg); diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index 6c55895..4045b7c 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -85,7 +85,14 @@ extern int8_t delta; extern STRING_MIDI USE_MIDI; void LoadConfig(void) { - SendProgramChangeMidiEvent(0,Timbre_index[mGuiData[GUI_TIMBRE_SELECT].Current]); + uint8_t ch; + + /* 双音色库:主弦走 Bank1,先选 bank 再 PC */ + SendProgramWithBankMidiEvent(0, MIDI_BANK_STRING, Timbre_index[mGuiData[GUI_TIMBRE_SELECT].Current]); + + /* 伴奏通道预置 Bank0,避免上电后首个 PC 前误用残留 bank */ + for (ch = 1; ch <= 15; ch++) + SendBankChangeMidiEvent(ch, MIDI_BANK_ACCOMP); uint8_t val_127 = (faders[0].val * 127) / 10; SendVolumeChangeMidiEvent(1,val_127); diff --git a/UI/UI_global.c b/UI/UI_global.c index 27cea57..6cb729a 100644 --- a/UI/UI_global.c +++ b/UI/UI_global.c @@ -942,7 +942,8 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group) switch(Group->Id) { case GUI_TIMBRE_SELECT: - SendProgramChangeMidiEvent(0,Timbre_index[Group->Current]); + /* 双音色库:主弦走 Bank1,先选 bank 再 PC */ + SendProgramWithBankMidiEvent(0, MIDI_BANK_STRING, Timbre_index[Group->Current]); break; default: break; diff --git a/midi/midi_send.c b/midi/midi_send.c index 16016d8..6dce55f 100644 --- a/midi/midi_send.c +++ b/midi/midi_send.c @@ -27,10 +27,21 @@ void SendVolumeChangeMidiEvent(uint8_t channel,uint8_t CC) SendMidiDataToDreamDSP(midibuff,3); } -void SendBankChangeMidiEvent(uint8_t CC) +/* Bank Select:CC0(MSB)=bank,CC32(LSB)=0。Dream 双音色库:0=伴奏,1=主弦 */ +void SendBankChangeMidiEvent(uint8_t channel, uint8_t bank) { - uint8_t midibuff[3] = {0xB0 ,0x00, CC }; + uint8_t midibuff[3] = {0xB0|(channel & 0x0F) ,0x00, bank }; SendMidiDataToDreamDSP(midibuff,3); + midibuff[1] = 0x20; /* CC32 Bank LSB */ + midibuff[2] = 0; + SendMidiDataToDreamDSP(midibuff,3); +} + +/* 先选 Bank 再 Program Change,避免漏发 Bank Select 落到错误音色库 */ +void SendProgramWithBankMidiEvent(uint8_t channel, uint8_t bank, uint8_t program) +{ + SendBankChangeMidiEvent(channel, bank); + SendProgramChangeMidiEvent(channel, program); } void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt) diff --git a/midi/midi_send.h b/midi/midi_send.h index df1646a..50d835e 100644 --- a/midi/midi_send.h +++ b/midi/midi_send.h @@ -2,11 +2,16 @@ #define __MIDI_SEND_H__ +/* Dream 音色库 Bank:0=自动伴奏,1=主音色/弦 */ +#define MIDI_BANK_ACCOMP 0 +#define MIDI_BANK_STRING 1 + /* MIDI 发送函数 */ void SendNoteOnMidiEvent(uint8_t Key, uint8_t OnVal); void SendNoteOffMidiEvent(uint8_t Key, uint8_t OffVal); void SendProgramChangeMidiEvent(uint8_t channel, uint8_t CC); -void SendBankChangeMidiEvent(uint8_t CC); +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); void DefaultTask_SendMsg(uint16_t Data1, uint16_t Data2, uint16_t Data3, uint16_t Data4); diff --git a/midi/midi_tables.c b/midi/midi_tables.c index 72a35e9..fd9483e 100644 --- a/midi/midi_tables.c +++ b/midi/midi_tables.c @@ -220,7 +220,7 @@ const STRING_MIDI *Chord_Midi_Table[7] = const STRING_MIDI *OrganChord_Midi_Table[7] = { OrganMIDI_1,OrganMIDI_2,OrganMIDI_3,OrganMIDI_4,OrganMIDI_5,OrganMIDI_6, OrganMIDI_7 }; -/* UI槽位0~4 → MIDI Program Change:24尼龙 / 25钢弦 / 27清音 / 30失真 / 33 Finger贝斯 */ +/* UI槽位0~4 → MIDI Program Change(Bank1):24尼龙 / 25钢弦 / 27清音 / 30失真 / 33电贝司 */ const uint8_t Timbre_index[5] = {0x18, 0x19, 0x1B, 0x1E, 0x21}; diff --git a/project/inc/ExtFlash_Tone_Addr.h b/project/inc/ExtFlash_Tone_Addr.h index 27e7326..d85d49a 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 "0915" +#define EXTFLASH_TONE_RES_VER "0916" #define EXTFLASH_TONE_RES_VER_MAJOR 0 #define EXTFLASH_TONE_RES_VER_MINOR 9 -#define EXTFLASH_TONE_RES_VER_PATCH 15 +#define EXTFLASH_TONE_RES_VER_PATCH 16 #define EXTFLASH_LOGO_ADDR 0x00000000UL #define EXTFLASH_LOGO_SIZE 52080UL @@ -18,13 +18,13 @@ #define EXTFLASH_CHARGING_H 190 #define EXTFLASH_BIN1_RHYTHM_ADDR 0x0001B8F0UL -#define EXTFLASH_BIN1_RHYTHM_SIZE 506071UL +#define EXTFLASH_BIN1_RHYTHM_SIZE 506746UL #define EXTFLASH_BIN2_SONG_HAITIAN_ADDR 0x0009D07DUL #define EXTFLASH_BIN2_SONG_HAITIAN_SIZE 41914UL #define EXTFLASH_BIN3_UNIVERSAL_ADDR 0x000A7437UL -#define EXTFLASH_BIN3_UNIVERSAL_SIZE 33815UL +#define EXTFLASH_BIN3_UNIVERSAL_SIZE 33945UL /* Convenience aliases used by UI ADDRESS */ #define FLASH_ADDR_MODE_NORMAL EXTFLASH_BIN1_RHYTHM_ADDR /* 普通 */ @@ -35,8 +35,8 @@ /* Legacy AutoBand bank — not repacked; may overlap 2.bin — do not enable until remapped */ #define FLASH_ADDR_AUTOBAND_LEGACY 0x0009EB5FUL -#define EXTFLASH_TONE_PACK_END 0x000AF84EUL -#define EXTFLASH_TONE_PACK_SIZE 718926UL +#define EXTFLASH_TONE_PACK_END 0x000AF8D0UL +#define EXTFLASH_TONE_PACK_SIZE 719056UL #define UI0902_RES_BASE_SAFE_GAP (0x00100000UL - EXTFLASH_TONE_PACK_END) #endif diff --git a/protocol/git_user_fw_ver.h b/protocol/git_user_fw_ver.h index 8d5c54a..abc95e5 100644 --- a/protocol/git_user_fw_ver.h +++ b/protocol/git_user_fw_ver.h @@ -1,16 +1,16 @@ /* Auto-generated by tools/gen_git_user_fw_ver.py — do not edit. - * git HEAD (dirty): 8a8c7ec377314f1b712d58afbedeb0c631dfaba5 + * git HEAD (dirty): merge-in-progress * branch: develop → develop - * 01 0C wire: develop_8a8c7e* + * 01 0C wire: develop_merge* */ #ifndef GIT_USER_FW_VER_H #define GIT_USER_FW_VER_H -#define GIT_COMMIT_ID_FULL "8a8c7ec377314f1b712d58afbedeb0c631dfaba5" +#define GIT_COMMIT_ID_FULL "0000000000000000000000000000000000000000" #define GIT_BRANCH_NAME "develop" -#define GIT_COMMIT_SHORT6 "8a8c7e" +#define GIT_COMMIT_SHORT6 "000000" #define GIT_DIRTY (1) -#define GIT_BUILD_ID "develop_8a8c7e*" +#define GIT_BUILD_ID "develop_000000*" #define GIT_BUILD_ID_LEN 15u #endif /* GIT_USER_FW_VER_H */ diff --git a/tools/pack_extflash_tone_0903.py b/tools/pack_extflash_tone_0903.py index 4f021f6..22433a0 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 (0915). +"""Pack external W25Q128 tone/logo image for K1 (0916_bank). Layout (absolute W25Q128 offsets): 0x00000000 logo.bin (legacy pad; boot UI uses UI0902 full-screen logo) @@ -10,10 +10,10 @@ Layout (absolute W25Q128 offsets): after 2.bin 3.bin 万能模式(随 2.bin 长度后移;写入 ExtFlash_Tone_Addr.h) Outputs: - tools/out/extflash_tone_0915.bin / .res - tools/out/extflash_ALL_tone0915_ui0902.res + tools/out/extflash_tone_0916.bin / .res + tools/out/extflash_ALL_tone0916_ui0902.res project/inc/ExtFlash_Tone_Addr.h - Doc/音色文件/0915/FLASH_MAP.txt + Doc/音色文件/0916_bank/FLASH_MAP.txt """ from __future__ import annotations @@ -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 = "0915" +TONE_TAG = "0916" 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,11 +34,10 @@ 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" -OUT_MAP = REPO / "Doc" / "音色文件" / TONE_TAG / "FLASH_MAP.txt" +TONE_DIR = REPO / "Doc" / "音色文件" / "0916_bank" +OUT_MAP = TONE_DIR / "FLASH_MAP.txt" UI0902_BIN = OUT_DIR / "ui0902_res.bin" -TONE_DIR = REPO / "Doc" / "音色文件" / TONE_TAG - OFF_LOGO = 0x00000000 OFF_CHARGING = 0x0000CB70 OFF_BIN1 = 0x0001B8F0 @@ -164,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 15 +#define EXTFLASH_TONE_RES_VER_PATCH 16 #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 a138617..8d4e74e 100644 --- a/tools/publish_k1_release.py +++ b/tools/publish_k1_release.py @@ -30,10 +30,10 @@ BOOT_BIN = ( / "Exe" / "AT32F403ARCT7_BOOT.bin" ) -TONE_RES_VER = "0915" +TONE_RES_VER = "0916" TONE_BIN = PROJ / "tools" / "out" / f"extflash_tone_{TONE_RES_VER}.bin" UI0902_BIN = PROJ / "tools" / "out" / "ui0902_res.bin" -MAP_TXT = REPO / "Doc" / "音色文件" / TONE_RES_VER / "FLASH_MAP.txt" +MAP_TXT = REPO / "Doc" / "音色文件" / "0916_bank" / "FLASH_MAP.txt" TONE_HDR = PROJ / "project" / "inc" / "ExtFlash_Tone_Addr.h" IAP_DIR = REPO / "升级" / "MCU主控升级" OUT_ROOT = REPO / "tools" / "out" @@ -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" / "音色文件" / TONE_RES_VER + tone_dir = REPO / "Doc" / "音色文件" / "0916_bank" ziliao = None for p in REPO.iterdir(): if p.is_dir() and (p / "logo.bin").is_file() and (p / "Charg.bin").is_file():