Compare commits

...

2 Commits

Author SHA1 Message Date
yuquanjun 8a7e8169a2 Align status sep and mode-select rows to 0902 draft.
Put the status divider at y=36 and start mode rows at CARD_Y=48 so Universal matches transpose/tempo tops with draft row height 88 and pitch 92.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:43:47 +08:00
yuquanjun bce08be772 Show chord progression on Universal; rhythm/local on Normal and Expert.
Swap mode-home param rows and tone reload so TAB0 uses 和弦走向 while TAB1/2 keep 节奏类型 and 本地曲目 with 弦音色.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:25:09 +08:00
4 changed files with 100 additions and 107 deletions

View File

@ -21,12 +21,12 @@ void RGB_Y_TO_G()
extern bool InModeFlag; extern bool InModeFlag;
/* 0902/0819三行模式撑满状态栏下方至底边无底栏222x88 @ y=43/135/225 */ /* 0902-01行高88、行距92顶边与模式主页移调/速度(CARD_Y=48)对齐,分割线居中 */
#define UI0902_MODE_ROW_X 9 #define UI0902_MODE_ROW_X 9
#define UI0902_MODE_ROW_W 222 #define UI0902_MODE_ROW_W 222
#define UI0902_MODE_ROW_H 88 #define UI0902_MODE_ROW_H 88
#define UI0902_MODE_ROW_Y0 43 #define UI0902_MODE_ROW_Y0 UI0902_CARD_Y /* 48与移调/速度顶对齐 */
#define UI0902_MODE_ROW_DY 92 #define UI0902_MODE_ROW_DY 92 /* 48 / 140 / 232 */
/* 模式页不显示焦点:三行均用未选中资源;单击直接进入 */ /* 模式页不显示焦点:三行均用未选中资源;单击直接进入 */
static const uint32_t s_mode_row_addr[3] = { static const uint32_t s_mode_row_addr[3] = {
@ -73,10 +73,10 @@ void UI_DrawModeSelectScreen(void)
} }
const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = { const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = {
/* Flag=按钮序号(0万能/1普通/2专业)ID=进入 TAB。全宽便于命中 */ /* Flag=按钮序号(0万能/1普通/2专业)ID=进入 TAB。全宽便于命中Y 与 MODE_ROW_* 一致 */
{ 0, 239, 43, 130, 0, 0, 0, NULL }, { 0, 239, 48, 135, 0, 0, 0, NULL },
{ 0, 239, 135, 222, 1, 0, 2, NULL }, { 0, 239, 140, 227, 1, 0, 2, NULL },
{ 0, 239, 225, 312, 2, 0, 1, NULL }, { 0, 239, 232, 319, 2, 0, 1, NULL },
}; };
#define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef)) #define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef))

View File

@ -107,15 +107,15 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
{ {
switch(mGuiData[GUI_TAB_INDEX].Current) switch(mGuiData[GUI_TAB_INDEX].Current)
{ {
case 2: case 0: /* 万能:和弦走向转调触发 */
{ {
uint8_t midi = 0x3c; uint8_t midi = 0x3c;
midi += mGuiData[GUI_TRANSPOSE].Current; midi += mGuiData[GUI_TRANSPOSE].Current;
AutoBandTop1_Note_On(midi,0x3c); // AutoBand 模块未加入工程 AutoBandTop1_Note_On(midi,0x3c);
} }
break; break;
case 1: case 1: /* 专业 */
case 0: case 2: /* 普通 */
/* 音师:快转调只换和弦音,伴奏不重头 */ /* 音师:快转调只换和弦音,伴奏不重头 */
Accomp_UpdatePlayingChord(); Accomp_UpdatePlayingChord();
break; break;
@ -148,50 +148,34 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
case GUI_MODE_PARAM: case GUI_MODE_PARAM:
{ {
GUI_SWITCH *pCurData =NULL; GUI_SWITCH *pCurData =NULL;
uint8_t tab = (uint8_t)mGuiData[GUI_TAB_INDEX].Current;
if (tab == 0)
pCurData = &ParamGuiData[ALL_MODE_PARAM];
else if (mGuiData[GUI_AUTOBAND_SW].Current)
pCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
else
pCurData = &ParamGuiData[SONG_MODE_PARAM];
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: case 1:
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
pCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
}
else
{
pCurData = &ParamGuiData[SONG_MODE_PARAM];
}
break;
case 2: pCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
last_value = pCurData->Current; last_value = pCurData->Current;
GUI_Item_AjustLoopValue(pCurData, FLAG); GUI_Item_AjustLoopValue(pCurData, FLAG);
if (!UI_SetFocus(GUI_MODE_PARAM)) if (!UI_SetFocus(GUI_MODE_PARAM))
show_Param(&UI_Label[GUI_MODE_PARAM], pCurData); show_Param(&UI_Label[GUI_MODE_PARAM], pCurData);
switch(mGuiData[GUI_TAB_INDEX].Current)
{ UI_ApplyToneAddress();
case 0: case 1: if (tab == 0)
if(mGuiData[GUI_AUTOBAND_SW].Current) AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current);
{ else if (mGuiData[GUI_AUTOBAND_SW].Current)
UI_ApplyToneAddress(); AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[EXPRESS_MODE_PARAM].Current);
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[EXPRESS_MODE_PARAM].Current); else
} AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current);
else
{ if (tab == 0)
UI_ApplyToneAddress(); nvm->param.Param3 = ParamGuiData[ALL_MODE_PARAM].Current;
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current); else if (mGuiData[GUI_AUTOBAND_SW].Current)
nvm->param.Param2 = ParamGuiData[EXPRESS_MODE_PARAM].Current;
} else
break; nvm->param.Param1 = ParamGuiData[SONG_MODE_PARAM].Current;
case 2: AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current); break;
}
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: nvm->param.Param1 = ParamGuiData[SONG_MODE_PARAM].Current; break; // 姝屾<E5A79D>????
case 1: nvm->param.Param2 = ParamGuiData[EXPRESS_MODE_PARAM].Current;
break; // 涓撳<E6B693>????
case 2: nvm->param.Param3 = ParamGuiData[ALL_MODE_PARAM].Current; break; // 涓囪<E6B693>????
}
} }
break; break;
case GUI_TIMBRE_SELECT: case GUI_TIMBRE_SELECT:
@ -214,6 +198,9 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
if(ID == GUI_AUTOBAND_SW) if(ID == GUI_AUTOBAND_SW)
{ {
/* 万能无节奏/本地 TAB忽略该触控 */
if (mGuiData[GUI_TAB_INDEX].Current == 0)
return;
mGuiData[ID].Current = value; mGuiData[ID].Current = value;
UI_ReloadTonePreset(); UI_ReloadTonePreset();
if (!UI_SetFocus(GUI_MODE_PARAM)) if (!UI_SetFocus(GUI_MODE_PARAM))

View File

@ -109,25 +109,42 @@ void CallUI_RestoreSelect(void) {
LOG_I("UI", "page Restore"); LOG_I("UI", "page Restore");
} }
/* 音师:节奏类型→1.bin本地曲目→2.bin万能节奏→3.bin不再用 AutoBand legacy */ /* 音师:万能→3.bin普通/专业节奏→1.bin、本地曲目→2.bin */
void UI_ApplyToneAddress(void) void UI_ApplyToneAddress(void)
{ {
if (mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = FLASH_ADDR_SONG_HAITIAN; /* 本地曲目 → 2.bin */
return;
}
switch (mGuiData[GUI_TAB_INDEX].Current) switch (mGuiData[GUI_TAB_INDEX].Current)
{ {
case 1: ADDRESS = FLASH_ADDR_MODE_EXPERT; break; /* 专业 → 1.bin */ case 0: /* 万能:和弦走向库 */
case 2: ADDRESS = FLASH_ADDR_MODE_NORMAL; break; /* 普通 → 1.bin */ ADDRESS = FLASH_ADDR_MODE_UNIVERSAL;
default: ADDRESS = FLASH_ADDR_MODE_UNIVERSAL; break; /* 万能 → 3.bin */ return;
case 1: /* 专业 */
if (mGuiData[GUI_AUTOBAND_SW].Current)
ADDRESS = FLASH_ADDR_SONG_HAITIAN;
else
ADDRESS = FLASH_ADDR_MODE_EXPERT;
return;
case 2: /* 普通 */
if (mGuiData[GUI_AUTOBAND_SW].Current)
ADDRESS = FLASH_ADDR_SONG_HAITIAN;
else
ADDRESS = FLASH_ADDR_MODE_NORMAL;
return;
default:
ADDRESS = FLASH_ADDR_MODE_UNIVERSAL;
return;
} }
} }
void UI_ReloadTonePreset(void) void UI_ReloadTonePreset(void)
{ {
UI_ApplyToneAddress(); UI_ApplyToneAddress();
/* 万能:和弦走向 */
if (mGuiData[GUI_TAB_INDEX].Current == 0)
{
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current);
return;
}
/* 普通/专业:本地曲目或节奏类型 */
if (mGuiData[GUI_AUTOBAND_SW].Current) if (mGuiData[GUI_AUTOBAND_SW].Current)
{ {
GUI_SWITCH *local = &ParamGuiData[EXPRESS_MODE_PARAM]; GUI_SWITCH *local = &ParamGuiData[EXPRESS_MODE_PARAM];
@ -142,15 +159,7 @@ void UI_ReloadTonePreset(void)
} }
return; return;
} }
switch (mGuiData[GUI_TAB_INDEX].Current) AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current);
{
case 2:
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current);
break;
default:
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current);
break;
}
} }
static uint8_t s_ui_focus_id = UI_FOCUS_NONE; static uint8_t s_ui_focus_id = UI_FOCUS_NONE;
@ -228,7 +237,7 @@ uint8_t UI_SetFocus(uint8_t widget_id)
void UI_DrawStatusSepLine(void) void UI_DrawStatusSepLine(void)
{ {
/* 与模式选择/各模式主页统一:状态栏底部分割线 y=26 */ /* 与模式选择/各模式主页统一:需求稿分割线 y=36 */
LCD_DrawLine(0, UI0902_STATUS_SEP_Y, 239, UI0902_STATUS_SEP_Y, LCD_DrawLine(0, UI0902_STATUS_SEP_Y, 239, UI0902_STATUS_SEP_Y,
UI0902_STATUS_SEP_COLOR); UI0902_STATUS_SEP_COLOR);
} }
@ -555,9 +564,14 @@ void Refresh_Mode1Select(uint8_t last_data, LEBEL_UI *UI, GUI_SWITCH *Group)
// 重点<EFBC9A>?当前选中的模式2/3/4找到<E689BE>?<3F>应数据结构<E7BB93>? // 重点<EFBC9A>?当前选中的模式2/3/4找到<E689BE>?<3F>应数据结构<E7BB93>?
switch(mGuiData[GUI_TAB_INDEX].Current) switch(mGuiData[GUI_TAB_INDEX].Current)
{ {
case 0: pCurData = &ParamGuiData[SONG_MODE_PARAM]; break; // 歌曲 case 0: pCurData = &ParamGuiData[ALL_MODE_PARAM]; break; /* 万能:和弦走向 */
case 1: pCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; break; // 专家 case 1: /* 专业 */
case 2: pCurData = &ParamGuiData[ALL_MODE_PARAM]; break; // 万能 case 2: /* 普通 */
if (mGuiData[GUI_AUTOBAND_SW].Current)
pCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
else
pCurData = &ParamGuiData[SONG_MODE_PARAM];
break;
//default: pCurData = &mGuiData[GUI_MODE1_SELECT]; //default: pCurData = &mGuiData[GUI_MODE1_SELECT];
} }
// 清除旧数字(清除的是旧值,不是当前值) // 清除旧数字(清除的是旧值,不是当前值)
@ -693,54 +707,45 @@ void label_Speed_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
x1, x2, sub_y, (const uint8_t*)"BPM", x1, x2, sub_y, (const uint8_t*)"BPM",
LCD_ALIGN_CENTER, UI->Text_fc, c_top, c_bot, UI0902_CARD_SUB_SIZE); LCD_ALIGN_CENTER, UI->Text_fc, c_top, c_bot, UI0902_CARD_SUB_SIZE);
} }
// <EFBFBD>޸<EFBFBD><EFBFBD>棺ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>autobandֵ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ // 万能:和弦走向;普通/专业:节奏类型 | 本地曲目
void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group) void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{ {
char *str; char *str;
GUI_SWITCH *paramCurData = NULL; GUI_SWITCH *paramCurData = NULL;
uint16_t c_top, c_bot; uint16_t c_top, c_bot;
uint8_t tab = (uint8_t)mGuiData[GUI_TAB_INDEX].Current;
UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot); UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot);
switch(mGuiData[GUI_TAB_INDEX].Current) (void)Group;
{
case 0: paramCurData = &ParamGuiData[SONG_MODE_PARAM]; break;
case 1: paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; break;
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
LCD_FillRoundRectGradient(UI->x, UI->y+UI0902_TAB_H+4, UI->w, UI->h-UI0902_TAB_H-4, UI0902_RADIUS_CARD, c_top, c_bot); LCD_FillRoundRectGradient(UI->x, UI->y+UI0902_TAB_H+4, UI->w, UI->h-UI0902_TAB_H-4, UI0902_RADIUS_CARD, c_top, c_bot);
switch(mGuiData[GUI_TAB_INDEX].Current) {
case 0:case 1: if (tab == 0)
Draw_Tab_Mode_Menu(UI, &mGuiData[GUI_AUTOBAND_SW]); {
break; /* 万能:无 TAB标题「和弦走向」 */
case 2: str = (char*)"\xBA\xCD\xCF\xD2\xD7\xDF\xCF\xF2";
/* 普通模式无 TAB标题画在曲目行上方与音色行一致对齐 0902-04 */ {
str = (char*)"\xBA\xCD\xCF\xD2\xD7\xDF\xCF\xF2"; uint16_t row_y = (uint16_t)(UI->y + UI0902_TAB_H + 4);
{ uint16_t lab_y = (row_y > 15) ? (uint16_t)(row_y - 15) : 0;
uint16_t row_y = (uint16_t)(UI->y + UI0902_TAB_H + 4); LCD_FillByColor(UI->x, lab_y, UI->x + UI->w, (uint16_t)(row_y - 1), UI0902_BG_COLOR);
uint16_t lab_y = (row_y > 15) ? (uint16_t)(row_y - 15) : 0; LCD_ShowChinese_AutoAlign(
LCD_FillByColor(UI->x, lab_y, UI->x + UI->w, (uint16_t)(row_y - 1), UI0902_BG_COLOR);
LCD_ShowChinese_AutoAlign(
UI->x, UI->x+UI->w, lab_y, UI->x, UI->x+UI->w, lab_y,
(uint8_t *)str, UI->Tab_Align, UI->Tab_fc, UI0902_BG_COLOR, 0, UI->Tab_size (uint8_t *)str, UI->Tab_Align, UI->Tab_fc, UI0902_BG_COLOR, 0, UI->Tab_size
); );
} }
break; paramCurData = &ParamGuiData[ALL_MODE_PARAM];
} }
switch(mGuiData[GUI_TAB_INDEX].Current) else
{ {
case 0: case 1: /* 普通/专业:节奏类型 | 本地曲目 */
if(mGuiData[GUI_AUTOBAND_SW].Current) Draw_Tab_Mode_Menu(UI, &mGuiData[GUI_AUTOBAND_SW]);
{ if (mGuiData[GUI_AUTOBAND_SW].Current)
paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
}else else
{ paramCurData = &ParamGuiData[SONG_MODE_PARAM];
paramCurData = &ParamGuiData[SONG_MODE_PARAM];
}
break;
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
} }
show_Param(&UI_Label[GUI_MODE_PARAM], paramCurData); show_Param(&UI_Label[GUI_MODE_PARAM], paramCurData);
{ {
/* 箭头与曲目行垂直中心对齐 */
uint16_t row_cy = UI->y + UI0902_TAB_H + 4 + (UI->h - UI0902_TAB_H - 4) / 2; uint16_t row_cy = UI->y + UI0902_TAB_H + 4 + (UI->h - UI0902_TAB_H - 4) / 2;
UI_DrawTriLeft(UI->x + 5, row_cy); UI_DrawTriLeft(UI->x + 5, row_cy);
UI_DrawTriRight((uint16_t)(UI->x + UI->w - 5 - UI0902_TRI_R_W), row_cy); UI_DrawTriRight((uint16_t)(UI->x + UI->w - 5 - UI0902_TRI_R_W), row_cy);

View File

@ -28,7 +28,8 @@ void CallUI_RestoreSelect(void);
#define UI_STATUS_BAR_H 26 #define UI_STATUS_BAR_H 26
#define UI0902_STATUS_SEP_Y 26 /* 0902-01/02 需求稿:分割线 y=36居中于顶栏图标底与移调/速度控件顶之间 */
#define UI0902_STATUS_SEP_Y 36
#define UI0902_STATUS_SEP_COLOR 0x52AA /* 比旧 0x2988 更清晰,避免在蓝牙下看成断开 */ #define UI0902_STATUS_SEP_COLOR 0x52AA /* 比旧 0x2988 更清晰,避免在蓝牙下看成断开 */
/* 0902 设计稿配色与底栏导航 */ /* 0902 设计稿配色与底栏导航 */
#define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */ #define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */