Guitar Effector using "mbed application board".

Dependencies:   C12832 mbed

Guitar Effector using "mbed application board".

/media/uploads/vaifreak/dscn0187.jpg

/media/uploads/vaifreak/schematic_00.jpg

/media/uploads/vaifreak/schematic_01.jpg

/media/uploads/vaifreak/schematic_02.jpg

Committer:
vaifreak
Date:
Fri Sep 04 16:50:36 2015 +0000
Revision:
2:25adc1277b3e
Child:
3:1666e2d5bd46
mbed effector, version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vaifreak 2:25adc1277b3e 1 //=============================================================================
vaifreak 2:25adc1277b3e 2 // @author vaifreak
vaifreak 2:25adc1277b3e 3 // @brief menu display & effect parameter Control.
vaifreak 2:25adc1277b3e 4 //=============================================================================
vaifreak 2:25adc1277b3e 5 #pragma once
vaifreak 2:25adc1277b3e 6
vaifreak 2:25adc1277b3e 7 #include "Filter.h"
vaifreak 2:25adc1277b3e 8 #include "Drive.h"
vaifreak 2:25adc1277b3e 9 #include "Delay.h"
vaifreak 2:25adc1277b3e 10 #include "MyInputUtil.h"
vaifreak 2:25adc1277b3e 11
vaifreak 2:25adc1277b3e 12 //---------------------------------------------
vaifreak 2:25adc1277b3e 13 //
vaifreak 2:25adc1277b3e 14 //---------------------------------------------
vaifreak 2:25adc1277b3e 15 class Menu
vaifreak 2:25adc1277b3e 16 {
vaifreak 2:25adc1277b3e 17 public:
vaifreak 2:25adc1277b3e 18 float masterVolume;
vaifreak 2:25adc1277b3e 19
vaifreak 2:25adc1277b3e 20 private:
vaifreak 2:25adc1277b3e 21 //function type.
vaifreak 2:25adc1277b3e 22 enum {
vaifreak 2:25adc1277b3e 23 FILTER_PRE,
vaifreak 2:25adc1277b3e 24 DRIVE,
vaifreak 2:25adc1277b3e 25 FILTER_POST,
vaifreak 2:25adc1277b3e 26 DELAY,
vaifreak 2:25adc1277b3e 27 MASTER,
vaifreak 2:25adc1277b3e 28
vaifreak 2:25adc1277b3e 29 FUNCTION_MAX
vaifreak 2:25adc1277b3e 30 };
vaifreak 2:25adc1277b3e 31
vaifreak 2:25adc1277b3e 32 //param for filter pre
vaifreak 2:25adc1277b3e 33 int filter_pre_type;
vaifreak 2:25adc1277b3e 34 float filter_pre_freq;
vaifreak 2:25adc1277b3e 35 float filter_pre_Q;
vaifreak 2:25adc1277b3e 36
vaifreak 2:25adc1277b3e 37 //param for filter post
vaifreak 2:25adc1277b3e 38 int filter_post_type;
vaifreak 2:25adc1277b3e 39 float filter_post_freq;
vaifreak 2:25adc1277b3e 40 float filter_post_Q;
vaifreak 2:25adc1277b3e 41
vaifreak 2:25adc1277b3e 42 //param for Drive
vaifreak 2:25adc1277b3e 43 float drive_gain;
vaifreak 2:25adc1277b3e 44 float drive_volume;
vaifreak 2:25adc1277b3e 45
vaifreak 2:25adc1277b3e 46 //param for delay
vaifreak 2:25adc1277b3e 47 float delay_time;
vaifreak 2:25adc1277b3e 48 float delay_feedback;
vaifreak 2:25adc1277b3e 49 float delay_mix;
vaifreak 2:25adc1277b3e 50
vaifreak 2:25adc1277b3e 51 float sample_rate;
vaifreak 2:25adc1277b3e 52
vaifreak 2:25adc1277b3e 53 bool isOn[FUNCTION_MAX];
vaifreak 2:25adc1277b3e 54
vaifreak 2:25adc1277b3e 55 bool dirtyFlag;
vaifreak 2:25adc1277b3e 56 void SetDirty(){ dirtyFlag = true; }
vaifreak 2:25adc1277b3e 57 bool GetDirty(){ return dirtyFlag; }
vaifreak 2:25adc1277b3e 58 void ClearDirty(){ dirtyFlag = false; }
vaifreak 2:25adc1277b3e 59
vaifreak 2:25adc1277b3e 60 C12832 *lcd;
vaifreak 2:25adc1277b3e 61 MyVolume *pot1;
vaifreak 2:25adc1277b3e 62 MyVolume *pot2;
vaifreak 2:25adc1277b3e 63 MyButton *stick_U;
vaifreak 2:25adc1277b3e 64 MyButton *stick_D;
vaifreak 2:25adc1277b3e 65 MyButton *stick_L;
vaifreak 2:25adc1277b3e 66 MyButton *stick_R;
vaifreak 2:25adc1277b3e 67 MyButton *stick_C;
vaifreak 2:25adc1277b3e 68
vaifreak 2:25adc1277b3e 69 Filter *filter_pre;
vaifreak 2:25adc1277b3e 70 Filter *filter_post;
vaifreak 2:25adc1277b3e 71 Drive *drive;
vaifreak 2:25adc1277b3e 72 Delay *delay;
vaifreak 2:25adc1277b3e 73
vaifreak 2:25adc1277b3e 74 int current_function;
vaifreak 2:25adc1277b3e 75
vaifreak 2:25adc1277b3e 76 public:
vaifreak 2:25adc1277b3e 77 //-----------------------------------------
vaifreak 2:25adc1277b3e 78 //
vaifreak 2:25adc1277b3e 79 //-----------------------------------------
vaifreak 2:25adc1277b3e 80 Menu()
vaifreak 2:25adc1277b3e 81 {
vaifreak 2:25adc1277b3e 82 lcd = new C12832(p5, p7, p6, p8, p11);
vaifreak 2:25adc1277b3e 83 pot1 = new MyVolume(p19);
vaifreak 2:25adc1277b3e 84 pot2 = new MyVolume(p20);
vaifreak 2:25adc1277b3e 85 stick_U = new MyButton(p15);
vaifreak 2:25adc1277b3e 86 stick_D = new MyButton(p12);
vaifreak 2:25adc1277b3e 87 stick_L = new MyButton(p13);
vaifreak 2:25adc1277b3e 88 stick_R = new MyButton(p16);
vaifreak 2:25adc1277b3e 89 stick_C = new MyButton(p14);
vaifreak 2:25adc1277b3e 90
vaifreak 2:25adc1277b3e 91 printf("Menu constructed.\n");
vaifreak 2:25adc1277b3e 92 }
vaifreak 2:25adc1277b3e 93
vaifreak 2:25adc1277b3e 94 //-----------------------------------------
vaifreak 2:25adc1277b3e 95 //
vaifreak 2:25adc1277b3e 96 //-----------------------------------------
vaifreak 2:25adc1277b3e 97 void Init(
vaifreak 2:25adc1277b3e 98 float sample_rate_,
vaifreak 2:25adc1277b3e 99 Filter *filter_pre_,
vaifreak 2:25adc1277b3e 100 Filter *filter_post_,
vaifreak 2:25adc1277b3e 101 Drive *drive_,
vaifreak 2:25adc1277b3e 102 Delay *delay_ )
vaifreak 2:25adc1277b3e 103 {
vaifreak 2:25adc1277b3e 104 sample_rate = sample_rate_;
vaifreak 2:25adc1277b3e 105
vaifreak 2:25adc1277b3e 106 filter_pre = filter_pre_;
vaifreak 2:25adc1277b3e 107 filter_post = filter_post_;
vaifreak 2:25adc1277b3e 108 drive = drive_;
vaifreak 2:25adc1277b3e 109 delay = delay_;
vaifreak 2:25adc1277b3e 110
vaifreak 2:25adc1277b3e 111 for(int i=0; i<FUNCTION_MAX; i++){
vaifreak 2:25adc1277b3e 112 isOn[i] = true;
vaifreak 2:25adc1277b3e 113 }
vaifreak 2:25adc1277b3e 114
vaifreak 2:25adc1277b3e 115 current_function = 0;
vaifreak 2:25adc1277b3e 116
vaifreak 2:25adc1277b3e 117 filter_pre_type = filter_pre->type;
vaifreak 2:25adc1277b3e 118 filter_pre_freq = 3000.0f;
vaifreak 2:25adc1277b3e 119 filter_pre_Q = 0.5f;
vaifreak 2:25adc1277b3e 120 UpdateFilterPreParam();
vaifreak 2:25adc1277b3e 121
vaifreak 2:25adc1277b3e 122 filter_post_type = filter_post->type;
vaifreak 2:25adc1277b3e 123 filter_post_freq = 3000.0f;
vaifreak 2:25adc1277b3e 124 filter_post_Q = 0.5f;
vaifreak 2:25adc1277b3e 125 UpdateFilterPostParam();
vaifreak 2:25adc1277b3e 126
vaifreak 2:25adc1277b3e 127 drive_gain = 20.0f;
vaifreak 2:25adc1277b3e 128 drive_volume = 0.5f;
vaifreak 2:25adc1277b3e 129 UpdateDriveParam();
vaifreak 2:25adc1277b3e 130
vaifreak 2:25adc1277b3e 131 delay_time = 0.8f;
vaifreak 2:25adc1277b3e 132 delay_feedback = 0.5f;
vaifreak 2:25adc1277b3e 133 delay_mix = 0.8f;
vaifreak 2:25adc1277b3e 134 UpdateDelayParam();
vaifreak 2:25adc1277b3e 135
vaifreak 2:25adc1277b3e 136 masterVolume = 0.5f;
vaifreak 2:25adc1277b3e 137
vaifreak 2:25adc1277b3e 138 UpdateDisplay();
vaifreak 2:25adc1277b3e 139 }
vaifreak 2:25adc1277b3e 140
vaifreak 2:25adc1277b3e 141 //-----------------------------------------
vaifreak 2:25adc1277b3e 142 //
vaifreak 2:25adc1277b3e 143 //-----------------------------------------
vaifreak 2:25adc1277b3e 144 void Update()
vaifreak 2:25adc1277b3e 145 {
vaifreak 2:25adc1277b3e 146 pot1->Update();
vaifreak 2:25adc1277b3e 147 pot2->Update();
vaifreak 2:25adc1277b3e 148 stick_U->Update();
vaifreak 2:25adc1277b3e 149 stick_D->Update();
vaifreak 2:25adc1277b3e 150 stick_L->Update();
vaifreak 2:25adc1277b3e 151 stick_R->Update();
vaifreak 2:25adc1277b3e 152 stick_C->Update();
vaifreak 2:25adc1277b3e 153
vaifreak 2:25adc1277b3e 154 //---- select function
vaifreak 2:25adc1277b3e 155 if( stick_U->trig_on ){
vaifreak 2:25adc1277b3e 156 current_function --;
vaifreak 2:25adc1277b3e 157 if(current_function < 0) current_function = FUNCTION_MAX - 1;
vaifreak 2:25adc1277b3e 158 SetDirty();
vaifreak 2:25adc1277b3e 159 }
vaifreak 2:25adc1277b3e 160 if( stick_D->trig_on ){
vaifreak 2:25adc1277b3e 161 current_function ++;
vaifreak 2:25adc1277b3e 162 if(current_function >= FUNCTION_MAX) current_function = 0;
vaifreak 2:25adc1277b3e 163 SetDirty();
vaifreak 2:25adc1277b3e 164 }
vaifreak 2:25adc1277b3e 165
vaifreak 2:25adc1277b3e 166 //---- effect ON/OFF
vaifreak 2:25adc1277b3e 167 if( stick_C->trig_on ){
vaifreak 2:25adc1277b3e 168 isOn[ current_function ] = !isOn[ current_function ];
vaifreak 2:25adc1277b3e 169 SetDirty();
vaifreak 2:25adc1277b3e 170 }
vaifreak 2:25adc1277b3e 171
vaifreak 2:25adc1277b3e 172 UpdateParameter();
vaifreak 2:25adc1277b3e 173
vaifreak 2:25adc1277b3e 174 // update display.
vaifreak 2:25adc1277b3e 175 if( GetDirty() )
vaifreak 2:25adc1277b3e 176 {
vaifreak 2:25adc1277b3e 177 UpdateDisplay();
vaifreak 2:25adc1277b3e 178 ClearDirty();
vaifreak 2:25adc1277b3e 179 }
vaifreak 2:25adc1277b3e 180 }
vaifreak 2:25adc1277b3e 181
vaifreak 2:25adc1277b3e 182 private:
vaifreak 2:25adc1277b3e 183 //-----------------------------------------
vaifreak 2:25adc1277b3e 184 //
vaifreak 2:25adc1277b3e 185 //-----------------------------------------
vaifreak 2:25adc1277b3e 186 void UpdateDisplay()
vaifreak 2:25adc1277b3e 187 {
vaifreak 2:25adc1277b3e 188 lcd->cls();
vaifreak 2:25adc1277b3e 189 lcd->locate(0,0);
vaifreak 2:25adc1277b3e 190
vaifreak 2:25adc1277b3e 191 switch( current_function )
vaifreak 2:25adc1277b3e 192 {
vaifreak 2:25adc1277b3e 193 case FILTER_PRE:
vaifreak 2:25adc1277b3e 194 lcd->printf("FilterPre : %s", (isOn[FILTER_PRE]?"ON ":"off") );
vaifreak 2:25adc1277b3e 195 lcd->locate(0,10);
vaifreak 2:25adc1277b3e 196 lcd->printf("Freq.:%.0f Q:%.2f ", filter_pre_freq, filter_pre_Q );
vaifreak 2:25adc1277b3e 197 break;
vaifreak 2:25adc1277b3e 198
vaifreak 2:25adc1277b3e 199 case DRIVE:
vaifreak 2:25adc1277b3e 200 lcd->printf("Drive : %s", (isOn[DRIVE]?"ON ":"off") );
vaifreak 2:25adc1277b3e 201 lcd->locate(0,10);
vaifreak 2:25adc1277b3e 202 lcd->printf("Gain:%.2f Vol.:%.2f ", drive_gain, drive_volume );
vaifreak 2:25adc1277b3e 203 break;
vaifreak 2:25adc1277b3e 204
vaifreak 2:25adc1277b3e 205 case FILTER_POST:
vaifreak 2:25adc1277b3e 206 lcd->printf("FilterPost: %s", (isOn[FILTER_POST]?"ON ":"off") );
vaifreak 2:25adc1277b3e 207 lcd->locate(0,10);
vaifreak 2:25adc1277b3e 208 lcd->printf("Freq.:%.2f Q:%.2f ", filter_post_freq, filter_post_Q );
vaifreak 2:25adc1277b3e 209 break;
vaifreak 2:25adc1277b3e 210
vaifreak 2:25adc1277b3e 211 case DELAY:
vaifreak 2:25adc1277b3e 212 lcd->printf("Delay : %s", (isOn[DELAY]?"ON ":"off") );
vaifreak 2:25adc1277b3e 213 lcd->locate(0,10);
vaifreak 2:25adc1277b3e 214 lcd->printf("Time:%4dmsec Mix:%.2f ", delay->GetDelayTimeInMSec(sample_rate), delay_mix);
vaifreak 2:25adc1277b3e 215 break;
vaifreak 2:25adc1277b3e 216
vaifreak 2:25adc1277b3e 217 case MASTER:
vaifreak 2:25adc1277b3e 218 lcd->locate(0,10);
vaifreak 2:25adc1277b3e 219 lcd->printf("MasterVol.: %.2f", masterVolume );
vaifreak 2:25adc1277b3e 220 break;
vaifreak 2:25adc1277b3e 221 }
vaifreak 2:25adc1277b3e 222
vaifreak 2:25adc1277b3e 223 }
vaifreak 2:25adc1277b3e 224
vaifreak 2:25adc1277b3e 225 //-----------------------------------------
vaifreak 2:25adc1277b3e 226 //
vaifreak 2:25adc1277b3e 227 //-----------------------------------------
vaifreak 2:25adc1277b3e 228 void UpdateParameter()
vaifreak 2:25adc1277b3e 229 {
vaifreak 2:25adc1277b3e 230 switch( current_function )
vaifreak 2:25adc1277b3e 231 {
vaifreak 2:25adc1277b3e 232 case FILTER_PRE:
vaifreak 2:25adc1277b3e 233 {
vaifreak 2:25adc1277b3e 234 if( pot1->dirtyFlag ) {
vaifreak 2:25adc1277b3e 235 filter_pre_freq = RateToParam( 2000.0f, 6000.0f, pot1->val );
vaifreak 2:25adc1277b3e 236 SetDirty();
vaifreak 2:25adc1277b3e 237 }
vaifreak 2:25adc1277b3e 238 if( pot2->dirtyFlag ) {
vaifreak 2:25adc1277b3e 239 filter_pre_Q = RateToParam( 0.3f, 2.0f, pot2->val );
vaifreak 2:25adc1277b3e 240 SetDirty();
vaifreak 2:25adc1277b3e 241 }
vaifreak 2:25adc1277b3e 242 if( GetDirty() ){
vaifreak 2:25adc1277b3e 243 UpdateFilterPreParam();
vaifreak 2:25adc1277b3e 244 }
vaifreak 2:25adc1277b3e 245 }
vaifreak 2:25adc1277b3e 246 break;
vaifreak 2:25adc1277b3e 247
vaifreak 2:25adc1277b3e 248 case DRIVE:
vaifreak 2:25adc1277b3e 249 {
vaifreak 2:25adc1277b3e 250 if( pot1->dirtyFlag ) {
vaifreak 2:25adc1277b3e 251 drive_gain = pot1->val * 20.0f;
vaifreak 2:25adc1277b3e 252 SetDirty();
vaifreak 2:25adc1277b3e 253 }
vaifreak 2:25adc1277b3e 254 if( pot2->dirtyFlag ) {
vaifreak 2:25adc1277b3e 255 drive_volume = pot2->val * 2.0f;
vaifreak 2:25adc1277b3e 256 SetDirty();
vaifreak 2:25adc1277b3e 257 }
vaifreak 2:25adc1277b3e 258 if( GetDirty() ){
vaifreak 2:25adc1277b3e 259 UpdateDriveParam();
vaifreak 2:25adc1277b3e 260 }
vaifreak 2:25adc1277b3e 261 }
vaifreak 2:25adc1277b3e 262 break;
vaifreak 2:25adc1277b3e 263
vaifreak 2:25adc1277b3e 264 case FILTER_POST:
vaifreak 2:25adc1277b3e 265 {
vaifreak 2:25adc1277b3e 266 if( pot1->dirtyFlag ) {
vaifreak 2:25adc1277b3e 267 filter_post_freq = RateToParam( 2000.0f, 6000.0f, pot1->val );
vaifreak 2:25adc1277b3e 268 SetDirty();
vaifreak 2:25adc1277b3e 269 }
vaifreak 2:25adc1277b3e 270 if( pot2->dirtyFlag ) {
vaifreak 2:25adc1277b3e 271 filter_post_Q = RateToParam( 0.3f, 2.0f, pot2->val );
vaifreak 2:25adc1277b3e 272 SetDirty();
vaifreak 2:25adc1277b3e 273 }
vaifreak 2:25adc1277b3e 274 if( GetDirty() ){
vaifreak 2:25adc1277b3e 275 UpdateFilterPostParam();
vaifreak 2:25adc1277b3e 276 }
vaifreak 2:25adc1277b3e 277 }
vaifreak 2:25adc1277b3e 278 break;
vaifreak 2:25adc1277b3e 279
vaifreak 2:25adc1277b3e 280 case DELAY:
vaifreak 2:25adc1277b3e 281 {
vaifreak 2:25adc1277b3e 282 if( pot1->dirtyFlag ) {
vaifreak 2:25adc1277b3e 283 delay_time = pot1->val;
vaifreak 2:25adc1277b3e 284 SetDirty();
vaifreak 2:25adc1277b3e 285 }
vaifreak 2:25adc1277b3e 286 if( pot2->dirtyFlag ) {
vaifreak 2:25adc1277b3e 287 delay_mix = pot2->val;
vaifreak 2:25adc1277b3e 288 SetDirty();
vaifreak 2:25adc1277b3e 289 }
vaifreak 2:25adc1277b3e 290 if( GetDirty() ){
vaifreak 2:25adc1277b3e 291 UpdateDelayParam();
vaifreak 2:25adc1277b3e 292 }
vaifreak 2:25adc1277b3e 293 }
vaifreak 2:25adc1277b3e 294 break;
vaifreak 2:25adc1277b3e 295
vaifreak 2:25adc1277b3e 296 case MASTER:
vaifreak 2:25adc1277b3e 297 if( pot1->dirtyFlag )
vaifreak 2:25adc1277b3e 298 {
vaifreak 2:25adc1277b3e 299 masterVolume = pot1->val;
vaifreak 2:25adc1277b3e 300 SetDirty();
vaifreak 2:25adc1277b3e 301 }
vaifreak 2:25adc1277b3e 302 break;
vaifreak 2:25adc1277b3e 303 }
vaifreak 2:25adc1277b3e 304 }
vaifreak 2:25adc1277b3e 305
vaifreak 2:25adc1277b3e 306 //-----------------------------------------
vaifreak 2:25adc1277b3e 307 //
vaifreak 2:25adc1277b3e 308 //-----------------------------------------
vaifreak 2:25adc1277b3e 309 void UpdateFilterPreParam()
vaifreak 2:25adc1277b3e 310 {
vaifreak 2:25adc1277b3e 311 filter_pre->isBypass = !isOn[FILTER_PRE];
vaifreak 2:25adc1277b3e 312 filter_pre->set_LPF( sample_rate, filter_pre_freq, filter_pre_Q );
vaifreak 2:25adc1277b3e 313 }
vaifreak 2:25adc1277b3e 314
vaifreak 2:25adc1277b3e 315 //-----------------------------------------
vaifreak 2:25adc1277b3e 316 //
vaifreak 2:25adc1277b3e 317 //-----------------------------------------
vaifreak 2:25adc1277b3e 318 void UpdateFilterPostParam()
vaifreak 2:25adc1277b3e 319 {
vaifreak 2:25adc1277b3e 320 filter_post->isBypass = !isOn[FILTER_POST];
vaifreak 2:25adc1277b3e 321 filter_post->set_LPF( sample_rate, filter_post_freq, filter_post_Q );
vaifreak 2:25adc1277b3e 322 }
vaifreak 2:25adc1277b3e 323
vaifreak 2:25adc1277b3e 324 //-----------------------------------------
vaifreak 2:25adc1277b3e 325 //
vaifreak 2:25adc1277b3e 326 //-----------------------------------------
vaifreak 2:25adc1277b3e 327 void UpdateDriveParam()
vaifreak 2:25adc1277b3e 328 {
vaifreak 2:25adc1277b3e 329 drive->isBypass = !isOn[DRIVE];
vaifreak 2:25adc1277b3e 330 drive->gain = drive_gain;
vaifreak 2:25adc1277b3e 331 drive->vol = drive_volume;
vaifreak 2:25adc1277b3e 332 }
vaifreak 2:25adc1277b3e 333
vaifreak 2:25adc1277b3e 334 //-----------------------------------------
vaifreak 2:25adc1277b3e 335 //
vaifreak 2:25adc1277b3e 336 //-----------------------------------------
vaifreak 2:25adc1277b3e 337 void UpdateDelayParam()
vaifreak 2:25adc1277b3e 338 {
vaifreak 2:25adc1277b3e 339 delay->isBypass = !isOn[DELAY];
vaifreak 2:25adc1277b3e 340 delay->delay_time = delay_time;
vaifreak 2:25adc1277b3e 341 delay->feedback = delay_feedback;
vaifreak 2:25adc1277b3e 342 delay->effect_level = delay_mix;
vaifreak 2:25adc1277b3e 343 }
vaifreak 2:25adc1277b3e 344
vaifreak 2:25adc1277b3e 345 //-----------------------------------------
vaifreak 2:25adc1277b3e 346 //
vaifreak 2:25adc1277b3e 347 //-----------------------------------------
vaifreak 2:25adc1277b3e 348 float RateToParam( float min, float max, float rate )
vaifreak 2:25adc1277b3e 349 {
vaifreak 2:25adc1277b3e 350 return (max - min) * rate + min;
vaifreak 2:25adc1277b3e 351 }
vaifreak 2:25adc1277b3e 352 };
vaifreak 2:25adc1277b3e 353