From 24261942d8bbfdbe64527276639b6a4e3d035783 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Mon, 14 Sep 2026 12:24:35 +0800 Subject: [PATCH] Map universal section-4 to Postamble outro and share AutoBand_StartOutro with ADC. Exit piece mode before Postamble so universal chord loops can switch into the style outro stage once 3.bin has PostambleMIDI. Co-authored-by: Cursor --- Global/Global.c | 68 ++++++++++++++++++++++++++++++++++-------------- Global/Global.h | 2 ++ UI/UI_SongMode.c | 10 +++++++ 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/Global/Global.c b/Global/Global.c index a7017c5..efb4c4b 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -488,6 +488,29 @@ void Accomp_UpdatePlayingChord(void) AutoBandTop1_Note_On(midi_note_buff[i], 0x50); } +/* 尾奏起奏:Postamble(0) + 同步起奏 + 当前和弦 Note_On。 + * 供 ADC 独立尾奏键与万能模式第4段落键共用。 + * 万能走 piece 循环,须先退出 piece,否则 Postamble 舞台切不过去; + * 尾奏 MIDI 须由音师写入 3.bin(见 Doc/音师需求_万能3.bin尾奏_20260914.md)。 */ +void AutoBand_StartOutro(void) +{ + uint8_t midi_note_buff[4] = {0,}; + uint8_t note_cnt = 0; + + /* 退出和弦走向 piece,再进风格尾奏舞台 */ + AutoBandTop1_SetPiecePlayMode(0, 0, 0); + AutoBandTop1_Postamble(0); + /* 尾奏起奏前补发主音量,保证与图标一致 */ + MasterVolume_Reapply(); + AutoBandTop1_SyncStart(); + wk_delay_ms(50); + note_cnt = GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff); + for(uint8_t i = 0;i < note_cnt;i++) + { + AutoBandTop1_Note_On(midi_note_buff[i],0x50); + } +} + void ADC_IN1_KEY_Handle(uint8_t key,bool on) { uint8_t midi_note_buff[4] = {0,}; @@ -497,28 +520,35 @@ void ADC_IN1_KEY_Handle(uint8_t key,bool on) if(key_toggle[key] == 1) { //ResetAutoPowerCount(); - switch(key) + if(key == 1) { - case 3: AutoBandTop1_Preamble(0); is_preamble = 1; break; - case 0: AutoBandTop1_Preamble(1); is_preamble = 1; break; - case 1: AutoBandTop1_Postamble(0); break; - case 2: AutoBandTop1_Postamble(1); break; + /* 尾奏:与万能模式第4键共用同一起奏路径 */ + AutoBand_StartOutro(); } - /* 前奏/尾奏起奏前补发主音量,保证与图标一致 */ - MasterVolume_Reapply(); - //AutoBandTop1_Start(); - AutoBandTop1_SyncStart(); - wk_delay_ms(50); - /* 音师:前奏起始 = 当前调一级和弦第一把位(index 1 + maj,再经移调) */ - if (is_preamble) + else { - KEY_ID_1629 = 1; - chord_type_index_map[1].type = 0; - } - note_cnt = GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff); - for(uint8_t i = 0;i < note_cnt;i++) - { - AutoBandTop1_Note_On(midi_note_buff[i],0x50); + switch(key) + { + case 3: AutoBandTop1_Preamble(0); is_preamble = 1; break; + case 0: AutoBandTop1_Preamble(1); is_preamble = 1; break; + case 2: AutoBandTop1_Postamble(1); break; + } + /* 前奏/断奏起奏前补发主音量,保证与图标一致 */ + MasterVolume_Reapply(); + //AutoBandTop1_Start(); + AutoBandTop1_SyncStart(); + wk_delay_ms(50); + /* 音师:前奏起始 = 当前调一级和弦第一把位(index 1 + maj,再经移调) */ + if (is_preamble) + { + KEY_ID_1629 = 1; + chord_type_index_map[1].type = 0; + } + note_cnt = GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff); + for(uint8_t i = 0;i < note_cnt;i++) + { + AutoBandTop1_Note_On(midi_note_buff[i],0x50); + } } } else diff --git a/Global/Global.h b/Global/Global.h index 7633200..865acc5 100644 --- a/Global/Global.h +++ b/Global/Global.h @@ -214,6 +214,8 @@ void GUI_Item_AjustLoopValue(GUI_SWITCH * Group, int8_t Dir); void Send_volume(uint8_t vol); void MasterVolume_Reapply(void); +/* 尾奏起奏:ADC 尾奏键与万能第4段落键共用 */ +void AutoBand_StartOutro(void); void ADC_IN1_KEY_Handle(uint8_t key,bool on); void TM1617_Handle(uint8_t key); diff --git a/UI/UI_SongMode.c b/UI/UI_SongMode.c index d474677..4d180ec 100644 --- a/UI/UI_SongMode.c +++ b/UI/UI_SongMode.c @@ -237,6 +237,16 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value) } else if(ID==GUI_PLAY_SECTION) { + /* 万能模式第4键:改为尾奏播放(与独立尾奏键同路径),不走 main4 */ + if (mGuiData[GUI_TAB_INDEX].Current == 0 && value == 3) + { + last_value = mGuiData[ID].Current; + mGuiData[ID].Current = value; + AutoBand_StartOutro(); + if (!UI_SetFocus(GUI_PLAY_SECTION)) + Refresh_SectionSelect(last_value, &UI_Label[ID], &mGuiData[ID]); + return; + } if(mGuiData[ID].Current != value) { mGuiData[ID].Current = value;