Merge ../linus
[pandora-kernel.git] / sound / synth / emux / emux_synth.c
1 /*
2  *  Midi synth routines for the Emu8k/Emu10k1
3  *
4  *  Copyright (C) 1999 Steve Ratcliffe
5  *  Copyright (c) 1999-2000 Takashi Iwai <tiwai@suse.de>
6  *
7  *  Contains code based on awe_wave.c by Takashi Iwai
8  *
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.
13  *
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.
18  *
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
22  *
23  */
24
25 #include "emux_voice.h"
26 #include <sound/asoundef.h>
27
28 /*
29  * Prototypes
30  */
31
32 /*
33  * Ensure a value is between two points
34  * macro evaluates its args more than once, so changed to upper-case.
35  */
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)
38
39 static int get_zone(struct snd_emux *emu, struct snd_emux_port *port,
40                     int *notep, int vel, struct snd_midi_channel *chan,
41                     struct snd_sf_zone **table);
42 static int get_bank(struct snd_emux_port *port, struct snd_midi_channel *chan);
43 static void terminate_note1(struct snd_emux *emu, int note,
44                             struct snd_midi_channel *chan, int free);
45 static void exclusive_note_off(struct snd_emux *emu, struct snd_emux_port *port,
46                                int exclass);
47 static void terminate_voice(struct snd_emux *emu, struct snd_emux_voice *vp, int free);
48 static void update_voice(struct snd_emux *emu, struct snd_emux_voice *vp, int update);
49 static void setup_voice(struct snd_emux_voice *vp);
50 static int calc_pan(struct snd_emux_voice *vp);
51 static int calc_volume(struct snd_emux_voice *vp);
52 static int calc_pitch(struct snd_emux_voice *vp);
53
54
55 /*
56  * Start a note.
57  */
58 void
59 snd_emux_note_on(void *p, int note, int vel, struct snd_midi_channel *chan)
60 {
61         struct snd_emux *emu;
62         int i, key, nvoices;
63         struct snd_emux_voice *vp;
64         struct snd_sf_zone *table[SNDRV_EMUX_MAX_MULTI_VOICES];
65         unsigned long flags;
66         struct snd_emux_port *port;
67
68         port = p;
69         snd_assert(port != NULL && chan != NULL, return);
70
71         emu = port->emu;
72         snd_assert(emu != NULL, return);
73         snd_assert(emu->ops.get_voice != NULL, return);
74         snd_assert(emu->ops.trigger != NULL, return);
75
76         key = note; /* remember the original note */
77         nvoices = get_zone(emu, port, &note, vel, chan, table);
78         if (! nvoices)
79                 return;
80
81         /* exclusive note off */
82         for (i = 0; i < nvoices; i++) {
83                 struct snd_sf_zone *zp = table[i];
84                 if (zp && zp->v.exclusiveClass)
85                         exclusive_note_off(emu, port, zp->v.exclusiveClass);
86         }
87
88 #if 0 // seems not necessary
89         /* Turn off the same note on the same channel. */
90         terminate_note1(emu, key, chan, 0);
91 #endif
92
93         spin_lock_irqsave(&emu->voice_lock, flags);
94         for (i = 0; i < nvoices; i++) {
95
96                 /* set up each voice parameter */
97                 /* at this stage, we don't trigger the voice yet. */
98
99                 if (table[i] == NULL)
100                         continue;
101
102                 vp = emu->ops.get_voice(emu, port);
103                 if (vp == NULL || vp->ch < 0)
104                         continue;
105                 if (STATE_IS_PLAYING(vp->state))
106                         emu->ops.terminate(vp);
107
108                 vp->time = emu->use_time++;
109                 vp->chan = chan;
110                 vp->port = port;
111                 vp->key = key;
112                 vp->note = note;
113                 vp->velocity = vel;
114                 vp->zone = table[i];
115                 if (vp->zone->sample)
116                         vp->block = vp->zone->sample->block;
117                 else
118                         vp->block = NULL;
119
120                 setup_voice(vp);
121
122                 vp->state = SNDRV_EMUX_ST_STANDBY;
123                 if (emu->ops.prepare) {
124                         vp->state = SNDRV_EMUX_ST_OFF;
125                         if (emu->ops.prepare(vp) >= 0)
126                                 vp->state = SNDRV_EMUX_ST_STANDBY;
127                 }
128         }
129
130         /* start envelope now */
131         for (i = 0; i < emu->max_voices; i++) {
132                 vp = &emu->voices[i];
133                 if (vp->state == SNDRV_EMUX_ST_STANDBY &&
134                     vp->chan == chan) {
135                         emu->ops.trigger(vp);
136                         vp->state = SNDRV_EMUX_ST_ON;
137                         vp->ontime = jiffies; /* remember the trigger timing */
138                 }
139         }
140         spin_unlock_irqrestore(&emu->voice_lock, flags);
141
142 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
143         if (port->port_mode == SNDRV_EMUX_PORT_MODE_OSS_SYNTH) {
144                 /* clear voice position for the next note on this channel */
145                 struct snd_emux_effect_table *fx = chan->private;
146                 if (fx) {
147                         fx->flag[EMUX_FX_SAMPLE_START] = 0;
148                         fx->flag[EMUX_FX_COARSE_SAMPLE_START] = 0;
149                 }
150         }
151 #endif
152 }
153
154 /*
155  * Release a note in response to a midi note off.
156  */
157 void
158 snd_emux_note_off(void *p, int note, int vel, struct snd_midi_channel *chan)
159 {
160         int ch;
161         struct snd_emux *emu;
162         struct snd_emux_voice *vp;
163         unsigned long flags;
164         struct snd_emux_port *port;
165
166         port = p;
167         snd_assert(port != NULL && chan != NULL, return);
168
169         emu = port->emu;
170         snd_assert(emu != NULL, return);
171         snd_assert(emu->ops.release != NULL, return);
172
173         spin_lock_irqsave(&emu->voice_lock, flags);
174         for (ch = 0; ch < emu->max_voices; ch++) {
175                 vp = &emu->voices[ch];
176                 if (STATE_IS_PLAYING(vp->state) &&
177                     vp->chan == chan && vp->key == note) {
178                         vp->state = SNDRV_EMUX_ST_RELEASED;
179                         if (vp->ontime == jiffies) {
180                                 /* if note-off is sent too shortly after
181                                  * note-on, emuX engine cannot produce the sound
182                                  * correctly.  so we'll release this note
183                                  * a bit later via timer callback.
184                                  */
185                                 vp->state = SNDRV_EMUX_ST_PENDING;
186                                 if (! emu->timer_active) {
187                                         emu->tlist.expires = jiffies + 1;
188                                         add_timer(&emu->tlist);
189                                         emu->timer_active = 1;
190                                 }
191                         } else
192                                 /* ok now release the note */
193                                 emu->ops.release(vp);
194                 }
195         }
196         spin_unlock_irqrestore(&emu->voice_lock, flags);
197 }
198
199 /*
200  * timer callback
201  *
202  * release the pending note-offs
203  */
204 void snd_emux_timer_callback(unsigned long data)
205 {
206         struct snd_emux *emu = (struct snd_emux *) data;
207         struct snd_emux_voice *vp;
208         unsigned long flags;
209         int ch, do_again = 0;
210
211         spin_lock_irqsave(&emu->voice_lock, flags);
212         for (ch = 0; ch < emu->max_voices; ch++) {
213                 vp = &emu->voices[ch];
214                 if (vp->state == SNDRV_EMUX_ST_PENDING) {
215                         if (vp->ontime == jiffies)
216                                 do_again++; /* release this at the next interrupt */
217                         else {
218                                 emu->ops.release(vp);
219                                 vp->state = SNDRV_EMUX_ST_RELEASED;
220                         }
221                 }
222         }
223         if (do_again) {
224                 emu->tlist.expires = jiffies + 1;
225                 add_timer(&emu->tlist);
226                 emu->timer_active = 1;
227         } else
228                 emu->timer_active = 0;
229         spin_unlock_irqrestore(&emu->voice_lock, flags);
230 }
231
232 /*
233  * key pressure change
234  */
235 void
236 snd_emux_key_press(void *p, int note, int vel, struct snd_midi_channel *chan)
237 {
238         int ch;
239         struct snd_emux *emu;
240         struct snd_emux_voice *vp;
241         unsigned long flags;
242         struct snd_emux_port *port;
243
244         port = p;
245         snd_assert(port != NULL && chan != NULL, return);
246
247         emu = port->emu;
248         snd_assert(emu != NULL, return);
249         snd_assert(emu->ops.update != NULL, return);
250
251         spin_lock_irqsave(&emu->voice_lock, flags);
252         for (ch = 0; ch < emu->max_voices; ch++) {
253                 vp = &emu->voices[ch];
254                 if (vp->state == SNDRV_EMUX_ST_ON &&
255                     vp->chan == chan && vp->key == note) {
256                         vp->velocity = vel;
257                         update_voice(emu, vp, SNDRV_EMUX_UPDATE_VOLUME);
258                 }
259         }
260         spin_unlock_irqrestore(&emu->voice_lock, flags);
261 }
262
263
264 /*
265  * Modulate the voices which belong to the channel
266  */
267 void
268 snd_emux_update_channel(struct snd_emux_port *port, struct snd_midi_channel *chan, int update)
269 {
270         struct snd_emux *emu;
271         struct snd_emux_voice *vp;
272         int i;
273         unsigned long flags;
274
275         if (! update)
276                 return;
277
278         emu = port->emu;
279         snd_assert(emu != NULL, return);
280         snd_assert(emu->ops.update != NULL, return);
281
282         spin_lock_irqsave(&emu->voice_lock, flags);
283         for (i = 0; i < emu->max_voices; i++) {
284                 vp = &emu->voices[i];
285                 if (vp->chan == chan)
286                         update_voice(emu, vp, update);
287         }
288         spin_unlock_irqrestore(&emu->voice_lock, flags);
289 }
290
291 /*
292  * Modulate all the voices which belong to the port.
293  */
294 void
295 snd_emux_update_port(struct snd_emux_port *port, int update)
296 {
297         struct snd_emux *emu; 
298         struct snd_emux_voice *vp;
299         int i;
300         unsigned long flags;
301
302         if (! update)
303                 return;
304
305         emu = port->emu;
306         snd_assert(emu != NULL, return);
307         snd_assert(emu->ops.update != NULL, return);
308
309         spin_lock_irqsave(&emu->voice_lock, flags);
310         for (i = 0; i < emu->max_voices; i++) {
311                 vp = &emu->voices[i];
312                 if (vp->port == port)
313                         update_voice(emu, vp, update);
314         }
315         spin_unlock_irqrestore(&emu->voice_lock, flags);
316 }
317
318
319 /*
320  * Deal with a controler type event.  This includes all types of
321  * control events, not just the midi controllers
322  */
323 void
324 snd_emux_control(void *p, int type, struct snd_midi_channel *chan)
325 {
326         struct snd_emux_port *port;
327
328         port = p;
329         snd_assert(port != NULL && chan != NULL, return);
330
331         switch (type) {
332         case MIDI_CTL_MSB_MAIN_VOLUME:
333         case MIDI_CTL_MSB_EXPRESSION:
334                 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_VOLUME);
335                 break;
336                 
337         case MIDI_CTL_MSB_PAN:
338                 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_PAN);
339                 break;
340
341         case MIDI_CTL_SOFT_PEDAL:
342 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
343                 /* FIXME: this is an emulation */
344                 snd_emux_send_effect(port, chan, EMUX_FX_CUTOFF, -160,
345                                      EMUX_FX_FLAG_ADD);
346 #endif
347                 break;
348
349         case MIDI_CTL_PITCHBEND:
350                 snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_PITCH);
351                 break;
352
353         case MIDI_CTL_MSB_MODWHEEL:
354         case MIDI_CTL_CHAN_PRESSURE:
355                 snd_emux_update_channel(port, chan,
356                                         SNDRV_EMUX_UPDATE_FMMOD |
357                                         SNDRV_EMUX_UPDATE_FM2FRQ2);
358                 break;
359
360         }
361
362         if (port->chset.midi_mode == SNDRV_MIDI_MODE_XG) {
363                 snd_emux_xg_control(port, chan, type);
364         }
365 }
366
367
368 /*
369  * terminate note - if free flag is true, free the terminated voice
370  */
371 static void
372 terminate_note1(struct snd_emux *emu, int note, struct snd_midi_channel *chan, int free)
373 {
374         int  i;
375         struct snd_emux_voice *vp;
376         unsigned long flags;
377
378         spin_lock_irqsave(&emu->voice_lock, flags);
379         for (i = 0; i < emu->max_voices; i++) {
380                 vp = &emu->voices[i];
381                 if (STATE_IS_PLAYING(vp->state) && vp->chan == chan &&
382                     vp->key == note)
383                         terminate_voice(emu, vp, free);
384         }
385         spin_unlock_irqrestore(&emu->voice_lock, flags);
386 }
387
388
389 /*
390  * terminate note - exported for midi emulation
391  */
392 void
393 snd_emux_terminate_note(void *p, int note, struct snd_midi_channel *chan)
394 {
395         struct snd_emux *emu;
396         struct snd_emux_port *port;
397
398         port = p;
399         snd_assert(port != NULL && chan != NULL, return);
400
401         emu = port->emu;
402         snd_assert(emu != NULL, return);
403         snd_assert(emu->ops.terminate != NULL, return);
404
405         terminate_note1(emu, note, chan, 1);
406 }
407
408
409 /*
410  * Terminate all the notes
411  */
412 void
413 snd_emux_terminate_all(struct snd_emux *emu)
414 {
415         int i;
416         struct snd_emux_voice *vp;
417         unsigned long flags;
418
419         spin_lock_irqsave(&emu->voice_lock, flags);
420         for (i = 0; i < emu->max_voices; i++) {
421                 vp = &emu->voices[i];
422                 if (STATE_IS_PLAYING(vp->state))
423                         terminate_voice(emu, vp, 0);
424                 if (vp->state == SNDRV_EMUX_ST_OFF) {
425                         if (emu->ops.free_voice)
426                                 emu->ops.free_voice(vp);
427                         if (emu->ops.reset)
428                                 emu->ops.reset(emu, i);
429                 }
430                 vp->time = 0;
431         }
432         /* initialize allocation time */
433         emu->use_time = 0;
434         spin_unlock_irqrestore(&emu->voice_lock, flags);
435 }
436
437 EXPORT_SYMBOL(snd_emux_terminate_all);
438
439 /*
440  * Terminate all voices associated with the given port
441  */
442 void
443 snd_emux_sounds_off_all(struct snd_emux_port *port)
444 {
445         int i;
446         struct snd_emux *emu;
447         struct snd_emux_voice *vp;
448         unsigned long flags;
449
450         snd_assert(port != NULL, return);
451         emu = port->emu;
452         snd_assert(emu != NULL, return);
453         snd_assert(emu->ops.terminate != NULL, return);
454
455         spin_lock_irqsave(&emu->voice_lock, flags);
456         for (i = 0; i < emu->max_voices; i++) {
457                 vp = &emu->voices[i];
458                 if (STATE_IS_PLAYING(vp->state) &&
459                     vp->port == port)
460                         terminate_voice(emu, vp, 0);
461                 if (vp->state == SNDRV_EMUX_ST_OFF) {
462                         if (emu->ops.free_voice)
463                                 emu->ops.free_voice(vp);
464                         if (emu->ops.reset)
465                                 emu->ops.reset(emu, i);
466                 }
467         }
468         spin_unlock_irqrestore(&emu->voice_lock, flags);
469 }
470
471
472 /*
473  * Terminate all voices that have the same exclusive class.  This
474  * is mainly for drums.
475  */
476 static void
477 exclusive_note_off(struct snd_emux *emu, struct snd_emux_port *port, int exclass)
478 {
479         struct snd_emux_voice *vp;
480         int  i;
481         unsigned long flags;
482
483         spin_lock_irqsave(&emu->voice_lock, flags);
484         for (i = 0; i < emu->max_voices; i++) {
485                 vp = &emu->voices[i];
486                 if (STATE_IS_PLAYING(vp->state) && vp->port == port &&
487                     vp->reg.exclusiveClass == exclass) {
488                         terminate_voice(emu, vp, 0);
489                 }
490         }
491         spin_unlock_irqrestore(&emu->voice_lock, flags);
492 }
493
494 /*
495  * terminate a voice
496  * if free flag is true, call free_voice after termination
497  */
498 static void
499 terminate_voice(struct snd_emux *emu, struct snd_emux_voice *vp, int free)
500 {
501         emu->ops.terminate(vp);
502         vp->time = emu->use_time++;
503         vp->chan = NULL;
504         vp->port = NULL;
505         vp->zone = NULL;
506         vp->block = NULL;
507         vp->state = SNDRV_EMUX_ST_OFF;
508         if (free && emu->ops.free_voice)
509                 emu->ops.free_voice(vp);
510 }
511
512
513 /*
514  * Modulate the voice
515  */
516 static void
517 update_voice(struct snd_emux *emu, struct snd_emux_voice *vp, int update)
518 {
519         if (!STATE_IS_PLAYING(vp->state))
520                 return;
521
522         if (vp->chan == NULL || vp->port == NULL)
523                 return;
524         if (update & SNDRV_EMUX_UPDATE_VOLUME)
525                 calc_volume(vp);
526         if (update & SNDRV_EMUX_UPDATE_PITCH)
527                 calc_pitch(vp);
528         if (update & SNDRV_EMUX_UPDATE_PAN) {
529                 if (! calc_pan(vp) && (update == SNDRV_EMUX_UPDATE_PAN))
530                         return;
531         }
532         emu->ops.update(vp, update);
533 }
534
535
536 #if 0 // not used
537 /* table for volume target calculation */
538 static unsigned short voltarget[16] = { 
539         0xEAC0, 0xE0C8, 0xD740, 0xCE20, 0xC560, 0xBD08, 0xB500, 0xAD58,
540         0xA5F8, 0x9EF0, 0x9830, 0x91C0, 0x8B90, 0x85A8, 0x8000, 0x7A90
541 };
542 #endif
543
544 #define LO_BYTE(v)      ((v) & 0xff)
545 #define HI_BYTE(v)      (((v) >> 8) & 0xff)
546
547 /*
548  * Sets up the voice structure by calculating some values that
549  * will be needed later.
550  */
551 static void
552 setup_voice(struct snd_emux_voice *vp)
553 {
554         struct soundfont_voice_parm *parm;
555         int pitch;
556
557         /* copy the original register values */
558         vp->reg = vp->zone->v;
559
560 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
561         snd_emux_setup_effect(vp);
562 #endif
563
564         /* reset status */
565         vp->apan = -1;
566         vp->avol = -1;
567         vp->apitch = -1;
568
569         calc_volume(vp);
570         calc_pitch(vp);
571         calc_pan(vp);
572
573         parm = &vp->reg.parm;
574
575         /* compute filter target and correct modulation parameters */
576         if (LO_BYTE(parm->modatkhld) >= 0x80 && parm->moddelay >= 0x8000) {
577                 parm->moddelay = 0xbfff;
578                 pitch = (HI_BYTE(parm->pefe) << 4) + vp->apitch;
579                 if (pitch > 0xffff)
580                         pitch = 0xffff;
581                 /* calculate filter target */
582                 vp->ftarget = parm->cutoff + LO_BYTE(parm->pefe);
583                 LIMITVALUE(vp->ftarget, 0, 255);
584                 vp->ftarget <<= 8;
585         } else {
586                 vp->ftarget = parm->cutoff;
587                 vp->ftarget <<= 8;
588                 pitch = vp->apitch;
589         }
590
591         /* compute pitch target */
592         if (pitch != 0xffff) {
593                 vp->ptarget = 1 << (pitch >> 12);
594                 if (pitch & 0x800) vp->ptarget += (vp->ptarget*0x102e)/0x2710;
595                 if (pitch & 0x400) vp->ptarget += (vp->ptarget*0x764)/0x2710;
596                 if (pitch & 0x200) vp->ptarget += (vp->ptarget*0x389)/0x2710;
597                 vp->ptarget += (vp->ptarget >> 1);
598                 if (vp->ptarget > 0xffff) vp->ptarget = 0xffff;
599         } else
600                 vp->ptarget = 0xffff;
601
602         if (LO_BYTE(parm->modatkhld) >= 0x80) {
603                 parm->modatkhld &= ~0xff;
604                 parm->modatkhld |= 0x7f;
605         }
606
607         /* compute volume target and correct volume parameters */
608         vp->vtarget = 0;
609 #if 0 /* FIXME: this leads to some clicks.. */
610         if (LO_BYTE(parm->volatkhld) >= 0x80 && parm->voldelay >= 0x8000) {
611                 parm->voldelay = 0xbfff;
612                 vp->vtarget = voltarget[vp->avol % 0x10] >> (vp->avol >> 4);
613         }
614 #endif
615
616         if (LO_BYTE(parm->volatkhld) >= 0x80) {
617                 parm->volatkhld &= ~0xff;
618                 parm->volatkhld |= 0x7f;
619         }
620 }
621
622 /*
623  * calculate pitch parameter
624  */
625 static unsigned char pan_volumes[256] = {
626 0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x14,0x17,0x1a,0x1d,0x20,0x22,0x25,0x28,0x2a,
627 0x2d,0x30,0x32,0x35,0x37,0x3a,0x3c,0x3f,0x41,0x44,0x46,0x49,0x4b,0x4d,0x50,0x52,
628 0x54,0x57,0x59,0x5b,0x5d,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6f,0x71,0x73,0x75,
629 0x77,0x79,0x7b,0x7c,0x7e,0x80,0x82,0x84,0x86,0x88,0x89,0x8b,0x8d,0x8f,0x90,0x92,
630 0x94,0x96,0x97,0x99,0x9a,0x9c,0x9e,0x9f,0xa1,0xa2,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,
631 0xad,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb9,0xba,0xbb,0xbc,0xbe,0xbf,0xc0,
632 0xc1,0xc2,0xc3,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,
633 0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xdd,0xde,0xdf,
634 0xdf,0xe0,0xe1,0xe2,0xe2,0xe3,0xe4,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,
635 0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf1,
636 0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,0xf4,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,
637 0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,
638 0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
639 0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
640 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
641 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
642 };
643
644 static int
645 calc_pan(struct snd_emux_voice *vp)
646 {
647         struct snd_midi_channel *chan = vp->chan;
648         int pan;
649
650         /* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */
651         if (vp->reg.fixpan > 0) /* 0-127 */
652                 pan = 255 - (int)vp->reg.fixpan * 2;
653         else {
654                 pan = chan->control[MIDI_CTL_MSB_PAN] - 64;
655                 if (vp->reg.pan >= 0) /* 0-127 */
656                         pan += vp->reg.pan - 64;
657                 pan = 127 - (int)pan * 2;
658         }
659         LIMITVALUE(pan, 0, 255);
660
661         if (vp->emu->linear_panning) {
662                 /* assuming linear volume */
663                 if (pan != vp->apan) {
664                         vp->apan = pan;
665                         if (pan == 0)
666                                 vp->aaux = 0xff;
667                         else
668                                 vp->aaux = (-pan) & 0xff;
669                         return 1;
670                 } else
671                         return 0;
672         } else {
673                 /* using volume table */
674                 if (vp->apan != (int)pan_volumes[pan]) {
675                         vp->apan = pan_volumes[pan];
676                         vp->aaux = pan_volumes[255 - pan];
677                         return 1;
678                 }
679                 return 0;
680         }
681 }
682
683
684 /*
685  * calculate volume attenuation
686  *
687  * Voice volume is controlled by volume attenuation parameter.
688  * So volume becomes maximum when avol is 0 (no attenuation), and
689  * minimum when 255 (-96dB or silence).
690  */
691
692 /* tables for volume->attenuation calculation */
693 static unsigned char voltab1[128] = {
694    0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
695    0x63, 0x2b, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22,
696    0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
697    0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14,
698    0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
699    0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d,
700    0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
701    0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
702    0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06,
703    0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
704    0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
705    0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
706    0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
707 };
708
709 static unsigned char voltab2[128] = {
710    0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x2a,
711    0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x24, 0x23, 0x22, 0x21,
712    0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a,
713    0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15,
714    0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x10,
715    0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d,
716    0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a,
717    0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
718    0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
719    0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
720    0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
721    0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
722    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
723 };
724
725 static unsigned char expressiontab[128] = {
726    0x7f, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x4b, 0x48, 0x45, 0x42,
727    0x40, 0x3d, 0x3b, 0x39, 0x38, 0x36, 0x34, 0x33, 0x31, 0x30,
728    0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
729    0x24, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1e, 0x1e,
730    0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18,
731    0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x13,
732    0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f,
733    0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
734    0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
735    0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
736    0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
737    0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
738    0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
739 };
740
741 /*
742  * Magic to calculate the volume (actually attenuation) from all the
743  * voice and channels parameters.
744  */
745 static int
746 calc_volume(struct snd_emux_voice *vp)
747 {
748         int vol;
749         int main_vol, expression_vol, master_vol;
750         struct snd_midi_channel *chan = vp->chan;
751         struct snd_emux_port *port = vp->port;
752
753         expression_vol = chan->control[MIDI_CTL_MSB_EXPRESSION];
754         LIMITMAX(vp->velocity, 127);
755         LIMITVALUE(expression_vol, 0, 127);
756         if (port->port_mode == SNDRV_EMUX_PORT_MODE_OSS_SYNTH) {
757                 /* 0 - 127 */
758                 main_vol = chan->control[MIDI_CTL_MSB_MAIN_VOLUME];
759                 vol = (vp->velocity * main_vol * expression_vol) / (127*127);
760                 vol = vol * vp->reg.amplitude / 127;
761
762                 LIMITVALUE(vol, 0, 127);
763
764                 /* calc to attenuation */
765                 vol = snd_sf_vol_table[vol];
766
767         } else {
768                 main_vol = chan->control[MIDI_CTL_MSB_MAIN_VOLUME] * vp->reg.amplitude / 127;
769                 LIMITVALUE(main_vol, 0, 127);
770
771                 vol = voltab1[main_vol] + voltab2[vp->velocity];
772                 vol = (vol * 8) / 3;
773                 vol += vp->reg.attenuation;
774                 vol += ((0x100 - vol) * expressiontab[expression_vol])/128;
775         }
776
777         master_vol = port->chset.gs_master_volume;
778         LIMITVALUE(master_vol, 0, 127);
779         vol += snd_sf_vol_table[master_vol];
780         vol += port->volume_atten;
781
782 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
783         if (chan->private) {
784                 struct snd_emux_effect_table *fx = chan->private;
785                 vol += fx->val[EMUX_FX_ATTEN];
786         }
787 #endif
788
789         LIMITVALUE(vol, 0, 255);
790         if (vp->avol == vol)
791                 return 0; /* value unchanged */
792
793         vp->avol = vol;
794         if (!SF_IS_DRUM_BANK(get_bank(port, chan))
795             && LO_BYTE(vp->reg.parm.volatkhld) < 0x7d) {
796                 int atten;
797                 if (vp->velocity < 70)
798                         atten = 70;
799                 else
800                         atten = vp->velocity;
801                 vp->acutoff = (atten * vp->reg.parm.cutoff + 0xa0) >> 7;
802         } else {
803                 vp->acutoff = vp->reg.parm.cutoff;
804         }
805
806         return 1; /* value changed */
807 }
808
809 /*
810  * calculate pitch offset
811  *
812  * 0xE000 is no pitch offset at 44100Hz sample.
813  * Every 4096 is one octave.
814  */
815
816 static int
817 calc_pitch(struct snd_emux_voice *vp)
818 {
819         struct snd_midi_channel *chan = vp->chan;
820         int offset;
821
822         /* calculate offset */
823         if (vp->reg.fixkey >= 0) {
824                 offset = (vp->reg.fixkey - vp->reg.root) * 4096 / 12;
825         } else {
826                 offset = (vp->note - vp->reg.root) * 4096 / 12;
827         }
828         offset = (offset * vp->reg.scaleTuning) / 100;
829         offset += vp->reg.tune * 4096 / 1200;
830         if (chan->midi_pitchbend != 0) {
831                 /* (128 * 8192: 1 semitone) ==> (4096: 12 semitones) */
832                 offset += chan->midi_pitchbend * chan->gm_rpn_pitch_bend_range / 3072;
833         }
834
835         /* tuning via RPN:
836          *   coarse = -8192 to 8192 (100 cent per 128)
837          *   fine = -8192 to 8192 (max=100cent)
838          */
839         /* 4096 = 1200 cents in emu8000 parameter */
840         offset += chan->gm_rpn_coarse_tuning * 4096 / (12 * 128);
841         offset += chan->gm_rpn_fine_tuning / 24;
842
843 #ifdef SNDRV_EMUX_USE_RAW_EFFECT
844         /* add initial pitch correction */
845         if (chan->private) {
846                 struct snd_emux_effect_table *fx = chan->private;
847                 if (fx->flag[EMUX_FX_INIT_PITCH])
848                         offset += fx->val[EMUX_FX_INIT_PITCH];
849         }
850 #endif
851
852         /* 0xe000: root pitch */
853         offset += 0xe000 + vp->reg.rate_offset;
854         offset += vp->emu->pitch_shift;
855         LIMITVALUE(offset, 0, 0xffff);
856         if (offset == vp->apitch)
857                 return 0; /* unchanged */
858         vp->apitch = offset;
859         return 1; /* value changed */
860 }
861
862 /*
863  * Get the bank number assigned to the channel
864  */
865 static int
866 get_bank(struct snd_emux_port *port, struct snd_midi_channel *chan)
867 {
868         int val;
869
870         switch (port->chset.midi_mode) {
871         case SNDRV_MIDI_MODE_XG:
872                 val = chan->control[MIDI_CTL_MSB_BANK];
873                 if (val == 127)
874                         return 128; /* return drum bank */
875                 return chan->control[MIDI_CTL_LSB_BANK];
876
877         case SNDRV_MIDI_MODE_GS:
878                 if (chan->drum_channel)
879                         return 128;
880                 /* ignore LSB (bank map) */
881                 return chan->control[MIDI_CTL_MSB_BANK];
882                 
883         default:
884                 if (chan->drum_channel)
885                         return 128;
886                 return chan->control[MIDI_CTL_MSB_BANK];
887         }
888 }
889
890
891 /* Look for the zones matching with the given note and velocity.
892  * The resultant zones are stored on table.
893  */
894 static int
895 get_zone(struct snd_emux *emu, struct snd_emux_port *port,
896          int *notep, int vel, struct snd_midi_channel *chan,
897          struct snd_sf_zone **table)
898 {
899         int preset, bank, def_preset, def_bank;
900
901         bank = get_bank(port, chan);
902         preset = chan->midi_program;
903
904         if (SF_IS_DRUM_BANK(bank)) {
905                 def_preset = port->ctrls[EMUX_MD_DEF_DRUM];
906                 def_bank = bank;
907         } else {
908                 def_preset = preset;
909                 def_bank = port->ctrls[EMUX_MD_DEF_BANK];
910         }
911
912         return snd_soundfont_search_zone(emu->sflist, notep, vel, preset, bank,
913                                          def_preset, def_bank,
914                                          table, SNDRV_EMUX_MAX_MULTI_VOICES);
915 }
916
917 /*
918  */
919 void
920 snd_emux_init_voices(struct snd_emux *emu)
921 {
922         struct snd_emux_voice *vp;
923         int i;
924         unsigned long flags;
925
926         spin_lock_irqsave(&emu->voice_lock, flags);
927         for (i = 0; i < emu->max_voices; i++) {
928                 vp = &emu->voices[i];
929                 vp->ch = -1; /* not used */
930                 vp->state = SNDRV_EMUX_ST_OFF;
931                 vp->chan = NULL;
932                 vp->port = NULL;
933                 vp->time = 0;
934                 vp->emu = emu;
935                 vp->hw = emu->hw;
936         }
937         spin_unlock_irqrestore(&emu->voice_lock, flags);
938 }
939
940 /*
941  */
942 void snd_emux_lock_voice(struct snd_emux *emu, int voice)
943 {
944         unsigned long flags;
945
946         spin_lock_irqsave(&emu->voice_lock, flags);
947         if (emu->voices[voice].state == SNDRV_EMUX_ST_OFF)
948                 emu->voices[voice].state = SNDRV_EMUX_ST_LOCKED;
949         else
950                 snd_printk("invalid voice for lock %d (state = %x)\n",
951                            voice, emu->voices[voice].state);
952         spin_unlock_irqrestore(&emu->voice_lock, flags);
953 }
954
955 EXPORT_SYMBOL(snd_emux_lock_voice);
956
957 /*
958  */
959 void snd_emux_unlock_voice(struct snd_emux *emu, int voice)
960 {
961         unsigned long flags;
962
963         spin_lock_irqsave(&emu->voice_lock, flags);
964         if (emu->voices[voice].state == SNDRV_EMUX_ST_LOCKED)
965                 emu->voices[voice].state = SNDRV_EMUX_ST_OFF;
966         else
967                 snd_printk("invalid voice for unlock %d (state = %x)\n",
968                            voice, emu->voices[voice].state);
969         spin_unlock_irqrestore(&emu->voice_lock, flags);
970 }
971
972 EXPORT_SYMBOL(snd_emux_unlock_voice);