3 void tubasound(entity e, float restart)
22 m = e.note % Tuba_PitchStep;
25 if(e.note - m < TUBA_MIN)
28 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
29 p1 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
31 else if(e.note - m + Tuba_PitchStep > TUBA_MAX)
34 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
35 p1 = pow(2.0, m / 12.0);
40 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m);
41 f1 = cos(M_PI_2 * m / Tuba_PitchStep);
42 p1 = pow(2.0, m / 12.0);
44 snd2 = TUBA_STARTNOTE(e.tuba_instrument, e.note - m + Tuba_PitchStep);
45 f2 = sin(M_PI_2 * m / Tuba_PitchStep);
46 p2 = pow(2.0, (m - Tuba_PitchStep) / 12.0);
52 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
55 sound7(e, CH_TUBA_SINGLE, snd1, e.cnt * f1, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p1, 0);
57 sound7(e.enemy, CH_TUBA_SINGLE, snd2, e.cnt * f2, e.attenuate * autocvar_g_balance_tuba_attenuation, 100 * p2, 0);
62 snd1 = TUBA_STARTNOTE(e.tuba_instrument, e.note);
63 sound(e, CH_TUBA_SINGLE, snd1, e.cnt, e.attenuate * autocvar_g_balance_tuba_attenuation);
67 void Ent_TubaNote_Think()
70 f = autocvar_g_balance_tuba_fadetime;
72 self.cnt -= frametime * self.count / f;
75 self.nextthink = time;
78 sound(self, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
81 sound(self.enemy, CH_TUBA_SINGLE, "misc/null.wav", 0, 0);
92 void Ent_TubaNote_UpdateSound()
94 self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
95 self.enemy.count = self.enemy.cnt;
96 self.enemy.note = self.note;
97 self.enemy.tuba_instrument = self.tuba_instrument;
98 tubasound(self.enemy, 1);
101 void Ent_TubaNote_StopSound()
103 self.enemy.nextthink = time;
107 void Ent_TubaNote(float bIsNew)
122 if(n != self.note || i != self.tuba_instrument || bIsNew)
125 Ent_TubaNote_StopSound();
130 self.enemy = spawn();
131 self.enemy.classname = "tuba_note";
134 self.enemy.enemy = spawn();
135 self.enemy.enemy.classname = "tuba_note_2";
140 self.enemy.attenuate = att;
145 self.tuba_instrument = i;
152 self.enemy.origin_x = ReadCoord();
153 self.enemy.origin_y = ReadCoord();
154 self.enemy.origin_z = ReadCoord();
155 setorigin(self.enemy, self.enemy.origin);
157 setorigin(self.enemy.enemy, self.enemy.origin);
160 self.think = Ent_TubaNote_StopSound;
161 self.entremove = Ent_TubaNote_StopSound;
162 self.enemy.think = Ent_TubaNote_Think;
163 self.enemy.nextthink = time + 10;
166 Ent_TubaNote_UpdateSound();
173 Tuba_PitchStep = autocvar_g_balance_tuba_pitchstep;
176 if(!checkextension("DP_SND_SOUND7_WIP2") && !checkextension("DP_SND_SOUND7"))
178 print("^1NOTE:^7 requested pitch shifting, but not supported by this engine build\n");
182 for(n = TUBA_MIN; n <= TUBA_MAX; ++n)
184 if(!Tuba_PitchStep || ((n % Tuba_PitchStep) == 0))
186 for(i = 0; i < TUBA_INSTRUMENTS; ++i)
187 precache_sound(TUBA_STARTNOTE(i, n));