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 "emux_voice.h"
26 #include <sound/asoundef.h>
33 * Ensure a value is between two points
34 * macro evaluates its args more than once, so changed to upper-case.
36 #define LIMITVALUE(x, a, b) do { if ((x) < (a)) (x) = (a); else if ((x) > (b)) (x) = (b); } while (0)
37 #define LIMITMAX(x, a) do {if ((x) > (a)) (x) = (a); } while (0)
39 static int get_zone(snd_emux_t *emu, snd_emux_port_t *port, int *notep, int vel, snd_midi_channel_t *chan, snd_sf_zone_t **table);
40 static int get_bank(snd_emux_port_t *port, snd_midi_channel_t *chan);
41 static void terminate_note1(snd_emux_t *emu, int note, snd_midi_channel_t *chan, int free);
42 static void exclusive_note_off(snd_emux_t *emu, snd_emux_port_t *port, int exclass);
43 static void terminate_voice(snd_emux_t *emu, snd_emux_voice_t *vp, int free);
44 static void update_voice(snd_emux_t *emu, snd_emux_voice_t *vp, int update);
45 static void setup_voice(snd_emux_voice_t *vp);
46 static int calc_pan(snd_emux_voice_t *vp);
47 static int calc_volume(snd_emux_voice_t *vp);
48 static int calc_pitch(snd_emux_voice_t *vp);
55 snd_emux_note_on(void *p, int note, int vel, snd_midi_channel_t *chan)
60 snd_sf_zone_t *table[SNDRV_EMUX_MAX_MULTI_VOICES];
62 snd_emux_port_t *port;
65 snd_assert(port != NULL && chan != NULL, return);
68 snd_assert(emu != NULL, return);
69 snd_assert(emu->ops.get_voice != NULL, return);
70 snd_assert(emu->ops.trigger != NULL, return);
72 key = note; /* remember the original note */
73 nvoices = get_zone(emu, port, ¬e, vel, chan, table);
77 /* exclusive note off */
78 for (i = 0; i < nvoices; i++) {
79 snd_sf_zone_t *zp = table[i];
80 if (zp && zp->v.exclusiveClass)
81 exclusive_note_off(emu, port, zp->v.exclusiveClass);
84 #if 0 // seems not necessary
85 /* Turn off the same note on the same channel. */
86 terminate_note1(emu, key, chan, 0);
89 spin_lock_irqsave(&emu->voice_lock, flags);
90 for (i = 0; i < nvoices; i++) {
92 /* set up each voice parameter */
93 /* at this stage, we don't trigger the voice yet. */
98 vp = emu->ops.get_voice(emu, port);
99 if (vp == NULL || vp->ch < 0)
101 if (STATE_IS_PLAYING(vp->state))
102 emu->ops.terminate(vp);
104 vp->time = emu->use_time++;
111 if (vp->zone->sample)
112 vp->block = vp->zone->sample->block;
118 vp->state = SNDRV_EMUX_ST_STANDBY;
119 if (emu->ops.prepare) {
120 vp->state = SNDRV_EMUX_ST_OFF;
121 if (emu->ops.prepare(vp) >= 0)
122 vp->state = SNDRV_EMUX_ST_STANDBY;
126 /* start envelope now */
127 for (i = 0; i < emu->max_voices; i++) {
128 vp = &emu->voices[i];
129 if (vp->state == SNDRV_EMUX_ST_STANDBY &&
131 emu->ops.trigger(vp);
132 vp->state = SNDRV_EMUX_ST_ON;
133 vp->ontime = jiffies; /* remember the trigger timing */
136 spin_unlock_irqrestore(&emu->voice_lock, flags);
138 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
139 if (port->port_mode == SNDRV_EMUX_PORT_MODE_OSS_SYNTH) {
140 /* clear voice position for the next note on this channel */
141 snd_emux_effect_table_t *fx = chan->private;
143 fx->flag[EMUX_FX_SAMPLE_START] = 0;
144 fx->flag[EMUX_FX_COARSE_SAMPLE_START] = 0;
151 * Release a note in response to a midi note off.
154 snd_emux_note_off(void *p, int note, int vel, snd_midi_channel_t *chan)
158 snd_emux_voice_t *vp;
160 snd_emux_port_t *port;
163 snd_assert(port != NULL && chan != NULL, return);
166 snd_assert(emu != NULL, return);
167 snd_assert(emu->ops.release != NULL, return);
169 spin_lock_irqsave(&emu->voice_lock, flags);
170 for (ch = 0; ch < emu->max_voices; ch++) {
171 vp = &emu->voices[ch];
172 if (STATE_IS_PLAYING(vp->state) &&
173 vp->chan == chan && vp->key == note) {
174 vp->time = emu->use_time++;
175 vp->state = SNDRV_EMUX_ST_RELEASED;
176 if (vp->ontime == jiffies) {
177 /* if note-off is sent too shortly after
178 * note-on, emuX engine cannot produce the sound
179 * correctly. so we'll release this note
180 * a bit later via timer callback.
182 vp->state = SNDRV_EMUX_ST_PENDING;
183 if (! emu->timer_active) {
184 emu->tlist.expires = jiffies + 1;
185 add_timer(&emu->tlist);
186 emu->timer_active = 1;
189 /* ok now release the note */
190 emu->ops.release(vp);
193 spin_unlock_irqrestore(&emu->voice_lock, flags);
199 * release the pending note-offs
201 void snd_emux_timer_callback(unsigned long data)
203 snd_emux_t *emu = (snd_emux_t*) data;
204 snd_emux_voice_t *vp;
205 int ch, do_again = 0;
207 spin_lock(&emu->voice_lock);
208 for (ch = 0; ch < emu->max_voices; ch++) {
209 vp = &emu->voices[ch];
210 if (vp->state == SNDRV_EMUX_ST_PENDING) {
211 if (vp->ontime == jiffies)
212 do_again++; /* release this at the next interrupt */
214 emu->ops.release(vp);
215 vp->state = SNDRV_EMUX_ST_RELEASED;
220 emu->tlist.expires = jiffies + 1;
221 add_timer(&emu->tlist);
222 emu->timer_active = 1;
224 emu->timer_active = 0;
225 spin_unlock(&emu->voice_lock);
229 * key pressure change
232 snd_emux_key_press(void *p, int note, int vel, snd_midi_channel_t *chan)
236 snd_emux_voice_t *vp;
238 snd_emux_port_t *port;
241 snd_assert(port != NULL && chan != NULL, return);
244 snd_assert(emu != NULL, return);
245 snd_assert(emu->ops.update != NULL, return);
247 spin_lock_irqsave(&emu->voice_lock, flags);
248 for (ch = 0; ch < emu->max_voices; ch++) {
249 vp = &emu->voices[ch];
250 if (vp->state == SNDRV_EMUX_ST_ON &&
251 vp->chan == chan && vp->key == note) {
253 update_voice(emu, vp, SNDRV_EMUX_UPDATE_VOLUME);
256 spin_unlock_irqrestore(&emu->voice_lock, flags);
261 * Modulate the voices which belong to the channel
264 snd_emux_update_channel(snd_emux_port_t *port, snd_midi_channel_t *chan, int update)
267 snd_emux_voice_t *vp;
275 snd_assert(emu != NULL, return);
276 snd_assert(emu->ops.update != NULL, return);
278 spin_lock_irqsave(&emu->voice_lock, flags);
279 for (i = 0; i < emu->max_voices; i++) {
280 vp = &emu->voices[i];
281 if (vp->chan == chan)
282 update_voice(emu, vp, update);
284 spin_unlock_irqrestore(&emu->voice_lock, flags);
288 * Modulate all the voices which belong to the port.
291 snd_emux_update_port(snd_emux_port_t *port, int update)
294 snd_emux_voice_t *vp;
302 snd_assert(emu != NULL, return);
303 snd_assert(emu->ops.update != NULL, return);
305 spin_lock_irqsave(&emu->voice_lock, flags);
306 for (i = 0; i < emu->max_voices; i++) {
307 vp = &emu->voices[i];
308 if (vp->port == port)
309 update_voice(emu, vp, update);
311 spin_unlock_irqrestore(&emu->voice_lock, flags);
316 * Deal with a controler type event. This includes all types of
317 * control events, not just the midi controllers
320 snd_emux_control(void *p, int type, snd_midi_channel_t *chan)
322 snd_emux_port_t *port;
325 snd_assert(port != NULL && chan != NULL, return);
328 case MIDI_CTL_MSB_MAIN_VOLUME:
329 case MIDI_CTL_MSB_EXPRESSION:
330 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_VOLUME);
333 case MIDI_CTL_MSB_PAN:
334 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_PAN);
337 case MIDI_CTL_SOFT_PEDAL:
338 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
339 /* FIXME: this is an emulation */
340 snd_emux_send_effect(port, chan, EMUX_FX_CUTOFF, -160,
345 case MIDI_CTL_PITCHBEND:
346 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_PITCH);
349 case MIDI_CTL_MSB_MODWHEEL:
350 case MIDI_CTL_CHAN_PRESSURE:
351 snd_emux_update_channel(port, chan,
352 SNDRV_EMUX_UPDATE_FMMOD |
353 SNDRV_EMUX_UPDATE_FM2FRQ2);
358 if (port->chset.midi_mode == SNDRV_MIDI_MODE_XG) {
359 snd_emux_xg_control(port, chan, type);
365 * terminate note - if free flag is true, free the terminated voice
368 terminate_note1(snd_emux_t *emu, int note, snd_midi_channel_t *chan, int free)
371 snd_emux_voice_t *vp;
374 spin_lock_irqsave(&emu->voice_lock, flags);
375 for (i = 0; i < emu->max_voices; i++) {
376 vp = &emu->voices[i];
377 if (STATE_IS_PLAYING(vp->state) && vp->chan == chan &&
379 terminate_voice(emu, vp, free);
381 spin_unlock_irqrestore(&emu->voice_lock, flags);
386 * terminate note - exported for midi emulation
389 snd_emux_terminate_note(void *p, int note, snd_midi_channel_t *chan)
392 snd_emux_port_t *port;
395 snd_assert(port != NULL && chan != NULL, return);
398 snd_assert(emu != NULL, return);
399 snd_assert(emu->ops.terminate != NULL, return);
401 terminate_note1(emu, note, chan, 1);
406 * Terminate all the notes
409 snd_emux_terminate_all(snd_emux_t *emu)
412 snd_emux_voice_t *vp;
415 spin_lock_irqsave(&emu->voice_lock, flags);
416 for (i = 0; i < emu->max_voices; i++) {
417 vp = &emu->voices[i];
418 if (STATE_IS_PLAYING(vp->state))
419 terminate_voice(emu, vp, 0);
420 if (vp->state == SNDRV_EMUX_ST_OFF) {
421 if (emu->ops.free_voice)
422 emu->ops.free_voice(vp);
424 emu->ops.reset(emu, i);
428 /* initialize allocation time */
430 spin_unlock_irqrestore(&emu->voice_lock, flags);
435 * Terminate all voices associated with the given port
438 snd_emux_sounds_off_all(snd_emux_port_t *port)
442 snd_emux_voice_t *vp;
445 snd_assert(port != NULL, return);
447 snd_assert(emu != NULL, return);
448 snd_assert(emu->ops.terminate != NULL, return);
450 spin_lock_irqsave(&emu->voice_lock, flags);
451 for (i = 0; i < emu->max_voices; i++) {
452 vp = &emu->voices[i];
453 if (STATE_IS_PLAYING(vp->state) &&
455 terminate_voice(emu, vp, 0);
456 if (vp->state == SNDRV_EMUX_ST_OFF) {
457 if (emu->ops.free_voice)
458 emu->ops.free_voice(vp);
460 emu->ops.reset(emu, i);
463 spin_unlock_irqrestore(&emu->voice_lock, flags);
468 * Terminate all voices that have the same exclusive class. This
469 * is mainly for drums.
472 exclusive_note_off(snd_emux_t *emu, snd_emux_port_t *port, int exclass)
474 snd_emux_voice_t *vp;
478 spin_lock_irqsave(&emu->voice_lock, flags);
479 for (i = 0; i < emu->max_voices; i++) {
480 vp = &emu->voices[i];
481 if (STATE_IS_PLAYING(vp->state) && vp->port == port &&
482 vp->reg.exclusiveClass == exclass) {
483 terminate_voice(emu, vp, 0);
486 spin_unlock_irqrestore(&emu->voice_lock, flags);
491 * if free flag is true, call free_voice after termination
494 terminate_voice(snd_emux_t *emu, snd_emux_voice_t *vp, int free)
496 emu->ops.terminate(vp);
497 vp->time = emu->use_time++;
502 vp->state = SNDRV_EMUX_ST_OFF;
503 if (free && emu->ops.free_voice)
504 emu->ops.free_voice(vp);
512 update_voice(snd_emux_t *emu, snd_emux_voice_t *vp, int update)
514 if (!STATE_IS_PLAYING(vp->state))
517 if (vp->chan == NULL || vp->port == NULL)
519 if (update & SNDRV_EMUX_UPDATE_VOLUME)
521 if (update & SNDRV_EMUX_UPDATE_PITCH)
523 if (update & SNDRV_EMUX_UPDATE_PAN) {
524 if (! calc_pan(vp) && (update == SNDRV_EMUX_UPDATE_PAN))
527 emu->ops.update(vp, update);
532 /* table for volume target calculation */
533 static unsigned short voltarget[16] = {
534 0xEAC0, 0xE0C8, 0xD740, 0xCE20, 0xC560, 0xBD08, 0xB500, 0xAD58,
535 0xA5F8, 0x9EF0, 0x9830, 0x91C0, 0x8B90, 0x85A8, 0x8000, 0x7A90
539 #define LO_BYTE(v) ((v) & 0xff)
540 #define HI_BYTE(v) (((v) >> 8) & 0xff)
543 * Sets up the voice structure by calculating some values that
544 * will be needed later.
547 setup_voice(snd_emux_voice_t *vp)
549 soundfont_voice_parm_t *parm;
552 /* copy the original register values */
553 vp->reg = vp->zone->v;
555 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
556 snd_emux_setup_effect(vp);
568 parm = &vp->reg.parm;
570 /* compute filter target and correct modulation parameters */
571 if (LO_BYTE(parm->modatkhld) >= 0x80 && parm->moddelay >= 0x8000) {
572 parm->moddelay = 0xbfff;
573 pitch = (HI_BYTE(parm->pefe) << 4) + vp->apitch;
576 /* calculate filter target */
577 vp->ftarget = parm->cutoff + LO_BYTE(parm->pefe);
578 LIMITVALUE(vp->ftarget, 0, 255);
581 vp->ftarget = parm->cutoff;
586 /* compute pitch target */
587 if (pitch != 0xffff) {
588 vp->ptarget = 1 << (pitch >> 12);
589 if (pitch & 0x800) vp->ptarget += (vp->ptarget*0x102e)/0x2710;
590 if (pitch & 0x400) vp->ptarget += (vp->ptarget*0x764)/0x2710;
591 if (pitch & 0x200) vp->ptarget += (vp->ptarget*0x389)/0x2710;
592 vp->ptarget += (vp->ptarget >> 1);
593 if (vp->ptarget > 0xffff) vp->ptarget = 0xffff;
595 vp->ptarget = 0xffff;
597 if (LO_BYTE(parm->modatkhld) >= 0x80) {
598 parm->modatkhld &= ~0xff;
599 parm->modatkhld |= 0x7f;
602 /* compute volume target and correct volume parameters */
604 #if 0 /* FIXME: this leads to some clicks.. */
605 if (LO_BYTE(parm->volatkhld) >= 0x80 && parm->voldelay >= 0x8000) {
606 parm->voldelay = 0xbfff;
607 vp->vtarget = voltarget[vp->avol % 0x10] >> (vp->avol >> 4);
611 if (LO_BYTE(parm->volatkhld) >= 0x80) {
612 parm->volatkhld &= ~0xff;
613 parm->volatkhld |= 0x7f;
618 * calculate pitch parameter
620 static unsigned char pan_volumes[256] = {
621 0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x14,0x17,0x1a,0x1d,0x20,0x22,0x25,0x28,0x2a,
622 0x2d,0x30,0x32,0x35,0x37,0x3a,0x3c,0x3f,0x41,0x44,0x46,0x49,0x4b,0x4d,0x50,0x52,
623 0x54,0x57,0x59,0x5b,0x5d,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6f,0x71,0x73,0x75,
624 0x77,0x79,0x7b,0x7c,0x7e,0x80,0x82,0x84,0x86,0x88,0x89,0x8b,0x8d,0x8f,0x90,0x92,
625 0x94,0x96,0x97,0x99,0x9a,0x9c,0x9e,0x9f,0xa1,0xa2,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,
626 0xad,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb9,0xba,0xbb,0xbc,0xbe,0xbf,0xc0,
627 0xc1,0xc2,0xc3,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,
628 0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xdd,0xde,0xdf,
629 0xdf,0xe0,0xe1,0xe2,0xe2,0xe3,0xe4,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,
630 0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf1,
631 0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,0xf4,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,
632 0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,
633 0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
634 0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
635 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
636 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
640 calc_pan(snd_emux_voice_t *vp)
642 snd_midi_channel_t *chan = vp->chan;
645 /* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */
646 if (vp->reg.fixpan > 0) /* 0-127 */
647 pan = 255 - (int)vp->reg.fixpan * 2;
649 pan = chan->control[MIDI_CTL_MSB_PAN] - 64;
650 if (vp->reg.pan >= 0) /* 0-127 */
651 pan += vp->reg.pan - 64;
652 pan = 127 - (int)pan * 2;
654 LIMITVALUE(pan, 0, 255);
656 if (vp->emu->linear_panning) {
657 /* assuming linear volume */
658 if (pan != vp->apan) {
663 vp->aaux = (-pan) & 0xff;
668 /* using volume table */
669 if (vp->apan != (int)pan_volumes[pan]) {
670 vp->apan = pan_volumes[pan];
671 vp->aaux = pan_volumes[255 - pan];
680 * calculate volume attenuation
682 * Voice volume is controlled by volume attenuation parameter.
683 * So volume becomes maximum when avol is 0 (no attenuation), and
684 * minimum when 255 (-96dB or silence).
687 /* tables for volume->attenuation calculation */
688 static unsigned char voltab1[128] = {
689 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
690 0x63, 0x2b, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22,
691 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
692 0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14,
693 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
694 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d,
695 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
696 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
697 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06,
698 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
699 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
700 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
701 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
704 static unsigned char voltab2[128] = {
705 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x2a,
706 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x24, 0x23, 0x22, 0x21,
707 0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a,
708 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15,
709 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x10,
710 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d,
711 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a,
712 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
713 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
714 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
715 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
716 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
717 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
720 static unsigned char expressiontab[128] = {
721 0x7f, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x4b, 0x48, 0x45, 0x42,
722 0x40, 0x3d, 0x3b, 0x39, 0x38, 0x36, 0x34, 0x33, 0x31, 0x30,
723 0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
724 0x24, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1e, 0x1e,
725 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18,
726 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x13,
727 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f,
728 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
729 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
730 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
731 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
732 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
733 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
737 * Magic to calculate the volume (actually attenuation) from all the
738 * voice and channels parameters.
741 calc_volume(snd_emux_voice_t *vp)
744 int main_vol, expression_vol, master_vol;
745 snd_midi_channel_t *chan = vp->chan;
746 snd_emux_port_t *port = vp->port;
748 expression_vol = chan->control[MIDI_CTL_MSB_EXPRESSION];
749 LIMITMAX(vp->velocity, 127);
750 LIMITVALUE(expression_vol, 0, 127);
751 if (port->port_mode == SNDRV_EMUX_PORT_MODE_OSS_SYNTH) {
753 main_vol = chan->control[MIDI_CTL_MSB_MAIN_VOLUME];
754 vol = (vp->velocity * main_vol * expression_vol) / (127*127);
755 vol = vol * vp->reg.amplitude / 127;
757 LIMITVALUE(vol, 0, 127);
759 /* calc to attenuation */
760 vol = snd_sf_vol_table[vol];
763 main_vol = chan->control[MIDI_CTL_MSB_MAIN_VOLUME] * vp->reg.amplitude / 127;
764 LIMITVALUE(main_vol, 0, 127);
766 vol = voltab1[main_vol] + voltab2[vp->velocity];
768 vol += vp->reg.attenuation;
769 vol += ((0x100 - vol) * expressiontab[expression_vol])/128;
772 master_vol = port->chset.gs_master_volume;
773 LIMITVALUE(master_vol, 0, 127);
774 vol += snd_sf_vol_table[master_vol];
775 vol += port->volume_atten;
777 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
779 snd_emux_effect_table_t *fx = chan->private;
780 vol += fx->val[EMUX_FX_ATTEN];
784 LIMITVALUE(vol, 0, 255);
786 return 0; /* value unchanged */
789 if (!SF_IS_DRUM_BANK(get_bank(port, chan))
790 && LO_BYTE(vp->reg.parm.volatkhld) < 0x7d) {
792 if (vp->velocity < 70)
795 atten = vp->velocity;
796 vp->acutoff = (atten * vp->reg.parm.cutoff + 0xa0) >> 7;
798 vp->acutoff = vp->reg.parm.cutoff;
801 return 1; /* value changed */
805 * calculate pitch offset
807 * 0xE000 is no pitch offset at 44100Hz sample.
808 * Every 4096 is one octave.
812 calc_pitch(snd_emux_voice_t *vp)
814 snd_midi_channel_t *chan = vp->chan;
817 /* calculate offset */
818 if (vp->reg.fixkey >= 0) {
819 offset = (vp->reg.fixkey - vp->reg.root) * 4096 / 12;
821 offset = (vp->note - vp->reg.root) * 4096 / 12;
823 offset = (offset * vp->reg.scaleTuning) / 100;
824 offset += vp->reg.tune * 4096 / 1200;
825 if (chan->midi_pitchbend != 0) {
826 /* (128 * 8192: 1 semitone) ==> (4096: 12 semitones) */
827 offset += chan->midi_pitchbend * chan->gm_rpn_pitch_bend_range / 3072;
831 * coarse = -8192 to 8192 (100 cent per 128)
832 * fine = -8192 to 8192 (max=100cent)
834 /* 4096 = 1200 cents in emu8000 parameter */
835 offset += chan->gm_rpn_coarse_tuning * 4096 / (12 * 128);
836 offset += chan->gm_rpn_fine_tuning / 24;
838 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
839 /* add initial pitch correction */
841 snd_emux_effect_table_t *fx = chan->private;
842 if (fx->flag[EMUX_FX_INIT_PITCH])
843 offset += fx->val[EMUX_FX_INIT_PITCH];
847 /* 0xe000: root pitch */
848 offset += 0xe000 + vp->reg.rate_offset;
849 offset += vp->emu->pitch_shift;
850 LIMITVALUE(offset, 0, 0xffff);
851 if (offset == vp->apitch)
852 return 0; /* unchanged */
854 return 1; /* value changed */
858 * Get the bank number assigned to the channel
861 get_bank(snd_emux_port_t *port, snd_midi_channel_t *chan)
865 switch (port->chset.midi_mode) {
866 case SNDRV_MIDI_MODE_XG:
867 val = chan->control[MIDI_CTL_MSB_BANK];
869 return 128; /* return drum bank */
870 return chan->control[MIDI_CTL_LSB_BANK];
872 case SNDRV_MIDI_MODE_GS:
873 if (chan->drum_channel)
875 /* ignore LSB (bank map) */
876 return chan->control[MIDI_CTL_MSB_BANK];
879 if (chan->drum_channel)
881 return chan->control[MIDI_CTL_MSB_BANK];
886 /* Look for the zones matching with the given note and velocity.
887 * The resultant zones are stored on table.
890 get_zone(snd_emux_t *emu, snd_emux_port_t *port,
891 int *notep, int vel, snd_midi_channel_t *chan, snd_sf_zone_t **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(snd_emux_t *emu)
916 snd_emux_voice_t *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(snd_emux_t *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("invalid voice for lock %d (state = %x)\n",
945 voice, emu->voices[voice].state);
946 spin_unlock_irqrestore(&emu->voice_lock, flags);
951 void snd_emux_unlock_voice(snd_emux_t *emu, int voice)
955 spin_lock_irqsave(&emu->voice_lock, flags);
956 if (emu->voices[voice].state == SNDRV_EMUX_ST_LOCKED)
957 emu->voices[voice].state = SNDRV_EMUX_ST_OFF;
959 snd_printk("invalid voice for unlock %d (state = %x)\n",
960 voice, emu->voices[voice].state);
961 spin_unlock_irqrestore(&emu->voice_lock, flags);