迪文科技论坛

 找回密码
 立即注册
搜索
查看: 36|回复: 0

【开源】EQ滑条控制, 多种音乐场景

[复制链接]

14

主题

15

回帖

1286

积分

金牌会员

Rank: 6Rank: 6

积分
1286
QQ
发表于 前天 16:08 | 显示全部楼层 |阅读模式
通过控制不同EQ的增益,达到控制不同场景的效果
效果视频如下:
https://v.youku.com/v_show/id_XNjQ4NTc2NjQzMg==.html
界面如下:



界面代码如下:
void main(){
       INIT_CPU();  //系统初始化
       PORT_Init();//IO口初始化

       T0_Init();//定时器0初始化
       T2_Init();//定时器2初始化   my_UART4_Init(115200);
       uart_init();//串口初始化

ws2812_writ_byte(8); //LED初始化
       resetEQValue();
       delay_ms(1000);
       ChangePage(1);
       delay_ms(1000);
       updateScreenEQPage(Nature_screen);

       while(1){
              Uart_Handle_all();
              OneMsHandle();//1Ms一次
              TenMsHandle();

   Read_0xF00();//数据自动上传
//            data_change_sava();//数据改变自动保存
       }
}

void updateScreenEQPage(EQ_Screen_e screen)
{
       u8send[10*2][2];
       u8i=0;

       if(screen>=EQ_MaxScreen)
              return;

       for(i=0;i<10;i++)
       {
              EQv.Gain=ScreenGain[screen]+8;
              UserReadEQ[1]=ScreenGain[screen]+8;
       }

       //更改上面显示的增益
       memset(send,0,sizeof(send));
       for(i=0;i<10;i++)
       {
              sprintf(send[i*2],"%d",ScreenGain[screen]);
       }
       write_dgusii_vp(0x1300,send,20);

       //更改滑条内容显示
       memset(send,0,sizeof(send));
       for(i=0;i<10;i++)
       {
              send[1]=EQv.Gain;
       }
       write_dgusii_vp(0x1000,send,10);


       //更改显示场景文本
       memset(send,0,sizeof(send));
       switch(screen)
       {
              case  Nature_screen:
                     sprintf(send,"自然");
              break;


             case YaoGun_screen:
                     sprintf(send,"摇滚");
              break;


             case LiuXing_screen:
                     sprintf(send,"流行");
              break;


             case JingDian_screen:
                     sprintf(send,"经典");
              break;
       }
       write_dgusii_vp(0x1500,send,3);

       //更新从机的增益
       updateAllEQGain();
}

void EQChangeSend(void)
{
       u8Read[10][2];
       u8send[10][2];
       u8i=0;
       intgain=0;

       memset(Read,0,sizeof(Read));
       Read_Dgusii_Vp(0x1000,Read,10);

       for(i=0;i<10;i++)
       {
              if(UserReadEQ[1]!=Read[1])
              {
                     UserReadEQ[1]=Read[1];

                     //更改上面显示的增益
                     gain=Read[1]-8;
                     memset(send,0,sizeof(send));
                     sprintf(send,"%d",gain);
                     write_dgusii_vp(0x1300+2*i,send,2);
                     EQSenddata(i,Read[1]);
                     break;
              }
       }
}

解码板子代码如下:

voidUserUartRecHandle(const uart_bus_t *uart_bus,u8 *data,u16 len)
{
    u8 retdata[30];
    u8 i=0;
    struct eq_seg_info*tar_seg1;
    u32 eq_name = 7;

   if(data[0]!=DwinLocal_addr)
     return;

    switch(data[1])
    {
       case 1://设置音量
           app_audio_direct_set_volume(data[2]);
           retdata[i++]=0x15;
           memcpy(&retdata[1],&data[1],len-1);
           UserUartRetRec(uart_bus,retdata,len);
       break;

       case 0x0b://更新EQ值
           if(data[2]>9)
               break;
           tar_seg1=&music_mode.eq_parm.seg[data[2]];
           u16 fre1=data[3]<<8|data[4];
           float gain1=((data[5]&0x7f)*100+data[6]);
           gain1/=100;
           if(data[5]>=0X80)
               gain1=-gain1;
           float Q1=(data[7]*100+data[8]);
           Q1/=100;
           tar_seg1->freq=fre1;
           tar_seg1->gain=gain1;
           tar_seg1->q=Q1;

           cur_eq_set_update(eq_name, tar_seg1,get_eq_nsection(eq_name), 0);
#if 1      
           int gain=tar_seg1->gain*100;
           int q=tar_seg1->q*100;
           log_info("fre:%d,gain:%d.%d,Q/S:%d.%d",tar_seg1->freq,
           gain/100,gain%100,
           q/100,q%100);
#endif                 
       break;

       case 0x1b://更新指定增益
           if(data[2]>9)
               break;
           tar_seg1=&music_mode.eq_parm.seg[data[2]];
           tar_seg1->gain=data[3]-8;

           cur_eq_set_update(eq_name, tar_seg1,get_eq_nsection(eq_name), 0);
#if 1      
            gain=tar_seg1->gain*100;
            q=tar_seg1->q*100;
           log_info("fre:%d,gain:%d.%d,Q/S:%d.%d",tar_seg1->freq,
                    gain/100,gain%100,
                    q/100,q%100);
#endif         
       break;

           case 0x1C://更新指定增益
           int k=0;

           for(k=0;k<10;k++)
           {
           tar_seg1=&music_mode.eq_parm.seg[k];
           tar_seg1->gain=data[2+k]-8;
           cur_eq_set_update(eq_name, tar_seg1,get_eq_nsection(eq_name), 0);
#if 1      
            gain=tar_seg1->gain*100;
            q=tar_seg1->q*100;
           log_info("fre:%d,gain:%d.%d,Q/S:%d.%d",tar_seg1->freq,
                    gain/100,gain%100,
                    q/100,q%100);
#endif
           }
       break;

    }
}






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-8-2 14:42 , Processed in 0.034264 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表