1
/******************************************/
2
/* Waveguide Brass Instrument Model ala */
3
/* Cook (TBone, HosePlayer) */
4
/* by Perry R. Cook, 1995-96 */
6
/* This is a waveguide model, and thus */
7
/* relates to various Stanford Univ. */
8
/* and possibly Yamaha and other patents.*/
10
/* Controls: CONTROL1 = lipTension */
11
/* CONTROL2 = slideLength */
12
/* CONTROL3 = vibFreq */
13
/* MOD_WHEEL= vibAmt */
14
/******************************************/
17
#include "SKINI11.msg"
19
Brass :: Brass(MY_FLOAT lowestFreq)
21
length = (long) (SRATE / lowestFreq + 1);
22
delayLine = new DLineA(length);
23
lipFilter = new LipFilt;
24
dcBlock = new DCBlock;
26
adsr->setAllTimes((MY_FLOAT) 0.005, (MY_FLOAT) 0.001, (MY_FLOAT) 1.0, (MY_FLOAT) 0.010);
28
// Concatenate the STK RAWWAVE_PATH to the rawwave file
30
strcpy(file, RAWWAVE_PATH);
31
vibr = new RawWvIn(strcat(file,"rawwaves/sinewave.raw"),"looping");
34
vibr->setFreq((MY_FLOAT) 6.137);
35
vibrGain = (MY_FLOAT) 0.05; /* breath periodic vibrato component */
37
maxPressure = (MY_FLOAT) 0.0;
56
void Brass :: setFreq(MY_FLOAT frequency)
58
slideTarget = (SRATE / frequency * (MY_FLOAT) 2.0) + (MY_FLOAT) 3.0;
59
/* fudge correction for filter delays */
60
delayLine->setDelay(slideTarget); /* we'll play a harmonic */
61
lipTarget = frequency;
62
lipFilter->setFreq(frequency);
65
void Brass :: setLip(MY_FLOAT frequency)
67
lipFilter->setFreq(frequency);
70
void Brass :: startBlowing(MY_FLOAT amplitude,MY_FLOAT rate)
72
adsr->setAttackRate(rate);
73
maxPressure = amplitude;
77
void Brass :: stopBlowing(MY_FLOAT rate)
79
adsr->setReleaseRate(rate);
83
void Brass :: noteOn(MY_FLOAT freq, MY_FLOAT amp)
86
this->startBlowing(amp, amp * (MY_FLOAT) 0.001);
88
printf("Brass : NoteOn: Freq=%lf Amp=%lf\n",freq,amp);
92
void Brass :: noteOff(MY_FLOAT amp)
94
this->stopBlowing(amp * (MY_FLOAT) 0.005);
96
printf("Brass : NoteOff: Amp=%lf\n",amp);
100
MY_FLOAT Brass :: tick()
102
MY_FLOAT breathPressure;
104
breathPressure = maxPressure * adsr->tick();
105
breathPressure += vibrGain * vibr->tick();
106
lastOutput = delayLine->tick( /* bore delay */
107
dcBlock->tick( /* block DC */
108
lipFilter->tick((MY_FLOAT) 0.3 * breathPressure, /* mouth input */
109
(MY_FLOAT) 0.85 * delayLine->lastOut()))); /* and bore reflection */
113
void Brass :: controlChange(int number, MY_FLOAT value)
117
printf("Brass : ControlChange: Number=%i Value=%f\n",number,value);
119
if (number == __SK_LipTension_) {
120
temp = lipTarget * (MY_FLOAT) pow(4.0,(2.0*value*NORM_7) - 1.0);
123
else if (number == __SK_SlideLength_)
124
delayLine->setDelay(slideTarget * ((MY_FLOAT) 0.5 + (value * NORM_7)));
125
else if (number == __SK_ModFrequency_)
126
vibr->setFreq((value * NORM_7 * (MY_FLOAT) 12.0));
127
else if (number == __SK_ModWheel_ )
128
vibrGain = (value * NORM_7 * (MY_FLOAT) 0.4);
129
else if (number == __SK_AfterTouch_Cont_)
130
adsr->setTarget(value * NORM_7);
132
printf("Brass : Undefined Control Number!!\n");