volumetempofix

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

main.cpp

Committer:
chana_jo
Date:
2019-05-04
Revision:
4:ec0ff5b355e8
Parent:
3:3a2c11f459c4

File content as of revision 4:ec0ff5b355e8:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"
#include"sn44.h"
#include"cl44.h"
#include"clhh44.h"
#include"ophh44.h"
#include"kick44.h"

#define sample_freq 16000.0
DigitalOut led(LED1);
LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;
AnalogIn tempoknob(A1);
AnalogIn volumeknob(A0);
PwmOut speaker(D1);
Serial pc(USBTX, USBRX);
Ticker re,er,rr,ee,sn44tick,cl44tick,clhh44tick,ophh44tick,kick44tick,testprint;//timer ไว้ attach ตอนplay audio กับไว้รับปุ่ม

int checkplay=0,beat[5][8],page=1;
int tracking=1;
char currentpage[50],volumechar[50],strvolume[50],strtempo[50],tempostr[50]; //สร้างไว้ให้เขียนอักษรได้เฉยๆ
float volume,tempo;
float speed; //tempo converted to sec
int h,i,j,k,l;
void test(void); //function for touchscreen
void play(void);// function for play
void screen(void);//function for display
void knob(void);// read knob
void testbeat1(void);
void testbeat2(void);
float tempo2,volume2;

int main() 
{  
    lcd.Clear(LCD_COLOR_BLUE);
    ee.attach(&screen, 0.03);
    re.attach(&play, 0.5);//เล่นตามtempo
    er.attach(&test, 0.25);//กดช้ากดเร็วแล้วแต่
    rr.attach(&knob,0.5);//readknob ทุก0.5
   
   
}

 
//SAMPLE && SAMPLE PLAY FUNCTION

void sn44_sample ()
{
 
    speaker = sn44_data[h]/16777215.0;//scale to 0.0 to 1.0 for PWM
    h++;
    if (h>= num_sn44) {
        h = 0;
        sn44tick.detach();
        //led = 0;
    }
}
void cl44_sample ()
{
 
    speaker = cl44_data[i]/16777215.0;//scale to 0.0 to 1.0 for PWM
    i++;
    if (i>= num_cl44) {
        i = 0;
        cl44tick.detach();
        //led = 0;
    }
}
void clhh44_sample ()
{
 
    speaker = clhh44_data[j]/16777215.0;//scale to 0.0 to 1.0 for PWM
    j++;
    if (j>= num_clhh44) {
        j = 0;
        clhh44tick.detach();
        //led = 0;
    }
}
void ophh44_sample ()
{
 
    speaker = ophh44_data[k]/16777215.0;//scale to 0.0 to 1.0 for PWM
    k++;
    if (k>= num_ophh44) {
        k = 0;
        ophh44tick.detach();
        //led = 0;
    }
}
void kick44_sample ()
{
    speaker = kick44_data[l]/16777215.0;//scale to 0.0 to 1.0 for PWM
    l++;
    if (l>= num_kick44) {
        l = 0;
        kick44tick.detach();
        //led = 0;
    }
}
/////////////////////////////////////////////////////////////////////////////  PLAY   PART //////////////////////////////////////////////
void playsnare()
{
    speaker = sn44_data[h]/16777215.0;//scale to 0.0 to 1.0 for PWM
    h++;
    speaker.period((1.0/330750.0)*volume); //PWM freq >10X audio sample rate        
    
    if (h>= num_sn44) {
        h = 0;
        sn44tick.detach();
        }
    
}

void playkick()
{
    speaker = kick44_data[l]/16777215.0;//scale to 0.0 to 1.0 for PWM
    l++;
    speaker.period((1.0/441000.0)*volume); //PWM freq >10X audio sample rate
    
     if (l>= num_kick44) {
        l = 0;
        kick44tick.detach();
        }
    
}
void playclap()
{
    speaker = cl44_data[i]/16777215.0;//scale to 0.0 to 1.0 for PWM
    i++;
    speaker.period((1.0/220500.0)*volume); //PWM freq >10X audio sample rate
    
    if (i>= num_cl44) {
        i = 0;
        cl44tick.detach();
        }

}

void playclhh()
{
    speaker = clhh44_data[j]/16777215.0;//scale to 0.0 to 1.0 for PWM
    j++;
    speaker.period((1.0/330750.0)*volume); //PWM freq >10X audio sample rate
    
     if (j>= num_clhh44) {
        j = 0;
        clhh44tick.detach();
        }
        
}

void playophh()
{
    speaker = ophh44_data[k]/16777215.0;//scale to 0.0 to 1.0 for PWM
    k++;
    speaker.period((1.0/330750.0)*volume); //PWM freq >10X audio sample rate
    
    if (k>= num_ophh44) {
        k = 0;
        ophh44tick.detach();
        }
        
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void play() 
{
    if(checkplay==1)//led blink when button play is on
    {
      pc.printf("current beat : %d    \n\r",tracking);
                
            if(tracking==1)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][0]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][0]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][0]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][0]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][0]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
                         
            }
            else if(tracking==2)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][1]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][1]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][1]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][1]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][1]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==3)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][2]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][2]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][2]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][2]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][2]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==4)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][3]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][3]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][3]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][3]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][3]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==5)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][4]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][4]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][4]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][4]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][4]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==6)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][5]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][5]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][5]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][5]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][5]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==7)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][6]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][6]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][6]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][6]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][6]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
            else if(tracking==8)
            {
                sn44tick.detach();
                cl44tick.detach();
                clhh44tick.detach();
                ophh44tick.detach();
                kick44tick.detach();
                if(beat[0][7]==1)
                    {
                        pc.printf("1");
                        kick44tick.attach(&playkick,1.0 / 33075);
                    }
                if(beat[1][7]==1)
                    {
                        pc.printf("2");
                        sn44tick.attach(&playsnare,1.0 / 33075);
                    }
                if(beat[2][7]==1)
                    {
                        pc.printf("3");
                        cl44tick.attach(&playclap,1.0 /22050);
                    }
                if(beat[3][7]==1)
                    {
                        pc.printf("4");
                        clhh44tick.attach(&playclhh,1.0 / 33075);
                    }
                if(beat[4][7]==1)
                    {
                        pc.printf("5");
                        ophh44tick.attach(&playophh,1.0 / 33075);
                    }                        
            
                
            }
      if(tracking<8)
        {
        tracking=tracking+1;
        }
        else if(tracking==8)
        {
        tracking=1;
        led=!led;
        }
                
      }
    else if(checkplay==0)//led off
    {
       led=0;
       tracking=1;
    }
   
}

void test() 
{
       TS_StateTypeDef TS_State;
       /*uint8_t status;//ไม่ได้ใช้สร้างไว้ก่อน*/
       ts.GetState(&TS_State);  
       if((TS_State.touchDetected))//รับtouchอะไรก็ตาม จะเข้าfunctionนี้
       {
        
        if(TS_State.touchX[0]<74&&TS_State.touchX[0]>24&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//playbutton
        {
            if(checkplay==0)  
            {
            checkplay=1;
            }  
            else if(checkplay==1)
            {
                checkplay=0;
            }
        }
        if(TS_State.touchX[0]<74&&TS_State.touchX[0]>24&&TS_State.touchY[0]<161&&TS_State.touchY[0]>136)//previous page
        {
            page=page-1;
            if(page<1) 
            {
            page=5;
            }  
            pc.printf("change to page %d",page);
            
        }
         if(TS_State.touchX[0]<431&&TS_State.touchX[0]>406&&TS_State.touchY[0]<161&&TS_State.touchY[0]>136)//next page
        {
            page=page+1;
            if(page>5) 
            {
            page=1;
            }  
            pc.printf("change to page %d",page);
            
        }
          if(TS_State.touchX[0]<122&&TS_State.touchX[0]>98&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat1
        {
            
            if(beat[page-1][0]==0) 
            {
            beat[page-1][0]=1;
            
            }
            else if(beat[page-1][0]==1)
            {
                beat[page-1][0]=0;
            }
            
        
            
        }
          if(TS_State.touchX[0]<166&&TS_State.touchX[0]>142&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat2
        {
            if(beat[page-1][1]==0) 
            {
            beat[page-1][1]=1;
            }  
            else if(beat[page-1][1]==1)
            {
                beat[page-1][1]=0;
            }

        }          
          if(TS_State.touchX[0]<210&&TS_State.touchX[0]>186&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat3
        {
            if(beat[page-1][2]==0) 
            {
            beat[page-1][2]=1;
            }  
            else if(beat[page-1][2]==1)
            {
                beat[page-1][2]=0;
            }

        }
          if(TS_State.touchX[0]<254&&TS_State.touchX[0]>230&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat4
        {
            if(beat[page-1][3]==0) 
            {
            beat[page-1][3]=1;
            }  
            else if(beat[page-1][3]==1)
            {
                beat[page-1][3]=0;
            }

        }
          if(TS_State.touchX[0]<298&&TS_State.touchX[0]>274&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat5
        {
            if(beat[page-1][4]==0) 
            {
            beat[page-1][4]=1;
            }  
            else if(beat[page-1][4]==1)
            {
                beat[page-1][4]=0;
            }

        }
          if(TS_State.touchX[0]<342&&TS_State.touchX[0]>318&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat6
        {
            if(beat[page-1][5]==0) 
            {
            beat[page-1][5]=1;
            }  
            else if(beat[page-1][5]==1)
            {
                beat[page-1][5]=0;
            }

        }
          if(TS_State.touchX[0]<386&&TS_State.touchX[0]>362&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat7
        {
            if(beat[page-1][6]==0) 
            {
            beat[page-1][6]=1;
            }  
            else if(beat[page-1][6]==1)
            {
                beat[page-1][6]=0;
            }

        }
          if(TS_State.touchX[0]<430&&TS_State.touchX[0]>406&&TS_State.touchY[0]<248&&TS_State.touchY[0]>198)//beat8
        {
            if(beat[page-1][7]==0) 
            {
            beat[page-1][7]=1;
            }  
            else if(beat[page-1][7]==1)
            {
                beat[page-1][7]=0;
            }

        }

        pc.printf("at page :%d    ",page); //ไว้check uart เฉยๆ
        pc.printf("%d",beat[page-1][0]);
        pc.printf("%d",beat[page-1][1]);
        pc.printf("%d",beat[page-1][2]);
        pc.printf("%d",beat[page-1][3]);
        pc.printf("%d",beat[page-1][4]);
        pc.printf("%d",beat[page-1][5]);
        pc.printf("%d",beat[page-1][6]);
        pc.printf("%d",beat[page-1][7]);
        pc.printf("\n\r");
        }
 }
 
 void knob()//read analog
{

 
   volume=volumeknob.read();//0to100
   tempo=tempoknob.read();//problematic********************************************
  
  volume2=volume*100;
  sprintf(volumechar,"%1.1f",volume2);  
  tempo2=60+(tempo*90); 
  speed=(60/tempo2)/2;
  sprintf(tempostr,"%1.1f",speed);  
  pc.printf("speed = %1.3f\n\r",speed);
  pc.printf("tempo =%1.1f\n\r",tempo2);
  pc.printf("volume =%1.3f\n\r",volume);
  pc.printf("volume =%1.1f percent\n\r",volume2);
    
}
 
 
 
 
 void screen()// function for display
{
    lcd.SetBackColor(LCD_COLOR_BLUE);
    lcd.SetTextColor(LCD_COLOR_BROWN);//play button
    lcd.FillRect(24,198,50,50);
    lcd.SetTextColor(LCD_COLOR_YELLOW);//previous page
    lcd.FillRect(24,136,50,25);
    lcd.SetTextColor(LCD_COLOR_YELLOW);// next page
    lcd.FillRect(406,136,50,25);
    
    sprintf(strvolume,"%s","Volume "); //display volume
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DisplayStringAt(24,LINE(1),(uint8_t*)strvolume,LEFT_MODE);
    sprintf(volumechar,"%s",volumechar);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DisplayStringAt(24,LINE(2),(uint8_t*)volumechar,LEFT_MODE);
    
    sprintf(strtempo,"%s","Tempo ");
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DisplayStringAt(24,LINE(1),(uint8_t*)strtempo,RIGHT_MODE);
     sprintf(tempostr,"%1.1f",tempo2); ////////////////////////////////////////////display tempo on lcd ไม่ถูก
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.DisplayStringAt(24,LINE(2),(uint8_t*)tempostr,RIGHT_MODE);
    
    
   
    
       if(page==1) //พวกนี้คือแสดงหน้าว่าอยู่หน้าอะไร
        {
        sprintf(currentpage,"%s","Current page is Kick       ");
        lcd.SetTextColor(LCD_COLOR_BLACK);
        lcd.DisplayStringAt(24,LINE(3),(uint8_t*)currentpage,LEFT_MODE);
        
        }
        else if(page==2)
        {
        sprintf(currentpage,"%s","Current page is Snare      ");
        lcd.SetTextColor(LCD_COLOR_BLACK);
        lcd.DisplayStringAt(24,LINE(3),(uint8_t*)currentpage,LEFT_MODE);   
     
        }
       else if(page==3)
        {
        sprintf(currentpage,"%s","Current page is Clap       ");
        lcd.SetTextColor(LCD_COLOR_BLACK);
        lcd.DisplayStringAt(24,LINE(3),(uint8_t*)currentpage,LEFT_MODE);   
        }
       else if(page==4)
        {
        sprintf(currentpage,"%s","Current page is Close HiHat  ");
        lcd.SetTextColor(LCD_COLOR_BLACK);
        lcd.DisplayStringAt(24,LINE(3),(uint8_t*)currentpage,LEFT_MODE);   
        }
       else if(page==5)
        {
        sprintf(currentpage,"%s","Current page is Open HiHat  ");
        lcd.SetTextColor(LCD_COLOR_BLACK);
        lcd.DisplayStringAt(24,LINE(3),(uint8_t*)currentpage,LEFT_MODE);   
        }
            
           // พวกนี้คือเปลี่ยนปุ่มแต่ละ beat
            if(beat[page-1][0]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(98,198,24,50);
            }
            if(beat[page-1][0]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(98,198,24,50);
            }
            if(beat[page-1][1]==0)            
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(142,198,24,50);
            }
            if(beat[page-1][1]==1)            
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(142,198,24,50);
            }
            if(beat[page-1][2]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(186,198,24,50);
            }
            if(beat[page-1][2]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(186,198,24,50);
            }
            if(beat[page-1][3]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(230,198,24,50);
            }
            if(beat[page-1][3]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(230,198,24,50);
            }
            if(beat[page-1][4]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(274,198,24,50);
            }
            if(beat[page-1][4]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(274,198,24,50);
            }
            if(beat[page-1][5]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(318,198,24,50);
            }
            if(beat[page-1][5]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(318,198,24,50);
            }
            if(beat[page-1][6]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(362,198,24,50);
            }
            if(beat[page-1][6]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(362,198,24,50);
            }
            if(beat[page-1][7]==0)
            {
             lcd.SetTextColor(LCD_COLOR_LIGHTRED);
             lcd.FillRect(406,198,24,50);    
            }
            if(beat[page-1][7]==1)
            {
             lcd.SetTextColor(LCD_COLOR_GREEN);
             lcd.FillRect(406,198,24,50);    
            }

  }