
Guitar Effector using "mbed application board".
Guitar Effector using "mbed application board".
Delay.h@1:bfbfd6fede05, 2015-09-01 (annotated)
- Committer:
- vaifreak
- Date:
- Tue Sep 01 10:04:14 2015 +0000
- Revision:
- 1:bfbfd6fede05
- Child:
- 2:25adc1277b3e
implement, delay unit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vaifreak | 1:bfbfd6fede05 | 1 | //============================================================================= |
vaifreak | 1:bfbfd6fede05 | 2 | // |
vaifreak | 1:bfbfd6fede05 | 3 | //============================================================================= |
vaifreak | 1:bfbfd6fede05 | 4 | #pragma once |
vaifreak | 1:bfbfd6fede05 | 5 | |
vaifreak | 1:bfbfd6fede05 | 6 | #define DELAY_BUFF_SIZE 5000 |
vaifreak | 1:bfbfd6fede05 | 7 | |
vaifreak | 1:bfbfd6fede05 | 8 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 9 | // |
vaifreak | 1:bfbfd6fede05 | 10 | //--------------------------------------------- |
vaifreak | 1:bfbfd6fede05 | 11 | class Delay |
vaifreak | 1:bfbfd6fede05 | 12 | { |
vaifreak | 1:bfbfd6fede05 | 13 | private: |
vaifreak | 1:bfbfd6fede05 | 14 | unsigned short buff[ DELAY_BUFF_SIZE ]; |
vaifreak | 1:bfbfd6fede05 | 15 | int current; |
vaifreak | 1:bfbfd6fede05 | 16 | int offset; |
vaifreak | 1:bfbfd6fede05 | 17 | |
vaifreak | 1:bfbfd6fede05 | 18 | /// [-1.0 ~ 1.0] |
vaifreak | 1:bfbfd6fede05 | 19 | float buff_get( int i ){ |
vaifreak | 1:bfbfd6fede05 | 20 | return ((float)buff[i] * (2.0f/65535.0f) ) - 1.0f; |
vaifreak | 1:bfbfd6fede05 | 21 | } |
vaifreak | 1:bfbfd6fede05 | 22 | |
vaifreak | 1:bfbfd6fede05 | 23 | void buff_set( int i, float val ){ |
vaifreak | 1:bfbfd6fede05 | 24 | // [-1.0 ~ 1.0] to [ 0 ~ 65535 ] |
vaifreak | 1:bfbfd6fede05 | 25 | buff[i] = (unsigned short)(((val + 1.0f) * 0.5f) * 65535.0f); |
vaifreak | 1:bfbfd6fede05 | 26 | } |
vaifreak | 1:bfbfd6fede05 | 27 | |
vaifreak | 1:bfbfd6fede05 | 28 | public: |
vaifreak | 1:bfbfd6fede05 | 29 | float delay_time; //[0.0~1.0] |
vaifreak | 1:bfbfd6fede05 | 30 | float feedback; //[0.0~1.0] |
vaifreak | 1:bfbfd6fede05 | 31 | float effect_level; |
vaifreak | 1:bfbfd6fede05 | 32 | |
vaifreak | 1:bfbfd6fede05 | 33 | Delay() |
vaifreak | 1:bfbfd6fede05 | 34 | { |
vaifreak | 1:bfbfd6fede05 | 35 | for(int i=0; i<DELAY_BUFF_SIZE; i++) buff[i] = 0; |
vaifreak | 1:bfbfd6fede05 | 36 | |
vaifreak | 1:bfbfd6fede05 | 37 | delay_time = 0.8f; |
vaifreak | 1:bfbfd6fede05 | 38 | feedback = 0.5f; |
vaifreak | 1:bfbfd6fede05 | 39 | effect_level = 0.5f; |
vaifreak | 1:bfbfd6fede05 | 40 | |
vaifreak | 1:bfbfd6fede05 | 41 | current = 0; |
vaifreak | 1:bfbfd6fede05 | 42 | } |
vaifreak | 1:bfbfd6fede05 | 43 | |
vaifreak | 1:bfbfd6fede05 | 44 | float process(float input) |
vaifreak | 1:bfbfd6fede05 | 45 | { |
vaifreak | 1:bfbfd6fede05 | 46 | float output; |
vaifreak | 1:bfbfd6fede05 | 47 | |
vaifreak | 1:bfbfd6fede05 | 48 | float buff_val = buff_get(current); |
vaifreak | 1:bfbfd6fede05 | 49 | |
vaifreak | 1:bfbfd6fede05 | 50 | // feedback process. |
vaifreak | 1:bfbfd6fede05 | 51 | offset = current + (int)(delay_time * (float)DELAY_BUFF_SIZE); |
vaifreak | 1:bfbfd6fede05 | 52 | if( offset >= DELAY_BUFF_SIZE ) offset -= DELAY_BUFF_SIZE; |
vaifreak | 1:bfbfd6fede05 | 53 | buff_set( offset, (input + buff_val) * feedback ); |
vaifreak | 1:bfbfd6fede05 | 54 | |
vaifreak | 1:bfbfd6fede05 | 55 | // effect mix. |
vaifreak | 1:bfbfd6fede05 | 56 | output = input + buff_val * effect_level; |
vaifreak | 1:bfbfd6fede05 | 57 | |
vaifreak | 1:bfbfd6fede05 | 58 | current++; |
vaifreak | 1:bfbfd6fede05 | 59 | if(current >= DELAY_BUFF_SIZE) current = 0; |
vaifreak | 1:bfbfd6fede05 | 60 | |
vaifreak | 1:bfbfd6fede05 | 61 | return output; |
vaifreak | 1:bfbfd6fede05 | 62 | } |
vaifreak | 1:bfbfd6fede05 | 63 | |
vaifreak | 1:bfbfd6fede05 | 64 | }; |