void sequencer_newStep_action(void) // User callback function called by sequencer_process() { if ((noteG.automaticON || noteG.chRequested)) { seq_sequence_new(); noteG.chRequested = false; AdditiveGen_newWaveform(); } if ( (noteG.someNotesMuted) && (rintf(frand_a_b(0.4f , 1)) == 0) ) ADSR_keyOff(&adsr); else ADSR_keyOn(&adsr); if (autoFilterON) SVF_directSetFilterValue(&SVFilter, Ts * 600.f * powf(5000.f / 600.f, frand_a_b(0 , 1))); if (noteG.transpose != 0) { noteG.rootNote += noteG.transpose ; seq_transpose(); } if (autoSound == 1) { switch(rand() % 4) // 4 random timbers { case 0 : sound = CHORD15; break; case 1 : AdditiveGen_newWaveform(); sound = ADDITIVE; break; case 2 : sound = CHORD13min5; break; case 3 : sound = VOICES3; break; } } if (autoSound == 2) { sound = rand() % LAST_SOUND; if ((sound == CHORD13min5) || (sound == CHORD135)) sound = VOICES3; if ( sound == ADDITIVE) AdditiveGen_newWaveform(); } f0 = notesFreq[seq.track1.note[seq.step_idx]]; // Main "melody" frequency vol = frand_a_b(0.4f , .8f); // slightly random volume for each note }
//TODO: make phi_rad a parameter of this function void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length) { int i,j,p,l,k; double *alpha,*phi_rad,pi=acos(-1),*w_Hz; alpha = (double *)calloc(desc->nb_paths,sizeof(double)); phi_rad = (double *)calloc(desc->nb_paths,sizeof(double)); w_Hz = (double *)calloc(desc->nb_paths,sizeof(double)); for(i=0; i<desc->nb_paths; i++) { w_Hz[i]=desc->max_Doppler*cos(frand_a_b(0,2*pi)); phi_rad[i]=frand_a_b(0,2*pi); } if(desc->ricean_factor == 1) { for(i=0; i<desc->nb_paths; i++) { alpha[i]=1/sqrt(desc->nb_paths); } } else { alpha[0]=sqrt(desc->ricean_factor/(desc->ricean_factor+1)); for(i=1; i<desc->nb_paths; i++) { alpha[i] = (1/sqrt(desc->nb_paths-1))*(sqrt(1/(desc->ricean_factor+1))); } } /* // This is the code when we only consider a SISO case for(i=0;i<length;i++) { for(j=0;j<desc->nb_taps;j++) { for(p=0;p<desc->nb_paths;p++) { H[i][j] += sqrt(desc->amps[j]/2)*alpha[p]*cexp(-I*(2*pi*w_Hz[p]*i*(1/(desc->BW*1e6))+phi_rad[p])); } } } for(j=0;j<desc->nb_paths;j++) { phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->BW)+phi_rad[j],2*pi); } */ // if MIMO for (i=0; i<desc->nb_rx; i++) { for(j=0; j<desc->nb_tx; j++) { for(k=0; k<length; k++) { for(l=0; l<desc->nb_taps; l++) { H[i+(j*desc->nb_rx)][k][l] = 0; for(p=0; p<desc->nb_paths; p++) { H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[l]/2)*alpha[p]*cexp(I*(2*pi*w_Hz[p]*k*(1/(desc->BW*1e6))+phi_rad[p])); } } } for(j=0; j<desc->nb_paths; j++) { phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->BW)+phi_rad[j],2*pi); } } } free(alpha); free(w_Hz); free(phi_rad); }