24bit 48kHz Audio Delay
Dependencies: mbed-dsp mbed shimabara unzen_nucleo_f746
Fork of unzen_sample_nucleo_f746 by
雲仙フレームワークを使ったオーディオディレイのsampleです。
Revision 3:d9fd88ea0ff5, committed 2016-12-16
- Comitter:
- GSMCustomEffects
- Date:
- Fri Dec 16 10:43:24 2016 +0000
- Parent:
- 1:5b735bc30c17
- Commit message:
- add delay program
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 5b735bc30c17 -r d9fd88ea0ff5 main.cpp --- a/main.cpp Mon Dec 12 09:26:41 2016 +0000 +++ b/main.cpp Fri Dec 16 10:43:24 2016 +0000 @@ -3,13 +3,18 @@ #include "mbed.h" #include "arm_math.h" #define CODEC_I2C_ADDR 0x38 - +#define DELAY_TIME (550) /* delay time in ms */ +#define DELAY_BUF_SIZE (44100 * DELAY_TIME / 1000)/* ring buffer size */ +#define FEEDBACK 0.5; /* feedback control */ DigitalOut myled1(LED1); DigitalIn User_b1(PC_13); Serial uart(SERIAL_TX,SERIAL_RX); -float32_t delay_buf[1]; -float32_t delay_buf1[1]; -float32_t delay_buf2[1]; +float32_t delay_buf[DELAY_BUF_SIZE]; +unsigned int delay_buf_idx = 0; +float32_t l_lc[]={0}; +float32_t l_x[]={0}; +float32_t l_in[]={0}; +float32_t l_delay[]={0}; int flag = 1; char uart_read_value = 0; // customer signal processing initialization call back. @@ -30,22 +35,28 @@ unsigned int block_size // block size [sample] ) { + if(flag == 1){ // Sample processing - for ( int i=0; i<block_size; i++) // for all sample - { - tx_left_buffer[i] = rx_left_buffer[i]; // copy from input to output - tx_right_buffer[i] = rx_right_buffer[i]; + for ( int i=0; i<block_size; i++){ + /*Bypass Sound*/ + tx_left_buffer[i] = rx_left_buffer[i]; //copy from input to output + tx_right_buffer[i] = rx_left_buffer[i];//for guitar volume } } else if(flag == 0){ - for ( int i=0; i<block_size; i++) // for all sample - { - tx_left_buffer[i] = 0; // copy from input to output - tx_right_buffer[i] = 0; - + for ( int i=0; i<block_size; i++){ + + /*Echo Effect*/ + l_in[0] = rx_left_buffer[i]/2.0;//原音を保存 + l_delay[0] = delay_buf[delay_buf_idx]*FEEDBACK;//フィードバック量の調整(FEEDBACK < 1をまもらないと発振する) + arm_add_f32( l_in, l_delay, l_x, 1 );//ディレイ音と原音を合成(l_xに計算結果が格納) + delay_buf[delay_buf_idx] = l_x[0];//フィードバック + delay_buf_idx = (int)(delay_buf_idx + 1)%DELAY_BUF_SIZE;//ring bufferの更新 + tx_left_buffer[i] = l_x[0]*2.0; // copy from L to L + tx_right_buffer[i] = l_x[0]*2.0; // copy from L to R } } } @@ -54,15 +65,15 @@ int main() { - // I2C is essential to talk with ADAU1361 + // I2C is essential to talk with ADAU1361 I2C i2c(D14, D15); - // create an audio codec contoler - //shimabara::UMB_ADAU1361A codec(shimabara::Fs_32, i2c, CODEC_I2C_ADDR ); // Default Fs is 48kHz + // create an audio codec contoler + //shimabara::UMB_ADAU1361A codec(shimabara::Fs_32, i2c, CODEC_I2C_ADDR ); // Default Fs is 48kHz shimabara::UMB_ADAU1361A codec(shimabara::Fs_441, i2c, CODEC_I2C_ADDR ); -// shimabara::UMB_ADAU1361A codec(shimabara::Fs_48, i2c, CODEC_I2C_ADDR ); -// shimabara::UMB_ADAU1361A codec(shimabara::Fs_96, i2c, CODEC_I2C_ADDR ); + //shimabara::UMB_ADAU1361A codec(shimabara::Fs_48, i2c, CODEC_I2C_ADDR ); + //shimabara::UMB_ADAU1361A codec(shimabara::Fs_96, i2c, CODEC_I2C_ADDR ); // create an audio framework by singlton pattern unzen::Framework audio; @@ -72,7 +83,7 @@ // Configure the optional block size of signal processing. By default, it is 1[Sample] - audio.set_block_size(16); + //audio.set_block_size(16); // Start the ADAU1361. Audio codec starts to generate the I2C signals @@ -85,21 +96,16 @@ // periodically changing gain for test while(1) { - - delay_buf[0] = 1.0; codec.set_hp_output_gain( 3, 3); codec.set_line_output_gain( 3, 3 ); - arm_add_f32( delay_buf, delay_buf1, delay_buf2, 1 ); - if(User_b1 == 1){ - if(flag == 1){flag = 0;} - else if(flag == 0){flag = 1;} - if(flag == 1){myled1 =1;uart.printf("Effect On \r\n");} - else if(flag == 0){myled1 =0;uart.printf("Effect Off \r\n");} - while(User_b1==1){} + if(User_b1 == 1){//スイッチ入力に対応 + if(flag == 1){flag = 0;myled1 =1;uart.printf("Effect On \r\n");} + else if(flag == 0){flag = 1;myled1 =0;uart.printf("Effect Off \r\n");} + while(User_b1 == 1){} + } + if(uart.readable()== 1){uart_read_value = uart.getc();//Uart Output + if(uart_read_value == 'e'){flag = 1;myled1 =0;uart.printf("Effect Off \r\n");} + if(uart_read_value == 'd'){flag = 0;myled1 =1;uart.printf("Effect On \r\n");} } - if(uart.readable()== 1){uart_read_value = uart.getc(); - if(uart_read_value == 'e'){flag = 1;uart.printf("Effect On \r\n");} - if(uart_read_value == 'd'){flag = 0;uart.printf("Effect Off \r\n");} - } } } \ No newline at end of file