2026-08-26 07:26:58 +08:00
|
|
|
|
#include "includes.h"
|
|
|
|
|
|
|
|
|
|
|
|
// Note Off 0x8n
|
|
|
|
|
|
void SendNoteOffMidiEvent(uint8_t Key, uint8_t OffVal)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t midibuff[3] = {0x80 , Key , OffVal};
|
|
|
|
|
|
USART2_SendData(midibuff,sizeof(midibuff));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Note On 0x9n
|
|
|
|
|
|
void SendNoteOnMidiEvent(uint8_t Key, uint8_t OnVal)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t midibuff[3] = {0x90 , Key , OnVal};
|
|
|
|
|
|
USART2_SendData(midibuff,sizeof(midibuff));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SendProgramChangeMidiEvent(uint8_t channel,uint8_t CC)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t midibuff[2] = {0xC0|channel , CC };
|
|
|
|
|
|
SendMidiDataToDreamDSP(midibuff,2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SendVolumeChangeMidiEvent(uint8_t channel,uint8_t CC)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t midibuff[3] = {0xB0|channel ,0x07, CC };
|
|
|
|
|
|
SendMidiDataToDreamDSP(midibuff,3);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-16 18:29:48 +08:00
|
|
|
|
/* Bank Select:CC0(MSB)=bank,CC32(LSB)=0。Dream 双音色库:0=伴奏,1=主弦 */
|
|
|
|
|
|
void SendBankChangeMidiEvent(uint8_t channel, uint8_t bank)
|
2026-08-26 07:26:58 +08:00
|
|
|
|
{
|
2026-09-16 18:29:48 +08:00
|
|
|
|
uint8_t midibuff[3] = {0xB0|(channel & 0x0F) ,0x00, bank };
|
2026-08-26 07:26:58 +08:00
|
|
|
|
SendMidiDataToDreamDSP(midibuff,3);
|
2026-09-16 18:29:48 +08:00
|
|
|
|
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);
|
2026-08-26 07:26:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SendMidiDataToDreamDSP(uint8_t* buff, uint16_t cnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
USART2_SendData(buff,cnt);
|
|
|
|
|
|
}
|
2026-09-08 12:37:29 +08:00
|
|
|
|
|
2026-09-28 17:53:06 +08:00
|
|
|
|
/* Roland/Dream GS:checksum = 0x80 - (addr+data 低 7 位) */
|
|
|
|
|
|
static void Dream_Dt1(uint8_t ah, uint8_t am, uint8_t al, const uint8_t *data, uint8_t n)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t msg[16];
|
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
uint8_t sum;
|
|
|
|
|
|
|
|
|
|
|
|
msg[0] = 0xF0;
|
|
|
|
|
|
msg[1] = 0x41;
|
|
|
|
|
|
msg[2] = 0x00;
|
|
|
|
|
|
msg[3] = 0x42;
|
|
|
|
|
|
msg[4] = 0x12;
|
|
|
|
|
|
msg[5] = ah;
|
|
|
|
|
|
msg[6] = am;
|
|
|
|
|
|
msg[7] = al;
|
|
|
|
|
|
sum = (uint8_t)(ah + am + al);
|
|
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
msg[8 + i] = data[i];
|
|
|
|
|
|
sum = (uint8_t)(sum + data[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
msg[8 + n] = (uint8_t)((0x80u - (sum & 0x7Fu)) & 0x7Fu);
|
|
|
|
|
|
msg[9 + n] = 0xF7;
|
|
|
|
|
|
SendMidiDataToDreamDSP(msg, (uint16_t)(10u + n));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void Dream_Dt1Byte(uint8_t ah, uint8_t am, uint8_t al, uint8_t data)
|
|
|
|
|
|
{
|
|
|
|
|
|
Dream_Dt1(ah, am, al, &data, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 音师编辑器 B:Reverb / E:PEQ Normal。
|
|
|
|
|
|
混响是 GS 系统区 40 01 30:Hall2=4,Size=Character,PreLP,Level,Time,Delay Feedback。
|
|
|
|
|
|
PEQ 为同一套 4 段参量:增益按 0.1 dB/档、0=0 dB;频率按 Hz 的 14 位原值;Q 按 0.1 显示(2.00→20)。 */
|
|
|
|
|
|
void Dream_ApplyEditorParams(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t hz[2];
|
|
|
|
|
|
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x30, 4); /* Type Hall2 */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x31, 4); /* Size */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x32, 2); /* PreLP */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x33, 85); /* Level */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x34, 64); /* Time */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x01, 0x35, 0); /* DelFdbck */
|
|
|
|
|
|
|
|
|
|
|
|
/* 40 04 00.. 与编辑器从左到右、从上到下一致 */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x00, 81); /* GainLow 8.1 dB */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x01, 12); /* GainLoMid 1.2 dB */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x02, 7); /* GainHiMid 0.7 dB */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x03, 28); /* GainHigh 2.8 dB */
|
|
|
|
|
|
|
|
|
|
|
|
hz[0] = (uint8_t)((412 >> 7) & 0x7F);
|
|
|
|
|
|
hz[1] = (uint8_t)(412 & 0x7F);
|
|
|
|
|
|
Dream_Dt1(0x40, 0x04, 0x04, hz, 2); /* FreqLow 412 Hz */
|
|
|
|
|
|
hz[0] = (uint8_t)((2294 >> 7) & 0x7F);
|
|
|
|
|
|
hz[1] = (uint8_t)(2294 & 0x7F);
|
|
|
|
|
|
Dream_Dt1(0x40, 0x04, 0x06, hz, 2); /* FreqLoMid 2294 Hz */
|
|
|
|
|
|
hz[0] = (uint8_t)((6048 >> 7) & 0x7F);
|
|
|
|
|
|
hz[1] = (uint8_t)(6048 & 0x7F);
|
|
|
|
|
|
Dream_Dt1(0x40, 0x04, 0x08, hz, 2); /* FreqHiMid 6048 Hz */
|
|
|
|
|
|
hz[0] = (uint8_t)((3126 >> 7) & 0x7F);
|
|
|
|
|
|
hz[1] = (uint8_t)(3126 & 0x7F);
|
|
|
|
|
|
Dream_Dt1(0x40, 0x04, 0x0A, hz, 2); /* FreqHigh 3126 Hz */
|
|
|
|
|
|
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x0C, 20); /* Q-LoMid 2.00 */
|
|
|
|
|
|
Dream_Dt1Byte(0x40, 0x04, 0x0D, 20); /* Q-HiMid 2.00 */
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-08 12:37:29 +08:00
|
|
|
|
#define AT32_UID_BASE 0x1FFFF7E8UL
|
|
|
|
|
|
|
|
|
|
|
|
void BleBuildDeviceName(char *out)
|
|
|
|
|
|
{
|
|
|
|
|
|
static const char hex[] = "0123456789ABCDEF";
|
|
|
|
|
|
const uint32_t *uid = (const uint32_t *)AT32_UID_BASE;
|
|
|
|
|
|
uint32_t tail = uid[2] & 0x00FFFFFFu;
|
|
|
|
|
|
unsigned i;
|
|
|
|
|
|
|
|
|
|
|
|
out[0] = 'P';
|
|
|
|
|
|
out[1] = 'H';
|
|
|
|
|
|
out[2] = 'O';
|
|
|
|
|
|
out[3] = 'N';
|
|
|
|
|
|
out[4] = '_';
|
|
|
|
|
|
for (i = 0; i < 6; i++)
|
|
|
|
|
|
out[5 + i] = hex[(tail >> (4 * (5 - i))) & 0xFu];
|
|
|
|
|
|
out[BLE_DEVICE_NAME_LEN] = '\0';
|
|
|
|
|
|
}
|