Uzumeを正式リリースするまでの一時的な保管場所
Revisión | a7e7ef0194ec6d60a64036bbe5d6e7a48b3e3d16 (tree) |
---|---|
Tiempo | 2013-01-03 13:48:25 |
Autor | suikan <suikan@user...> |
Commiter | suikan |
フランジャーを実装した
@@ -116,10 +116,10 @@ UTASK_CFG = $(UNAME).cfg | ||
116 | 116 | UTASK_DIR = $(SRCDIR)/library |
117 | 117 | UTASK_ASMOBJS = |
118 | 118 | ifdef USE_CXX |
119 | - UTASK_CXXOBJS = $(UNAME).o | |
119 | + UTASK_CXXOBJS = $(UNAME).o flanger.o | |
120 | 120 | UTASK_COBJS = |
121 | 121 | else |
122 | - UTASK_COBJS = $(UNAME).o | |
122 | + UTASK_COBJS = $(UNAME).o flanger.o | |
123 | 123 | endif |
124 | 124 | UTASK_CFLAGS = |
125 | 125 | UTASK_LIBS = |
@@ -797,6 +797,20 @@ uzume_app.o: kernel/include/kernel.h kernel/include/t_services.h \ | ||
797 | 797 | /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ |
798 | 798 | kernel/config/blackfin/bsp_amakusa592/sys_defs.h \ |
799 | 799 | kernel/include/t_stddef.h |
800 | +flanger.o: \ | |
801 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/gcc.h \ | |
802 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/r2x16_typedef.h \ | |
803 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract2float_conv.h \ | |
804 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_typedef.h \ | |
805 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract_math.h \ | |
806 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/raw_typedef.h \ | |
807 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/r2x16_base.h \ | |
808 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract.h \ | |
809 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_math.h \ | |
810 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fr2x16_base.h \ | |
811 | + flanger.h \ | |
812 | + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/fract_typedef.h \ | |
813 | + flanger.c | |
800 | 814 | timer.o: \ |
801 | 815 | /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ |
802 | 816 | kernel/include/kernel.h kernel/include/timer.h \ |
@@ -3,6 +3,6 @@ cd kernel/cfg | ||
3 | 3 | make depend |
4 | 4 | make |
5 | 5 | popd |
6 | -kernel/configure -C blackfin -S bsp_amakusa592 -A uzume_app | |
6 | +kernel/configure -C blackfin -S bsp_amakusa592 -A uzume_app -U "flanger.o" | |
7 | 7 | make depend |
8 | 8 | make clean |
@@ -0,0 +1,51 @@ | ||
1 | +/* | |
2 | + * flanger.c | |
3 | + * | |
4 | + * Created on: 2013/01/03 | |
5 | + * Author: takemasa | |
6 | + */ | |
7 | + | |
8 | +#include "flanger.h" | |
9 | + | |
10 | +void flanger_init( struct TFLANGER * flanger ) | |
11 | +{ | |
12 | + int i; | |
13 | + | |
14 | + for ( i=0; i< FLANGER_MAX_DELAY; i++) | |
15 | + flanger->delayline[i] = 0; | |
16 | + flanger->delayhead = 0; | |
17 | + | |
18 | +} | |
19 | + | |
20 | +/** | |
21 | + * @brief ディレイライン実装用の内部関数 | |
22 | + * @param flanger フランジャー実体 | |
23 | + * @param sample ディレイラインに入力する最新サンプル | |
24 | + * @param delay 出力を取り出す位置 [0 .. 1) | |
25 | + * @param feedback | |
26 | + * @param mix | |
27 | + * @return delayで指示され対地にあるサンプル | |
28 | + * @details | |
29 | + */ | |
30 | +fract32 flanger_process( struct TFLANGER * flanger, fract32 sample, fract32 delay, fract32 feedback, fract32 mix) | |
31 | + | |
32 | +{ | |
33 | + int delay_pos; | |
34 | + fract32 delayed_sample; | |
35 | + // 固定小数値のディレイ量を遅延インデックスに変換する | |
36 | + delay_pos = mult_fr1x32x32( delay, FLANGER_MAX_DELAY) + flanger->delayhead; | |
37 | + // 循環バッファのポインタにするための丸め | |
38 | + delay_pos = ( delay_pos >= FLANGER_MAX_DELAY ) ? delay_pos - FLANGER_MAX_DELAY : delay_pos; | |
39 | + // 遅延バッファから遅延値を取り出す | |
40 | + delayed_sample = flanger->delayline[delay_pos]; | |
41 | + | |
42 | + // サンプル挿入点を更新 | |
43 | + flanger->delayhead--; | |
44 | + if ( flanger->delayhead < 0) | |
45 | + flanger->delayhead = FLANGER_MAX_DELAY -1 ; | |
46 | + | |
47 | + flanger->delayline[flanger->delayhead] = add_fr1x32( mult_fr1x32x32( sample, feedback ), delayed_sample ); | |
48 | + | |
49 | + return add_fr1x32( mult_fr1x32x32( delayed_sample, mix), sample); | |
50 | + | |
51 | +} |
@@ -10,22 +10,29 @@ | ||
10 | 10 | |
11 | 11 | #include <fract.h> |
12 | 12 | |
13 | -#define FLANGER_MAX_DELAY | |
13 | +#define FLANGER_MAX_DELAY 2400 | |
14 | 14 | |
15 | -struct { | |
15 | +struct TFLANGER{ | |
16 | 16 | fract32 delayline[FLANGER_MAX_DELAY]; |
17 | 17 | int delayhead; |
18 | -}TFlanger; | |
18 | +}; | |
19 | 19 | |
20 | 20 | /** |
21 | 21 | * @brief フランジャーの初期化 |
22 | - * @param franger | |
22 | + * @param franger 初期化したいflangerへのポインタ | |
23 | 23 | */ |
24 | -void flanger_init(struct TFlanger * flanger ); | |
24 | +void flanger_init(struct TFLANGER * flanger ); | |
25 | 25 | |
26 | 26 | /** |
27 | - * | |
27 | + * @brief ディレイライン実装用の内部関数 | |
28 | + * @param flanger フランジャー実体 | |
29 | + * @param sample ディレイラインに入力する最新サンプル | |
30 | + * @param delay ディレイラインの出力を取り出す位置 [0 .. 1) | |
31 | + * @param feedback ディレイライン出力から入力へのフィードバック量 | |
32 | + * @param mix ディレイライン出力と入力サンプルのミックス係数 | |
33 | + * @return delayで指示され対地にあるサンプル | |
34 | + * @details | |
28 | 35 | */ |
29 | -fract32 flanter_process( struct TFlanger * flanger, fract32 sample, fract32 feedback, fract32 mix); | |
36 | +fract32 flanger_process( struct TFLANGER * flanger, fract32 sample, fract32 delay, fract32 feedback, fract32 mix); | |
30 | 37 | |
31 | 38 | #endif /* FLANGER_H_ */ |
@@ -8,6 +8,10 @@ | ||
8 | 8 | #include "kernel_id.h" |
9 | 9 | #include "uzume.h" |
10 | 10 | #include "i2s_subsystem.h" |
11 | +#include "flanger.h" | |
12 | + | |
13 | +struct TFLANGER flanger; | |
14 | + | |
11 | 15 | /** |
12 | 16 | * @brief 信号処理初期化関数 |
13 | 17 | * @ingroup AUDIO |
@@ -18,6 +22,8 @@ | ||
18 | 22 | void init_audio( void ) |
19 | 23 | { |
20 | 24 | /* ブロックサイズは UZUME_BLOCKSIZE マクロを使用すればわかる */ |
25 | + | |
26 | + flanger_init( &flanger ); | |
21 | 27 | } |
22 | 28 | /** |
23 | 29 | * @brief 信号処理関数 |
@@ -50,10 +56,16 @@ void process_audio( | ||
50 | 56 | // ch 0 のボリューム値(32bit) |
51 | 57 | volume = get_volume(0)>>15; |
52 | 58 | |
53 | - // count個のサンプルすべてを処理する | |
59 | + // UZUME_BLOCKSIZE個のサンプルすべてを処理する | |
54 | 60 | for ( sample = 0; sample < UZUME_BLOCKSIZE; sample++ ){ |
55 | - output_left[sample] = (input_left[sample]>>16) * volume; | |
56 | - output_right[sample] = (input_right[sample]>>16) * volume; | |
61 | + output_left[sample] = output_right[sample] = | |
62 | + flanger_process( | |
63 | + & flanger, // flanger entity | |
64 | + add_fr1x32( input_left[sample], input_right[sample] ), // input | |
65 | + get_volume(0), // delay | |
66 | + get_volume(1), // feedback | |
67 | + get_volume(2) // mix | |
68 | + ); | |
57 | 69 | } |
58 | 70 | } |
59 | 71 |