Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
opl4_synth.c
Go to the documentation of this file.
1 /*
2  * OPL4 MIDI synthesizer functions
3  *
4  * Copyright (c) 2003 by Clemens Ladisch <[email protected]>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions, and the following disclaimer,
12  * without modification.
13  * 2. The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * Alternatively, this software may be distributed and/or modified under the
17  * terms of the GNU General Public License as published by the Free Software
18  * Foundation; either version 2 of the License, or (at your option) any later
19  * version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
25  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #include "opl4_local.h"
35 #include <linux/delay.h>
36 #include <asm/io.h>
37 #include <sound/asoundef.h>
38 
39 /* GM2 controllers */
40 #ifndef MIDI_CTL_RELEASE_TIME
41 #define MIDI_CTL_RELEASE_TIME 0x48
42 #define MIDI_CTL_ATTACK_TIME 0x49
43 #define MIDI_CTL_DECAY_TIME 0x4b
44 #define MIDI_CTL_VIBRATO_RATE 0x4c
45 #define MIDI_CTL_VIBRATO_DEPTH 0x4d
46 #define MIDI_CTL_VIBRATO_DELAY 0x4e
47 #endif
48 
49 /*
50  * This table maps 100/128 cents to F_NUMBER.
51  */
52 static const s16 snd_opl4_pitch_map[0x600] = {
53  0x000,0x000,0x001,0x001,0x002,0x002,0x003,0x003,
54  0x004,0x004,0x005,0x005,0x006,0x006,0x006,0x007,
55  0x007,0x008,0x008,0x009,0x009,0x00a,0x00a,0x00b,
56  0x00b,0x00c,0x00c,0x00d,0x00d,0x00d,0x00e,0x00e,
57  0x00f,0x00f,0x010,0x010,0x011,0x011,0x012,0x012,
58  0x013,0x013,0x014,0x014,0x015,0x015,0x015,0x016,
59  0x016,0x017,0x017,0x018,0x018,0x019,0x019,0x01a,
60  0x01a,0x01b,0x01b,0x01c,0x01c,0x01d,0x01d,0x01e,
61  0x01e,0x01e,0x01f,0x01f,0x020,0x020,0x021,0x021,
62  0x022,0x022,0x023,0x023,0x024,0x024,0x025,0x025,
63  0x026,0x026,0x027,0x027,0x028,0x028,0x029,0x029,
64  0x029,0x02a,0x02a,0x02b,0x02b,0x02c,0x02c,0x02d,
65  0x02d,0x02e,0x02e,0x02f,0x02f,0x030,0x030,0x031,
66  0x031,0x032,0x032,0x033,0x033,0x034,0x034,0x035,
67  0x035,0x036,0x036,0x037,0x037,0x038,0x038,0x038,
68  0x039,0x039,0x03a,0x03a,0x03b,0x03b,0x03c,0x03c,
69  0x03d,0x03d,0x03e,0x03e,0x03f,0x03f,0x040,0x040,
70  0x041,0x041,0x042,0x042,0x043,0x043,0x044,0x044,
71  0x045,0x045,0x046,0x046,0x047,0x047,0x048,0x048,
72  0x049,0x049,0x04a,0x04a,0x04b,0x04b,0x04c,0x04c,
73  0x04d,0x04d,0x04e,0x04e,0x04f,0x04f,0x050,0x050,
74  0x051,0x051,0x052,0x052,0x053,0x053,0x054,0x054,
75  0x055,0x055,0x056,0x056,0x057,0x057,0x058,0x058,
76  0x059,0x059,0x05a,0x05a,0x05b,0x05b,0x05c,0x05c,
77  0x05d,0x05d,0x05e,0x05e,0x05f,0x05f,0x060,0x060,
78  0x061,0x061,0x062,0x062,0x063,0x063,0x064,0x064,
79  0x065,0x065,0x066,0x066,0x067,0x067,0x068,0x068,
80  0x069,0x069,0x06a,0x06a,0x06b,0x06b,0x06c,0x06c,
81  0x06d,0x06d,0x06e,0x06e,0x06f,0x06f,0x070,0x071,
82  0x071,0x072,0x072,0x073,0x073,0x074,0x074,0x075,
83  0x075,0x076,0x076,0x077,0x077,0x078,0x078,0x079,
84  0x079,0x07a,0x07a,0x07b,0x07b,0x07c,0x07c,0x07d,
85  0x07d,0x07e,0x07e,0x07f,0x07f,0x080,0x081,0x081,
86  0x082,0x082,0x083,0x083,0x084,0x084,0x085,0x085,
87  0x086,0x086,0x087,0x087,0x088,0x088,0x089,0x089,
88  0x08a,0x08a,0x08b,0x08b,0x08c,0x08d,0x08d,0x08e,
89  0x08e,0x08f,0x08f,0x090,0x090,0x091,0x091,0x092,
90  0x092,0x093,0x093,0x094,0x094,0x095,0x096,0x096,
91  0x097,0x097,0x098,0x098,0x099,0x099,0x09a,0x09a,
92  0x09b,0x09b,0x09c,0x09c,0x09d,0x09d,0x09e,0x09f,
93  0x09f,0x0a0,0x0a0,0x0a1,0x0a1,0x0a2,0x0a2,0x0a3,
94  0x0a3,0x0a4,0x0a4,0x0a5,0x0a6,0x0a6,0x0a7,0x0a7,
95  0x0a8,0x0a8,0x0a9,0x0a9,0x0aa,0x0aa,0x0ab,0x0ab,
96  0x0ac,0x0ad,0x0ad,0x0ae,0x0ae,0x0af,0x0af,0x0b0,
97  0x0b0,0x0b1,0x0b1,0x0b2,0x0b2,0x0b3,0x0b4,0x0b4,
98  0x0b5,0x0b5,0x0b6,0x0b6,0x0b7,0x0b7,0x0b8,0x0b8,
99  0x0b9,0x0ba,0x0ba,0x0bb,0x0bb,0x0bc,0x0bc,0x0bd,
100  0x0bd,0x0be,0x0be,0x0bf,0x0c0,0x0c0,0x0c1,0x0c1,
101  0x0c2,0x0c2,0x0c3,0x0c3,0x0c4,0x0c4,0x0c5,0x0c6,
102  0x0c6,0x0c7,0x0c7,0x0c8,0x0c8,0x0c9,0x0c9,0x0ca,
103  0x0cb,0x0cb,0x0cc,0x0cc,0x0cd,0x0cd,0x0ce,0x0ce,
104  0x0cf,0x0d0,0x0d0,0x0d1,0x0d1,0x0d2,0x0d2,0x0d3,
105  0x0d3,0x0d4,0x0d5,0x0d5,0x0d6,0x0d6,0x0d7,0x0d7,
106  0x0d8,0x0d8,0x0d9,0x0da,0x0da,0x0db,0x0db,0x0dc,
107  0x0dc,0x0dd,0x0de,0x0de,0x0df,0x0df,0x0e0,0x0e0,
108  0x0e1,0x0e1,0x0e2,0x0e3,0x0e3,0x0e4,0x0e4,0x0e5,
109  0x0e5,0x0e6,0x0e7,0x0e7,0x0e8,0x0e8,0x0e9,0x0e9,
110  0x0ea,0x0eb,0x0eb,0x0ec,0x0ec,0x0ed,0x0ed,0x0ee,
111  0x0ef,0x0ef,0x0f0,0x0f0,0x0f1,0x0f1,0x0f2,0x0f3,
112  0x0f3,0x0f4,0x0f4,0x0f5,0x0f5,0x0f6,0x0f7,0x0f7,
113  0x0f8,0x0f8,0x0f9,0x0f9,0x0fa,0x0fb,0x0fb,0x0fc,
114  0x0fc,0x0fd,0x0fd,0x0fe,0x0ff,0x0ff,0x100,0x100,
115  0x101,0x101,0x102,0x103,0x103,0x104,0x104,0x105,
116  0x106,0x106,0x107,0x107,0x108,0x108,0x109,0x10a,
117  0x10a,0x10b,0x10b,0x10c,0x10c,0x10d,0x10e,0x10e,
118  0x10f,0x10f,0x110,0x111,0x111,0x112,0x112,0x113,
119  0x114,0x114,0x115,0x115,0x116,0x116,0x117,0x118,
120  0x118,0x119,0x119,0x11a,0x11b,0x11b,0x11c,0x11c,
121  0x11d,0x11e,0x11e,0x11f,0x11f,0x120,0x120,0x121,
122  0x122,0x122,0x123,0x123,0x124,0x125,0x125,0x126,
123  0x126,0x127,0x128,0x128,0x129,0x129,0x12a,0x12b,
124  0x12b,0x12c,0x12c,0x12d,0x12e,0x12e,0x12f,0x12f,
125  0x130,0x131,0x131,0x132,0x132,0x133,0x134,0x134,
126  0x135,0x135,0x136,0x137,0x137,0x138,0x138,0x139,
127  0x13a,0x13a,0x13b,0x13b,0x13c,0x13d,0x13d,0x13e,
128  0x13e,0x13f,0x140,0x140,0x141,0x141,0x142,0x143,
129  0x143,0x144,0x144,0x145,0x146,0x146,0x147,0x148,
130  0x148,0x149,0x149,0x14a,0x14b,0x14b,0x14c,0x14c,
131  0x14d,0x14e,0x14e,0x14f,0x14f,0x150,0x151,0x151,
132  0x152,0x153,0x153,0x154,0x154,0x155,0x156,0x156,
133  0x157,0x157,0x158,0x159,0x159,0x15a,0x15b,0x15b,
134  0x15c,0x15c,0x15d,0x15e,0x15e,0x15f,0x160,0x160,
135  0x161,0x161,0x162,0x163,0x163,0x164,0x165,0x165,
136  0x166,0x166,0x167,0x168,0x168,0x169,0x16a,0x16a,
137  0x16b,0x16b,0x16c,0x16d,0x16d,0x16e,0x16f,0x16f,
138  0x170,0x170,0x171,0x172,0x172,0x173,0x174,0x174,
139  0x175,0x175,0x176,0x177,0x177,0x178,0x179,0x179,
140  0x17a,0x17a,0x17b,0x17c,0x17c,0x17d,0x17e,0x17e,
141  0x17f,0x180,0x180,0x181,0x181,0x182,0x183,0x183,
142  0x184,0x185,0x185,0x186,0x187,0x187,0x188,0x188,
143  0x189,0x18a,0x18a,0x18b,0x18c,0x18c,0x18d,0x18e,
144  0x18e,0x18f,0x190,0x190,0x191,0x191,0x192,0x193,
145  0x193,0x194,0x195,0x195,0x196,0x197,0x197,0x198,
146  0x199,0x199,0x19a,0x19a,0x19b,0x19c,0x19c,0x19d,
147  0x19e,0x19e,0x19f,0x1a0,0x1a0,0x1a1,0x1a2,0x1a2,
148  0x1a3,0x1a4,0x1a4,0x1a5,0x1a6,0x1a6,0x1a7,0x1a8,
149  0x1a8,0x1a9,0x1a9,0x1aa,0x1ab,0x1ab,0x1ac,0x1ad,
150  0x1ad,0x1ae,0x1af,0x1af,0x1b0,0x1b1,0x1b1,0x1b2,
151  0x1b3,0x1b3,0x1b4,0x1b5,0x1b5,0x1b6,0x1b7,0x1b7,
152  0x1b8,0x1b9,0x1b9,0x1ba,0x1bb,0x1bb,0x1bc,0x1bd,
153  0x1bd,0x1be,0x1bf,0x1bf,0x1c0,0x1c1,0x1c1,0x1c2,
154  0x1c3,0x1c3,0x1c4,0x1c5,0x1c5,0x1c6,0x1c7,0x1c7,
155  0x1c8,0x1c9,0x1c9,0x1ca,0x1cb,0x1cb,0x1cc,0x1cd,
156  0x1cd,0x1ce,0x1cf,0x1cf,0x1d0,0x1d1,0x1d1,0x1d2,
157  0x1d3,0x1d3,0x1d4,0x1d5,0x1d5,0x1d6,0x1d7,0x1d7,
158  0x1d8,0x1d9,0x1d9,0x1da,0x1db,0x1db,0x1dc,0x1dd,
159  0x1dd,0x1de,0x1df,0x1df,0x1e0,0x1e1,0x1e1,0x1e2,
160  0x1e3,0x1e4,0x1e4,0x1e5,0x1e6,0x1e6,0x1e7,0x1e8,
161  0x1e8,0x1e9,0x1ea,0x1ea,0x1eb,0x1ec,0x1ec,0x1ed,
162  0x1ee,0x1ee,0x1ef,0x1f0,0x1f0,0x1f1,0x1f2,0x1f3,
163  0x1f3,0x1f4,0x1f5,0x1f5,0x1f6,0x1f7,0x1f7,0x1f8,
164  0x1f9,0x1f9,0x1fa,0x1fb,0x1fb,0x1fc,0x1fd,0x1fe,
165  0x1fe,0x1ff,0x200,0x200,0x201,0x202,0x202,0x203,
166  0x204,0x205,0x205,0x206,0x207,0x207,0x208,0x209,
167  0x209,0x20a,0x20b,0x20b,0x20c,0x20d,0x20e,0x20e,
168  0x20f,0x210,0x210,0x211,0x212,0x212,0x213,0x214,
169  0x215,0x215,0x216,0x217,0x217,0x218,0x219,0x21a,
170  0x21a,0x21b,0x21c,0x21c,0x21d,0x21e,0x21e,0x21f,
171  0x220,0x221,0x221,0x222,0x223,0x223,0x224,0x225,
172  0x226,0x226,0x227,0x228,0x228,0x229,0x22a,0x22b,
173  0x22b,0x22c,0x22d,0x22d,0x22e,0x22f,0x230,0x230,
174  0x231,0x232,0x232,0x233,0x234,0x235,0x235,0x236,
175  0x237,0x237,0x238,0x239,0x23a,0x23a,0x23b,0x23c,
176  0x23c,0x23d,0x23e,0x23f,0x23f,0x240,0x241,0x241,
177  0x242,0x243,0x244,0x244,0x245,0x246,0x247,0x247,
178  0x248,0x249,0x249,0x24a,0x24b,0x24c,0x24c,0x24d,
179  0x24e,0x24f,0x24f,0x250,0x251,0x251,0x252,0x253,
180  0x254,0x254,0x255,0x256,0x257,0x257,0x258,0x259,
181  0x259,0x25a,0x25b,0x25c,0x25c,0x25d,0x25e,0x25f,
182  0x25f,0x260,0x261,0x262,0x262,0x263,0x264,0x265,
183  0x265,0x266,0x267,0x267,0x268,0x269,0x26a,0x26a,
184  0x26b,0x26c,0x26d,0x26d,0x26e,0x26f,0x270,0x270,
185  0x271,0x272,0x273,0x273,0x274,0x275,0x276,0x276,
186  0x277,0x278,0x279,0x279,0x27a,0x27b,0x27c,0x27c,
187  0x27d,0x27e,0x27f,0x27f,0x280,0x281,0x282,0x282,
188  0x283,0x284,0x285,0x285,0x286,0x287,0x288,0x288,
189  0x289,0x28a,0x28b,0x28b,0x28c,0x28d,0x28e,0x28e,
190  0x28f,0x290,0x291,0x291,0x292,0x293,0x294,0x294,
191  0x295,0x296,0x297,0x298,0x298,0x299,0x29a,0x29b,
192  0x29b,0x29c,0x29d,0x29e,0x29e,0x29f,0x2a0,0x2a1,
193  0x2a1,0x2a2,0x2a3,0x2a4,0x2a5,0x2a5,0x2a6,0x2a7,
194  0x2a8,0x2a8,0x2a9,0x2aa,0x2ab,0x2ab,0x2ac,0x2ad,
195  0x2ae,0x2af,0x2af,0x2b0,0x2b1,0x2b2,0x2b2,0x2b3,
196  0x2b4,0x2b5,0x2b5,0x2b6,0x2b7,0x2b8,0x2b9,0x2b9,
197  0x2ba,0x2bb,0x2bc,0x2bc,0x2bd,0x2be,0x2bf,0x2c0,
198  0x2c0,0x2c1,0x2c2,0x2c3,0x2c4,0x2c4,0x2c5,0x2c6,
199  0x2c7,0x2c7,0x2c8,0x2c9,0x2ca,0x2cb,0x2cb,0x2cc,
200  0x2cd,0x2ce,0x2ce,0x2cf,0x2d0,0x2d1,0x2d2,0x2d2,
201  0x2d3,0x2d4,0x2d5,0x2d6,0x2d6,0x2d7,0x2d8,0x2d9,
202  0x2da,0x2da,0x2db,0x2dc,0x2dd,0x2dd,0x2de,0x2df,
203  0x2e0,0x2e1,0x2e1,0x2e2,0x2e3,0x2e4,0x2e5,0x2e5,
204  0x2e6,0x2e7,0x2e8,0x2e9,0x2e9,0x2ea,0x2eb,0x2ec,
205  0x2ed,0x2ed,0x2ee,0x2ef,0x2f0,0x2f1,0x2f1,0x2f2,
206  0x2f3,0x2f4,0x2f5,0x2f5,0x2f6,0x2f7,0x2f8,0x2f9,
207  0x2f9,0x2fa,0x2fb,0x2fc,0x2fd,0x2fd,0x2fe,0x2ff,
208  0x300,0x301,0x302,0x302,0x303,0x304,0x305,0x306,
209  0x306,0x307,0x308,0x309,0x30a,0x30a,0x30b,0x30c,
210  0x30d,0x30e,0x30f,0x30f,0x310,0x311,0x312,0x313,
211  0x313,0x314,0x315,0x316,0x317,0x318,0x318,0x319,
212  0x31a,0x31b,0x31c,0x31c,0x31d,0x31e,0x31f,0x320,
213  0x321,0x321,0x322,0x323,0x324,0x325,0x326,0x326,
214  0x327,0x328,0x329,0x32a,0x32a,0x32b,0x32c,0x32d,
215  0x32e,0x32f,0x32f,0x330,0x331,0x332,0x333,0x334,
216  0x334,0x335,0x336,0x337,0x338,0x339,0x339,0x33a,
217  0x33b,0x33c,0x33d,0x33e,0x33e,0x33f,0x340,0x341,
218  0x342,0x343,0x343,0x344,0x345,0x346,0x347,0x348,
219  0x349,0x349,0x34a,0x34b,0x34c,0x34d,0x34e,0x34e,
220  0x34f,0x350,0x351,0x352,0x353,0x353,0x354,0x355,
221  0x356,0x357,0x358,0x359,0x359,0x35a,0x35b,0x35c,
222  0x35d,0x35e,0x35f,0x35f,0x360,0x361,0x362,0x363,
223  0x364,0x364,0x365,0x366,0x367,0x368,0x369,0x36a,
224  0x36a,0x36b,0x36c,0x36d,0x36e,0x36f,0x370,0x370,
225  0x371,0x372,0x373,0x374,0x375,0x376,0x377,0x377,
226  0x378,0x379,0x37a,0x37b,0x37c,0x37d,0x37d,0x37e,
227  0x37f,0x380,0x381,0x382,0x383,0x383,0x384,0x385,
228  0x386,0x387,0x388,0x389,0x38a,0x38a,0x38b,0x38c,
229  0x38d,0x38e,0x38f,0x390,0x391,0x391,0x392,0x393,
230  0x394,0x395,0x396,0x397,0x398,0x398,0x399,0x39a,
231  0x39b,0x39c,0x39d,0x39e,0x39f,0x39f,0x3a0,0x3a1,
232  0x3a2,0x3a3,0x3a4,0x3a5,0x3a6,0x3a7,0x3a7,0x3a8,
233  0x3a9,0x3aa,0x3ab,0x3ac,0x3ad,0x3ae,0x3ae,0x3af,
234  0x3b0,0x3b1,0x3b2,0x3b3,0x3b4,0x3b5,0x3b6,0x3b6,
235  0x3b7,0x3b8,0x3b9,0x3ba,0x3bb,0x3bc,0x3bd,0x3be,
236  0x3bf,0x3bf,0x3c0,0x3c1,0x3c2,0x3c3,0x3c4,0x3c5,
237  0x3c6,0x3c7,0x3c7,0x3c8,0x3c9,0x3ca,0x3cb,0x3cc,
238  0x3cd,0x3ce,0x3cf,0x3d0,0x3d1,0x3d1,0x3d2,0x3d3,
239  0x3d4,0x3d5,0x3d6,0x3d7,0x3d8,0x3d9,0x3da,0x3da,
240  0x3db,0x3dc,0x3dd,0x3de,0x3df,0x3e0,0x3e1,0x3e2,
241  0x3e3,0x3e4,0x3e4,0x3e5,0x3e6,0x3e7,0x3e8,0x3e9,
242  0x3ea,0x3eb,0x3ec,0x3ed,0x3ee,0x3ef,0x3ef,0x3f0,
243  0x3f1,0x3f2,0x3f3,0x3f4,0x3f5,0x3f6,0x3f7,0x3f8,
244  0x3f9,0x3fa,0x3fa,0x3fb,0x3fc,0x3fd,0x3fe,0x3ff
245 };
246 
247 /*
248  * Attenuation according to GM recommendations, in -0.375 dB units.
249  * table[v] = 40 * log(v / 127) / -0.375
250  */
251 static unsigned char snd_opl4_volume_table[128] = {
252  255,224,192,173,160,150,141,134,
253  128,122,117,113,109,105,102, 99,
254  96, 93, 90, 88, 85, 83, 81, 79,
255  77, 75, 73, 71, 70, 68, 67, 65,
256  64, 62, 61, 59, 58, 57, 56, 54,
257  53, 52, 51, 50, 49, 48, 47, 46,
258  45, 44, 43, 42, 41, 40, 39, 39,
259  38, 37, 36, 35, 34, 34, 33, 32,
260  31, 31, 30, 29, 29, 28, 27, 27,
261  26, 25, 25, 24, 24, 23, 22, 22,
262  21, 21, 20, 19, 19, 18, 18, 17,
263  17, 16, 16, 15, 15, 14, 14, 13,
264  13, 12, 12, 11, 11, 10, 10, 9,
265  9, 9, 8, 8, 7, 7, 6, 6,
266  6, 5, 5, 4, 4, 4, 3, 3,
267  2, 2, 2, 1, 1, 0, 0, 0
268 };
269 
270 /*
271  * Initializes all voices.
272  */
273 void snd_opl4_synth_reset(struct snd_opl4 *opl4)
274 {
275  unsigned long flags;
276  int i;
277 
278  spin_lock_irqsave(&opl4->reg_lock, flags);
279  for (i = 0; i < OPL4_MAX_VOICES; i++)
281  spin_unlock_irqrestore(&opl4->reg_lock, flags);
282 
283  INIT_LIST_HEAD(&opl4->off_voices);
284  INIT_LIST_HEAD(&opl4->on_voices);
285  memset(opl4->voices, 0, sizeof(opl4->voices));
286  for (i = 0; i < OPL4_MAX_VOICES; i++) {
287  opl4->voices[i].number = i;
288  list_add_tail(&opl4->voices[i].list, &opl4->off_voices);
289  }
290 
291  snd_midi_channel_set_clear(opl4->chset);
292 }
293 
294 /*
295  * Shuts down all voices.
296  */
298 {
299  unsigned long flags;
300  int i;
301 
302  spin_lock_irqsave(&opl4->reg_lock, flags);
303  for (i = 0; i < OPL4_MAX_VOICES; i++)
304  snd_opl4_write(opl4, OPL4_REG_MISC + i,
305  opl4->voices[i].reg_misc & ~OPL4_KEY_ON_BIT);
306  spin_unlock_irqrestore(&opl4->reg_lock, flags);
307 }
308 
309 /*
310  * Executes the callback for all voices playing the specified note.
311  */
312 static void snd_opl4_do_for_note(struct snd_opl4 *opl4, int note, struct snd_midi_channel *chan,
313  void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
314 {
315  int i;
316  unsigned long flags;
317  struct opl4_voice *voice;
318 
319  spin_lock_irqsave(&opl4->reg_lock, flags);
320  for (i = 0; i < OPL4_MAX_VOICES; i++) {
321  voice = &opl4->voices[i];
322  if (voice->chan == chan && voice->note == note) {
323  func(opl4, voice);
324  }
325  }
326  spin_unlock_irqrestore(&opl4->reg_lock, flags);
327 }
328 
329 /*
330  * Executes the callback for all voices of to the specified channel.
331  */
332 static void snd_opl4_do_for_channel(struct snd_opl4 *opl4,
333  struct snd_midi_channel *chan,
334  void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
335 {
336  int i;
337  unsigned long flags;
338  struct opl4_voice *voice;
339 
340  spin_lock_irqsave(&opl4->reg_lock, flags);
341  for (i = 0; i < OPL4_MAX_VOICES; i++) {
342  voice = &opl4->voices[i];
343  if (voice->chan == chan) {
344  func(opl4, voice);
345  }
346  }
347  spin_unlock_irqrestore(&opl4->reg_lock, flags);
348 }
349 
350 /*
351  * Executes the callback for all active voices.
352  */
353 static void snd_opl4_do_for_all(struct snd_opl4 *opl4,
354  void (*func)(struct snd_opl4 *opl4, struct opl4_voice *voice))
355 {
356  int i;
357  unsigned long flags;
358  struct opl4_voice *voice;
359 
360  spin_lock_irqsave(&opl4->reg_lock, flags);
361  for (i = 0; i < OPL4_MAX_VOICES; i++) {
362  voice = &opl4->voices[i];
363  if (voice->chan)
364  func(opl4, voice);
365  }
366  spin_unlock_irqrestore(&opl4->reg_lock, flags);
367 }
368 
369 static void snd_opl4_update_volume(struct snd_opl4 *opl4, struct opl4_voice *voice)
370 {
371  int att;
372 
373  att = voice->sound->tone_attenuate;
374  att += snd_opl4_volume_table[opl4->chset->gs_master_volume & 0x7f];
375  att += snd_opl4_volume_table[voice->chan->gm_volume & 0x7f];
376  att += snd_opl4_volume_table[voice->chan->gm_expression & 0x7f];
377  att += snd_opl4_volume_table[voice->velocity];
378  att = 0x7f - (0x7f - att) * (voice->sound->volume_factor) / 0xfe - volume_boost;
379  if (att < 0)
380  att = 0;
381  else if (att > 0x7e)
382  att = 0x7e;
383  snd_opl4_write(opl4, OPL4_REG_LEVEL + voice->number,
384  (att << 1) | voice->level_direct);
385  voice->level_direct = 0;
386 }
387 
388 static void snd_opl4_update_pan(struct snd_opl4 *opl4, struct opl4_voice *voice)
389 {
390  int pan = voice->sound->panpot;
391 
392  if (!voice->chan->drum_channel)
393  pan += (voice->chan->control[MIDI_CTL_MSB_PAN] - 0x40) >> 3;
394  if (pan < -7)
395  pan = -7;
396  else if (pan > 7)
397  pan = 7;
398  voice->reg_misc = (voice->reg_misc & ~OPL4_PAN_POT_MASK)
399  | (pan & OPL4_PAN_POT_MASK);
400  snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
401 }
402 
403 static void snd_opl4_update_vibrato_depth(struct snd_opl4 *opl4,
404  struct opl4_voice *voice)
405 {
406  int depth;
407 
408  if (voice->chan->drum_channel)
409  return;
410  depth = (7 - voice->sound->vibrato)
411  * (voice->chan->control[MIDI_CTL_VIBRATO_DEPTH] & 0x7f);
412  depth = (depth >> 7) + voice->sound->vibrato;
414  voice->reg_lfo_vibrato |= depth & OPL4_VIBRATO_DEPTH_MASK;
416  voice->reg_lfo_vibrato);
417 }
418 
419 static void snd_opl4_update_pitch(struct snd_opl4 *opl4,
420  struct opl4_voice *voice)
421 {
422  struct snd_midi_channel *chan = voice->chan;
423  int note, pitch, octave;
424 
425  note = chan->drum_channel ? 60 : voice->note;
426  /*
427  * pitch is in 100/128 cents, so 0x80 is one semitone and
428  * 0x600 is one octave.
429  */
430  pitch = ((note - 60) << 7) * voice->sound->key_scaling / 100 + (60 << 7);
431  pitch += voice->sound->pitch_offset;
432  if (!chan->drum_channel)
433  pitch += chan->gm_rpn_coarse_tuning;
434  pitch += chan->gm_rpn_fine_tuning >> 7;
435  pitch += chan->midi_pitchbend * chan->gm_rpn_pitch_bend_range / 0x2000;
436  if (pitch < 0)
437  pitch = 0;
438  else if (pitch >= 0x6000)
439  pitch = 0x5fff;
440  octave = pitch / 0x600 - 8;
441  pitch = snd_opl4_pitch_map[pitch % 0x600];
442 
443  snd_opl4_write(opl4, OPL4_REG_OCTAVE + voice->number,
444  (octave << 4) | ((pitch >> 7) & OPL4_F_NUMBER_HIGH_MASK));
446  | ((pitch << 1) & OPL4_F_NUMBER_LOW_MASK);
447  snd_opl4_write(opl4, OPL4_REG_F_NUMBER + voice->number, voice->reg_f_number);
448 }
449 
450 static void snd_opl4_update_tone_parameters(struct snd_opl4 *opl4,
451  struct opl4_voice *voice)
452 {
454  voice->sound->reg_attack_decay1);
456  voice->sound->reg_level_decay2);
458  voice->sound->reg_release_correction);
459  snd_opl4_write(opl4, OPL4_REG_TREMOLO + voice->number,
460  voice->sound->reg_tremolo);
461 }
462 
463 /* allocate one voice */
464 static struct opl4_voice *snd_opl4_get_voice(struct snd_opl4 *opl4)
465 {
466  /* first, try to get the oldest key-off voice */
467  if (!list_empty(&opl4->off_voices))
468  return list_entry(opl4->off_voices.next, struct opl4_voice, list);
469  /* then get the oldest key-on voice */
470  snd_BUG_ON(list_empty(&opl4->on_voices));
471  return list_entry(opl4->on_voices.next, struct opl4_voice, list);
472 }
473 
474 static void snd_opl4_wait_for_wave_headers(struct snd_opl4 *opl4)
475 {
476  int timeout = 200;
477 
478  while ((inb(opl4->fm_port) & OPL4_STATUS_LOAD) && --timeout > 0)
479  udelay(10);
480 }
481 
482 void snd_opl4_note_on(void *private_data, int note, int vel, struct snd_midi_channel *chan)
483 {
484  struct snd_opl4 *opl4 = private_data;
485  const struct opl4_region_ptr *regions;
486  struct opl4_voice *voice[2];
487  const struct opl4_sound *sound[2];
488  int voices = 0, i;
489  unsigned long flags;
490 
491  /* determine the number of voices and voice parameters */
492  i = chan->drum_channel ? 0x80 : (chan->midi_program & 0x7f);
493  regions = &snd_yrw801_regions[i];
494  for (i = 0; i < regions->count; i++) {
495  if (note >= regions->regions[i].key_min &&
496  note <= regions->regions[i].key_max) {
497  sound[voices] = &regions->regions[i].sound;
498  if (++voices >= 2)
499  break;
500  }
501  }
502 
503  /* allocate and initialize the needed voices */
504  spin_lock_irqsave(&opl4->reg_lock, flags);
505  for (i = 0; i < voices; i++) {
506  voice[i] = snd_opl4_get_voice(opl4);
507  list_move_tail(&voice[i]->list, &opl4->on_voices);
508  voice[i]->chan = chan;
509  voice[i]->note = note;
510  voice[i]->velocity = vel & 0x7f;
511  voice[i]->sound = sound[i];
512  }
513 
514  /* set tone number (triggers header loading) */
515  for (i = 0; i < voices; i++) {
516  voice[i]->reg_f_number =
517  (sound[i]->tone >> 8) & OPL4_TONE_NUMBER_BIT8;
518  snd_opl4_write(opl4, OPL4_REG_F_NUMBER + voice[i]->number,
519  voice[i]->reg_f_number);
520  snd_opl4_write(opl4, OPL4_REG_TONE_NUMBER + voice[i]->number,
521  sound[i]->tone & 0xff);
522  }
523 
524  /* set parameters which can be set while loading */
525  for (i = 0; i < voices; i++) {
526  voice[i]->reg_misc = OPL4_LFO_RESET_BIT;
527  snd_opl4_update_pan(opl4, voice[i]);
528  snd_opl4_update_pitch(opl4, voice[i]);
530  snd_opl4_update_volume(opl4, voice[i]);
531  }
532  spin_unlock_irqrestore(&opl4->reg_lock, flags);
533 
534  /* wait for completion of loading */
535  snd_opl4_wait_for_wave_headers(opl4);
536 
537  /* set remaining parameters */
538  spin_lock_irqsave(&opl4->reg_lock, flags);
539  for (i = 0; i < voices; i++) {
540  snd_opl4_update_tone_parameters(opl4, voice[i]);
541  voice[i]->reg_lfo_vibrato = voice[i]->sound->reg_lfo_vibrato;
542  snd_opl4_update_vibrato_depth(opl4, voice[i]);
543  }
544 
545  /* finally, switch on all voices */
546  for (i = 0; i < voices; i++) {
547  voice[i]->reg_misc =
548  (voice[i]->reg_misc & 0x1f) | OPL4_KEY_ON_BIT;
549  snd_opl4_write(opl4, OPL4_REG_MISC + voice[i]->number,
550  voice[i]->reg_misc);
551  }
552  spin_unlock_irqrestore(&opl4->reg_lock, flags);
553 }
554 
555 static void snd_opl4_voice_off(struct snd_opl4 *opl4, struct opl4_voice *voice)
556 {
557  list_move_tail(&voice->list, &opl4->off_voices);
558 
559  voice->reg_misc &= ~OPL4_KEY_ON_BIT;
560  snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
561 }
562 
563 void snd_opl4_note_off(void *private_data, int note, int vel, struct snd_midi_channel *chan)
564 {
565  struct snd_opl4 *opl4 = private_data;
566 
567  snd_opl4_do_for_note(opl4, note, chan, snd_opl4_voice_off);
568 }
569 
570 static void snd_opl4_terminate_voice(struct snd_opl4 *opl4, struct opl4_voice *voice)
571 {
572  list_move_tail(&voice->list, &opl4->off_voices);
573 
574  voice->reg_misc = (voice->reg_misc & ~OPL4_KEY_ON_BIT) | OPL4_DAMP_BIT;
575  snd_opl4_write(opl4, OPL4_REG_MISC + voice->number, voice->reg_misc);
576 }
577 
578 void snd_opl4_terminate_note(void *private_data, int note, struct snd_midi_channel *chan)
579 {
580  struct snd_opl4 *opl4 = private_data;
581 
582  snd_opl4_do_for_note(opl4, note, chan, snd_opl4_terminate_voice);
583 }
584 
585 void snd_opl4_control(void *private_data, int type, struct snd_midi_channel *chan)
586 {
587  struct snd_opl4 *opl4 = private_data;
588 
589  switch (type) {
592  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_vibrato_depth);
593  break;
595  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_volume);
596  break;
597  case MIDI_CTL_MSB_PAN:
598  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_pan);
599  break;
601  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_volume);
602  break;
604  /* not yet supported */
605  break;
607  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_vibrato_depth);
608  break;
610  /* not yet supported */
611  break;
613  /*
614  * Each OPL4 voice has a bit called "Pseudo-Reverb", but
615  * IMHO _not_ using it enhances the listening experience.
616  */
617  break;
618  case MIDI_CTL_PITCHBEND:
619  snd_opl4_do_for_channel(opl4, chan, snd_opl4_update_pitch);
620  break;
621  }
622 }
623 
624 void snd_opl4_sysex(void *private_data, unsigned char *buf, int len,
625  int parsed, struct snd_midi_channel_set *chset)
626 {
627  struct snd_opl4 *opl4 = private_data;
628 
629  if (parsed == SNDRV_MIDI_SYSEX_GS_MASTER_VOLUME)
630  snd_opl4_do_for_all(opl4, snd_opl4_update_volume);
631 }