1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Midi synth routines for the Emu8k/Emu10k1
5 * Copyright (C) 1999 Steve Ratcliffe
6 * Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
8 * Contains code based on awe_wave.c by Takashi Iwai
11 #include <linux/export.h>
12 #include "emux_voice.h"
13 #include <sound/asoundef.h>
20 * Ensure a value is between two points
21 * macro evaluates its args more than once, so changed to upper-case.
23 #define LIMITVALUE(x, a, b) do { if ((x) < (a)) (x) = (a); else if ((x) > (b)) (x) = (b); } while (0)
24 #define LIMITMAX(x, a) do {if ((x) > (a)) (x) = (a); } while (0)
26 static int get_zone(struct snd_emux
*emu
, struct snd_emux_port
*port
,
27 int *notep
, int vel
, struct snd_midi_channel
*chan
,
28 struct snd_sf_zone
**table
);
29 static int get_bank(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
);
30 static void terminate_note1(struct snd_emux
*emu
, int note
,
31 struct snd_midi_channel
*chan
, int free
);
32 static void exclusive_note_off(struct snd_emux
*emu
, struct snd_emux_port
*port
,
34 static void terminate_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int free
);
35 static void update_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int update
);
36 static void setup_voice(struct snd_emux_voice
*vp
);
37 static int calc_pan(struct snd_emux_voice
*vp
);
38 static int calc_volume(struct snd_emux_voice
*vp
);
39 static int calc_pitch(struct snd_emux_voice
*vp
);
46 snd_emux_note_on(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
50 struct snd_emux_voice
*vp
;
51 struct snd_sf_zone
*table
[SNDRV_EMUX_MAX_MULTI_VOICES
];
53 struct snd_emux_port
*port
;
56 if (snd_BUG_ON(!port
|| !chan
))
60 if (snd_BUG_ON(!emu
|| !emu
->ops
.get_voice
|| !emu
->ops
.trigger
))
63 key
= note
; /* remember the original note */
64 nvoices
= get_zone(emu
, port
, ¬e
, vel
, chan
, table
);
68 /* exclusive note off */
69 for (i
= 0; i
< nvoices
; i
++) {
70 struct snd_sf_zone
*zp
= table
[i
];
71 if (zp
&& zp
->v
.exclusiveClass
)
72 exclusive_note_off(emu
, port
, zp
->v
.exclusiveClass
);
75 #if 0 // seems not necessary
76 /* Turn off the same note on the same channel. */
77 terminate_note1(emu
, key
, chan
, 0);
80 spin_lock_irqsave(&emu
->voice_lock
, flags
);
81 for (i
= 0; i
< nvoices
; i
++) {
83 /* set up each voice parameter */
84 /* at this stage, we don't trigger the voice yet. */
89 vp
= emu
->ops
.get_voice(emu
, port
);
90 if (vp
== NULL
|| vp
->ch
< 0)
92 if (STATE_IS_PLAYING(vp
->state
))
93 emu
->ops
.terminate(vp
);
95 vp
->time
= emu
->use_time
++;
102 if (vp
->zone
->sample
)
103 vp
->block
= vp
->zone
->sample
->block
;
109 vp
->state
= SNDRV_EMUX_ST_STANDBY
;
110 if (emu
->ops
.prepare
) {
111 vp
->state
= SNDRV_EMUX_ST_OFF
;
112 if (emu
->ops
.prepare(vp
) >= 0)
113 vp
->state
= SNDRV_EMUX_ST_STANDBY
;
117 /* start envelope now */
118 for (i
= 0; i
< emu
->max_voices
; i
++) {
119 vp
= &emu
->voices
[i
];
120 if (vp
->state
== SNDRV_EMUX_ST_STANDBY
&&
122 emu
->ops
.trigger(vp
);
123 vp
->state
= SNDRV_EMUX_ST_ON
;
124 vp
->ontime
= jiffies
; /* remember the trigger timing */
127 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
129 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
130 if (port
->port_mode
== SNDRV_EMUX_PORT_MODE_OSS_SYNTH
) {
131 /* clear voice position for the next note on this channel */
132 struct snd_emux_effect_table
*fx
= chan
->private;
134 fx
->flag
[EMUX_FX_SAMPLE_START
] = 0;
135 fx
->flag
[EMUX_FX_COARSE_SAMPLE_START
] = 0;
142 * Release a note in response to a midi note off.
145 snd_emux_note_off(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
148 struct snd_emux
*emu
;
149 struct snd_emux_voice
*vp
;
151 struct snd_emux_port
*port
;
154 if (snd_BUG_ON(!port
|| !chan
))
158 if (snd_BUG_ON(!emu
|| !emu
->ops
.release
))
161 spin_lock_irqsave(&emu
->voice_lock
, flags
);
162 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
163 vp
= &emu
->voices
[ch
];
164 if (STATE_IS_PLAYING(vp
->state
) &&
165 vp
->chan
== chan
&& vp
->key
== note
) {
166 vp
->state
= SNDRV_EMUX_ST_RELEASED
;
167 if (vp
->ontime
== jiffies
) {
168 /* if note-off is sent too shortly after
169 * note-on, emuX engine cannot produce the sound
170 * correctly. so we'll release this note
171 * a bit later via timer callback.
173 vp
->state
= SNDRV_EMUX_ST_PENDING
;
174 if (! emu
->timer_active
) {
175 mod_timer(&emu
->tlist
, jiffies
+ 1);
176 emu
->timer_active
= 1;
179 /* ok now release the note */
180 emu
->ops
.release(vp
);
183 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
189 * release the pending note-offs
191 void snd_emux_timer_callback(struct timer_list
*t
)
193 struct snd_emux
*emu
= from_timer(emu
, t
, tlist
);
194 struct snd_emux_voice
*vp
;
196 int ch
, do_again
= 0;
198 spin_lock_irqsave(&emu
->voice_lock
, flags
);
199 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
200 vp
= &emu
->voices
[ch
];
201 if (vp
->state
== SNDRV_EMUX_ST_PENDING
) {
202 if (vp
->ontime
== jiffies
)
203 do_again
++; /* release this at the next interrupt */
205 emu
->ops
.release(vp
);
206 vp
->state
= SNDRV_EMUX_ST_RELEASED
;
211 mod_timer(&emu
->tlist
, jiffies
+ 1);
212 emu
->timer_active
= 1;
214 emu
->timer_active
= 0;
215 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
219 * key pressure change
222 snd_emux_key_press(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
225 struct snd_emux
*emu
;
226 struct snd_emux_voice
*vp
;
228 struct snd_emux_port
*port
;
231 if (snd_BUG_ON(!port
|| !chan
))
235 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
238 spin_lock_irqsave(&emu
->voice_lock
, flags
);
239 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
240 vp
= &emu
->voices
[ch
];
241 if (vp
->state
== SNDRV_EMUX_ST_ON
&&
242 vp
->chan
== chan
&& vp
->key
== note
) {
244 update_voice(emu
, vp
, SNDRV_EMUX_UPDATE_VOLUME
);
247 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
252 * Modulate the voices which belong to the channel
255 snd_emux_update_channel(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
, int update
)
257 struct snd_emux
*emu
;
258 struct snd_emux_voice
*vp
;
266 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
269 spin_lock_irqsave(&emu
->voice_lock
, flags
);
270 for (i
= 0; i
< emu
->max_voices
; i
++) {
271 vp
= &emu
->voices
[i
];
272 if (vp
->chan
== chan
)
273 update_voice(emu
, vp
, update
);
275 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
279 * Modulate all the voices which belong to the port.
282 snd_emux_update_port(struct snd_emux_port
*port
, int update
)
284 struct snd_emux
*emu
;
285 struct snd_emux_voice
*vp
;
293 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
296 spin_lock_irqsave(&emu
->voice_lock
, flags
);
297 for (i
= 0; i
< emu
->max_voices
; i
++) {
298 vp
= &emu
->voices
[i
];
299 if (vp
->port
== port
)
300 update_voice(emu
, vp
, update
);
302 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
307 * Deal with a controller type event. This includes all types of
308 * control events, not just the midi controllers
311 snd_emux_control(void *p
, int type
, struct snd_midi_channel
*chan
)
313 struct snd_emux_port
*port
;
316 if (snd_BUG_ON(!port
|| !chan
))
320 case MIDI_CTL_MSB_MAIN_VOLUME
:
321 case MIDI_CTL_MSB_EXPRESSION
:
322 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_VOLUME
);
325 case MIDI_CTL_MSB_PAN
:
326 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_PAN
);
329 case MIDI_CTL_SOFT_PEDAL
:
330 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
331 /* FIXME: this is an emulation */
332 if (chan
->control
[type
] >= 64)
333 snd_emux_send_effect(port
, chan
, EMUX_FX_CUTOFF
, -160,
336 snd_emux_send_effect(port
, chan
, EMUX_FX_CUTOFF
, 0,
341 case MIDI_CTL_PITCHBEND
:
342 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_PITCH
);
345 case MIDI_CTL_MSB_MODWHEEL
:
346 case MIDI_CTL_CHAN_PRESSURE
:
347 snd_emux_update_channel(port
, chan
,
348 SNDRV_EMUX_UPDATE_FMMOD
|
349 SNDRV_EMUX_UPDATE_FM2FRQ2
);
354 if (port
->chset
.midi_mode
== SNDRV_MIDI_MODE_XG
) {
355 snd_emux_xg_control(port
, chan
, type
);
361 * terminate note - if free flag is true, free the terminated voice
364 terminate_note1(struct snd_emux
*emu
, int note
, struct snd_midi_channel
*chan
, int free
)
367 struct snd_emux_voice
*vp
;
370 spin_lock_irqsave(&emu
->voice_lock
, flags
);
371 for (i
= 0; i
< emu
->max_voices
; i
++) {
372 vp
= &emu
->voices
[i
];
373 if (STATE_IS_PLAYING(vp
->state
) && vp
->chan
== chan
&&
375 terminate_voice(emu
, vp
, free
);
377 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
382 * terminate note - exported for midi emulation
385 snd_emux_terminate_note(void *p
, int note
, struct snd_midi_channel
*chan
)
387 struct snd_emux
*emu
;
388 struct snd_emux_port
*port
;
391 if (snd_BUG_ON(!port
|| !chan
))
395 if (snd_BUG_ON(!emu
|| !emu
->ops
.terminate
))
398 terminate_note1(emu
, note
, chan
, 1);
403 * Terminate all the notes
406 snd_emux_terminate_all(struct snd_emux
*emu
)
409 struct snd_emux_voice
*vp
;
412 spin_lock_irqsave(&emu
->voice_lock
, flags
);
413 for (i
= 0; i
< emu
->max_voices
; i
++) {
414 vp
= &emu
->voices
[i
];
415 if (STATE_IS_PLAYING(vp
->state
))
416 terminate_voice(emu
, vp
, 0);
417 if (vp
->state
== SNDRV_EMUX_ST_OFF
) {
418 if (emu
->ops
.free_voice
)
419 emu
->ops
.free_voice(vp
);
421 emu
->ops
.reset(emu
, i
);
425 /* initialize allocation time */
427 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
430 EXPORT_SYMBOL(snd_emux_terminate_all
);
433 * Terminate all voices associated with the given port
436 snd_emux_sounds_off_all(struct snd_emux_port
*port
)
439 struct snd_emux
*emu
;
440 struct snd_emux_voice
*vp
;
443 if (snd_BUG_ON(!port
))
446 if (snd_BUG_ON(!emu
|| !emu
->ops
.terminate
))
449 spin_lock_irqsave(&emu
->voice_lock
, flags
);
450 for (i
= 0; i
< emu
->max_voices
; i
++) {
451 vp
= &emu
->voices
[i
];
452 if (STATE_IS_PLAYING(vp
->state
) &&
454 terminate_voice(emu
, vp
, 0);
455 if (vp
->state
== SNDRV_EMUX_ST_OFF
) {
456 if (emu
->ops
.free_voice
)
457 emu
->ops
.free_voice(vp
);
459 emu
->ops
.reset(emu
, i
);
462 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
467 * Terminate all voices that have the same exclusive class. This
468 * is mainly for drums.
471 exclusive_note_off(struct snd_emux
*emu
, struct snd_emux_port
*port
, int exclass
)
473 struct snd_emux_voice
*vp
;
477 spin_lock_irqsave(&emu
->voice_lock
, flags
);
478 for (i
= 0; i
< emu
->max_voices
; i
++) {
479 vp
= &emu
->voices
[i
];
480 if (STATE_IS_PLAYING(vp
->state
) && vp
->port
== port
&&
481 vp
->reg
.exclusiveClass
== exclass
) {
482 terminate_voice(emu
, vp
, 0);
485 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
490 * if free flag is true, call free_voice after termination
493 terminate_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int free
)
495 emu
->ops
.terminate(vp
);
496 vp
->time
= emu
->use_time
++;
501 vp
->state
= SNDRV_EMUX_ST_OFF
;
502 if (free
&& emu
->ops
.free_voice
)
503 emu
->ops
.free_voice(vp
);
511 update_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int update
)
513 if (!STATE_IS_PLAYING(vp
->state
))
516 if (vp
->chan
== NULL
|| vp
->port
== NULL
)
518 if (update
& SNDRV_EMUX_UPDATE_VOLUME
)
520 if (update
& SNDRV_EMUX_UPDATE_PITCH
)
522 if (update
& SNDRV_EMUX_UPDATE_PAN
) {
523 if (! calc_pan(vp
) && (update
== SNDRV_EMUX_UPDATE_PAN
))
526 emu
->ops
.update(vp
, update
);
531 /* table for volume target calculation */
532 static const unsigned short voltarget
[16] = {
533 0xEAC0, 0xE0C8, 0xD740, 0xCE20, 0xC560, 0xBD08, 0xB500, 0xAD58,
534 0xA5F8, 0x9EF0, 0x9830, 0x91C0, 0x8B90, 0x85A8, 0x8000, 0x7A90
538 #define LO_BYTE(v) ((v) & 0xff)
539 #define HI_BYTE(v) (((v) >> 8) & 0xff)
542 * Sets up the voice structure by calculating some values that
543 * will be needed later.
546 setup_voice(struct snd_emux_voice
*vp
)
548 struct soundfont_voice_parm
*parm
;
551 /* copy the original register values */
552 vp
->reg
= vp
->zone
->v
;
554 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
555 snd_emux_setup_effect(vp
);
567 parm
= &vp
->reg
.parm
;
569 /* compute filter target and correct modulation parameters */
570 if (LO_BYTE(parm
->modatkhld
) >= 0x80 && parm
->moddelay
>= 0x8000) {
571 parm
->moddelay
= 0xbfff;
572 pitch
= (HI_BYTE(parm
->pefe
) << 4) + vp
->apitch
;
575 /* calculate filter target */
576 vp
->ftarget
= parm
->cutoff
+ LO_BYTE(parm
->pefe
);
577 LIMITVALUE(vp
->ftarget
, 0, 255);
580 vp
->ftarget
= parm
->cutoff
;
585 /* compute pitch target */
586 if (pitch
!= 0xffff) {
587 vp
->ptarget
= 1 << (pitch
>> 12);
588 if (pitch
& 0x800) vp
->ptarget
+= (vp
->ptarget
*0x102e)/0x2710;
589 if (pitch
& 0x400) vp
->ptarget
+= (vp
->ptarget
*0x764)/0x2710;
590 if (pitch
& 0x200) vp
->ptarget
+= (vp
->ptarget
*0x389)/0x2710;
591 vp
->ptarget
+= (vp
->ptarget
>> 1);
592 if (vp
->ptarget
> 0xffff) vp
->ptarget
= 0xffff;
594 vp
->ptarget
= 0xffff;
596 if (LO_BYTE(parm
->modatkhld
) >= 0x80) {
597 parm
->modatkhld
&= ~0xff;
598 parm
->modatkhld
|= 0x7f;
601 /* compute volume target and correct volume parameters */
603 #if 0 /* FIXME: this leads to some clicks.. */
604 if (LO_BYTE(parm
->volatkhld
) >= 0x80 && parm
->voldelay
>= 0x8000) {
605 parm
->voldelay
= 0xbfff;
606 vp
->vtarget
= voltarget
[vp
->avol
% 0x10] >> (vp
->avol
>> 4);
610 if (LO_BYTE(parm
->volatkhld
) >= 0x80) {
611 parm
->volatkhld
&= ~0xff;
612 parm
->volatkhld
|= 0x7f;
617 * calculate pitch parameter
619 static const unsigned char pan_volumes
[256] = {
620 0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x14,0x17,0x1a,0x1d,0x20,0x22,0x25,0x28,0x2a,
621 0x2d,0x30,0x32,0x35,0x37,0x3a,0x3c,0x3f,0x41,0x44,0x46,0x49,0x4b,0x4d,0x50,0x52,
622 0x54,0x57,0x59,0x5b,0x5d,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6f,0x71,0x73,0x75,
623 0x77,0x79,0x7b,0x7c,0x7e,0x80,0x82,0x84,0x86,0x88,0x89,0x8b,0x8d,0x8f,0x90,0x92,
624 0x94,0x96,0x97,0x99,0x9a,0x9c,0x9e,0x9f,0xa1,0xa2,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,
625 0xad,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb9,0xba,0xbb,0xbc,0xbe,0xbf,0xc0,
626 0xc1,0xc2,0xc3,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,
627 0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xdd,0xde,0xdf,
628 0xdf,0xe0,0xe1,0xe2,0xe2,0xe3,0xe4,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,
629 0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf1,
630 0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,0xf4,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,
631 0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,
632 0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
633 0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
634 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
635 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
639 calc_pan(struct snd_emux_voice
*vp
)
641 struct snd_midi_channel
*chan
= vp
->chan
;
644 /* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */
645 if (vp
->reg
.fixpan
> 0) /* 0-127 */
646 pan
= 255 - (int)vp
->reg
.fixpan
* 2;
648 pan
= chan
->control
[MIDI_CTL_MSB_PAN
] - 64;
649 if (vp
->reg
.pan
>= 0) /* 0-127 */
650 pan
+= vp
->reg
.pan
- 64;
651 pan
= 127 - (int)pan
* 2;
653 LIMITVALUE(pan
, 0, 255);
655 if (vp
->emu
->linear_panning
) {
656 /* assuming linear volume */
657 if (pan
!= vp
->apan
) {
662 vp
->aaux
= (-pan
) & 0xff;
667 /* using volume table */
668 if (vp
->apan
!= (int)pan_volumes
[pan
]) {
669 vp
->apan
= pan_volumes
[pan
];
670 vp
->aaux
= pan_volumes
[255 - pan
];
679 * calculate volume attenuation
681 * Voice volume is controlled by volume attenuation parameter.
682 * So volume becomes maximum when avol is 0 (no attenuation), and
683 * minimum when 255 (-96dB or silence).
686 /* tables for volume->attenuation calculation */
687 static const unsigned char voltab1
[128] = {
688 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
689 0x63, 0x2b, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22,
690 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
691 0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14,
692 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
693 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d,
694 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
695 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
696 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06,
697 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
698 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
699 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
700 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
703 static const unsigned char voltab2
[128] = {
704 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x2a,
705 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x24, 0x23, 0x22, 0x21,
706 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a,
707 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15,
708 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x10,
709 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d,
710 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a,
711 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
712 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
713 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
714 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
715 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
716 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
719 static const unsigned char expressiontab
[128] = {
720 0x7f, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x4b, 0x48, 0x45, 0x42,
721 0x40, 0x3d, 0x3b, 0x39, 0x38, 0x36, 0x34, 0x33, 0x31, 0x30,
722 0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
723 0x24, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1e, 0x1e,
724 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18,
725 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x13,
726 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f,
727 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
728 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
729 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
730 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
731 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
732 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
736 * Magic to calculate the volume (actually attenuation) from all the
737 * voice and channels parameters.
740 calc_volume(struct snd_emux_voice
*vp
)
743 int main_vol
, expression_vol
, master_vol
;
744 struct snd_midi_channel
*chan
= vp
->chan
;
745 struct snd_emux_port
*port
= vp
->port
;
747 expression_vol
= chan
->control
[MIDI_CTL_MSB_EXPRESSION
];
748 LIMITMAX(vp
->velocity
, 127);
749 LIMITVALUE(expression_vol
, 0, 127);
750 if (port
->port_mode
== SNDRV_EMUX_PORT_MODE_OSS_SYNTH
) {
752 main_vol
= chan
->control
[MIDI_CTL_MSB_MAIN_VOLUME
];
753 vol
= (vp
->velocity
* main_vol
* expression_vol
) / (127*127);
754 vol
= vol
* vp
->reg
.amplitude
/ 127;
756 LIMITVALUE(vol
, 0, 127);
758 /* calc to attenuation */
759 vol
= snd_sf_vol_table
[vol
];
762 main_vol
= chan
->control
[MIDI_CTL_MSB_MAIN_VOLUME
] * vp
->reg
.amplitude
/ 127;
763 LIMITVALUE(main_vol
, 0, 127);
765 vol
= voltab1
[main_vol
] + voltab2
[vp
->velocity
];
767 vol
+= vp
->reg
.attenuation
;
768 vol
+= ((0x100 - vol
) * expressiontab
[expression_vol
])/128;
771 master_vol
= port
->chset
.gs_master_volume
;
772 LIMITVALUE(master_vol
, 0, 127);
773 vol
+= snd_sf_vol_table
[master_vol
];
774 vol
+= port
->volume_atten
;
776 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
778 struct snd_emux_effect_table
*fx
= chan
->private;
779 vol
+= fx
->val
[EMUX_FX_ATTEN
];
783 LIMITVALUE(vol
, 0, 255);
785 return 0; /* value unchanged */
788 if (!SF_IS_DRUM_BANK(get_bank(port
, chan
))
789 && LO_BYTE(vp
->reg
.parm
.volatkhld
) < 0x7d) {
791 if (vp
->velocity
< 70)
794 atten
= vp
->velocity
;
795 vp
->acutoff
= (atten
* vp
->reg
.parm
.cutoff
+ 0xa0) >> 7;
797 vp
->acutoff
= vp
->reg
.parm
.cutoff
;
800 return 1; /* value changed */
804 * calculate pitch offset
806 * 0xE000 is no pitch offset at 44100Hz sample.
807 * Every 4096 is one octave.
811 calc_pitch(struct snd_emux_voice
*vp
)
813 struct snd_midi_channel
*chan
= vp
->chan
;
816 /* calculate offset */
817 if (vp
->reg
.fixkey
>= 0) {
818 offset
= (vp
->reg
.fixkey
- vp
->reg
.root
) * 4096 / 12;
820 offset
= (vp
->note
- vp
->reg
.root
) * 4096 / 12;
822 offset
= (offset
* vp
->reg
.scaleTuning
) / 100;
823 offset
+= vp
->reg
.tune
* 4096 / 1200;
824 if (chan
->midi_pitchbend
!= 0) {
825 /* (128 * 8192: 1 semitone) ==> (4096: 12 semitones) */
826 offset
+= chan
->midi_pitchbend
* chan
->gm_rpn_pitch_bend_range
/ 3072;
830 * coarse = -8192 to 8192 (100 cent per 128)
831 * fine = -8192 to 8192 (max=100cent)
833 /* 4096 = 1200 cents in emu8000 parameter */
834 offset
+= chan
->gm_rpn_coarse_tuning
* 4096 / (12 * 128);
835 offset
+= chan
->gm_rpn_fine_tuning
/ 24;
837 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
838 /* add initial pitch correction */
840 struct snd_emux_effect_table
*fx
= chan
->private;
841 if (fx
->flag
[EMUX_FX_INIT_PITCH
])
842 offset
+= fx
->val
[EMUX_FX_INIT_PITCH
];
846 /* 0xe000: root pitch */
847 offset
+= 0xe000 + vp
->reg
.rate_offset
;
848 offset
+= vp
->emu
->pitch_shift
;
849 LIMITVALUE(offset
, 0, 0xffff);
850 if (offset
== vp
->apitch
)
851 return 0; /* unchanged */
853 return 1; /* value changed */
857 * Get the bank number assigned to the channel
860 get_bank(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
)
864 switch (port
->chset
.midi_mode
) {
865 case SNDRV_MIDI_MODE_XG
:
866 val
= chan
->control
[MIDI_CTL_MSB_BANK
];
868 return 128; /* return drum bank */
869 return chan
->control
[MIDI_CTL_LSB_BANK
];
871 case SNDRV_MIDI_MODE_GS
:
872 if (chan
->drum_channel
)
874 /* ignore LSB (bank map) */
875 return chan
->control
[MIDI_CTL_MSB_BANK
];
878 if (chan
->drum_channel
)
880 return chan
->control
[MIDI_CTL_MSB_BANK
];
885 /* Look for the zones matching with the given note and velocity.
886 * The resultant zones are stored on table.
889 get_zone(struct snd_emux
*emu
, struct snd_emux_port
*port
,
890 int *notep
, int vel
, struct snd_midi_channel
*chan
,
891 struct snd_sf_zone
**table
)
893 int preset
, bank
, def_preset
, def_bank
;
895 bank
= get_bank(port
, chan
);
896 preset
= chan
->midi_program
;
898 if (SF_IS_DRUM_BANK(bank
)) {
899 def_preset
= port
->ctrls
[EMUX_MD_DEF_DRUM
];
903 def_bank
= port
->ctrls
[EMUX_MD_DEF_BANK
];
906 return snd_soundfont_search_zone(emu
->sflist
, notep
, vel
, preset
, bank
,
907 def_preset
, def_bank
,
908 table
, SNDRV_EMUX_MAX_MULTI_VOICES
);
914 snd_emux_init_voices(struct snd_emux
*emu
)
916 struct snd_emux_voice
*vp
;
920 spin_lock_irqsave(&emu
->voice_lock
, flags
);
921 for (i
= 0; i
< emu
->max_voices
; i
++) {
922 vp
= &emu
->voices
[i
];
923 vp
->ch
= -1; /* not used */
924 vp
->state
= SNDRV_EMUX_ST_OFF
;
931 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
936 void snd_emux_lock_voice(struct snd_emux
*emu
, int voice
)
940 spin_lock_irqsave(&emu
->voice_lock
, flags
);
941 if (emu
->voices
[voice
].state
== SNDRV_EMUX_ST_OFF
)
942 emu
->voices
[voice
].state
= SNDRV_EMUX_ST_LOCKED
;
944 snd_printk(KERN_WARNING
945 "invalid voice for lock %d (state = %x)\n",
946 voice
, emu
->voices
[voice
].state
);
947 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
950 EXPORT_SYMBOL(snd_emux_lock_voice
);
954 void snd_emux_unlock_voice(struct snd_emux
*emu
, int voice
)
958 spin_lock_irqsave(&emu
->voice_lock
, flags
);
959 if (emu
->voices
[voice
].state
== SNDRV_EMUX_ST_LOCKED
)
960 emu
->voices
[voice
].state
= SNDRV_EMUX_ST_OFF
;
962 snd_printk(KERN_WARNING
963 "invalid voice for unlock %d (state = %x)\n",
964 voice
, emu
->voices
[voice
].state
);
965 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
968 EXPORT_SYMBOL(snd_emux_unlock_voice
);