int32_t voicformset(CSOUND *csound, VOICF *p) { MYFLT amp = (*p->amp)*AMP_RSCALE; /* Normalise */ int32_t i; if (UNLIKELY(make_SingWave(csound, &p->voiced, p->ifn, p->ivfn)==NOTOK)) return NOTOK; Envelope_setRate(csound, &(p->voiced.envelope), FL(0.001)); Envelope_setTarget(&(p->voiced.envelope), FL(0.0)); make_Noise(p->noise); for (i=0; i<4; i++) { make_FormSwep(&p->filters[i]); FormSwep_setSweepRate(p->filters[i], FL(0.001)); } make_OneZero(&p->onezero); OneZero_setCoeff(&p->onezero, - FL(0.9)); make_OnePole(&p->onepole); OnePole_setPole(&p->onepole, FL(0.9)); make_Envelope(&p->noiseEnv); Envelope_setRate(csound, &p->noiseEnv, FL(0.001)); Envelope_setTarget(&p->noiseEnv, FL(0.0)); p->oldform = *p->formant; p->ph = (int32_t)(FL(0.5)+ *p->phoneme); VoicForm_setPhoneme(csound, p, p->ph, p->oldform); /* Clear */ /* OnePole_clear(&p->onepole); */ /* Included in make */ FormSwep_clear(p->filters[0]); FormSwep_clear(p->filters[1]); FormSwep_clear(p->filters[2]); FormSwep_clear(p->filters[3]); { MYFLT temp, freq = *p->frequency; if ((freq * FL(22.0)) > CS_ESR) { csound->Warning(csound, Str("This note is too high!!\n")); freq = CS_ESR / FL(22.0); } p->basef = freq; temp = FABS(FL(1500.0) - freq) + FL(200.0); p->lastGain = FL(10000.0) / temp / temp; SingWave_setFreq(csound, &p->voiced, freq); } Envelope_setTarget(&(p->voiced.envelope), amp); OnePole_setPole(&p->onepole, FL(0.95) - (amp * FL(0.2))/FL(128.0)); /* voicprint(csound, p); */ return OK; }
static int32_t make_Modulatr(CSOUND *csound,Modulatr *p, MYFLT *i) { FUNC *ftp; if (LIKELY((ftp = csound->FTnp2Find(csound,i)) != NULL)) p->wave = ftp; else { /* Expect sine wave */ return csound->InitError(csound, Str("No table for Modulatr")); } p->v_time = FL(0.0); /* p->v_rate = 6.0; */ /* p->vibAmt = 0.04; */ make_SubNoise(&p->noise, 330);/* Surely this should be scaled to esr?? */ /* p->rndAmt = 0.005; */ make_OnePole(&p->onepole); OnePole_setPole(&p->onepole, POLE_POS); OnePole_setGain(&p->onepole, RND_SCALE * FL(0.005) /* p->rndAmt */); return 0; }
int vibraphnset(CSOUND *csound, VIBRAPHN *p) { Modal4 *m = &(p->m4); MYFLT temp; FUNC *ftp; if (LIKELY((ftp = csound->FTnp2Find(csound, p->ifn)) != NULL)) p->m4.wave = ftp; /* Expect an impulslything */ else { return csound->InitError(csound, Str("No table for Vibraphone strike")); } if (UNLIKELY(make_Modal4(csound, m, p->ivfn, *p->vibAmt, *p->vibFreq)==NOTOK)) return NOTOK; p->m4.w_phaseOffset = FL(0.0); /* p->m4.w_rate = 13.33; */ OnePole_setPole(&p->m4.onepole, FL(0.2)); Modal4_setRatioAndReson(csound, m, 0, FL(1.0), FL(0.99995)); /* Set */ Modal4_setRatioAndReson(csound, m, 1, FL(2.01),FL(0.99991)); /* our */ Modal4_setRatioAndReson(csound, m, 2, FL(3.9), FL(0.99992)); /* resonance */ Modal4_setRatioAndReson(csound, m, 3,FL(14.37),FL(0.99990)); /* values here */ Modal4_setFiltGain(m, 0, FL(0.025)); Modal4_setFiltGain(m, 1, FL(0.015)); Modal4_setFiltGain(m, 2, FL(0.015)); Modal4_setFiltGain(m, 3, FL(0.015)); p->m4.directGain = FL(0.0); /* vibrGain = 0.2; */ p->m4.w_rate = FL(2.0) + (FL(22.66) * *p->hardness); p->m4.masterGain = FL(0.2) + (*p->hardness * FL(1.6)); /* Set Strike position */ temp = (p->strikePosition = *p->spos) * PI_F; BiQuad_setGain(p->m4.filters[0], FL(0.025) * SIN(temp)); BiQuad_setGain(p->m4.filters[1], FL(0.015) * SIN(FL(0.1) + (FL(2.01) * temp))); BiQuad_setGain(p->m4.filters[2], FL(0.015) * SIN(FL(3.95) * temp)); /* Strike */ Modal4_strike(csound, m, *p->amplitude * AMP_RSCALE); Modal4_setFreq(csound, m, *p->frequency); p->first = 1; return OK; }
static void Modal4_strike(CSOUND *csound, Modal4 *m, MYFLT amplitude) { int i; MYFLT temp; Envelope_setRate(csound, &m->envelope, FL(1.0)); Envelope_setTarget(&m->envelope, amplitude); OnePole_setPole(&m->onepole, FL(1.0) - amplitude); Envelope_tick(&m->envelope); m->w_time = FL(0.0); //m->w_lastOutput = FL(0.0); m->w_allDone = 0; /* wave->reset(); */ for (i=0;i<4;i++) { if (m->ratios[i] < 0) temp = - m->ratios[i]; else temp = m->ratios[i] * m->baseFreq; BiQuad_setFreqAndReson(m->filters[i], temp, m->resons[i]); } }
int agogobelset(CSOUND *csound, VIBRAPHN *p) { Modal4 *m = &(p->m4); FUNC *ftp; MYFLT temp; /* Expect an impulslything */ if (LIKELY((ftp = csound->FTnp2Find(csound, p->ifn)) != NULL)) p->m4.wave = ftp; else { return csound->InitError(csound, Str("No table for Agogobell strike")); } if (UNLIKELY(make_Modal4(csound, m, p->ivfn, *p->vibAmt, *p->vibFreq)==NOTOK)) return NOTOK; p->m4.w_phaseOffset = FL(0.0); /* p->m4.w_rate = 7.0; */ OnePole_setPole(&p->m4.onepole, FL(0.2)); Modal4_setRatioAndReson(csound, m, 0, FL(1.00), FL(0.999)); /* Set */ Modal4_setRatioAndReson(csound, m, 1, FL(4.08), FL(0.999)); /* our */ Modal4_setRatioAndReson(csound, m, 2, FL(6.669),FL(0.999)); /* resonance */ Modal4_setRatioAndReson(csound, m, 3,-FL(3725.0), FL(0.999)); /* values here */ Modal4_setFiltGain(m, 0, FL(0.06)); Modal4_setFiltGain(m, 1, FL(0.05)); Modal4_setFiltGain(m, 2, FL(0.03)); Modal4_setFiltGain(m, 3, FL(0.02)); p->m4.directGain = FL(0.25); /* vibrGain = 0.2; */ p->m4.w_rate = FL(3.0) + (FL(8.0) * *p->hardness); p->m4.masterGain = FL(1.0); /* Set Strike position */ temp = (p->strikePosition = *p->spos) * PI_F; BiQuad_setGain(p->m4.filters[0], FL(0.08) * SIN(FL(0.7) * temp)); BiQuad_setGain(p->m4.filters[1], FL(0.07) * SIN(FL(0.1) + (FL(5.0) * temp))); BiQuad_setGain(p->m4.filters[2], FL(0.04) * SIN(FL(0.2) + (FL(7.0) * temp))); /* Strike */ Modal4_strike(csound, m, *p->amplitude*AMP_RSCALE); Modal4_setFreq(csound, m, *p->frequency); return OK; }
int bowedset(CSOUND *csound, BOWED *p) { int32 length; FUNC *ftp; MYFLT amp = (*p->amp)*AMP_RSCALE; /* Normalise */ if (LIKELY((ftp = csound->FTnp2Find(csound, p->ifn)) != NULL)) p->vibr = ftp; else { /* Expect sine wave */ return csound->InitError(csound, Str("No table for wgbow vibrato")); } if (*p->lowestFreq>=FL(0.0)) { /* If no init skip */ if (*p->lowestFreq!=FL(0.0)) { length = (int32) (CS_ESR / *p->lowestFreq + FL(1.0)); p->limit = *p->lowestFreq; } else if (*p->frequency!=FL(0.0)) { length = (int32) (CS_ESR / *p->frequency + FL(1.0)); p->limit = *p->frequency; } else { csound->Warning(csound, Str("unknown lowest frequency for bowed string " "-- assuming 50Hz\n")); length = (int32) (CS_ESR / FL(50.0) + FL(1.0)); p->limit = FL(50.0); } make_DLineL(csound, &p->neckDelay, length); length = length >> 1; /* Unsure about this; seems correct in later code */ make_DLineL(csound, &p->bridgeDelay, length); /* p->bowTabl.offSet = FL(0.0);*/ /* offset is a bias, really not needed unless */ /* friction is different in each direction */ /* p->bowTabl.slope contrls width of friction pulse, related to bowForce */ p->bowTabl.slope = FL(3.0); make_OnePole(&p->reflFilt); make_BiQuad(&p->bodyFilt); make_ADSR(&p->adsr); DLineL_setDelay(&p->neckDelay, FL(100.0)); DLineL_setDelay(&p->bridgeDelay, FL(29.0)); OnePole_setPole(&p->reflFilt, FL(0.6) - (FL(0.1) * RATE_NORM)); OnePole_setGain(&p->reflFilt, FL(0.95)); BiQuad_setFreqAndReson(p->bodyFilt, FL(500.0), FL(0.85)); BiQuad_setEqualGainZeroes(p->bodyFilt); BiQuad_setGain(p->bodyFilt, FL(0.2)); ADSR_setAllTimes(csound, &p->adsr, FL(0.02), FL(0.005), FL(0.9), FL(0.01)); /* ADSR_setAll(&p->adsr, 0.002f,0.01f,0.9f,0.01f); */ p->adsr.target = FL(1.0); p->adsr.rate = p->adsr.attackRate; p->adsr.state = ATTACK; p->maxVelocity = FL(0.03) + (FL(0.2) * amp); p->lastpress = FL(0.0); /* Set unknown state */ p->lastfreq = FL(0.0); p->lastbeta = FL(0.0); /* Remember states */ p->lastamp = amp; } return OK; }
int fluteset(CSOUND *csound, FLUTE *p) { FUNC *ftp; int32 length; if (LIKELY((ftp = csound->FTnp2Find(csound, p->ifn)) != NULL)) p->vibr = ftp; else { /* Expect sine wave */ return csound->InitError(csound, Str("No table for Flute")); } if (*p->lowestFreq>=FL(0.0)) { /* Skip initialisation?? */ if (*p->lowestFreq!=FL(0.0)) { length = (int32) (CS_ESR / *p->lowestFreq + FL(1.0)); p->limit = *p->lowestFreq; } else if (*p->frequency!=FL(0.0)) { length = (int32) (CS_ESR / *p->frequency + FL(1.0)); p->limit = *p->frequency; } else { csound->Warning(csound, Str("No base frequency for flute " "-- assumed to be 50Hz\n")); length = (int32) (CS_ESR / FL(50.0) + FL(1.0)); p->limit = FL(50.0); } make_DLineL(csound, &p->boreDelay, length); length = length >> 1; /* ??? really; yes from later version */ make_DLineL(csound, &p->jetDelay, length); make_OnePole(&p->filter); make_DCBlock(&p->dcBlock); make_Noise(p->noise); make_ADSR(&p->adsr); /* Clear */ /* OnePole_clear(&p->filter); */ /* DCBlock_clear(&p->dcBlock); */ /* End Clear */ /* DLineL_setDelay(&p->boreDelay, 100.0f); */ /* DLineL_setDelay(&p->jetDelay, 49.0f); */ OnePole_setPole(&p->filter, FL(0.7) - (FL(0.1) * RATE_NORM)); OnePole_setGain(&p->filter, -FL(1.0)); ADSR_setAllTimes(csound, &p->adsr, FL(0.005), FL(0.01), FL(0.8), FL(0.010)); /* ADSR_setAll(&p->adsr, 0.02f, 0.05f, 0.8f, 0.001f); */ /* Suggested values */ /* p->endRefl = 0.5; */ /* p->jetRefl = 0.5; */ /* p->noiseGain = 0.15; */ /* Breath pressure random component */ /* p->vibrGain = 0.05; */ /* breath periodic vibrato component */ /* p->jetRatio = 0.32; */ p->lastamp = FL(1.0); /* Remember */ /* This should be controlled by attack */ ADSR_setAttackRate(csound, &p->adsr, FL(0.02)); p->maxPress = FL(2.3) / FL(0.8); p->outputGain = FL(1.001); ADSR_keyOn(&p->adsr); p->kloop = (MYFLT)((int)(p->h.insdshead->offtim*CS_EKR - CS_EKR*(*p->dettack))); p->lastFreq = FL(0.0); p->lastJet = -FL(1.0); /* freq = (2/3)*p->frequency as we're overblowing here */ /* but 1/(2/3) is 1.5 so multiply for speed */ } return OK; }