int32_t voicform(CSOUND *csound, VOICF *p) { MYFLT *ar = p->ar; uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; if (p->basef != *p->frequency) { p->basef = *p->frequency; SingWave_setFreq(csound, &p->voiced, p->basef); } /* OnePole_setPole(&p->onepole, 0.95 - (amp * 0.1)); */ /* Envelope_setTarget(&(p->voiced.envelope), amp); */ /* Envelope_setTarget(&p->noiseEnv, 0.95 - (amp * 0.1)); */ SingWave_setVibFreq(p->voiced, *p->vibf); Modulatr_setVibAmt(p->voiced.modulator, *p->vibAmt); /* Set phoneme */ if (p->oldform != *p->formant || p->ph != (int32_t)(0.5+*p->phoneme)) { p->oldform = *p->formant; p->ph = (int32_t)(0.5 + *p->phoneme); csound->Warning(csound, Str("Setting Phoneme: %d %f\n"), p->ph, p->oldform); VoicForm_setPhoneme(csound, p, (int32_t) *p->phoneme, p->oldform); } /* voicprint(csound, p); */ if (UNLIKELY(offset)) memset(ar, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&ar[nsmps], '\0', early*sizeof(MYFLT)); } for (n=offset; n<nsmps; n++) { MYFLT temp; MYFLT lastOutput; temp = OnePole_tick(&p->onepole, OneZero_tick(&p->onezero, SingWave_tick(csound, &p->voiced))); // printf("%d: temp=%f ", n, temp); temp += Envelope_tick(&p->noiseEnv) * Noise_tick(csound, &p->noise); // printf("%f\n", temp); lastOutput = FormSwep_tick(csound, &p->filters[0], temp); // printf("%d: output=%f ", lastOutput); lastOutput = FormSwep_tick(csound, &p->filters[1], lastOutput); // printf("%f ", lastOutput); lastOutput = FormSwep_tick(csound, &p->filters[2], lastOutput); // printf("%f ", lastOutput); lastOutput = FormSwep_tick(csound, &p->filters[3], lastOutput); // printf("%f ", lastOutput); lastOutput *= p->lastGain; // printf("%f ", lastOutput); // printf("->%f\n", lastOutput* AMP_SCALE); ar[n] = lastOutput * FL(0.22) * AMP_SCALE * *p->amp; } return OK; }
int clarin(CSOUND *csound, CLARIN *p) { MYFLT *ar = p->ar; uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; MYFLT amp = (*p->amp)*AMP_RSCALE; /* Normalise */ MYFLT nGain = *p->noiseGain; int v_len = (int)p->vibr->flen; MYFLT *v_data = p->vibr->ftable; MYFLT vibGain = *p->vibAmt; MYFLT vTime = p->v_time; if (p->envelope.rate==FL(0.0)) { p->envelope.rate = amp /(*p->attack*CS_ESR); p->envelope.value = p->envelope.target = FL(0.55) + amp*FL(0.30); } p->outputGain = amp + FL(0.001); DLineL_setDelay(&p->delayLine, /* length - approx filter delay */ (CS_ESR/ *p->frequency) * FL(0.5) - FL(1.5)); p->v_rate = *p->vibFreq * p->vibr->flen * csound->onedsr; /* Check to see if into decay yet */ if (p->kloop>0 && p->h.insdshead->relesing) p->kloop=1; if ((--p->kloop) == 0) { p->envelope.state = 1; /* Start change */ p->envelope.rate = p->envelope.value / (*p->dettack * CS_ESR); p->envelope.target = FL(0.0); #ifdef BETA csound->Message(csound, "Set off phase time = %f Breath v,r = %f, %f\n", (MYFLT) CS_KCNT * CS_ONEDKR, p->envelope.value, p->envelope.rate); #endif } if (UNLIKELY(offset)) memset(ar, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&ar[nsmps], '\0', early*sizeof(MYFLT)); } for (n=offset;n<nsmps;n++) { MYFLT pressureDiff; MYFLT breathPressure; int32 temp; MYFLT temp_time, alpha; MYFLT nextsamp; MYFLT v_lastOutput; MYFLT lastOutput; breathPressure = Envelope_tick(&p->envelope); breathPressure += breathPressure * nGain * Noise_tick(csound,&p->noise); /* Tick on vibrato table */ vTime += p->v_rate; /* Update current time */ while (vTime >= v_len) /* Check for end of sound */ vTime -= v_len; /* loop back to beginning */ while (vTime < FL(0.0)) /* Check for end of sound */ vTime += v_len; /* loop back to beginning */ temp_time = vTime; #ifdef have_phase if (p->v_phaseOffset != FL(0.0)) { temp_time += p->v_phaseOffset; /* Add phase offset */ while (temp_time >= v_len) /* Check for end of sound */ temp_time -= v_len; /* loop back to beginning */ while (temp_time < FL(0.0)) /* Check for end of sound */ temp_time += v_len; /* loop back to beginning */ } #endif temp = (int32) temp_time; /* Integer part of time address */ /* fractional part of time address */ alpha = temp_time - (MYFLT)temp; v_lastOutput = v_data[temp]; /* Do linear interpolation */ /* same as alpha*data[temp+1] + (1-alpha)data[temp] */ v_lastOutput += (alpha * (v_data[temp+1] - v_lastOutput)); /* End of vibrato tick */ breathPressure += breathPressure * vibGain * v_lastOutput; pressureDiff = OneZero_tick(&p->filter, /* differential pressure */ DLineL_lastOut(&p->delayLine)); pressureDiff = (-FL(0.95)*pressureDiff) - breathPressure; /* of reflected and mouth */ nextsamp = pressureDiff * ReedTabl_LookUp(&p->reedTable,pressureDiff); nextsamp = breathPressure + nextsamp; /* perform scattering in economical way */ lastOutput = DLineL_tick(&p->delayLine, nextsamp); lastOutput *= p->outputGain; ar[n] = lastOutput*AMP_SCALE; } p->v_time = vTime; return OK; }
int mandolin(CSOUND *csound, MANDOL *p) { MYFLT *ar = p->ar; uint32_t offset = p->h.insdshead->ksmps_offset; uint32_t early = p->h.insdshead->ksmps_no_end; uint32_t n, nsmps = CS_KSMPS; MYFLT amp = (*p->amp)*AMP_RSCALE; /* Normalise */ MYFLT lastOutput; MYFLT loopGain; loopGain = *p->baseLoopGain + (p->lastFreq * FL(0.000005)); if (loopGain>FL(1.0)) loopGain = FL(0.99999); if (p->kloop>0 && p->h.insdshead->relesing) p->kloop=1; if (p->lastFreq != *p->frequency) { p->lastFreq = *p->frequency; p->lastLength = ( CS_ESR / p->lastFreq); /* length - delays */ DLineA_setDelay(csound, &p->delayLine1, (p->lastLength / *p->detuning) - FL(0.5)); DLineA_setDelay(csound, &p->delayLine2, (p->lastLength * *p->detuning) - FL(0.5)); } if ((--p->kloop) == 0) { loopGain = (FL(1.0) - amp) * FL(0.5); } if (UNLIKELY(offset)) memset(ar, '\0', offset*sizeof(MYFLT)); if (UNLIKELY(early)) { nsmps -= early; memset(&ar[nsmps], '\0', early*sizeof(MYFLT)); } for (n=offset;n<nsmps;n++) { MYFLT temp = FL(0.0); if (!p->waveDone) { p->waveDone = infoTick(p); /* as long as it goes . . . */ temp = p->s_lastOutput * amp; /* scaled pluck excitation */ temp = temp - DLineL_tick(&p->combDelay, temp);/* with comb filtering */ } if (p->dampTime>=0) { /* Damping hack to help avoid */ p->dampTime -= 1; /* overflow on replucking */ lastOutput = DLineA_tick(&p->delayLine1, /* Calculate 1st delay */ OneZero_tick(&p->filter1, /* filterered reflection */ temp + /* plus pluck excitation */ (p->delayLine1.lastOutput * FL(0.7)))); lastOutput += DLineA_tick(&p->delayLine2, /* and 2nd delay just like the 1st */ OneZero_tick(&p->filter2, temp + (p->delayLine2.lastOutput * FL(0.7)))); /* that's the whole thing!! */ } else { /* No damping hack after 1 period */ lastOutput = DLineA_tick(&p->delayLine1, /* Calculate 1st delay */ OneZero_tick(&p->filter1, /* filtered reflection */ temp + /* plus pluck excitation */ (p->delayLine1.lastOutput * loopGain))); lastOutput += DLineA_tick(&p->delayLine2, /* and 2nd delay */ OneZero_tick(&p->filter2, /* just like the 1st */ temp + (p->delayLine2.lastOutput * loopGain))); } lastOutput *= FL(3.7); ar[n] = lastOutput*AMP_SCALE; } return OK; }