comparison projects/bucket_brigade_chorus/render.cpp @ 183:2bdb48d1fca6

Fixed BBD chorus project
author Giulio Moro <giuliomoro@yahoo.it>
date Fri, 15 Jan 2016 23:48:08 +0000
parents 9a413516a1fc
children
comparison
equal deleted inserted replaced
182:4c5acd649d46 183:2bdb48d1fca6
4 #include <Utilities.h> 4 #include <Utilities.h>
5 5
6 float gPhase1, gPhase2; 6 float gPhase1, gPhase2;
7 float gFrequency1, gFrequency2; 7 float gFrequency1, gFrequency2;
8 float gInverseSampleRate; 8 float gInverseSampleRate;
9
10 Scope scope; //create a scope object
11 9
12 // initialise_render() is called once before the audio rendering starts. 10 // initialise_render() is called once before the audio rendering starts.
13 // Use it to perform any initialisation and allocation which is dependent 11 // Use it to perform any initialisation and allocation which is dependent
14 // on the period size or sample rate. 12 // on the period size or sample rate.
15 // 13 //
20 #include <I2c_Codec.h> 18 #include <I2c_Codec.h>
21 #include <PRU.h> 19 #include <PRU.h>
22 extern I2c_Codec *gAudioCodec; 20 extern I2c_Codec *gAudioCodec;
23 extern PRU *gPRU; 21 extern PRU *gPRU;
24 float D=5264; 22 float D=5264;
25 #define delayLength 512 23 #define delayLength 256
26 float delay[delayLength]; 24 float delay[delayLength];
27 int writePointer=0; 25 int writePointer=0;
28 int readPointer=writePointer+1; 26 int readPointer=writePointer+1;
29 AuxiliaryTask updatePll; 27 AuxiliaryTask updatePll;
30 28
31 void updatePllFunction(){ 29 void updatePllFunction(){
32 // rt_printf("now\n"); 30 // gPRU->setGPIOTestPin();
33 gPRU->setGPIOTestPin(); 31 static int count = 0;
34 gAudioCodec->setPllD(D); 32 while(!gShouldStop){
35 gPRU->clearGPIOTestPin(); 33 gAudioCodec->setPllD(D);
34 count++;
35 if((count&4095)==0)
36 printf("sampling rate: %f\n",gAudioCodec->getAudioSamplingRate());
37 usleep(100);
38 }
39 // gPRU->clearGPIOTestPin();
36 } 40 }
37 41
38 bool setup(BeagleRTContext *context, void *userData) 42 bool setup(BeagleRTContext *context, void *userData)
39 { 43 {
40 scope.setup(context->audioSampleRate); //call this once in setup to initialise the scope
41
42 gInverseSampleRate = 1.0/context->audioSampleRate; 44 gInverseSampleRate = 1.0/context->audioSampleRate;
43 45
44 gPhase1 = 0.0; 46 gPhase1 = 0.0;
45 gPhase2 = 0.0; 47 gPhase2 = 0.0;
46 48
47 gFrequency1 = 200.0; 49 gFrequency1 = 200.0;
48 gFrequency2 = 201.0; 50 gFrequency2 = 201.0;
49 updatePll=BeagleRT_createAuxiliaryTask(&updatePllFunction, 98, "update PLL"); 51 updatePll=BeagleRT_createAuxiliaryTask(&updatePllFunction, 91, "update PLL");
50 for(int n=0; n<delayLength; n++){ 52 for(int n=0; n<delayLength; n++){
51 delay[n]=0; 53 delay[n]=0;
52 } 54 }
53 return true; 55 return true;
54 } 56 }
58 // ADCs and DACs (if available). If only audio is available, numMatrixFrames 60 // ADCs and DACs (if available). If only audio is available, numMatrixFrames
59 // will be 0. 61 // will be 0.
60 62
61 void render(BeagleRTContext *context, void *userData) 63 void render(BeagleRTContext *context, void *userData)
62 { 64 {
65 // printf("here\n");
66 static bool init = false;
67 if(init == false){
68 BeagleRT_scheduleAuxiliaryTask(updatePll);
69 // gAudioCodec->setPllP(2);
70 // gAudioCodec->setPllR();
71 // gAudioCodec->setAudioSamplingRate(43600);
72 // printf("samplingRate: %f, k: %f\n", gAudioCodec->getAudioSamplingRate(), gAudioCodec->getPllK());
73 init = true;
74 }
63 static int count=0; 75 static int count=0;
64 static float lfoPhase=0; 76 static float lfoPhase=0;
65 static float feedback=0; 77 static float feedback=0;
66 int updateRate=8; 78 int updateRate=1;
67 if((count&(updateRate-1))==0 && digitalReadFrame(context,0,P8_07)==GPIO_HIGH){ 79 if((count&(updateRate-1))==0){
68 float amplitude=context->analogIn[0]/0.84*4990; 80 float amplitude = 8000;
69 float rate=context->analogIn[1]*20+0.1; 81 float rate = 2;
70 lfoPhase+=rate*2*M_PI*updateRate*context->analogFrames/context->audioSampleRate; 82 lfoPhase+=rate*2*M_PI*updateRate*context->analogFrames/context->audioSampleRate;
71 D=amplitude+amplitude*sinf(lfoPhase); 83 D=amplitude+amplitude*sinf(lfoPhase);
72 BeagleRT_scheduleAuxiliaryTask(updatePll);
73 if((count&255)==0){ 84 if((count&255)==0){
74 rt_printf("gpio: %d\n",digitalReadFrame(context,0,P8_07)); 85 // rt_printf("frequency: %f\n", gAudioCodec->getAudioSamplingRate());
75 rt_printf("D: %.0f\n", D); 86 // rt_printf("D: %.0f\n", D);
76 rt_printf("rate: %f\n", rate/2); 87 // rt_printf("rate: %f\n", rate);
77 rt_printf("amplitude: %.3f\n", amplitude); 88 // rt_printf("amplitude: %.3f\n", amplitude);
78 rt_printf("feedback: %.3f\n\n", feedback); 89 // rt_printf("feedback: %.3f\n\n", feedback);
79 } 90 }
80 } 91 }
81 count++; 92 count++;
82 93
83 for(unsigned int n = 0; n < context->audioFrames; n++) { 94 for(unsigned int n = 0; n < context->audioFrames; n++) {
84 feedback=context->analogIn[n/2*context->analogChannels+2]/0.84*1.2; 95 feedback = 0.4;
85 if(digitalReadFrame(context,n,P8_08)==GPIO_LOW) 96 float input = audioReadFrame(context, n, 0) + audioReadFrame(context, n, 1);
86 feedback=0; 97 delay[writePointer++] = input + delay[readPointer]*feedback;
87 delay[writePointer++]=context->audioIn[n*context->audioChannels+0] + delay[readPointer]*feedback; 98 float output = (input + 0.9*delay[readPointer++] ) * 0.5;
88 context->audioOut[n*context->audioChannels+0]=context->audioIn[n*context->audioChannels+0]+delay[readPointer++]; 99 audioWriteFrame(context, n, 0, output);
89 // context->audioOut[n*context->audioChannels+1]=sinf(gPhase1); 100 audioWriteFrame(context, n, 1, output);
90 context->analogOut[n/2*context->analogChannels+0]=D/10000;
91 if(writePointer>=delayLength) 101 if(writePointer>=delayLength)
92 writePointer-=delayLength; 102 writePointer-=delayLength;
93 if(readPointer>=delayLength) 103 if(readPointer>=delayLength)
94 readPointer-=delayLength; 104 readPointer-=delayLength;
95 105
97 gPhase2 += 2.0 * M_PI * gFrequency2 * gInverseSampleRate; 107 gPhase2 += 2.0 * M_PI * gFrequency2 * gInverseSampleRate;
98 if(gPhase1 > 2.0 * M_PI) 108 if(gPhase1 > 2.0 * M_PI)
99 gPhase1 -= 2.0 * M_PI; 109 gPhase1 -= 2.0 * M_PI;
100 if(gPhase2 > 2.0 * M_PI) 110 if(gPhase2 > 2.0 * M_PI)
101 gPhase2 -= 2.0 * M_PI; 111 gPhase2 -= 2.0 * M_PI;
102
103 } 112 }
104 } 113 }
105 114
106 // cleanup_render() is called once at the end, after the audio has stopped. 115 // cleanup_render() is called once at the end, after the audio has stopped.
107 // Release any resources that were allocated in initialise_render(). 116 // Release any resources that were allocated in initialise_render().