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..9565163 100644 --- a/midi/midi_tables.c +++ b/midi/midi_tables.c @@ -220,8 +220,8 @@ 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贝斯 */ -const uint8_t Timbre_index[5] = {0x18, 0x19, 0x1B, 0x1E, 0x21}; +/* UI槽位0~4 → MIDI Program Change(Bank1):24尼龙 / 25钢弦 / 27清音 / 30失真 / 34电贝司 */ +const uint8_t Timbre_index[5] = {0x18, 0x19, 0x1B, 0x1E, 0x22};