feat(midi): select Dream bank0 for accomp, bank1 for string timbre
Match dual-bank tone ROM so accompaniment volume scaling no longer shares patches with the main string voice; bass program updated to 34. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
125eb00aa3
commit
11efccc19e
|
|
@ -329,9 +329,19 @@ static int App_Auto_MapNoteOn(int channel, int key)
|
||||||
static void Func_CallBack_ProgramChange(int channel, int program)
|
static void Func_CallBack_ProgramChange(int channel, int program)
|
||||||
{
|
{
|
||||||
MidiFifoItem_t midimsg;
|
MidiFifoItem_t midimsg;
|
||||||
|
uint8_t ch = (uint8_t)(channel & 0x0F);
|
||||||
LOG_I("REG", "pc ch%u prog=%d", (unsigned)channel, program);
|
LOG_I("REG", "pc ch%u prog=%d", (unsigned)channel, program);
|
||||||
midimsg.msg[0] = 0xc0 | (channel & 0x0F);
|
/* 双音色库:伴奏一律先切 Bank0(CC0 MSB=0, CC32 LSB=0)再 PC */
|
||||||
midimsg.msg[1] = program;
|
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.msg[2] = 0;
|
||||||
midimsg.msglen = 2;
|
midimsg.msglen = 2;
|
||||||
mymidififo_InQueue(&m_MidiSendFifo,&midimsg);
|
mymidififo_InQueue(&m_MidiSendFifo,&midimsg);
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,14 @@ extern int8_t delta;
|
||||||
extern STRING_MIDI USE_MIDI;
|
extern STRING_MIDI USE_MIDI;
|
||||||
void LoadConfig(void)
|
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;
|
uint8_t val_127 = (faders[0].val * 127) / 10;
|
||||||
SendVolumeChangeMidiEvent(1,val_127);
|
SendVolumeChangeMidiEvent(1,val_127);
|
||||||
|
|
|
||||||
|
|
@ -942,7 +942,8 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
|
||||||
switch(Group->Id)
|
switch(Group->Id)
|
||||||
{
|
{
|
||||||
case GUI_TIMBRE_SELECT:
|
case GUI_TIMBRE_SELECT:
|
||||||
SendProgramChangeMidiEvent(0,Timbre_index[Group->Current]);
|
/* 双音色库:主弦走 Bank1,先选 bank 再 PC */
|
||||||
|
SendProgramWithBankMidiEvent(0, MIDI_BANK_STRING, Timbre_index[Group->Current]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,21 @@ void SendVolumeChangeMidiEvent(uint8_t channel,uint8_t CC)
|
||||||
SendMidiDataToDreamDSP(midibuff,3);
|
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);
|
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)
|
void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt)
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,16 @@
|
||||||
#define __MIDI_SEND_H__
|
#define __MIDI_SEND_H__
|
||||||
|
|
||||||
|
|
||||||
|
/* Dream 音色库 Bank:0=自动伴奏,1=主音色/弦 */
|
||||||
|
#define MIDI_BANK_ACCOMP 0
|
||||||
|
#define MIDI_BANK_STRING 1
|
||||||
|
|
||||||
/* MIDI 发送函数 */
|
/* MIDI 发送函数 */
|
||||||
void SendNoteOnMidiEvent(uint8_t Key, uint8_t OnVal);
|
void SendNoteOnMidiEvent(uint8_t Key, uint8_t OnVal);
|
||||||
void SendNoteOffMidiEvent(uint8_t Key, uint8_t OffVal);
|
void SendNoteOffMidiEvent(uint8_t Key, uint8_t OffVal);
|
||||||
void SendProgramChangeMidiEvent(uint8_t channel, uint8_t CC);
|
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 SendVolumeChangeMidiEvent(uint8_t channel, uint8_t CC);
|
||||||
void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt);
|
void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt);
|
||||||
void DefaultTask_SendMsg(uint16_t Data1, uint16_t Data2, uint16_t Data3, uint16_t Data4);
|
void DefaultTask_SendMsg(uint16_t Data1, uint16_t Data2, uint16_t Data3, uint16_t Data4);
|
||||||
|
|
|
||||||
|
|
@ -220,8 +220,8 @@ const STRING_MIDI *Chord_Midi_Table[7] =
|
||||||
const STRING_MIDI *OrganChord_Midi_Table[7] =
|
const STRING_MIDI *OrganChord_Midi_Table[7] =
|
||||||
{ OrganMIDI_1,OrganMIDI_2,OrganMIDI_3,OrganMIDI_4,OrganMIDI_5,OrganMIDI_6, OrganMIDI_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失真 / 34电贝司 */
|
||||||
const uint8_t Timbre_index[5] = {0x18, 0x19, 0x1B, 0x1E, 0x21};
|
const uint8_t Timbre_index[5] = {0x18, 0x19, 0x1B, 0x1E, 0x22};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue