2 * Midi synth routines for the Emu8k/Emu10k1
4 * Copyright (C) 1999 Steve Ratcliffe
5 * Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
7 * Contains code based on awe_wave.c by Takashi Iwai
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include <linux/export.h>
26 #include "emux_voice.h"
27 #include <sound/asoundef.h>
34 * Ensure a value is between two points
35 * macro evaluates its args more than once, so changed to upper-case.
37 #define LIMITVALUE(x, a, b) do { if ((x) < (a)) (x) = (a); else if ((x) > (b)) (x) = (b); } while (0)
38 #define LIMITMAX(x, a) do {if ((x) > (a)) (x) = (a); } while (0)
40 static int get_zone(struct snd_emux
*emu
, struct snd_emux_port
*port
,
41 int *notep
, int vel
, struct snd_midi_channel
*chan
,
42 struct snd_sf_zone
**table
);
43 static int get_bank(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
);
44 static void terminate_note1(struct snd_emux
*emu
, int note
,
45 struct snd_midi_channel
*chan
, int free
);
46 static void exclusive_note_off(struct snd_emux
*emu
, struct snd_emux_port
*port
,
48 static void terminate_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int free
);
49 static void update_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int update
);
50 static void setup_voice(struct snd_emux_voice
*vp
);
51 static int calc_pan(struct snd_emux_voice
*vp
);
52 static int calc_volume(struct snd_emux_voice
*vp
);
53 static int calc_pitch(struct snd_emux_voice
*vp
);
60 snd_emux_note_on(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
64 struct snd_emux_voice
*vp
;
65 struct snd_sf_zone
*table
[SNDRV_EMUX_MAX_MULTI_VOICES
];
67 struct snd_emux_port
*port
;
70 if (snd_BUG_ON(!port
|| !chan
))
74 if (snd_BUG_ON(!emu
|| !emu
->ops
.get_voice
|| !emu
->ops
.trigger
))
77 key
= note
; /* remember the original note */
78 nvoices
= get_zone(emu
, port
, ¬e
, vel
, chan
, table
);
82 /* exclusive note off */
83 for (i
= 0; i
< nvoices
; i
++) {
84 struct snd_sf_zone
*zp
= table
[i
];
85 if (zp
&& zp
->v
.exclusiveClass
)
86 exclusive_note_off(emu
, port
, zp
->v
.exclusiveClass
);
89 #if 0 // seems not necessary
90 /* Turn off the same note on the same channel. */
91 terminate_note1(emu
, key
, chan
, 0);
94 spin_lock_irqsave(&emu
->voice_lock
, flags
);
95 for (i
= 0; i
< nvoices
; i
++) {
97 /* set up each voice parameter */
98 /* at this stage, we don't trigger the voice yet. */
100 if (table
[i
] == NULL
)
103 vp
= emu
->ops
.get_voice(emu
, port
);
104 if (vp
== NULL
|| vp
->ch
< 0)
106 if (STATE_IS_PLAYING(vp
->state
))
107 emu
->ops
.terminate(vp
);
109 vp
->time
= emu
->use_time
++;
116 if (vp
->zone
->sample
)
117 vp
->block
= vp
->zone
->sample
->block
;
123 vp
->state
= SNDRV_EMUX_ST_STANDBY
;
124 if (emu
->ops
.prepare
) {
125 vp
->state
= SNDRV_EMUX_ST_OFF
;
126 if (emu
->ops
.prepare(vp
) >= 0)
127 vp
->state
= SNDRV_EMUX_ST_STANDBY
;
131 /* start envelope now */
132 for (i
= 0; i
< emu
->max_voices
; i
++) {
133 vp
= &emu
->voices
[i
];
134 if (vp
->state
== SNDRV_EMUX_ST_STANDBY
&&
136 emu
->ops
.trigger(vp
);
137 vp
->state
= SNDRV_EMUX_ST_ON
;
138 vp
->ontime
= jiffies
; /* remember the trigger timing */
141 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
143 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
144 if (port
->port_mode
== SNDRV_EMUX_PORT_MODE_OSS_SYNTH
) {
145 /* clear voice position for the next note on this channel */
146 struct snd_emux_effect_table
*fx
= chan
->private;
148 fx
->flag
[EMUX_FX_SAMPLE_START
] = 0;
149 fx
->flag
[EMUX_FX_COARSE_SAMPLE_START
] = 0;
156 * Release a note in response to a midi note off.
159 snd_emux_note_off(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
162 struct snd_emux
*emu
;
163 struct snd_emux_voice
*vp
;
165 struct snd_emux_port
*port
;
168 if (snd_BUG_ON(!port
|| !chan
))
172 if (snd_BUG_ON(!emu
|| !emu
->ops
.release
))
175 spin_lock_irqsave(&emu
->voice_lock
, flags
);
176 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
177 vp
= &emu
->voices
[ch
];
178 if (STATE_IS_PLAYING(vp
->state
) &&
179 vp
->chan
== chan
&& vp
->key
== note
) {
180 vp
->state
= SNDRV_EMUX_ST_RELEASED
;
181 if (vp
->ontime
== jiffies
) {
182 /* if note-off is sent too shortly after
183 * note-on, emuX engine cannot produce the sound
184 * correctly. so we'll release this note
185 * a bit later via timer callback.
187 vp
->state
= SNDRV_EMUX_ST_PENDING
;
188 if (! emu
->timer_active
) {
189 mod_timer(&emu
->tlist
, jiffies
+ 1);
190 emu
->timer_active
= 1;
193 /* ok now release the note */
194 emu
->ops
.release(vp
);
197 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
203 * release the pending note-offs
205 void snd_emux_timer_callback(struct timer_list
*t
)
207 struct snd_emux
*emu
= from_timer(emu
, t
, tlist
);
208 struct snd_emux_voice
*vp
;
210 int ch
, do_again
= 0;
212 spin_lock_irqsave(&emu
->voice_lock
, flags
);
213 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
214 vp
= &emu
->voices
[ch
];
215 if (vp
->state
== SNDRV_EMUX_ST_PENDING
) {
216 if (vp
->ontime
== jiffies
)
217 do_again
++; /* release this at the next interrupt */
219 emu
->ops
.release(vp
);
220 vp
->state
= SNDRV_EMUX_ST_RELEASED
;
225 mod_timer(&emu
->tlist
, jiffies
+ 1);
226 emu
->timer_active
= 1;
228 emu
->timer_active
= 0;
229 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
233 * key pressure change
236 snd_emux_key_press(void *p
, int note
, int vel
, struct snd_midi_channel
*chan
)
239 struct snd_emux
*emu
;
240 struct snd_emux_voice
*vp
;
242 struct snd_emux_port
*port
;
245 if (snd_BUG_ON(!port
|| !chan
))
249 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
252 spin_lock_irqsave(&emu
->voice_lock
, flags
);
253 for (ch
= 0; ch
< emu
->max_voices
; ch
++) {
254 vp
= &emu
->voices
[ch
];
255 if (vp
->state
== SNDRV_EMUX_ST_ON
&&
256 vp
->chan
== chan
&& vp
->key
== note
) {
258 update_voice(emu
, vp
, SNDRV_EMUX_UPDATE_VOLUME
);
261 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
266 * Modulate the voices which belong to the channel
269 snd_emux_update_channel(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
, int update
)
271 struct snd_emux
*emu
;
272 struct snd_emux_voice
*vp
;
280 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
283 spin_lock_irqsave(&emu
->voice_lock
, flags
);
284 for (i
= 0; i
< emu
->max_voices
; i
++) {
285 vp
= &emu
->voices
[i
];
286 if (vp
->chan
== chan
)
287 update_voice(emu
, vp
, update
);
289 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
293 * Modulate all the voices which belong to the port.
296 snd_emux_update_port(struct snd_emux_port
*port
, int update
)
298 struct snd_emux
*emu
;
299 struct snd_emux_voice
*vp
;
307 if (snd_BUG_ON(!emu
|| !emu
->ops
.update
))
310 spin_lock_irqsave(&emu
->voice_lock
, flags
);
311 for (i
= 0; i
< emu
->max_voices
; i
++) {
312 vp
= &emu
->voices
[i
];
313 if (vp
->port
== port
)
314 update_voice(emu
, vp
, update
);
316 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
321 * Deal with a controller type event. This includes all types of
322 * control events, not just the midi controllers
325 snd_emux_control(void *p
, int type
, struct snd_midi_channel
*chan
)
327 struct snd_emux_port
*port
;
330 if (snd_BUG_ON(!port
|| !chan
))
334 case MIDI_CTL_MSB_MAIN_VOLUME
:
335 case MIDI_CTL_MSB_EXPRESSION
:
336 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_VOLUME
);
339 case MIDI_CTL_MSB_PAN
:
340 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_PAN
);
343 case MIDI_CTL_SOFT_PEDAL
:
344 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
345 /* FIXME: this is an emulation */
346 if (chan
->control
[type
] >= 64)
347 snd_emux_send_effect(port
, chan
, EMUX_FX_CUTOFF
, -160,
350 snd_emux_send_effect(port
, chan
, EMUX_FX_CUTOFF
, 0,
355 case MIDI_CTL_PITCHBEND
:
356 snd_emux_update_channel(port
, chan
, SNDRV_EMUX_UPDATE_PITCH
);
359 case MIDI_CTL_MSB_MODWHEEL
:
360 case MIDI_CTL_CHAN_PRESSURE
:
361 snd_emux_update_channel(port
, chan
,
362 SNDRV_EMUX_UPDATE_FMMOD
|
363 SNDRV_EMUX_UPDATE_FM2FRQ2
);
368 if (port
->chset
.midi_mode
== SNDRV_MIDI_MODE_XG
) {
369 snd_emux_xg_control(port
, chan
, type
);
375 * terminate note - if free flag is true, free the terminated voice
378 terminate_note1(struct snd_emux
*emu
, int note
, struct snd_midi_channel
*chan
, int free
)
381 struct snd_emux_voice
*vp
;
384 spin_lock_irqsave(&emu
->voice_lock
, flags
);
385 for (i
= 0; i
< emu
->max_voices
; i
++) {
386 vp
= &emu
->voices
[i
];
387 if (STATE_IS_PLAYING(vp
->state
) && vp
->chan
== chan
&&
389 terminate_voice(emu
, vp
, free
);
391 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
396 * terminate note - exported for midi emulation
399 snd_emux_terminate_note(void *p
, int note
, struct snd_midi_channel
*chan
)
401 struct snd_emux
*emu
;
402 struct snd_emux_port
*port
;
405 if (snd_BUG_ON(!port
|| !chan
))
409 if (snd_BUG_ON(!emu
|| !emu
->ops
.terminate
))
412 terminate_note1(emu
, note
, chan
, 1);
417 * Terminate all the notes
420 snd_emux_terminate_all(struct snd_emux
*emu
)
423 struct snd_emux_voice
*vp
;
426 spin_lock_irqsave(&emu
->voice_lock
, flags
);
427 for (i
= 0; i
< emu
->max_voices
; i
++) {
428 vp
= &emu
->voices
[i
];
429 if (STATE_IS_PLAYING(vp
->state
))
430 terminate_voice(emu
, vp
, 0);
431 if (vp
->state
== SNDRV_EMUX_ST_OFF
) {
432 if (emu
->ops
.free_voice
)
433 emu
->ops
.free_voice(vp
);
435 emu
->ops
.reset(emu
, i
);
439 /* initialize allocation time */
441 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
444 EXPORT_SYMBOL(snd_emux_terminate_all
);
447 * Terminate all voices associated with the given port
450 snd_emux_sounds_off_all(struct snd_emux_port
*port
)
453 struct snd_emux
*emu
;
454 struct snd_emux_voice
*vp
;
457 if (snd_BUG_ON(!port
))
460 if (snd_BUG_ON(!emu
|| !emu
->ops
.terminate
))
463 spin_lock_irqsave(&emu
->voice_lock
, flags
);
464 for (i
= 0; i
< emu
->max_voices
; i
++) {
465 vp
= &emu
->voices
[i
];
466 if (STATE_IS_PLAYING(vp
->state
) &&
468 terminate_voice(emu
, vp
, 0);
469 if (vp
->state
== SNDRV_EMUX_ST_OFF
) {
470 if (emu
->ops
.free_voice
)
471 emu
->ops
.free_voice(vp
);
473 emu
->ops
.reset(emu
, i
);
476 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
481 * Terminate all voices that have the same exclusive class. This
482 * is mainly for drums.
485 exclusive_note_off(struct snd_emux
*emu
, struct snd_emux_port
*port
, int exclass
)
487 struct snd_emux_voice
*vp
;
491 spin_lock_irqsave(&emu
->voice_lock
, flags
);
492 for (i
= 0; i
< emu
->max_voices
; i
++) {
493 vp
= &emu
->voices
[i
];
494 if (STATE_IS_PLAYING(vp
->state
) && vp
->port
== port
&&
495 vp
->reg
.exclusiveClass
== exclass
) {
496 terminate_voice(emu
, vp
, 0);
499 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
504 * if free flag is true, call free_voice after termination
507 terminate_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int free
)
509 emu
->ops
.terminate(vp
);
510 vp
->time
= emu
->use_time
++;
515 vp
->state
= SNDRV_EMUX_ST_OFF
;
516 if (free
&& emu
->ops
.free_voice
)
517 emu
->ops
.free_voice(vp
);
525 update_voice(struct snd_emux
*emu
, struct snd_emux_voice
*vp
, int update
)
527 if (!STATE_IS_PLAYING(vp
->state
))
530 if (vp
->chan
== NULL
|| vp
->port
== NULL
)
532 if (update
& SNDRV_EMUX_UPDATE_VOLUME
)
534 if (update
& SNDRV_EMUX_UPDATE_PITCH
)
536 if (update
& SNDRV_EMUX_UPDATE_PAN
) {
537 if (! calc_pan(vp
) && (update
== SNDRV_EMUX_UPDATE_PAN
))
540 emu
->ops
.update(vp
, update
);
545 /* table for volume target calculation */
546 static unsigned short voltarget
[16] = {
547 0xEAC0, 0xE0C8, 0xD740, 0xCE20, 0xC560, 0xBD08, 0xB500, 0xAD58,
548 0xA5F8, 0x9EF0, 0x9830, 0x91C0, 0x8B90, 0x85A8, 0x8000, 0x7A90
552 #define LO_BYTE(v) ((v) & 0xff)
553 #define HI_BYTE(v) (((v) >> 8) & 0xff)
556 * Sets up the voice structure by calculating some values that
557 * will be needed later.
560 setup_voice(struct snd_emux_voice
*vp
)
562 struct soundfont_voice_parm
*parm
;
565 /* copy the original register values */
566 vp
->reg
= vp
->zone
->v
;
568 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
569 snd_emux_setup_effect(vp
);
581 parm
= &vp
->reg
.parm
;
583 /* compute filter target and correct modulation parameters */
584 if (LO_BYTE(parm
->modatkhld
) >= 0x80 && parm
->moddelay
>= 0x8000) {
585 parm
->moddelay
= 0xbfff;
586 pitch
= (HI_BYTE(parm
->pefe
) << 4) + vp
->apitch
;
589 /* calculate filter target */
590 vp
->ftarget
= parm
->cutoff
+ LO_BYTE(parm
->pefe
);
591 LIMITVALUE(vp
->ftarget
, 0, 255);
594 vp
->ftarget
= parm
->cutoff
;
599 /* compute pitch target */
600 if (pitch
!= 0xffff) {
601 vp
->ptarget
= 1 << (pitch
>> 12);
602 if (pitch
& 0x800) vp
->ptarget
+= (vp
->ptarget
*0x102e)/0x2710;
603 if (pitch
& 0x400) vp
->ptarget
+= (vp
->ptarget
*0x764)/0x2710;
604 if (pitch
& 0x200) vp
->ptarget
+= (vp
->ptarget
*0x389)/0x2710;
605 vp
->ptarget
+= (vp
->ptarget
>> 1);
606 if (vp
->ptarget
> 0xffff) vp
->ptarget
= 0xffff;
608 vp
->ptarget
= 0xffff;
610 if (LO_BYTE(parm
->modatkhld
) >= 0x80) {
611 parm
->modatkhld
&= ~0xff;
612 parm
->modatkhld
|= 0x7f;
615 /* compute volume target and correct volume parameters */
617 #if 0 /* FIXME: this leads to some clicks.. */
618 if (LO_BYTE(parm
->volatkhld
) >= 0x80 && parm
->voldelay
>= 0x8000) {
619 parm
->voldelay
= 0xbfff;
620 vp
->vtarget
= voltarget
[vp
->avol
% 0x10] >> (vp
->avol
>> 4);
624 if (LO_BYTE(parm
->volatkhld
) >= 0x80) {
625 parm
->volatkhld
&= ~0xff;
626 parm
->volatkhld
|= 0x7f;
631 * calculate pitch parameter
633 static unsigned char pan_volumes
[256] = {
634 0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x14,0x17,0x1a,0x1d,0x20,0x22,0x25,0x28,0x2a,
635 0x2d,0x30,0x32,0x35,0x37,0x3a,0x3c,0x3f,0x41,0x44,0x46,0x49,0x4b,0x4d,0x50,0x52,
636 0x54,0x57,0x59,0x5b,0x5d,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6f,0x71,0x73,0x75,
637 0x77,0x79,0x7b,0x7c,0x7e,0x80,0x82,0x84,0x86,0x88,0x89,0x8b,0x8d,0x8f,0x90,0x92,
638 0x94,0x96,0x97,0x99,0x9a,0x9c,0x9e,0x9f,0xa1,0xa2,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,
639 0xad,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb9,0xba,0xbb,0xbc,0xbe,0xbf,0xc0,
640 0xc1,0xc2,0xc3,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,
641 0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xdd,0xde,0xdf,
642 0xdf,0xe0,0xe1,0xe2,0xe2,0xe3,0xe4,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,
643 0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf1,
644 0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,0xf4,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,
645 0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,
646 0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
647 0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
648 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
649 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
653 calc_pan(struct snd_emux_voice
*vp
)
655 struct snd_midi_channel
*chan
= vp
->chan
;
658 /* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */
659 if (vp
->reg
.fixpan
> 0) /* 0-127 */
660 pan
= 255 - (int)vp
->reg
.fixpan
* 2;
662 pan
= chan
->control
[MIDI_CTL_MSB_PAN
] - 64;
663 if (vp
->reg
.pan
>= 0) /* 0-127 */
664 pan
+= vp
->reg
.pan
- 64;
665 pan
= 127 - (int)pan
* 2;
667 LIMITVALUE(pan
, 0, 255);
669 if (vp
->emu
->linear_panning
) {
670 /* assuming linear volume */
671 if (pan
!= vp
->apan
) {
676 vp
->aaux
= (-pan
) & 0xff;
681 /* using volume table */
682 if (vp
->apan
!= (int)pan_volumes
[pan
]) {
683 vp
->apan
= pan_volumes
[pan
];
684 vp
->aaux
= pan_volumes
[255 - pan
];
693 * calculate volume attenuation
695 * Voice volume is controlled by volume attenuation parameter.
696 * So volume becomes maximum when avol is 0 (no attenuation), and
697 * minimum when 255 (-96dB or silence).
700 /* tables for volume->attenuation calculation */
701 static unsigned char voltab1
[128] = {
702 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
703 0x63, 0x2b, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22,
704 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
705 0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14,
706 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
707 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d,
708 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
709 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
710 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06,
711 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
712 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
713 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
714 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
717 static unsigned char voltab2
[128] = {
718 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x2a,
719 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x24, 0x23, 0x22, 0x21,
720 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a,
721 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15,
722 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x10,
723 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d,
724 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a,
725 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
726 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
727 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
728 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
729 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
730 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
733 static unsigned char expressiontab
[128] = {
734 0x7f, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x4b, 0x48, 0x45, 0x42,
735 0x40, 0x3d, 0x3b, 0x39, 0x38, 0x36, 0x34, 0x33, 0x31, 0x30,
736 0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
737 0x24, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1e, 0x1e,
738 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18,
739 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x13,
740 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f,
741 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
742 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
743 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
744 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
745 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
746 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
750 * Magic to calculate the volume (actually attenuation) from all the
751 * voice and channels parameters.
754 calc_volume(struct snd_emux_voice
*vp
)
757 int main_vol
, expression_vol
, master_vol
;
758 struct snd_midi_channel
*chan
= vp
->chan
;
759 struct snd_emux_port
*port
= vp
->port
;
761 expression_vol
= chan
->control
[MIDI_CTL_MSB_EXPRESSION
];
762 LIMITMAX(vp
->velocity
, 127);
763 LIMITVALUE(expression_vol
, 0, 127);
764 if (port
->port_mode
== SNDRV_EMUX_PORT_MODE_OSS_SYNTH
) {
766 main_vol
= chan
->control
[MIDI_CTL_MSB_MAIN_VOLUME
];
767 vol
= (vp
->velocity
* main_vol
* expression_vol
) / (127*127);
768 vol
= vol
* vp
->reg
.amplitude
/ 127;
770 LIMITVALUE(vol
, 0, 127);
772 /* calc to attenuation */
773 vol
= snd_sf_vol_table
[vol
];
776 main_vol
= chan
->control
[MIDI_CTL_MSB_MAIN_VOLUME
] * vp
->reg
.amplitude
/ 127;
777 LIMITVALUE(main_vol
, 0, 127);
779 vol
= voltab1
[main_vol
] + voltab2
[vp
->velocity
];
781 vol
+= vp
->reg
.attenuation
;
782 vol
+= ((0x100 - vol
) * expressiontab
[expression_vol
])/128;
785 master_vol
= port
->chset
.gs_master_volume
;
786 LIMITVALUE(master_vol
, 0, 127);
787 vol
+= snd_sf_vol_table
[master_vol
];
788 vol
+= port
->volume_atten
;
790 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
792 struct snd_emux_effect_table
*fx
= chan
->private;
793 vol
+= fx
->val
[EMUX_FX_ATTEN
];
797 LIMITVALUE(vol
, 0, 255);
799 return 0; /* value unchanged */
802 if (!SF_IS_DRUM_BANK(get_bank(port
, chan
))
803 && LO_BYTE(vp
->reg
.parm
.volatkhld
) < 0x7d) {
805 if (vp
->velocity
< 70)
808 atten
= vp
->velocity
;
809 vp
->acutoff
= (atten
* vp
->reg
.parm
.cutoff
+ 0xa0) >> 7;
811 vp
->acutoff
= vp
->reg
.parm
.cutoff
;
814 return 1; /* value changed */
818 * calculate pitch offset
820 * 0xE000 is no pitch offset at 44100Hz sample.
821 * Every 4096 is one octave.
825 calc_pitch(struct snd_emux_voice
*vp
)
827 struct snd_midi_channel
*chan
= vp
->chan
;
830 /* calculate offset */
831 if (vp
->reg
.fixkey
>= 0) {
832 offset
= (vp
->reg
.fixkey
- vp
->reg
.root
) * 4096 / 12;
834 offset
= (vp
->note
- vp
->reg
.root
) * 4096 / 12;
836 offset
= (offset
* vp
->reg
.scaleTuning
) / 100;
837 offset
+= vp
->reg
.tune
* 4096 / 1200;
838 if (chan
->midi_pitchbend
!= 0) {
839 /* (128 * 8192: 1 semitone) ==> (4096: 12 semitones) */
840 offset
+= chan
->midi_pitchbend
* chan
->gm_rpn_pitch_bend_range
/ 3072;
844 * coarse = -8192 to 8192 (100 cent per 128)
845 * fine = -8192 to 8192 (max=100cent)
847 /* 4096 = 1200 cents in emu8000 parameter */
848 offset
+= chan
->gm_rpn_coarse_tuning
* 4096 / (12 * 128);
849 offset
+= chan
->gm_rpn_fine_tuning
/ 24;
851 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
852 /* add initial pitch correction */
854 struct snd_emux_effect_table
*fx
= chan
->private;
855 if (fx
->flag
[EMUX_FX_INIT_PITCH
])
856 offset
+= fx
->val
[EMUX_FX_INIT_PITCH
];
860 /* 0xe000: root pitch */
861 offset
+= 0xe000 + vp
->reg
.rate_offset
;
862 offset
+= vp
->emu
->pitch_shift
;
863 LIMITVALUE(offset
, 0, 0xffff);
864 if (offset
== vp
->apitch
)
865 return 0; /* unchanged */
867 return 1; /* value changed */
871 * Get the bank number assigned to the channel
874 get_bank(struct snd_emux_port
*port
, struct snd_midi_channel
*chan
)
878 switch (port
->chset
.midi_mode
) {
879 case SNDRV_MIDI_MODE_XG
:
880 val
= chan
->control
[MIDI_CTL_MSB_BANK
];
882 return 128; /* return drum bank */
883 return chan
->control
[MIDI_CTL_LSB_BANK
];
885 case SNDRV_MIDI_MODE_GS
:
886 if (chan
->drum_channel
)
888 /* ignore LSB (bank map) */
889 return chan
->control
[MIDI_CTL_MSB_BANK
];
892 if (chan
->drum_channel
)
894 return chan
->control
[MIDI_CTL_MSB_BANK
];
899 /* Look for the zones matching with the given note and velocity.
900 * The resultant zones are stored on table.
903 get_zone(struct snd_emux
*emu
, struct snd_emux_port
*port
,
904 int *notep
, int vel
, struct snd_midi_channel
*chan
,
905 struct snd_sf_zone
**table
)
907 int preset
, bank
, def_preset
, def_bank
;
909 bank
= get_bank(port
, chan
);
910 preset
= chan
->midi_program
;
912 if (SF_IS_DRUM_BANK(bank
)) {
913 def_preset
= port
->ctrls
[EMUX_MD_DEF_DRUM
];
917 def_bank
= port
->ctrls
[EMUX_MD_DEF_BANK
];
920 return snd_soundfont_search_zone(emu
->sflist
, notep
, vel
, preset
, bank
,
921 def_preset
, def_bank
,
922 table
, SNDRV_EMUX_MAX_MULTI_VOICES
);
928 snd_emux_init_voices(struct snd_emux
*emu
)
930 struct snd_emux_voice
*vp
;
934 spin_lock_irqsave(&emu
->voice_lock
, flags
);
935 for (i
= 0; i
< emu
->max_voices
; i
++) {
936 vp
= &emu
->voices
[i
];
937 vp
->ch
= -1; /* not used */
938 vp
->state
= SNDRV_EMUX_ST_OFF
;
945 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
950 void snd_emux_lock_voice(struct snd_emux
*emu
, int voice
)
954 spin_lock_irqsave(&emu
->voice_lock
, flags
);
955 if (emu
->voices
[voice
].state
== SNDRV_EMUX_ST_OFF
)
956 emu
->voices
[voice
].state
= SNDRV_EMUX_ST_LOCKED
;
958 snd_printk(KERN_WARNING
959 "invalid voice for lock %d (state = %x)\n",
960 voice
, emu
->voices
[voice
].state
);
961 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
964 EXPORT_SYMBOL(snd_emux_lock_voice
);
968 void snd_emux_unlock_voice(struct snd_emux
*emu
, int voice
)
972 spin_lock_irqsave(&emu
->voice_lock
, flags
);
973 if (emu
->voices
[voice
].state
== SNDRV_EMUX_ST_LOCKED
)
974 emu
->voices
[voice
].state
= SNDRV_EMUX_ST_OFF
;
976 snd_printk(KERN_WARNING
977 "invalid voice for unlock %d (state = %x)\n",
978 voice
, emu
->voices
[voice
].state
);
979 spin_unlock_irqrestore(&emu
->voice_lock
, flags
);
982 EXPORT_SYMBOL(snd_emux_unlock_voice
);