K1Guitar/midi/midi_send.c

138 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
/* Bank Select:CC0(MSB)=bank,CC32(LSB)=0。Dream 双音色库:0=伴奏,1=主弦 */
void SendBankChangeMidiEvent(uint8_t channel, uint8_t bank)
{
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)
{
USART2_SendData(buff,cnt);
}
/* 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 */
}
#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';
}