diff --git a/APP/app_tm1629.c b/APP/app_tm1629.c index 309af2a..4b45cb1 100644 --- a/APP/app_tm1629.c +++ b/APP/app_tm1629.c @@ -3,7 +3,7 @@ static uint8_t key_last = KEY_NONE; -/* LED 期望颜色缓存:索引 = LedNum_TypeDef(0~7),COLOR_OTHER 表示灭 */ +/* LED ??????????棺???? = LedNum_TypeDef??0~7????COLOR_OTHER ????? */ //static LedColor_TypeDef led_cache[8] = { // COLOR_OTHER, COLOR_OTHER, COLOR_OTHER, COLOR_OTHER, // COLOR_OTHER, COLOR_OTHER, COLOR_OTHER, COLOR_OTHER @@ -31,9 +31,14 @@ uint8_t app_tm1629_Scan_Key(void) if(key != key_last) { key_last = key; - LOG_I("KEY", "tm1629 key=%u", (unsigned)key); + if(key >= 1 && key <= 21) + LOG_I("KEY", "tm1629 key=%u pitch=%u type=%u", (unsigned)key, + (unsigned)chord_type_index_map[key].PitchOffset, + (unsigned)chord_type_index_map[key].type); + else + LOG_I("KEY", "tm1629 key=%u", (unsigned)key); TM1629_Handle(key); - return key; + return key; } return KEY_NONE; } diff --git a/MyCode/App_Auto.c b/MyCode/App_Auto.c index 63befd7..7d5ebdf 100644 --- a/MyCode/App_Auto.c +++ b/MyCode/App_Auto.c @@ -19,6 +19,64 @@ static uint8_t pStoreBuffer[PRESET_BUFFER_SIZE]; //static uint8_t* pStoreBuffer; #define DEFAULT_TEMPO 100 +/* ======== 璺嚎A锛#IV 闄嶅叓搴︽嫤鎴紙闊冲笀搴撴敮鎸佸叓搴﹀墠鐨勪复鏃舵柟妗堬級 ======== + * AutoBand 搴撳杈撳叆闊崇鍙仛闊崇骇璇嗗埆锛岃緭鍑洪煶鍖虹敱鍏跺唴閮 octaveBase 鍐冲畾锛 + * 鍥轰欢渚у湪 GetChordNotesByType 閲岀殑浣庡叓搴﹁璁′笉鍙惉銆傛晠鍦ㄥ紩鎿庤緭鍑哄洖璋冨 + * 鎸夊綋鍓嶅拰寮︾姸鎬佸鏃嬪緥閫氶亾鍋氭潯浠舵у叓搴﹀亸绉伙紱闊冲笀鏂板簱鍒颁綅鍚庢暣浣撶Щ闄ゃ */ +#define CHORD_OCTAVE_INTERCEPT_EN 1 +#define DRUM_CHANNEL 9 /* 榧撻氶亾涓嶇Щ璋 */ + +/* 褰撳墠鐢熸晥鐨勫叓搴﹀亸绉伙紙0 鎴 -12锛夈俁AM 浣欓噺鏋佸皬锛屼笉鐢ㄦ寜闊崇琛細 + * 鐘舵佺炕杞灛闂村厛鍚戞棆寰嬮氶亾琛 CC123(All Notes Off) 娓呮帀鏃ч煶鍖虹殑闊筹紝 + * 涔嬪悗 NoteOff 缁熶竴鎸夊綋鍓嶅亸绉昏繕鍘熷嵆鍙紝涓嶄細鎸傞煶銆 */ +static int8_t s_chord_octave_shift = 0; + +static int8_t App_Auto_TargetChordOctaveShift(void) +{ +#if CHORD_OCTAVE_INTERCEPT_EN + /* 涓 GetChordNotesByType 鐨勬牴闊冲叓搴﹁璁″榻愶紙鏁存浼村鍘嬩竴涓叓搴︼級锛 + * V/VI/VII锛堥敭 13~21锛夋牴闊虫湰灏卞湪浣庡叓搴︼紙43/45/47锛夛紱 + * #IV锛堥敭 10~12 + Pitch 鍗囷級鏁寸粍浣庡叓搴︼紝涓烘渶浣庨煶銆 + * 寮曟搸鍙闊崇骇涓嶈鍏害锛屾晠鍦ㄨ緭鍑轰晶缁熶竴琛 -12銆 */ + if (KEY_ID_1629 >= 13 && KEY_ID_1629 <= 21) + return -12; + if (KEY_ID_1629 >= 10 && KEY_ID_1629 <= 12 && + chord_type_index_map[KEY_ID_1629].PitchOffset == 2) + return -12; +#endif + return 0; +} + +static void App_Auto_QueueAllNotesOff(void) +{ + MidiFifoItem_t m; + for (int ch = 0; ch < 16; ch++) + { + if (ch == DRUM_CHANNEL) continue; + m.msg[0] = 0xB0 | ch; + m.msg[1] = 123; /* CC123 All Notes Off */ + m.msg[2] = 0; + m.msglen = 3; + mymidififo_InQueue(&m_MidiSendFifo,&m); + } +} + +/* NoteOn 璺緞璋冪敤锛氬亸绉荤姸鎬佺炕杞椂鍏堟竻鏃ч煶锛屽啀杩斿洖鏂板亸绉 */ +static int8_t App_Auto_ShiftForNoteOn(void) +{ + int8_t target = App_Auto_TargetChordOctaveShift(); + if (target != s_chord_octave_shift) + { + LOG_I("OCT", "shift %d->%d chord=%u pitch=%u", + (int)s_chord_octave_shift, (int)target, + (unsigned)KEY_ID_1629, + (unsigned)chord_type_index_map[KEY_ID_1629].PitchOffset); + App_Auto_QueueAllNotesOff(); + s_chord_octave_shift = target; + } + return s_chord_octave_shift; +} + static void Func_CallBack_ProgramChange(int channel, int program) { MidiFifoItem_t midimsg; @@ -32,8 +90,15 @@ static void Func_CallBack_ProgramChange(int channel, int program) static void Func_CallBack_NoteOff(int channel,int key) { MidiFifoItem_t midimsg; - midimsg.msg[0] = 0x80 | channel; - midimsg.msg[1] = key; + int out_key = key; + if (channel != DRUM_CHANNEL && key >= 0 && key < 128) + { + /* 鎸夊綋鍓嶅亸绉昏繕鍘燂紱鍋忕Щ缈昏浆鐬棿鐨勬棫闊冲凡鐢 CC123 娓呮帀 */ + out_key = key + s_chord_octave_shift; + if (out_key < 0 || out_key > 127) out_key = key; + } + midimsg.msg[0] = 0x80 | (channel & 0x0F); + midimsg.msg[1] = (uint8_t)out_key; midimsg.msg[2] = 0; midimsg.msglen = 3; mymidififo_InQueue(&m_MidiSendFifo,&midimsg); @@ -43,9 +108,17 @@ static void Func_CallBack_NoteOff(int channel,int key) static void Func_CallBack_NoteOn(int channel,int key,int vel) { MidiFifoItem_t midimsg; - midimsg.msg[0] = 0x90 | channel; - midimsg.msg[1] = key; - midimsg.msg[2] = vel; + int out_key = key; + if (channel != DRUM_CHANNEL && key >= 0 && key < 128) + { + int8_t shift = (vel == 0) ? s_chord_octave_shift /* vel=0 瑙嗗悓 NoteOff */ + : App_Auto_ShiftForNoteOn(); + out_key = key + shift; + if (out_key < 0 || out_key > 127) out_key = key; + } + midimsg.msg[0] = 0x90 | (channel & 0x0F); + midimsg.msg[1] = (uint8_t)out_key; + midimsg.msg[2] = (uint8_t)vel; midimsg.msglen = 3; mymidififo_InQueue(&m_MidiSendFifo,&midimsg); @@ -135,6 +208,7 @@ static int Func_CallBack_ReadFlash(int address,int length,uint8_t* pOutput) // void App_Auto_Init(void) { + LOG_I("OCT", "intercept build 20260910 en=%d", (int)CHORD_OCTAVE_INTERCEPT_EN); AutoBandTop1_SetPresetStoreBuffer(pStoreBuffer,PRESET_BUFFER_SIZE); AutoBandTop1_Init(); AutoBandTop1_RegisterCallBack_NoteOn(Func_CallBack_NoteOn);