Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
main.cpp
- Committer:
- Tantep
- Date:
- 2019-05-05
- Revision:
- 5:7db99d28bc36
- Parent:
- 4:ec0ff5b355e8
- Child:
- 6:d6d4f48fc2e1
File content as of revision 5:7db99d28bc36:
#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 = volume*(sn44_data[h]/16777215.0);//scale to 0.0 to 1.0 for PWM
h++;
speaker.period(1.0/330750.0); //PWM freq >10X audio sample rate
if (h>= num_sn44) {
h = 0;
sn44tick.detach();
}
}
void playkick()
{
speaker = volume*(kick44_data[l]/16777215.0);//scale to 0.0 to 1.0 for PWM
l++;
speaker.period(1.0/441000.0); //PWM freq >10X audio sample rate
if (l>= num_kick44) {
l = 0;
kick44tick.detach();
}
}
void playclap()
{
speaker = volume*(cl44_data[i]/16777215.0);//scale to 0.0 to 1.0 for PWM
i++;
speaker.period(1.0/220500.0); //PWM freq >10X audio sample rate
if (i>= num_cl44) {
i = 0;
cl44tick.detach();
}
}
void playclhh()
{
speaker = volume*(clhh44_data[j]/16777215.0);//scale to 0.0 to 1.0 for PWM
j++;
speaker.period(1.0/330750.0); //PWM freq >10X audio sample rate
if (j>= num_clhh44) {
j = 0;
clhh44tick.detach();
}
}
void playophh()
{
speaker = volume*(ophh44_data[k]/16777215.0);//scale to 0.0 to 1.0 for PWM
k++;
speaker.period(1.0/330750.0); //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);
}
}