2 * Routines for Gravis UltraSound soundcards - Simple instrument handlers
3 * Copyright (c) by Jaroslav Kysela <perex@suse.cz>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <sound/driver.h>
23 #include <linux/time.h>
24 #include <sound/core.h>
25 #include <sound/gus.h>
26 #include "gus_tables.h"
32 static void interrupt_wave(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
);
33 static void interrupt_volume(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
);
34 static void interrupt_effect(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
);
36 static void sample_start(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, snd_seq_position_t position
);
37 static void sample_stop(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, int mode
);
38 static void sample_freq(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, snd_seq_frequency_t freq
);
39 static void sample_volume(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
, struct snd_seq_ev_volume
*volume
);
40 static void sample_loop(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
, struct snd_seq_ev_loop
*loop
);
41 static void sample_pos(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
, snd_seq_position_t position
);
42 static void sample_private1(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
, unsigned char *data
);
44 static struct snd_gus_sample_ops sample_ops
= {
56 static void note_stop(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, int wait
);
57 static void note_wait(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
);
58 static void note_off(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
);
59 static void note_volume(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
60 static void note_pitchbend(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
61 static void note_vibrato(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
62 static void note_tremolo(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
64 static struct snd_gus_note_handlers note_commands
= {
74 static void chn_trigger_down(struct snd_gus_card
*card
, ultra_channel_t
*channel
, ultra_instrument_t
*instrument
, unsigned char note
, unsigned char velocity
, unsigned char priority
);
75 static void chn_trigger_up( ultra_card_t
*card
, ultra_note_t
*note
);
76 static void chn_control( ultra_card_t
*card
, ultra_channel_t
*channel
, unsigned short p1
, unsigned short p2
);
78 static struct ULTRA_STRU_INSTRUMENT_CHANNEL_COMMANDS channel_commands
= {
86 static void do_volume_envelope(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
87 static void do_pan_envelope(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
);
93 static void interrupt_wave(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
)
95 spin_lock(&gus
->event_lock
);
96 snd_gf1_stop_voice(gus
, voice
->number
);
97 spin_lock(&gus
->reg_lock
);
98 snd_gf1_select_voice(gus
, voice
->number
);
99 snd_gf1_write16(gus
, SNDRV_GF1_VW_VOLUME
, 0);
100 spin_unlock(&gus
->reg_lock
);
101 voice
->flags
&= ~SNDRV_GF1_VFLG_RUNNING
;
102 spin_unlock(&gus
->event_lock
);
105 static void interrupt_volume(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
)
107 spin_lock(&gus
->event_lock
);
108 if (voice
->flags
& SNDRV_GF1_VFLG_RUNNING
)
109 do_volume_envelope(gus
, voice
);
111 snd_gf1_stop_voice(gus
, voice
->number
);
112 spin_unlock(&gus
->event_lock
);
115 static void interrupt_effect(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
)
117 spin_lock(&gus
->event_lock
);
118 if ((voice
->flags
& (SNDRV_GF1_VFLG_RUNNING
|SNDRV_GF1_VFLG_EFFECT_TIMER1
)) ==
119 (SNDRV_GF1_VFLG_RUNNING
|SNDRV_GF1_VFLG_EFFECT_TIMER1
))
120 do_pan_envelope(gus
, voice
);
121 spin_unlock(&gus
->event_lock
);
128 static void do_volume_envelope(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
)
130 unsigned short next
, rate
, old_volume
;
131 int program_next_ramp
;
134 if (!gus
->gf1
.volume_ramp
) {
135 spin_lock_irqsave(&gus
->reg_lock
, flags
);
136 snd_gf1_select_voice(gus
, voice
->number
);
137 snd_gf1_ctrl_stop(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
);
138 snd_gf1_write16(gus
, SNDRV_GF1_VW_VOLUME
, voice
->gf1_volume
);
139 /* printk("gf1_volume = 0x%x\n", voice->gf1_volume); */
140 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
143 program_next_ramp
= 0;
146 program_next_ramp
= 0;
148 switch (voice
->venv_state
) {
150 voice
->venv_state
= VENV_ATTACK
;
151 voice
->venv_value_next
= 0;
152 spin_lock_irqsave(&gus
->reg_lock
, flags
);
153 snd_gf1_select_voice(gus
, voice
->number
);
154 snd_gf1_ctrl_stop(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
);
155 snd_gf1_write16(gus
, SNDRV_GF1_VW_VOLUME
, SNDRV_GF1_MIN_VOLUME
);
156 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
159 voice
->venv_state
= VENV_SUSTAIN
;
162 rate
= gus
->gf1
.volume_ramp
;
165 voice
->venv_state
= VENV_RELEASE
;
166 spin_lock_irqsave(&gus
->reg_lock
, flags
);
167 snd_gf1_select_voice(gus
, voice
->number
);
168 snd_gf1_ctrl_stop(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
);
169 snd_gf1_write16(gus
, SNDRV_GF1_VW_VOLUME
, ((int)voice
->gf1_volume
* (int)voice
->venv_value_next
) / 255);
170 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
173 voice
->venv_state
= VENV_DONE
;
176 rate
= gus
->gf1
.volume_ramp
;
179 snd_gf1_stop_voice(gus
, voice
->number
);
180 voice
->flags
&= ~SNDRV_GF1_VFLG_RUNNING
;
184 next
= voice
->venv_value_next
;
185 rate
= gus
->gf1
.volume_ramp
;
186 voice
->venv_state
= voice
->venv_state_prev
;
189 voice
->venv_value_next
= next
;
190 if (!program_next_ramp
)
192 spin_lock_irqsave(&gus
->reg_lock
, flags
);
193 snd_gf1_select_voice(gus
, voice
->number
);
194 snd_gf1_ctrl_stop(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
);
195 old_volume
= snd_gf1_read16(gus
, SNDRV_GF1_VW_VOLUME
) >> 8;
197 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
200 next
= (((int)voice
->gf1_volume
* (int)next
) / 255) >> 8;
201 if (old_volume
< SNDRV_GF1_MIN_OFFSET
)
202 old_volume
= SNDRV_GF1_MIN_OFFSET
;
203 if (next
< SNDRV_GF1_MIN_OFFSET
)
204 next
= SNDRV_GF1_MIN_OFFSET
;
205 if (next
> SNDRV_GF1_MAX_OFFSET
)
206 next
= SNDRV_GF1_MAX_OFFSET
;
207 if (old_volume
== next
) {
208 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
211 voice
->volume_control
&= ~0xc3;
212 voice
->volume_control
|= 0x20;
213 if (old_volume
> next
) {
214 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_START
, next
);
215 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_END
, old_volume
);
216 voice
->volume_control
|= 0x40;
218 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_START
, old_volume
);
219 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_END
, next
);
221 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_RATE
, rate
);
222 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
, voice
->volume_control
);
223 if (!gus
->gf1
.enh_mode
) {
225 snd_gf1_write8(gus
, SNDRV_GF1_VB_VOLUME_CONTROL
, voice
->volume_control
);
227 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
232 static void do_pan_envelope(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
)
235 unsigned char old_pan
;
238 snd_gf1_select_voice(gus
, voice
->number
);
239 printk(" -%i- do_pan_envelope - flags = 0x%x (0x%x -> 0x%x)\n",
243 snd_gf1_i_read8(gus
, SNDRV_GF1_VB_PAN
) & 0x0f);
245 if (gus
->gf1
.enh_mode
) {
246 voice
->flags
&= ~(SNDRV_GF1_VFLG_EFFECT_TIMER1
|SNDRV_GF1_VFLG_PAN
);
249 if (!gus
->gf1
.smooth_pan
) {
250 spin_lock_irqsave(&gus
->reg_lock
, flags
);
251 snd_gf1_select_voice(gus
, voice
->number
);
252 snd_gf1_write8(gus
, SNDRV_GF1_VB_PAN
, voice
->gf1_pan
);
253 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
256 if (!(voice
->flags
& SNDRV_GF1_VFLG_PAN
)) /* before */
257 voice
->flags
|= SNDRV_GF1_VFLG_EFFECT_TIMER1
|SNDRV_GF1_VFLG_PAN
;
258 spin_lock_irqsave(&gus
->reg_lock
, flags
);
259 snd_gf1_select_voice(gus
, voice
->number
);
260 old_pan
= snd_gf1_read8(gus
, SNDRV_GF1_VB_PAN
) & 0x0f;
261 if (old_pan
> voice
->gf1_pan
)
263 if (old_pan
< voice
->gf1_pan
)
265 snd_gf1_write8(gus
, SNDRV_GF1_VB_PAN
, old_pan
);
266 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
267 if (old_pan
== voice
->gf1_pan
) /* the goal was reached */
268 voice
->flags
&= ~(SNDRV_GF1_VFLG_EFFECT_TIMER1
|SNDRV_GF1_VFLG_PAN
);
270 snd_gf1_select_voice(gus
, voice
->number
);
271 printk(" -%i- (1) do_pan_envelope - flags = 0x%x (0x%x -> 0x%x)\n",
275 snd_gf1_i_read8(gus
, GF1_VB_PAN
) & 0x0f);
279 static void set_enhanced_pan(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, unsigned short pan
)
282 unsigned short vlo
, vro
;
284 vlo
= SNDRV_GF1_ATTEN((SNDRV_GF1_ATTEN_TABLE_SIZE
-1) - pan
);
285 vro
= SNDRV_GF1_ATTEN(pan
);
286 if (pan
!= SNDRV_GF1_ATTEN_TABLE_SIZE
- 1 && pan
!= 0) {
293 printk("vlo = 0x%x (0x%x), vro = 0x%x (0x%x)\n",
294 vlo
, snd_gf1_i_read16(gus
, GF1_VW_OFFSET_LEFT
),
295 vro
, snd_gf1_i_read16(gus
, GF1_VW_OFFSET_RIGHT
));
297 spin_lock_irqsave(&gus
->reg_lock
, flags
);
298 snd_gf1_select_voice(gus
, voice
->number
);
299 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_LEFT_FINAL
, vlo
);
300 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_RIGHT_FINAL
, vro
);
301 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
310 static void sample_start(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, snd_seq_position_t position
)
313 unsigned int begin
, addr
, addr_end
, addr_start
;
315 struct simple_instrument
*simple
;
316 struct snd_seq_kinstr
*instr
;
318 instr
= snd_seq_instr_find(gus
->gf1
.ilist
, &voice
->instr
, 0, 1);
321 voice
->instr
= instr
->instr
; /* copy ID to speedup aliases */
322 simple
= KINSTR_DATA(instr
);
323 begin
= simple
->address
.memory
<< 4;
324 w_16
= simple
->format
& SIMPLE_WAVE_16BIT
? 0x04 : 0;
325 addr_start
= simple
->loop_start
;
326 if (simple
->format
& SIMPLE_WAVE_LOOP
) {
327 addr_end
= simple
->loop_end
;
329 addr_end
= (simple
->size
<< 4) - (w_16
? 40 : 24);
331 if (simple
->format
& SIMPLE_WAVE_BACKWARD
) {
332 addr
= simple
->loop_end
;
333 if (position
< simple
->loop_end
)
338 voice
->control
= 0x00;
339 voice
->mode
= 0x20; /* enable offset registers */
340 if (simple
->format
& SIMPLE_WAVE_16BIT
)
341 voice
->control
|= 0x04;
342 if (simple
->format
& SIMPLE_WAVE_BACKWARD
)
343 voice
->control
|= 0x40;
344 if (simple
->format
& SIMPLE_WAVE_LOOP
) {
345 voice
->control
|= 0x08;
347 voice
->control
|= 0x20;
349 if (simple
->format
& SIMPLE_WAVE_BIDIR
)
350 voice
->control
|= 0x10;
351 if (simple
->format
& SIMPLE_WAVE_ULAW
)
354 addr
= ((addr
<< 1) & ~0x1f) | (addr
& 0x0f);
355 addr_start
= ((addr_start
<< 1) & ~0x1f) | (addr_start
& 0x0f);
356 addr_end
= ((addr_end
<< 1) & ~0x1f) | (addr_end
& 0x0f);
361 snd_gf1_stop_voice(gus
, voice
->number
);
362 spin_lock_irqsave(&gus
->reg_lock
, flags
);
363 snd_gf1_select_voice(gus
, voice
->number
);
364 snd_gf1_write16(gus
, SNDRV_GF1_VW_FREQUENCY
, voice
->fc_register
+ voice
->fc_lfo
);
365 voice
->venv_state
= VENV_BEFORE
;
366 voice
->volume_control
= 0x03;
367 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_START
, addr_start
, w_16
);
368 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_END
, addr_end
, w_16
);
369 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_CURRENT
, addr
, w_16
);
370 if (!gus
->gf1
.enh_mode
) {
371 snd_gf1_write8(gus
, SNDRV_GF1_VB_PAN
, voice
->gf1_pan
);
373 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_LEFT
, voice
->vlo
);
374 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_LEFT_FINAL
, voice
->vlo
);
375 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_RIGHT
, voice
->vro
);
376 snd_gf1_write16(gus
, SNDRV_GF1_VW_OFFSET_RIGHT_FINAL
, voice
->vro
);
377 snd_gf1_write8(gus
, SNDRV_GF1_VB_ACCUMULATOR
, voice
->effect_accumulator
);
378 snd_gf1_write16(gus
, SNDRV_GF1_VW_EFFECT_VOLUME
, voice
->gf1_effect_volume
);
379 snd_gf1_write16(gus
, SNDRV_GF1_VW_EFFECT_VOLUME_FINAL
, voice
->gf1_effect_volume
);
381 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
382 do_volume_envelope(gus
, voice
);
383 spin_lock_irqsave(&gus
->reg_lock
, flags
);
384 snd_gf1_select_voice(gus
, voice
->number
);
385 if (gus
->gf1
.enh_mode
)
386 snd_gf1_write8(gus
, SNDRV_GF1_VB_MODE
, voice
->mode
);
387 snd_gf1_write8(gus
, SNDRV_GF1_VB_ADDRESS_CONTROL
, voice
->control
);
388 if (!gus
->gf1
.enh_mode
) {
390 snd_gf1_write8(gus
, SNDRV_GF1_VB_ADDRESS_CONTROL
, voice
->control
);
392 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
394 snd_gf1_print_voice_registers(gus
);
396 voice
->flags
|= SNDRV_GF1_VFLG_RUNNING
;
397 snd_seq_instr_free_use(gus
->gf1
.ilist
, instr
);
400 static void sample_stop(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, int mode
)
402 unsigned char control
;
405 if (!(voice
->flags
& SNDRV_GF1_VFLG_RUNNING
))
409 if (gus
->gf1
.volume_ramp
> 0) {
410 if (voice
->venv_state
< VENV_RELEASE
) {
411 voice
->venv_state
= VENV_RELEASE
;
412 do_volume_envelope(gus
, voice
);
415 if (mode
!= SAMPLE_STOP_VENVELOPE
) {
416 snd_gf1_stop_voice(gus
, voice
->number
);
417 spin_lock_irqsave(&gus
->reg_lock
, flags
);
418 snd_gf1_select_voice(gus
, voice
->number
);
419 snd_gf1_write16(gus
, SNDRV_GF1_VW_VOLUME
, SNDRV_GF1_MIN_VOLUME
);
420 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
421 voice
->flags
&= ~SNDRV_GF1_VFLG_RUNNING
;
424 case SAMPLE_STOP_LOOP
: /* disable loop only */
425 spin_lock_irqsave(&gus
->reg_lock
, flags
);
426 snd_gf1_select_voice(gus
, voice
->number
);
427 control
= snd_gf1_read8(gus
, SNDRV_GF1_VB_ADDRESS_CONTROL
);
428 control
&= ~(0x83 | 0x04);
430 snd_gf1_write8(gus
, SNDRV_GF1_VB_ADDRESS_CONTROL
, control
);
431 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
436 static void sample_freq(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, snd_seq_frequency_t freq
)
440 spin_lock_irqsave(&gus
->reg_lock
, flags
);
441 voice
->fc_register
= snd_gf1_translate_freq(gus
, freq
);
442 snd_gf1_select_voice(gus
, voice
->number
);
443 snd_gf1_write16(gus
, SNDRV_GF1_VW_FREQUENCY
, voice
->fc_register
+ voice
->fc_lfo
);
444 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
447 static void sample_volume(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, struct snd_seq_ev_volume
*volume
)
449 if (volume
->volume
>= 0) {
450 volume
->volume
&= 0x3fff;
451 voice
->gf1_volume
= snd_gf1_lvol_to_gvol_raw(volume
->volume
<< 2) << 4;
452 voice
->venv_state_prev
= VENV_SUSTAIN
;
453 voice
->venv_state
= VENV_VOLUME
;
454 do_volume_envelope(gus
, voice
);
456 if (volume
->lr
>= 0) {
457 volume
->lr
&= 0x3fff;
458 if (!gus
->gf1
.enh_mode
) {
459 voice
->gf1_pan
= (volume
->lr
>> 10) & 15;
460 if (!gus
->gf1
.full_range_pan
) {
461 if (voice
->gf1_pan
== 0)
463 if (voice
->gf1_pan
== 15)
466 voice
->flags
&= ~SNDRV_GF1_VFLG_PAN
; /* before */
467 do_pan_envelope(gus
, voice
);
469 set_enhanced_pan(gus
, voice
, volume
->lr
>> 7);
474 static void sample_loop(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, struct snd_seq_ev_loop
*loop
)
477 int w_16
= voice
->control
& 0x04;
478 unsigned int begin
, addr_start
, addr_end
;
479 struct simple_instrument
*simple
;
480 struct snd_seq_kinstr
*instr
;
483 printk("voice_loop: start = 0x%x, end = 0x%x\n", loop
->start
, loop
->end
);
485 instr
= snd_seq_instr_find(gus
->gf1
.ilist
, &voice
->instr
, 0, 1);
488 voice
->instr
= instr
->instr
; /* copy ID to speedup aliases */
489 simple
= KINSTR_DATA(instr
);
490 begin
= simple
->address
.memory
;
491 addr_start
= loop
->start
;
492 addr_end
= loop
->end
;
493 addr_start
= (((addr_start
<< 1) & ~0x1f) | (addr_start
& 0x0f)) + begin
;
494 addr_end
= (((addr_end
<< 1) & ~0x1f) | (addr_end
& 0x0f)) + begin
;
495 spin_lock_irqsave(&gus
->reg_lock
, flags
);
496 snd_gf1_select_voice(gus
, voice
->number
);
497 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_START
, addr_start
, w_16
);
498 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_END
, addr_end
, w_16
);
499 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
500 snd_seq_instr_free_use(gus
->gf1
.ilist
, instr
);
503 static void sample_pos(struct snd_gus_card
*gus
, struct snd_gus_voice
*voice
, snd_seq_position_t position
)
506 int w_16
= voice
->control
& 0x04;
507 unsigned int begin
, addr
;
508 struct simple_instrument
*simple
;
509 struct snd_seq_kinstr
*instr
;
512 printk("voice_loop: start = 0x%x, end = 0x%x\n", loop
->start
, loop
->end
);
514 instr
= snd_seq_instr_find(gus
->gf1
.ilist
, &voice
->instr
, 0, 1);
517 voice
->instr
= instr
->instr
; /* copy ID to speedup aliases */
518 simple
= KINSTR_DATA(instr
);
519 begin
= simple
->address
.memory
;
520 addr
= (((position
<< 1) & ~0x1f) | (position
& 0x0f)) + begin
;
521 spin_lock_irqsave(&gus
->reg_lock
, flags
);
522 snd_gf1_select_voice(gus
, voice
->number
);
523 snd_gf1_write_addr(gus
, SNDRV_GF1_VA_CURRENT
, addr
, w_16
);
524 spin_unlock_irqrestore(&gus
->reg_lock
, flags
);
525 snd_seq_instr_free_use(gus
->gf1
.ilist
, instr
);
530 static unsigned char get_effects_mask( ultra_card_t
*card
, int value
)
532 if ( value
> 7 ) return 0;
533 if ( card
-> gf1
.effects
&& card
-> gf1
.effects
-> chip_type
== ULTRA_EFFECT_CHIP_INTERWAVE
)
534 return card
-> gf1
.effects
-> chip
.interwave
.voice_output
[ value
];
540 static void sample_private1(struct snd_gus_card
*card
, struct snd_gus_voice
*voice
, unsigned char *data
)
547 case ULTRA_PRIV1_IW_EFFECT
:
548 uc
= get_effects_mask( card
, ultra_get_byte( data
, 4 ) );
549 uc
|= get_effects_mask( card
, ultra_get_byte( data
, 4 ) >> 4 );
550 uc
|= get_effects_mask( card
, ultra_get_byte( data
, 5 ) );
551 uc
|= get_effects_mask( card
, ultra_get_byte( data
, 5 ) >> 4 );
552 voice
-> data
.simple
.effect_accumulator
= uc
;
553 voice
-> data
.simple
.effect_volume
= ultra_translate_voice_volume( card
, ultra_get_word( data
, 2 ) ) << 4;
554 if ( !card
-> gf1
.enh_mode
) return;
555 if ( voice
-> flags
& VFLG_WAIT_FOR_START
) return;
556 if ( voice
-> flags
& VFLG_RUNNING
)
559 gf1_select_voice( card
, voice
-> number
);
560 ultra_write8( card
, GF1_VB_ACCUMULATOR
, voice
-> data
.simple
.effect_accumulator
);
561 ultra_write16( card
, GF1_VW_EFFECT_VOLUME_FINAL
, voice
-> data
.simple
.effect_volume
);
565 case ULTRA_PRIV1_IW_LFO
:
566 ultra_lfo_command( card
, voice
-> number
, data
);
577 static void note_stop( ultra_card_t
*card
, ultra_voice_t
*voice
, int wait
)
581 static void note_wait( ultra_card_t
*card
, ultra_voice_t
*voice
)
585 static void note_off( ultra_card_t
*card
, ultra_voice_t
*voice
)
589 static void note_volume( ultra_card_t
*card
, ultra_voice_t
*voice
)
593 static void note_pitchbend( ultra_card_t
*card
, ultra_voice_t
*voice
)
597 static void note_vibrato( ultra_card_t
*card
, ultra_voice_t
*voice
)
601 static void note_tremolo( ultra_card_t
*card
, ultra_voice_t
*voice
)
609 static void chn_trigger_down( ultra_card_t
*card
, ultra_channel_t
*channel
, ultra_instrument_t
*instrument
, unsigned char note
, unsigned char velocity
, unsigned char priority
)
613 static void chn_trigger_up( ultra_card_t
*card
, ultra_note_t
*note
)
617 static void chn_control( ultra_card_t
*card
, ultra_channel_t
*channel
, unsigned short p1
, unsigned short p2
)
627 void snd_gf1_simple_init(struct snd_gus_voice
*voice
)
629 voice
->handler_wave
= interrupt_wave
;
630 voice
->handler_volume
= interrupt_volume
;
631 voice
->handler_effect
= interrupt_effect
;
632 voice
->volume_change
= NULL
;
633 voice
->sample_ops
= &sample_ops
;