
Guitar Effector using "mbed application board".
Guitar Effector using "mbed application board".
main.cpp@2:25adc1277b3e, 2015-09-04 (annotated)
- Committer:
- vaifreak
- Date:
- Fri Sep 04 16:50:36 2015 +0000
- Revision:
- 2:25adc1277b3e
- Parent:
- 1:bfbfd6fede05
- Child:
- 3:1666e2d5bd46
mbed effector, version 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vaifreak | 1:bfbfd6fede05 | 1 | //============================================================================= |
vaifreak | 1:bfbfd6fede05 | 2 | // @author vaifreak |
vaifreak | 2:25adc1277b3e | 3 | // @brief Guitar Effector for "mbed application board" |
vaifreak | 2:25adc1277b3e | 4 | // https://developer.mbed.org/cookbook/mbed-application-board |
vaifreak | 1:bfbfd6fede05 | 5 | //============================================================================= |
vaifreak | 0:6b260c0931c5 | 6 | #include "mbed.h" |
vaifreak | 0:6b260c0931c5 | 7 | #include "C12832.h" |
vaifreak | 2:25adc1277b3e | 8 | #include <new> |
vaifreak | 2:25adc1277b3e | 9 | #include <list> |
vaifreak | 2:25adc1277b3e | 10 | |
vaifreak | 2:25adc1277b3e | 11 | #include "MyInputUtil.h" |
vaifreak | 2:25adc1277b3e | 12 | #include "Menu.h" |
vaifreak | 2:25adc1277b3e | 13 | #include "LevelMeter.h" |
vaifreak | 0:6b260c0931c5 | 14 | |
vaifreak | 1:bfbfd6fede05 | 15 | #include "Filter.h" |
vaifreak | 1:bfbfd6fede05 | 16 | #include "Drive.h" |
vaifreak | 1:bfbfd6fede05 | 17 | #include "Delay.h" |
vaifreak | 0:6b260c0931c5 | 18 | |
vaifreak | 2:25adc1277b3e | 19 | |
vaifreak | 2:25adc1277b3e | 20 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 21 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 22 | AnalogOut a_out(p18); |
vaifreak | 1:bfbfd6fede05 | 23 | AnalogIn a_in(p17); |
vaifreak | 0:6b260c0931c5 | 24 | |
vaifreak | 2:25adc1277b3e | 25 | Filter *filter_pre; |
vaifreak | 2:25adc1277b3e | 26 | Filter *filter_post; |
vaifreak | 1:bfbfd6fede05 | 27 | Drive *drive; |
vaifreak | 1:bfbfd6fede05 | 28 | Delay *delay; |
vaifreak | 1:bfbfd6fede05 | 29 | |
vaifreak | 2:25adc1277b3e | 30 | list<EffectUnitBase*> g_EffectList; |
vaifreak | 2:25adc1277b3e | 31 | |
vaifreak | 2:25adc1277b3e | 32 | Menu menu; |
vaifreak | 2:25adc1277b3e | 33 | LevelMeter level_meter; |
vaifreak | 2:25adc1277b3e | 34 | |
vaifreak | 2:25adc1277b3e | 35 | Ticker menu_ticker; |
vaifreak | 2:25adc1277b3e | 36 | Ticker process_ticker; |
vaifreak | 2:25adc1277b3e | 37 | |
vaifreak | 2:25adc1277b3e | 38 | float g_sample_rate = 22050.0f; |
vaifreak | 2:25adc1277b3e | 39 | |
vaifreak | 2:25adc1277b3e | 40 | |
vaifreak | 2:25adc1277b3e | 41 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 42 | // Forward declaration |
vaifreak | 2:25adc1277b3e | 43 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 44 | void process(); |
vaifreak | 2:25adc1277b3e | 45 | void update_display(); |
vaifreak | 2:25adc1277b3e | 46 | |
vaifreak | 2:25adc1277b3e | 47 | |
vaifreak | 2:25adc1277b3e | 48 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 49 | extern "C" |
vaifreak | 2:25adc1277b3e | 50 | void HardFault_Handler() { |
vaifreak | 2:25adc1277b3e | 51 | printf("Hard Fault!\r\n"); |
vaifreak | 2:25adc1277b3e | 52 | while(1); |
vaifreak | 2:25adc1277b3e | 53 | } |
vaifreak | 2:25adc1277b3e | 54 | |
vaifreak | 2:25adc1277b3e | 55 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 56 | void no_memory () { |
vaifreak | 2:25adc1277b3e | 57 | printf("panic: can't allocate to memory!\r\n"); |
vaifreak | 2:25adc1277b3e | 58 | exit(-1); |
vaifreak | 2:25adc1277b3e | 59 | } |
vaifreak | 1:bfbfd6fede05 | 60 | |
vaifreak | 1:bfbfd6fede05 | 61 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 62 | // |
vaifreak | 1:bfbfd6fede05 | 63 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 64 | int main() |
vaifreak | 0:6b260c0931c5 | 65 | { |
vaifreak | 2:25adc1277b3e | 66 | printf("mbed effector, start!\n"); |
vaifreak | 2:25adc1277b3e | 67 | set_new_handler(no_memory); // new handler function |
vaifreak | 2:25adc1277b3e | 68 | |
vaifreak | 2:25adc1277b3e | 69 | // create effect unit |
vaifreak | 2:25adc1277b3e | 70 | filter_pre = new Filter(); |
vaifreak | 2:25adc1277b3e | 71 | filter_post = new Filter(); |
vaifreak | 2:25adc1277b3e | 72 | drive = new Drive(); |
vaifreak | 2:25adc1277b3e | 73 | delay = new Delay(); |
vaifreak | 0:6b260c0931c5 | 74 | |
vaifreak | 2:25adc1277b3e | 75 | // add to effect processing list |
vaifreak | 2:25adc1277b3e | 76 | g_EffectList.push_back(filter_pre); |
vaifreak | 2:25adc1277b3e | 77 | g_EffectList.push_back(filter_post); |
vaifreak | 2:25adc1277b3e | 78 | g_EffectList.push_back(drive); |
vaifreak | 2:25adc1277b3e | 79 | g_EffectList.push_back(delay); |
vaifreak | 2:25adc1277b3e | 80 | |
vaifreak | 2:25adc1277b3e | 81 | menu.Init( g_sample_rate, filter_pre, filter_post, drive, delay ); |
vaifreak | 0:6b260c0931c5 | 82 | |
vaifreak | 2:25adc1277b3e | 83 | process_ticker.attach( &process, 1.0/g_sample_rate ); |
vaifreak | 2:25adc1277b3e | 84 | menu_ticker.attach( &update_display, 0.1 ); |
vaifreak | 2:25adc1277b3e | 85 | |
vaifreak | 2:25adc1277b3e | 86 | //---- main loop ---- |
vaifreak | 2:25adc1277b3e | 87 | //while(1) |
vaifreak | 2:25adc1277b3e | 88 | //{ |
vaifreak | 2:25adc1277b3e | 89 | //} |
vaifreak | 0:6b260c0931c5 | 90 | } |
vaifreak | 0:6b260c0931c5 | 91 | |
vaifreak | 1:bfbfd6fede05 | 92 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 93 | // |
vaifreak | 1:bfbfd6fede05 | 94 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 95 | void process() |
vaifreak | 1:bfbfd6fede05 | 96 | { |
vaifreak | 1:bfbfd6fede05 | 97 | float val = (a_in * 2.0f) - 1.0f; //convert [0.0 ~ 1.0] to [-1.0 ~ 1.0] |
vaifreak | 2:25adc1277b3e | 98 | //val = val * 10.0f; //TEST: input gain |
vaifreak | 2:25adc1277b3e | 99 | |
vaifreak | 2:25adc1277b3e | 100 | level_meter.Update( fabsf(val) ); // LED level meter. |
vaifreak | 2:25adc1277b3e | 101 | |
vaifreak | 0:6b260c0931c5 | 102 | |
vaifreak | 1:bfbfd6fede05 | 103 | //---- effect process ---- |
vaifreak | 1:bfbfd6fede05 | 104 | { |
vaifreak | 2:25adc1277b3e | 105 | list<EffectUnitBase*>::iterator it = g_EffectList.begin(); |
vaifreak | 2:25adc1277b3e | 106 | while( it != g_EffectList.end() ) |
vaifreak | 2:25adc1277b3e | 107 | { |
vaifreak | 2:25adc1277b3e | 108 | val = (*it)->Process( val ); |
vaifreak | 2:25adc1277b3e | 109 | ++it; |
vaifreak | 2:25adc1277b3e | 110 | } |
vaifreak | 2:25adc1277b3e | 111 | |
vaifreak | 2:25adc1277b3e | 112 | //master volume |
vaifreak | 2:25adc1277b3e | 113 | val = val * menu.masterVolume; |
vaifreak | 1:bfbfd6fede05 | 114 | } |
vaifreak | 1:bfbfd6fede05 | 115 | |
vaifreak | 1:bfbfd6fede05 | 116 | val = (val + 1.0f) * 0.5f; //convert [-1.0 ~ 1.0] to [0.0 ~ 1.0] |
vaifreak | 1:bfbfd6fede05 | 117 | |
vaifreak | 1:bfbfd6fede05 | 118 | //clipping. just to be safe. |
vaifreak | 1:bfbfd6fede05 | 119 | if(val > 1.0f) val = 1.0f; |
vaifreak | 1:bfbfd6fede05 | 120 | else if(val < 0.0f) val =0.0f; |
vaifreak | 1:bfbfd6fede05 | 121 | |
vaifreak | 1:bfbfd6fede05 | 122 | a_out = val; |
vaifreak | 1:bfbfd6fede05 | 123 | |
vaifreak | 1:bfbfd6fede05 | 124 | } |
vaifreak | 0:6b260c0931c5 | 125 | |
vaifreak | 1:bfbfd6fede05 | 126 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 127 | // |
vaifreak | 1:bfbfd6fede05 | 128 | //--------------------------------------------- |
vaifreak | 2:25adc1277b3e | 129 | void update_display() |
vaifreak | 1:bfbfd6fede05 | 130 | { |
vaifreak | 2:25adc1277b3e | 131 | menu.Update(); |
vaifreak | 2:25adc1277b3e | 132 | } |
vaifreak | 1:bfbfd6fede05 | 133 | |
vaifreak | 1:bfbfd6fede05 | 134 |