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