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: mbed
Front/Front.cpp
- Committer:
- lukeocarwright
- Date:
- 2020-05-26
- Revision:
- 30:08cc4ec58d07
- Parent:
- 29:207111ffd6e6
- Child:
- 31:cfdb014ff086
File content as of revision 30:08cc4ec58d07:
#include "mbed.h"
#include "Front.h"
//Objects-----------------------------------------------------------------------
Sound sound;
Envelope envelope;
Filter filter;
//Sprites-----------------------------------------------------------------------
const int fader[35][5] = { //Fader Sprite
{ 1,1,1,1,1 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 0,0,1,0,0 },
{ 1,1,1,1,1 },
};
const int sin_wav[6][28] = {//sub 1 sin sprite
{ 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0 },
{ 0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0 },
{ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0 },
{ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 },
{ 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
};
const int tri_wav[6][28] = {//sub 2 tri sprite
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
{ 0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0 },
{ 0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0 },
{ 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0 },
{ 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1 },
{ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 },
};
const int square_wav[6][28] = {//sub 3 sqr sprite
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1 },
{ 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 },
{ 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 },
{ 0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
};
const int Low_pass[19][29]= {//LPF plot
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0 },
};
const int High_pass[19][29]= {//HPF plot
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
};
const int Band_pass[19][29]= {//BPF plot
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
{ 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0 },
{ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 },
{ 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0 },
{ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
{ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
{ 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
{ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
{ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 },
};
//Gloabal Variables
volatile int g_isr_flag; //used for sound generation
volatile extern int silent_flag; //used for note release
//constructor/destructor
Front::Front()
{
}
Front::~Front()
{
}
//PUBLIC------------------------------------------------------------------------
void Front::frontrun(N5110 &lcd, Gamepad &pad, int submenu)
{
frontsetup(lcd, pad, submenu,0, true); //Initialises front pannel display
frequency=frequency_convert(pad,oct); //collects initial frequency
release_flag=silent_flag=0; //Flags setup
used=menuflag=1; //initialises vairables
filter_type=envelope_in=0;
a=d=s=r=17; //starting adsr values (1->35)
noteon=false;
oct=3; //starting octave
#ifdef CSV
itterator=0; //sets itterator for CSV OUTPUT
#endif
while (menuflag==1) {
#ifdef SLOW_TIME
print_SLOWTIME_out(out,noteon,a,d,s,r,release_flag,silent_flag); //debug terminal print function
#endif
if (noteon==true && g_isr_flag == 1) { //isr triggered and note on
pad.write_u16(out);
envelope_in=(sound.sound_main(false,submenu,frequency)-32767); //int around 0
envelope_in=filter.filter_run(envelope_in,filter_type,false);
if (release_flag==0) {
out=(envelope.env_in(a,d,s,r,envelope_in,false));//Uint around 32767
} else {
out=envelope.release(s,r,envelope_in,false);
if (silent_flag==1) {
release_flag=0;
silent_flag=0;
noteon=false;
out=envelope.env_in(a,d,s,r,out,true);
out=0;
}
}
g_isr_flag=0;
#ifdef CSV
printf("%d,%d\n",itterator,out);
itterator++;
#endif
}
dir=pad.get_direction();
if (dir!=dir_1) {
//printf("dir =%d\n",dir); //debug
if(dir==3) {
used++;
if (used>5) {
used=5;
}
}
if (dir==7) {
used--;
if(used<1) {
used=1;
}
}
if (dir==1) {
if (used==1) {
a=incrament_adsr(used,a,1);
}
if (used==2) {
d=incrament_adsr(used,d,1);
}
if (used==3) {
s=incrament_adsr(used,s,1);
}
if (used==4) {
r=incrament_adsr(used,r,1);
}
if (used==5) {
filter_type=incrament_adsr(used,filter_type,-1);
printf("FILTER_TYPE=%d\n",filter_type);
}
}
if (dir==5) {
if (used==1) {
a=incrament_adsr(used,a,-1);
}
if (used==2) {
d=incrament_adsr(used,d,-1);
}
if (used==3) {
s=incrament_adsr(used,s,-1);
}
if (used==4) {
r=incrament_adsr(used,r,-1);
}
if (used==5) {
filter_type=incrament_adsr(used,filter_type,1);
printf("FILTER_TYPE=%d\n",filter_type);
}
}
frontsetup(lcd,pad,submenu,filter_type,false);
printsliders(lcd,a,d,s,r,used);
wait_ms(80);
} //END if DIR
if ( pad.A_pressed()) { //NOTE ON
printf("NOTE_ON\n");
noteon=true;
out=envelope.env_in(a,d,s,r,out,true);
frequency=frequency_convert(pad,oct);
}
if ( pad.B_pressed()) { //NOTE OFF
//printf("NOTE_OFF (W.release)\n");
release_flag=1;
envelope_in=envelope.release(s,r,envelope_in,true);
pad.reset_buttons();
}
if ( pad.X_pressed()) {
oct--;
if (oct<0) {oct++;}
printf("OCTAVE %d\n",oct);
pad.reset_buttons();
}
if ( pad.Y_pressed()) {
oct++;
if (oct>5) {oct--;}
printf("OCTAVE %d\n",oct);
pad.reset_buttons();
}
if (pad.start_pressed()) { //go back menu
// printf("start pressed\n");
printf("Waveforms Sub selected\n"); //debug
noteon=false;
menuflag=0; //sets flag
break;
}
dir=dir_1;
sleep(); //puts sleep until ISR wakes up
}
}
//PRIVATE-----------------------------------------------------------------------
void Front::frontsetup(N5110 &lcd, Gamepad &pad, int submenu, int filter_type, bool initial)
{
if (initial==true) {
printsliders(lcd,17,17,17,17,1);
initialise(pad,lcd,submenu);
}
lcd.clear();
lcd.printString("A D S R",3,5);
printfader(lcd,3,3);
printfader(lcd,15,3);
printfader(lcd,27,3);
printfader(lcd,39,3);
lcd.drawRect(50,3,30,8,FILL_TRANSPARENT);
printwav(lcd,submenu);
printfilter(lcd, filter_type);
lcd.refresh();
}
void Front::initialise(Gamepad &pad, N5110 &lcd, int submenu)
{
out=sound.sound_main(true,submenu,440); //initialises external variables
out = filter.filter_run(out,1,true); //initialises LPF Filter
out = filter.filter_run(out,2,true); //initialises LPF Filter
out = filter.filter_run(out,3,true); //initialises LPF Filter
out=envelope.env_in(17,17,17,17,out,true);
out=envelope.release(17,17,out,true);
printsliders(lcd,17,17,17,17,1); //prints initialsliders
pad.reset_buttons();
}
void Front::printsliders(N5110 &lcd, int a, int d, int s, int r, int used)
{
if(used==0) {
printslider(lcd,3,a,false);
printslider(lcd,15,d,false);
printslider(lcd,27,s,false);
printslider(lcd,39,r,false);
}
if(used==1) {
printslider(lcd,3,a,true);
printslider(lcd,15,d,false);
printslider(lcd,27,s,false);
printslider(lcd,39,r,false);
}
if(used==2) {
printslider(lcd,3,a,false);
printslider(lcd,15,d,true);
printslider(lcd,27,s,false);
printslider(lcd,39,r,false);
}
if(used==3) {
printslider(lcd,3,a,false);
printslider(lcd,15,d,false);
printslider(lcd,27,s,true);
printslider(lcd,39,r,false);
}
if(used==4) {
printslider(lcd,3,a,false);
printslider(lcd,15,d,false);
printslider(lcd,27,s,false);
printslider(lcd,39,r,true);
}
if(used>=5) {
printslider(lcd,3,a,false);
printslider(lcd,15,d,false);
printslider(lcd,27,s,false);
printslider(lcd,39,r,false);
}
lcd.refresh();
}
void Front::printslider(N5110 &lcd, int x_val, int y_val, bool use)
{
if (use==true) {
lcd.drawRect(x_val,37-y_val,5,2,FILL_BLACK);
}
if (use==false) {
lcd.drawRect(x_val,37-y_val,5,1,FILL_BLACK);
}
}
void Front::printfader(N5110 &lcd, int x, int y)
{
// x origin, y origin, rows, cols, sprite
lcd.drawSprite(x,y,35,5,(int *)fader);
}
void Front::printwav(N5110 &lcd, int submenu)
{
if (submenu==1) {
// x origin, y origin, rows, cols, sprite
lcd.drawSprite(51,4,6,28,(int *)sin_wav);
}
if (submenu==2) {
// x origin, y origin, rows, cols, sprite
lcd.drawSprite(51,4,6,28,(int *)tri_wav);
}
if (submenu==3) {
// x origin, y origin, rows, cols, sprite
lcd.drawSprite(51,4,6,28,(int *)square_wav);
}
}
void Front::printfilter(N5110 &lcd, int filter_type)
{
if (filter_type>=1) {
lcd.drawLine(51,32,51,12,1); //y axis
lcd.drawLine(51,32,81,32,1); //x axis
if (filter_type==1) {
lcd.drawSprite(52,13,19,29,(int *)Low_pass);
lcd.printString("L",45,2);
}
if (filter_type==2) {
lcd.drawSprite(52,13,19,29,(int *)High_pass);
lcd.printString("H",45,2);
}
if (filter_type==3) {
lcd.drawSprite(52,13,19,29,(int *)Band_pass);
lcd.printString("B",45,2);
}
}
}
int Front::parameter_manager(Gamepad &pad, int dir, int a, int d, int s, int r)
{
return(used);
}
int Front::incrament_adsr(int used, int adsr, int ud)
{
if (used<=4) {
if (ud==1) {
adsr++;
if (adsr>35) {
adsr--;
}
}
if (ud==-1) {
adsr--;
if (adsr<1) {
adsr++;
}
}
}
if (used==5) {
adsr=incrament_filter(adsr,ud);
}
return(adsr);
}
int Front::incrament_filter(int adsr, int ud)
{
if (ud==1) {
adsr++;
if (adsr>3) {
adsr--;
}
}
if (ud==-1) {
adsr--;
if (adsr<0) {
adsr++;
}
}
return(adsr);
}
int Front::frequency_convert(Gamepad &pad,int oct)
{
frequency=55*(pow(2.0,oct));
frequency=(frequency+(pad.read_pot1()*frequency));
return(frequency);
}
#ifdef SLOW_TIME
void Front::print_SLOWTIME_out (uint16_t out, bool noteon, int a, int d, int s, int r, int release_flag, int silent_flag)
{
//Prints all data required in SLOW_TIME
printf("OUTPUT:%d\n",out);
printf("NOTEON: %d\n",noteon);
printf("A:%d,D:%d,S:%d,R:%d\n",a,d,s,r);
printf("RelFlag=%d, SilFlag=%d\n\n",release_flag,silent_flag);
}
#endif