/*
 * OPL4 MIDI synthesizer functions
 *
 * Copyright (c) 2003 by Clemens Ladisch <clemens@ladisch.de>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed and/or modified under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include "opl4_local.h"
#include <linux/delay.h>
#include <linux/io.h>
#include <sound/asoundef.h>

/* GM2 controllers */
#ifndef MIDI_CTL_RELEASE_TIME
#define MIDI_CTL_RELEASE_TIME	0x48
#define MIDI_CTL_ATTACK_TIME	0x49
#define MIDI_CTL_DECAY_TIME	0x4b
#define MIDI_CTL_VIBRATO_RATE	0x4c
#define MIDI_CTL_VIBRATO_DEPTH	0x4d
#define MIDI_CTL_VIBRATO_DELAY	0x4e
#endif

/*
 * This table maps 100/128 cents to F_NUMBER.
 */
static const s16 snd_opl4_pitch_map[0x600] = {
	0x000,0x000,0x001,0x001,0x002,0x002,0x003,0x003,
	0x004,0x004,0x005,0x005,0x006,0x006,0x006,0x007,
	0x007,0x008,0x008,0x009,0x009,0x00a,0x00a,0x00b,
	0x00b,0x00c,0x00c,0x00d,0x00d,0x00d,0x00e,0x00e,
	0x00f,0x00f,0x010,0x010,0x011,0x011,0x012,0x012,
	0x013,0x013,0x014,0x014,0x015,0x015,0x015,0x016,
	0x016,0x017,0x017,0x018,0x018,0x019,0x019,0x01a,
	0x01a,0x01b,0x01b,0x01c,0x01c,0x01d,0x01d,0x01e,
	0x01e,0x01e,0x01f,0x01f,0x020,0x020,0x021,0x021,
	0x022,0x022,0x023,0x023,0x024,0x024,0x025,0x025,
	0x026,0x026,0x027,0x027,0x028,0x028,0x029,0x029,
	0x029,0x02a,0x02a,0x02b,0x02b,0x02c,0x02c,0x02d,
	0x02d,0x02e,0x02e,0x02f,0x02f,0x030,0x030,0x031,
	0x031,0x032,0x032,0x033,0x033,0x034,0x034,0x035,
	0x035,0x036,0x036,0x037,0x037,0x038,0x038,0x038,
	0x039,0x039,0x03a,0x03a,0x03b,0x03b,0x03c,0x03c,
	0x03d,0x03d,0x03e,0x03e,0x03f,0x03f,0x040,0x040,
	0x041,0x041,0x042,0x042,0x043,0x043,0x044,0x044,
	0x045,0x045,0x046,0x046,0x047,0x047,0x048,0x048,
	0x049,0x049,0x04a,0x04a,0x04b,0x04b,0x04c,0x04c,
	0x04d,0x04d,0x04e,0x04e,0x04f,0x04f,0x050,0x050,
	0x051,0x051,0x052,0x052,0x053,0x053,0x054,0x054,
	0x055,0x055,0x056,0x056,0x057,0x057,0x058,0x058,
	0x059,0x059,0x05a,0x05a,0x05b,0x05b,0x05c,0x05c,
	0x05d,0x05d,0x05e,0x05e,0x05f,0x05f,0x060,0x060,
	0x061,0x061,0x062,0x062,0x063,0x063,0x064,0x064,
	0x065,0x065,0x066,0x066,0x067,0x067,0x068,0x068,
	0x069,0x069,0x06a,0x06a,0x06b,0x06b,0x06c,0x06c,
	0x06d,0x06d,0x06e,0x06e,0x06f,0x06f,0x070,0x071,
	0x071,0x072,0x072,0x073,0x073,0x074,0x074,0x075,
	0x075,0x076,0x076,0x077,0x077,0x078,0x078,0x079,
	0x079,0x07a,0x07a,0x07b,0x07b,0x07c,0x07c,0x07d,
	0x07d,0x07e,0x07e,0x07f,0x07f,0x080,0x081,0x081,
	0x082,0x082,0x083,0x083,0x084,0x084,0x085,0x085,
	0x086,0x086,0x087,0x087,0x088,0x088,0x089,0x089,
	0x08a,0x08a,0x08b,0x08b,0x08c,0x08d,0x08d,0x08e,
	0x08e,0x08f,0x08f,0x090,0x090,0x091,0x091,0x092,
	0x092,0x093,0x093,0x094,0x094,0x095,0x096,0x096,
	0x097,0x097,0x098,0x098,0x099,0x099,0x09a,0x09a,
	0x09b,0x09b,0x09c,0x09c,0x09d,0x09d,0x09e,0x09f,
	0x09f,0x0a0,0x0a0,0x0a1,0x0a1,0x0a2,0x0a2,0x0a3,
	0x0a3,0x0a4,0x0a4,0x0a5,0x0a6,0x0a6,0x0a7,0x0a7,
	0x0a8,0x0a8,0x0a9,0x0a9,0x0aa,0x0aa,0x0ab,0x0ab,
	0x0ac,0x0ad,0x0ad,0x0ae,0x0ae,0x0af,0x0af,0x0b0,
	0x0b0,0x0b1,0x0b1,0x0b2,0x0b2,0x0b3,0x0b4,0x0b4,
	0x0b5,0x0b5,0x0b6,0x0b6,0x0b7,0x0b7,0x0b8,0x0b8,
	0x0b9,0x0ba,0x0ba,0x0bb,0x0bb,0x0bc,0x0bc,0x0bd,
	0x0bd,0x0be,0x0be,0x0bf,0x0c0,0x0c0,0x0c1,0x0c1,
	0x0c2,0x0c2,0x0c3,0x0c3,0x0c4,0x0c4,0x0c5,0x0c6,
	0x0c6,0x0c7,0x0c7,0x0c8,0x0c8,0x0c9,0x0c9,0x0ca,
	0x0cb,0x0cb,0x0cc,0x0cc,0x0cd,0x0cd,0x0ce,0x0ce,
	0x0cf,0x0d0,0x0d0,0x0d1,0x0d1,0x0d2,0x0d2,0x0d3,
	0x0d3,0x0d4,0x0d5,0x0d5,0x0d6,0x0d6,0x0d7,0x0d7,
	0x0d8,0x0d8,0x0d9,0x0da,0x0da,0x0db,0x0db,0x0dc,
	0x0dc,0x0dd,0x0de,0x0de,0x0df,0x0df,0x0e0,0x0e0,
	0x0e1,0x0e1,0x0e2,0x0e3,0x0e3,0x0e4,0x0e4,0x0e5,
	0x0e5,0x0e6,0x0e7,0x0e7,0x0e8,0x0e8,0x0e9,0x0e9,
	0x0ea,0x0eb,0x0eb,0x0ec,0x0ec,0x0ed,0x0ed,0x0ee,
	0x0ef,0x0ef,0x0f0,0x0f0,0x0f1,0x0f1,0x0f2,0x0f3,
	0x0f3,0x0f4,0x0f4,0x0f5,0x0f5,0x0f6,0x0f7,0x0f7,
	0x0f8,0x0f8,0x0f9,0x0f9,0x0fa,0x0fb,0x0fb,0x0fc,
	0x0fc,0x0fd,0x0fd,0x0fe,0x0ff,0x0ff,0x100,0x100,
	0x101,0x101,0x102,0x103,0x103,0x104,0x104,0x105,
	0x106,0x106,0x107,0x107,0x108,0x108,0x109,0x10a,
	0x10a,0x10b,0x10b,0x10c,0x10c,0x10d,0x10e,0x10e,
	0x10f,0x10f,0x110,0x111,0x111,0x112,0x112,0x113,
	0x114,0x114,0x115,0x115,0x116,0x116,0x117,0x118,
	0x118,0x119,0x119,0x11a,0x11b,0x11b,0x11c,0x11c,
	0x11d,0x11e,0x11e,0x11f,0x11f,0x120,0x120,0x121,
	0x122,0x122,0x123,0x123,0x124,0x125,0x125,0x126,
	0x126,0x127,0x128,0x128,0x129,0x129,0x12a,0x12b,
	0x12b,0x12c,0x12c,0x12d,0x12e,0x12e,0x12f,0x12f,
	0x130,0x131,0x131,0x132,0x132,0x133,0x134,0x134,
	0x135,0x135,0x136,0x137,0x137,0x138,0x138,0x139,
	0x13a,0x13a,0x13b,0x13b,0x13c,0x13d,0x13d,0x13e,
	0x13e,0x13f,0x140,0x140,0x141,0x141,0x142,0x143,
	0x143,0x144,0x144,0x145,0x146,0x146,0x147,0x148,
	0x148,0x149,0x149,0x14a,0x14b,0x14b,0x14c,0x14c,
	0x14d,0x14e,0x14e,0x14f,0x14f,0x150,0x151,0x151,
	0x152,0x153,0x153,0x154,0x154,0x155,0x156,0x156,
	0x157,0x157,0x158,0x159,0x159,0x15a,0x15b,0x15b,
	0x15c,0x15c,0x15d,0x15e,0x15e,0x15f,0x160,0x160,
	0x161,0x161,0x162,0x163,0x163,0x164,0x165,0x165,
	0x166,0x166,0x167,0x168,0x168,0x169,0x16a,0x16a,
	0x16b,0x16b,0x16c,0x16d,0x16d,0x16e,0x16f,0x16f,
	0x170,0x170,0x171,0x172,0x172,0x173,0x174,0x174,
	0x175,0x175,0x176,0x177,0x177,0x178,0x179,0x179,
	0x17a,0x17a,0x17b,0x17c,0x17c,0x17d,0x17e,0x17e,
	0x17f,0x180,0x180,0x181,0x181,0x182,0x183,0x183,
	0x184,0x185,0x185,0x186,0x187,0x187,0x188,0x188,
	0x189,0x18a,0x18a,0x18b,0x18c,0x18c,0x18d,0x18e,
	0x18e,0x18f,0x190,0x190,0x191,0x191,0x192,0x193,
	0x193,0x194,0x195,0x195,0x196,0x197,0x197,0x198,
	0x199,0x199,0x19a,0x19a,0x19b,0x19c,0x19c,0x19d,
	0x19e,0x19e,0x19f,0x1a0,0x1a0,0x1a1,0x1a2,0x1a2,
	0x1a3,0x1a4,0x1a4,0x1a5,0x1a6,0x1a6,0x1a7,0x1a8,
	0x1a8,0x1a9,0x1a9,0x1aa,0x1ab,0x1ab,0x1ac,0x1ad,
	0x1ad,0x1ae,0x1af,0x1af,0x1b0,0x1b1,0x1b1,0x1b2,
	0x1b3,0x1b3,0x1b4,0x1b5,0x1b5,0x1b6,0x1b7,0x1b7,
	0x1b8,0x1b9,0x1b9,0x1ba,0x1bb,0x1bb,0x1bc,0x1bd,
	0x1bd,0x1be,0x1bf,0x1bf,0x1c0,0x1c1,0x1c1,0x1c2,
	0x1c3,0x1c3,0x1c4,0x1c5,0x1c5,0x1c6,0x1c7,0x1c7,
	0x1c8,0x1c9,0x1c9,0x1ca,0x1cb,0x1cb,0x1cc,0x1cd,
	0x1cd,0x1ce,0x1cf,0x1cf,0x1d0,0x1d1,0x1d1,0x1d2,
	0x1d3,0x1d3,0x1d4,0x1d5,0x1d5,0x1d6,0x1d7,0x1d7,
	0x1d8,0x1d9,0x1d9,0x1da,0x1db,0x1db,0x1dc,0x1dd,
	0x1dd,0x1de,0x1df,0x1df,0x1e0,0x1e1,0x1e1,0x1e2,
	0x1e3,0x1e4,0x1e4,0x1e5,0x1e6,0x1e6,0x1e7,0x1e8,
	0x1e8,0x1e9,0x1ea,0x1ea,0x1eb,0x1ec,0x1ec,0x1ed,
	0x1ee,0x1ee,0x1ef,0x1f0,0x1f0,0x1f1,0x1f2,0x1f3,
	0x1f3,0x1f4,0x1f5,0x1f5,0x1f6,0x1f7,0x1f7,0x1f8,
	0x1f9,0x1f9,0x1fa,0x1fb,0x1fb,0x1fc,0x1fd,0x1fe,
	0x1fe,0x1ff,0x200,0x200,0x201,0x202,0x202,0x203,
	0x204,0x205,0x205,0x206,0x207,0x207,0x208,0x209,
	0x209,0x20a,0x20b,0x20b,0x20c,0x20d,0x20e,0x20e,
	0x20f,0x210,0x210,0x211,0x212,0x212,0x213,0x214,
	0x215,0x215,0x216,0x217,0x217,0x218,0x219,0x21a,
	0x21a,0x21b,0x21c,0x21c,0x21d,0x21e,0x21e,0x21f,
	0x220,0x221,0x221,0x222,0x223,0x223,0x224,0x225,
	0x226,0x226,0x227,0x228,0x228,0x229,0x22a,0x22b,
	0x22b,0x22c,0x22d,0x22d,0x22e,0x22f,0x230,0x230,
	0x231,0x232,0x232,0x233,0x234,0x235,0x235,0x236,
	0x237,0x237,0x238,0x239,0x23a,0x23a,0x23b,0x23c,
	0x23c,0x23d,0x23e,0x23f,0x23f,0x240,0x241,0x241,
	0x242,0x243,0x244,0x244,0x245,0x246,0x247,0x247,
	0x248,0x249,0x249,0x24a,0x24b,0x24c,0x24c,0x24d,
	0x24e,0x24f,0x24f,0x250,0x251,0x251,0x252,0x253,
	0x254,0x254,0x255,0x256,0x257,0x257,0x258,0x259,
	0x259,0x25a,0x25b,0x25c,0x25c,0x25d,0x25e,0x25f,
	0x25f,0x260,0x261,0x262,0x262,0x263,0x264,0x265,
	0x265,0x266,0x267,0x267,0x268,0x269,0x26a,0x26a,
	0x26b,0x26c,0x26d,0x26d,0x26e,0x26f,0x270,0x270,
	0x271,0x272,0x273,0x273,0x274,0x275,0x276,0x276,
	0x277,0x278,0x279,0x279,0x27a,0x27b,0x27c,0x27c,
	0x27d,0x27e,0x27f,0x27f,0x280,0x281,0x282,0x282,
	0x283,0x284,0x285,0x285,0x286,0x287,0x288,0x288,
	0x289,0x28a,0x28b,0x28b,0x28c,0x28d,0x28e,0x28e,
	0x28f,0x290,0x291,0x291,0x292,0x293,0x294,0x294,
	0x295,0x296,0x297,0x298,0x298,0x299,0x29a,0x29b,
	0x29b,0x29c,0x29d,0x29e,0x29e,0x29f,0x2a0,0x2a1,
	0x2a1,0x2a2,0x2a3,0x2a4,0x2a5,0x2a5,0x2a6,0x2a7,
	0x2a8,0x2a8,0x2a9,0x2aa,0x2ab,0x2ab,0x2ac,0x2ad,
	0x2ae,0x2af,0x2af,0x2b0,0x2b1,0x2b2,0x2b2,0x2b3,
	0x2b4,0x2b5,0x2b5,0x2b6,0x2b7,0x2b8,0x2b9,0x2b9,
	0x2ba,0x2bb,0x2bc,0x2bc,0x2bd,0x2be,0x2bf,0x2c0,
	0x2c0,0x2c1,0x2c2,0x2c3,0x2c4,0x2c4,0x2c5,0x2c6,
	0x2c7,0x2c7,0x2c8,0x2c9,0x2ca,0x2cb,0x2cb,0x2cc,
	0x2cd,0x2ce,0x2ce,0x2cf,0x2d0,0x2d1,0x2d2,0x2d2,
	0x2d3,0x2d4,0x2d5,0x2d6,0x2d6,0x2d7,0x2d8,0x2d9,
	0x2da,0x2da,0x2db,0x2dc,0x2dd,0x2dd,0x2de,0x2df,
	0x2e0,0x2e1,0x2e1,0x2e2,0x2e3,0x2e4,0x2e5,0x2e5,
	0x2e6,0x2e7,0x2e8,0x2e9,0x2e9,0x2ea,0x2eb,0x2ec,
	0x2ed,0x2ed,0x2ee,0x2ef,0x2f0,0x2f1,0x2f1,0x2f2,
	0x2f3,0x2f4,0x2f5,0x2f5,0x2f6,0x2f7,0x2f8,0x2f9,
	0x2f9,0x2fa,0x2fb,0x2fc,0x2fd,0x2fd,0x2fe,0x2ff,
	0x300,0x301,0x302,0x302,0x303,0x304,0x305,0x306,
	0x306,0x307,0x308,0x309,0x30a,0x30a,0x30b,0x30c,
	0x30d,0x30e,0x30f,0x30f,0x310,0x311,0x312,0x313,
	0x313,0x314,0x315,0x316,0x317,0x318,0x318,0x319,
	0x31a,0x31b,0x31c,0x31c,0x31d,0x31e,0x31f,0x320,
	0x321,0x321,0x322,0x323,0x324,0x325,0x326,0x326,
	0x327,0x328,0x329,0x32a,0x32a,0x32b,0x32c,0x32d,
	0x32e,0x32f,0x32f,0x330,0x331,0x332,0x333,0x334,
	0x334,0x335,0x336,0x337,0x338,0x339,0x339,0x33a,
	0x33b,0x33c,0x33d,0x33e,0x33e,0x33f,0x340,0x341,
	0x342,0x343,0x343,0x344,0x345,0x346,0x347,0x348,
	0x349,0x349,0x34a,0x34b,0x34c,0x34d,0x34e,0x34e,
	0x34f,0x350,0x351,0x352,0x353,0x353,0x354,0x355,
	0x356,0x357,0x358,0x359,0x359,0x35a,0x35b,0x35c,
	0x35d,0x35e,0x35f,0x35f,0x360,0x361,0x362,0x363,
	0x364,0x364,0x365,0x366,0x367,0x368,0x369,0x36a,
	0x36a,0x36b,0x36c,0x36d,0x36e,0x36f,0x370,0x370,
	0x371,0x372,0x373,0x374,0x375,0x376,0x377,0x377,
	0x378,0x379,0x37a,0x37b,0x37c,0x37d,0x37d,0x37e,
	0x37f,0x380,0x381,0x382,0x383,0x383,0x384,0x385,
	0x386,0x387,0x388,0x389,0x38a,0x38a,0x38b,0x38c,
	0x38d,0x38e,0x38f,0x390,0x391,0x391,0x392,0x393,
	0x394,0x395,0x396,0x397,0x398,0x398,0x399,0x39a,
	0x39b,0x39c,0x39d,0x39e,0x39f,0x39f,0x3a0,0x3a1,
	0x3a2,0x3a3,0x3a4,0x3a5,0x3a6,0x3a7,0x3a7,0x3a8,
	0x3a9,0x3aa,0x3ab,0x3ac,0x3ad,0x3ae,0x3ae,0x3af,
	0x3b0,0x3b1,0x3b2,0x3b3,0x3b4,0x3b5,0x3b6,0x3b6,
	0x3b7,0x3b8,0x3b9,0x3ba,0x3bb,0x3bc,0x3bd,0x3be,
	0x3bf,0x3bf,0x3c0,0x3c1,0x3c2,0x3c3,0x3c4,0x3c5,
	0x3c6,0x3c7,0x3c7,0x3c8,0x3c9,0x3ca,0x3cb,0x3cc,
	0x3cd,0x3ce,0x3cf,0x3d0,0x3d1,0x3d1,0x3d2,0x3d3,
	0x3d4,0x3d5,0x3d6,0x3d7,0x3d8,0x3d9,0x3da,0x3da,
	0x3db,0x3dc,0x3dd,0x3de,0x3df,0x3e0,0x3e1,0x3e2,
	0x3e3,0x3e4,0x3e4,0x3e5,0x3e6,0x3e7,0x3e8,0x3e9,
	0x3ea,0x3eb,0x3ec,0x3ed,0x3ee,0x3ef,0x3ef,0x3f0,
	0x3f1,0x3f2,0x3f3,0x3f4,0x3f5,0x3f6,0x3f7,0x3f8,
	0x3f9,0x3fa,0x3fa,0x3fb,0x3fc,0x3fd,0x3fe,0x3ff
};

/*
 * Attenuation according to GM recommendations, in -0.375 dB units.
 * table[v] = 40 * log(v / 127) / -0.375
 */
static unsigned char snd_opl4_volume_table[128] = {
	255,224,192,173,160,150,141,134,
	128,122,117,113,109,105,102, 99,
	 96, 93, 90, 88, 85, 83, 81, 79,
	 77, 75, 73, 71, 70, 68, 67, 65,
	 64, 62, 61, 59, 58, 57, 56, 54,
	 53, 52, 51, 50, 49, 48, 47, 46,
	 45, 44, 43, 42, 41, 40, 39, 39,
	 38, 37, 36, 35, 34, 34, 33, 32,
	 31, 31, 30, 29, 29, 28, 27, 27,
	 26, 25, 25, 24, 24, 23, 22, 22,
	 21, 21, 20, 19, 19, 18, 18, 17,
	 17, 16, 16, 15, 15, 14, 14, 13,
	 13, 12, 12, 11, 11, 10, 10,  9,
	  9,  9,  8,  8,  7,  7,  6,  6,
	  6,  5,  5,  4,  4,  4,  3,  3,
	  2,  2,  2,  1,  1,  0,  0,  0
};

/*
 * Initializes all voices.
 */
void snd_opl4_synth_reset(struct snd_opl4 *opl4)
{
	unsigned long flags;
	int i;

	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < OPL4_MAX_VOICES; i++)
		snd_opl4_write(opl4, OPL4_REG_MISC + i, OPL4_DAMP_BIT);
	spin_unlock_irqrestore(&opl4->reg_lock, flags);

	INIT_LIST_HEAD(&opl4->off_voices);
	INIT_LIST_HEAD(&opl4->on_voices);
	memset(opl4->voices, 0, sizeof(opl4->voices));
	for (i = 0; i < OPL4_MAX_VOICES; i++) {
		opl4->voices[i].number = i;
		list_add_tail(&opl4->voices[i].list, &opl4->off_voices);
	}

	snd_midi_channel_set_clear(opl4->chset);
}

/*
 * Shuts down all voices.
 */
void snd_opl4_synth_shutdown(struct snd_opl4 *opl4)
{
	unsigned long flags;
	int i;

	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < OPL4_MAX_VOICES; i++)
		snd_opl4_write(opl4, OPL4_REG_MISC + i,
			       opl4->voices[i].reg_misc & ~OPL4_KEY_ON_BIT);
	spin_unlock_irqrestore(&opl4->reg_lock, flags);
}

/*
 * Executes the callback for all voices playing the specified note.
 */
static void snd_opl4_do_for_note(struct snd_opl4 *opl4, int note, struct snd_midi_channel *chan,
				 void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
{
	int i;
	unsigned long flags;
	struct opl4_voice *voice;

	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < OPL4_MAX_VOICES; i++) {
		voice = &opl4->voices[i];
		if (voice->chan == chan && voice->note == note) {
			func(opl4, voice);
		}
	}
	spin_unlock_irqrestore(&opl4->reg_lock, flags);
}

/*
 * Executes the callback for all voices of to the specified channel.
 */
static void snd_opl4_do_for_channel(struct snd_opl4 *opl4,
				    struct snd_midi_channel *chan,
				    void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
{
	int i;
	unsigned long flags;
	struct opl4_voice *voice;

	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < OPL4_MAX_VOICES; i++) {
		voice = &opl4->voices[i];
		if (voice->chan == chan) {
			func(opl4, voice);
		}
	}
	spin_unlock_irqrestore(&opl4->reg_lock, flags);
}

/*
 * Executes the callback for all active voices.
 */
static void snd_opl4_do_for_all(struct snd_opl4 *opl4,
				void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
{
	int i;
	unsigned long flags;
	struct opl4_voice *voice;

	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < OPL4_MAX_VOICES; i++) {
		voice = &opl4->voices[i];
		if (voice->chan)
			func(opl4, voice);
	}
	spin_unlock_irqrestore(&opl4->reg_lock, flags);
}

static void snd_opl4_update_volume(struct snd_opl4 *opl4, struct opl4_voice *voice)
{
	int att;

	att = voice->sound->tone_attenuate;
	att += snd_opl4_volume_table[opl4->chset->gs_master_volume & 0x7f];
	att += snd_opl4_volume_table[voice->chan->gm_volume & 0x7f];
	att += snd_opl4_volume_table[voice->chan->gm_expression & 0x7f];
	att += snd_opl4_volume_table[voice->velocity];
	att = 0x7f - (0x7f - att) * (voice->sound->volume_factor) / 0xfe - volume_boost;
	if (att < 0)
		att = 0;
	else if (att > 0x7e)
		att = 0x7e;
	snd_opl4_write(opl4, OPL4_REG_LEVEL + voice->number,
		       (att << 1) | voice->level_direct);
	voice->level_direct = 0;
}

static void snd_opl4_update_pan(struct snd_opl4 *opl4, struct opl4_voice *voice)
{
	int pan = voice->sound->panpot;

	if (!voice->chan->drum_channel)
		pan += (voice->chan->control[MIDI_CTL_MSB_PAN] - 0x40) >> 3;
	if (pan < -7)
		pan = -7;
	else if (pan > 7)
		pan = 7;
	voice->reg_misc = (voice->reg_misc & ~OPL4_PAN_POT_MASK)
		| (pan & OPL4_PAN_POT_MASK);
	snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
}

static void snd_opl4_update_vibrato_depth(struct snd_opl4 *opl4,
					  struct opl4_voice *voice)
{
	int depth;

	if (voice->chan->drum_channel)
		return;
	depth = (7 - voice->sound->vibrato)
		* (voice->chan->control[MIDI_CTL_VIBRATO_DEPTH] & 0x7f);
	depth = (depth >> 7) + voice->sound->vibrato;
	voice->reg_lfo_vibrato &= ~OPL4_VIBRATO_DEPTH_MASK;
	voice->reg_lfo_vibrato |= depth & OPL4_VIBRATO_DEPTH_MASK;
	snd_opl4_write(opl4, OPL4_REG_LFO_VIBRATO + voice->number,
		       voice->reg_lfo_vibrato);
}

static void snd_opl4_update_pitch(struct snd_opl4 *opl4,
				  struct opl4_voice *voice)
{
	struct snd_midi_channel *chan = voice->chan;
	int note, pitch, octave;

	note = chan->drum_channel ? 60 : voice->note;
	/*
	 * pitch is in 100/128 cents, so 0x80 is one semitone and
	 * 0x600 is one octave.
	 */
	pitch = ((note - 60) << 7) * voice->sound->key_scaling / 100 + (60 << 7);
	pitch += voice->sound->pitch_offset;
	if (!chan->drum_channel)
		pitch += chan->gm_rpn_coarse_tuning;
	pitch += chan->gm_rpn_fine_tuning >> 7;
	pitch += chan->midi_pitchbend * chan->gm_rpn_pitch_bend_range / 0x2000;
	if (pitch < 0)
		pitch = 0;
	else if (pitch >= 0x6000)
		pitch = 0x5fff;
	octave = pitch / 0x600 - 8;
	pitch = snd_opl4_pitch_map[pitch % 0x600];

	snd_opl4_write(opl4, OPL4_REG_OCTAVE + voice->number,
		       (octave << 4) | ((pitch >> 7) & OPL4_F_NUMBER_HIGH_MASK));
	voice->reg_f_number = (voice->reg_f_number & OPL4_TONE_NUMBER_BIT8)
		| ((pitch << 1) & OPL4_F_NUMBER_LOW_MASK);
	snd_opl4_write(opl4, OPL4_REG_F_NUMBER + voice->number, voice->reg_f_number);
}

static void snd_opl4_update_tone_parameters(struct snd_opl4 *opl4,
					    struct opl4_voice *voice)
{
	snd_opl4_write(opl4, OPL4_REG_ATTACK_DECAY1 + voice->number,
		       voice->sound->reg_attack_decay1);
	snd_opl4_write(opl4, OPL4_REG_LEVEL_DECAY2 + voice->number,
		       voice->sound->reg_level_decay2);
	snd_opl4_write(opl4, OPL4_REG_RELEASE_CORRECTION + voice->number,
		       voice->sound->reg_release_correction);
	snd_opl4_write(opl4, OPL4_REG_TREMOLO + voice->number,
		       voice->sound->reg_tremolo);
}

/* allocate one voice */
static struct opl4_voice *snd_opl4_get_voice(struct snd_opl4 *opl4)
{
	/* first, try to get the oldest key-off voice */
	if (!list_empty(&opl4->off_voices))
		return list_entry(opl4->off_voices.next, struct opl4_voice, list);
	/* then get the oldest key-on voice */
	snd_BUG_ON(list_empty(&opl4->on_voices));
	return list_entry(opl4->on_voices.next, struct opl4_voice, list);
}

static void snd_opl4_wait_for_wave_headers(struct snd_opl4 *opl4)
{
	int timeout = 200;

	while ((inb(opl4->fm_port) & OPL4_STATUS_LOAD) && --timeout > 0)
		udelay(10);
}

void snd_opl4_note_on(void *private_data, int note, int vel, struct snd_midi_channel *chan)
{
	struct snd_opl4 *opl4 = private_data;
	const struct opl4_region_ptr *regions;
	struct opl4_voice *voice[2];
	const struct opl4_sound *sound[2];
	int voices = 0, i;
	unsigned long flags;

	/* determine the number of voices and voice parameters */
	i = chan->drum_channel ? 0x80 : (chan->midi_program & 0x7f);
	regions = &snd_yrw801_regions[i];
	for (i = 0; i < regions->count; i++) {
		if (note >= regions->regions[i].key_min &&
		    note <= regions->regions[i].key_max) {
			sound[voices] = &regions->regions[i].sound;
			if (++voices >= 2)
				break;
		}
	}

	/* allocate and initialize the needed voices */
	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < voices; i++) {
		voice[i] = snd_opl4_get_voice(opl4);
		list_move_tail(&voice[i]->list, &opl4->on_voices);
		voice[i]->chan = chan;
		voice[i]->note = note;
		voice[i]->velocity = vel & 0x7f;
		voice[i]->sound = sound[i];
	}

	/* set tone number (triggers header loading) */
	for (i = 0; i < voices; i++) {
		voice[i]->reg_f_number =
			(sound[i]->tone >> 8) & OPL4_TONE_NUMBER_BIT8;
		snd_opl4_write(opl4, OPL4_REG_F_NUMBER + voice[i]->number,
			       voice[i]->reg_f_number);
		snd_opl4_write(opl4, OPL4_REG_TONE_NUMBER + voice[i]->number,
			       sound[i]->tone & 0xff);
	}

	/* set parameters which can be set while loading */
	for (i = 0; i < voices; i++) {
		voice[i]->reg_misc = OPL4_LFO_RESET_BIT;
		snd_opl4_update_pan(opl4, voice[i]);
		snd_opl4_update_pitch(opl4, voice[i]);
		voice[i]->level_direct = OPL4_LEVEL_DIRECT_BIT;
		snd_opl4_update_volume(opl4, voice[i]);
	}
	spin_unlock_irqrestore(&opl4->reg_lock, flags);

	/* wait for completion of loading */
	snd_opl4_wait_for_wave_headers(opl4);

	/* set remaining parameters */
	spin_lock_irqsave(&opl4->reg_lock, flags);
	for (i = 0; i < voices; i++) {
		snd_opl4_update_tone_parameters(opl4, voice[i]);
		voice[i]->reg_lfo_vibrato = voice[i]->sound->reg_lfo_vibrato;
		snd_opl4_update_vibrato_depth(opl4, voice[i]);
	}

	/* finally, switch on all voices */
	for (i = 0; i < voices; i++) {
		voice[i]->reg_misc =
			(voice[i]->reg_misc & 0x1f) | OPL4_KEY_ON_BIT;
		snd_opl4_write(opl4, OPL4_REG_MISC + voice[i]->number,
			       voice[i]->reg_misc);
	}
	spin_unlock_irqrestore(&opl4->reg_lock, flags);
}

static void snd_opl4_voice_off(struct snd_opl4 *opl4, struct opl4_voice *voice)
{
	list_move_tail(&voice->list, &opl4->off_voices);

	voice->reg_misc &= ~OPL4_KEY_ON_BIT;
	snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
}

void snd_opl4_note_off(void *private_data, int note, int vel, struct snd_midi_channel *chan)
{
	struct snd_opl4 *opl4 = private_data;

	snd_opl4_do_for_note(opl4, note, chan, snd_opl4_voice_off);
}

static void snd_opl4_terminate_voice(struct snd_opl4 *opl4, struct opl4_voice *voice)
{
	list_move_tail(&voice->list, &opl4->off_voices);

	voice->reg_misc = (voice->reg_misc & ~OPL4_KEY_ON_BIT) | OPL4_DAMP_BIT;
	snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
}

void snd_opl4_terminate_note(void *private_data, int note, struct snd_midi_channel *chan)
{
	struct snd_opl4 *opl4 = private_data;

	snd_opl4_do_for_note(opl4, note, chan, snd_opl4_terminate_voice);
}

void snd_opl4_control(void *private_data, int type, struct snd_midi_channel *chan)
{
	struct snd_opl4 *opl4 = private_data;

	switch (type) {
	case MIDI_CTL_MSB_MODWHEEL:
		chan->control[MIDI_CTL_VIBRATO_DEPTH] = chan->control[MIDI_CTL_MSB_MODWHEEL];
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_vibrato_depth);
		break;
	case MIDI_CTL_MSB_MAIN_VOLUME:
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_volume);
		break;
	case MIDI_CTL_MSB_PAN:
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_pan);
		break;
	case MIDI_CTL_MSB_EXPRESSION:
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_volume);
		break;
	case MIDI_CTL_VIBRATO_RATE:
		/* not yet supported */
		break;
	case MIDI_CTL_VIBRATO_DEPTH:
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_vibrato_depth);
		break;
	case MIDI_CTL_VIBRATO_DELAY:
		/* not yet supported */
		break;
	case MIDI_CTL_E1_REVERB_DEPTH:
		/*
		 * Each OPL4 voice has a bit called "Pseudo-Reverb", but
		 * IMHO _not_ using it enhances the listening experience.
		 */
		break;
	case MIDI_CTL_PITCHBEND:
		snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_pitch);
		break;
	}
}

void snd_opl4_sysex(void *private_data, unsigned char *buf, int len,
		    int parsed, struct snd_midi_channel_set *chset)
{
	struct snd_opl4 *opl4 = private_data;

	if (parsed == SNDRV_MIDI_SYSEX_GS_MASTER_VOLUME)
		snd_opl4_do_for_all(opl4, snd_opl4_update_volume);
}
