1/* 2 YC-20 keyboard mixer implementation in Faust 3 Copyright(C) 2010 Sampo Savolainen <v2@iki.fi> 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18*/ 19// 5 octaves + one C = 61 keys 20 21key_slowdown(x) = (x@3 + x@2 + x@1 + x)/4; 22 23// Bottom 17 keys is the switchable bass manual 24key_c0 = button("c0") : key_slowdown; 25key_C0 = button("C0") : key_slowdown; 26key_d0 = button("d0") : key_slowdown; 27key_D0 = button("D0") : key_slowdown; 28key_e0 = button("e0") : key_slowdown; 29key_f0 = button("f0") : key_slowdown; 30key_F0 = button("F0") : key_slowdown; 31key_g0 = button("g0") : key_slowdown; 32key_G0 = button("G0") : key_slowdown; 33key_a0 = button("a0") : key_slowdown; 34key_A0 = button("A0") : key_slowdown; 35key_b0 = button("b0") : key_slowdown; 36 37key_c1 = button("c1") : key_slowdown; 38key_C1 = button("C1") : key_slowdown; 39key_d1 = button("d1") : key_slowdown; 40key_D1 = button("D1") : key_slowdown; 41key_e1 = button("e1") : key_slowdown; 42 43// The rest is regular manual 44key_f1 = button("f1") : key_slowdown; 45key_F1 = button("F1") : key_slowdown; 46key_g1 = button("g1") : key_slowdown; 47key_G1 = button("G1") : key_slowdown; 48key_a1 = button("a1") : key_slowdown; 49key_A1 = button("A1") : key_slowdown; 50key_b1 = button("b1") : key_slowdown; 51 52key_c2 = button("c2") : key_slowdown; 53key_C2 = button("C2") : key_slowdown; 54key_d2 = button("d2") : key_slowdown; 55key_D2 = button("D2") : key_slowdown; 56key_e2 = button("e2") : key_slowdown; 57key_f2 = button("f2") : key_slowdown; 58key_F2 = button("F2") : key_slowdown; 59key_g2 = button("g2") : key_slowdown; 60key_G2 = button("G2") : key_slowdown; 61key_a2 = button("a2") : key_slowdown; 62key_A2 = button("A2") : key_slowdown; 63key_b2 = button("b2") : key_slowdown; 64 65key_c3 = button("c3") : key_slowdown; 66key_C3 = button("C3") : key_slowdown; 67key_d3 = button("d3") : key_slowdown; 68key_D3 = button("D3") : key_slowdown; 69key_e3 = button("e3") : key_slowdown; 70key_f3 = button("f3") : key_slowdown; 71key_F3 = button("F3") : key_slowdown; 72key_g3 = button("g3") : key_slowdown; 73key_G3 = button("G3") : key_slowdown; 74key_a3 = button("a3") : key_slowdown; 75key_A3 = button("A3") : key_slowdown; 76key_b3 = button("b3") : key_slowdown; 77 78key_c4 = button("c4") : key_slowdown; 79key_C4 = button("C4") : key_slowdown; 80key_d4 = button("d4") : key_slowdown; 81key_D4 = button("D4") : key_slowdown; 82key_e4 = button("e4") : key_slowdown; 83key_f4 = button("f4") : key_slowdown; 84key_F4 = button("F4") : key_slowdown; 85key_g4 = button("g4") : key_slowdown; 86key_G4 = button("G4") : key_slowdown; 87key_a4 = button("a4") : key_slowdown; 88key_A4 = button("A4") : key_slowdown; 89key_b4 = button("b4") : key_slowdown; 90 91key_c5 = button("c5") : key_slowdown; 92 93 94// This will be needed later on 95bass_engaged = hgroup("bass",hslider("[3]bass manual",0.0, 0.0, 1.0, 1.0)); 96 97// This implementation uses every voice and has equal number of outputs 98// when compared to the "slow" (read "correct") version 99keyboard_fast( 100 c8,c7,c6,c5,c4,c3,c2,c1, 101 C8,C7,C6,C5,C4,C3,C2,C1, 102 d8,d7,d6,d5,d4,d3,d2,d1, 103 D8,D7,D6,D5,D4,D3,D2,D1, 104 e8,e7,e6,e5,e4,e3,e2,e1, 105 f8,f7,f6,f5,f4,f3,f2,f1, 106 F8,F7,F6,F5,F4,F3,F2,F1, 107 g8,g7,g6,g5,g4,g3,g2,g1, 108 G8,G7,G6,G5,G4,G3,G2,G1, 109 a8,a7,a6,a5,a4,a3,a2,a1, 110 A8,A7,A6,A5,A4,A3,A2,A1, 111 b8,b7,b6,b5,b4,b3,b2,b1 112) = bus_1, 113 bus_1_3p5, 114 bus_2, 115 bus_2_2p3, 116 bus_4, 117 bus_8, 118 bus_16, 119 bass_bus_4, 120 bass_bus_8, 121 bass_bus_16 122with 123{ 124 bus_1 = c1+c2+c3+c4+c5+c6+c7+c8+c8*bass_engaged; 125 bus_1_3p5 = C1+C2+C3+C4+C5+C6+C7+C8+C8; 126 bus_2 = d1+d2+d3+d4+d5+d6+d7+d8+d8 127 + A1+A2+A3+A4+A5+A6+A7+A8+A8; 128 bus_2_2p3 = D1+D2+D3+D4+D5+D6+D7+D8+D8; 129 bus_4 = e1+e2+e3+e4+e5+e6+e7+e8+e8; 130 bus_8 = f1+f2+f3+f4+f5+f6+f7+f8+f8 131 + b1+b2+b3+b4+b5+b6+b7+b8+b8; 132 bus_16 = F1+F2+F3+F4+F5+F6+F7+F8+F8; 133 bass_bus_4 = g1+g2+g3+g4+g5+g6+g7+g8+g8; 134 bass_bus_8 = G1+G2+G3+G4+G5+G6+G7+G8+G8; 135 bass_bus_16 = a1+a2+a3+a4+a5+a6+a7+a8+a8; 136}; 137 138// This function sums the 96 signals together using the above 139// defined "buttons" 140keyboard( 141 c8,c7,c6,c5,c4,c3,c2,c1, 142 C8,C7,C6,C5,C4,C3,C2,C1, 143 d8,d7,d6,d5,d4,d3,d2,d1, 144 D8,D7,D6,D5,D4,D3,D2,D1, 145 e8,e7,e6,e5,e4,e3,e2,e1, 146 f8,f7,f6,f5,f4,f3,f2,f1, 147 F8,F7,F6,F5,F4,F3,F2,F1, 148 g8,g7,g6,g5,g4,g3,g2,g1, 149 G8,G7,G6,G5,G4,G3,G2,G1, 150 a8,a7,a6,a5,a4,a3,a2,a1, 151 A8,A7,A6,A5,A4,A3,A2,A1, 152 b8,b7,b6,b5,b4,b3,b2,b1 153) = bus_1 + bus_1_bleed, 154 bus_1_3p5 + bus_1_3p5_bleed, 155 bus_2 + bus_2_bleed, 156 bus_2_2p3 + bus_2_2p3_bleed, 157 bus_4 + bus_4_bleed, 158 bus_8 + bus_8_bleed, 159 bus_16 + bus_16_bleed, 160 bass_bus_4, 161 bass_bus_8, 162 bass_bus_16 163with 164{ 165 // some measurements show -30..-40dB of overall level change, but it's way too loud, 166 // probably as to how the bleed compounds from multiple bus bars. 167 // this gain coefficient is selected as -54dB 168 bus_bleed_filter = passive_hp(100000.0, 0.001) : *(0.002); 169 apply_realism = *( select2( realism_control >= (5.0/6.0), 0.0, 1.0) ); 170 171 // ******** BUS 1 172 173 bus_1 = (key_c0*c5 + key_C0*C5 + key_d0*d5 + key_D0*D5 + key_e0*e5 + key_f0*f5 + key_F0*F5 + key_g0*g5 + key_G0*G5 + key_a0*a5 + key_A0*A5 + key_b0*b5 174 + key_c1*c6 + key_C1*C6 + key_d1*d6 + key_D1*D6 + key_e1*e6) * (1.0 - bass_engaged) 175 + key_f1*f6 + key_F1*F6 + key_g1*g6 + key_G1*G6 + key_a1*a6 + key_A1*A6 + key_b1*b6 176 + key_c2*c7 + key_C2*C7 + key_d2*d7 + key_D2*D7 + key_e2*e7 + key_f2*f7 + key_F2*F7 + key_g2*g7 + key_G2*G7 + key_a2*a7 + key_A2*A7 + key_b2*b7 177 + key_c3*c8 + key_C3*C8 + key_d3*d8 + key_D3*D8 + key_e3*e8 + key_f3*f8 + key_F3*F8 + key_g3*g8 + key_G3*G8 + key_a3*a8 + key_A3*A8 + key_b3*b8 178 + key_c4*c8 + key_C4*C8 + key_d4*d8 + key_D4*D8 + key_e4*e8 + key_f4*f8 + key_F4*F8 + key_g4*g8 + key_G4*G8 + key_a4*a8 + key_A4*A8 + key_b4*b8 179 + key_c5*c8; 180 181 bus_1_all = (c5 + C5 + d5 + D5 + e5 + f5 + F5 + g5 + G5 + a5 + A5 + b5 182 + c6 + C6 + d6 + D6 + e6) * (1.0 - bass_engaged) 183 + f6 + F6 + g6 + G6 + a6 + A6 + b6 184 + c7 + C7 + d7 + D7 + e7 + f7 + F7 + g7 + G7 + a7 + A7 + b7 185 + c8 + C8 + d8 + D8 + e8 + f8 + F8 + g8 + G8 + a8 + A8 + b8 186 + c8 + C8 + d8 + D8 + e8 + f8 + F8 + g8 + G8 + a8 + A8 + b8 187 + c8; 188 189 bus_1_bleed = bus_1_all - bus_1 : bus_bleed_filter : apply_realism; 190 191 // ******** BUS 1 3/5 192 193 bus_1_3p5 = (key_c0*e4 + key_C0*f4 + key_d0*F4 + key_D0*g4 + key_e0*G4 + key_f0*a4 + key_F0*A4 + key_g0*b4 + key_G0*c5 + key_a0*C5 + key_A0*d5 + key_b0*D5 194 + key_c1*e5 + key_C1*f5 + key_d1*F5 + key_D1*g5 + key_e1*G5) * (1.0 - bass_engaged) 195 + key_f1*a5 + key_F1*A5 + key_g1*b5 + key_G1*c6 + key_a1*C6 + key_A1*d6 + key_b1*D6 196 + key_c2*e6 + key_C2*f6 + key_d2*F6 + key_D2*g6 + key_e2*G6 + key_f2*a6 + key_F2*A6 + key_g2*b6 + key_G2*c7 + key_a2*C7 + key_A2*d7 + key_b2*D7 197 + key_c3*e7 + key_C3*f7 + key_d3*F7 + key_D3*g7 + key_e3*G7 + key_f3*a7 + key_F3*A7 + key_g3*b7 + key_G3*c8 + key_a3*C8 + key_A3*d8 + key_b3*D8 198 + key_c4*e8 + key_C4*f8 + key_d4*F8 + key_D4*g8 + key_e4*G8 + key_f4*a8 + key_F4*A8 + key_g4*b8 + key_G4*c8 + key_a4*C8 + key_A4*d8 + key_b4*D8 199 + key_c5*e8; 200 201 bus_1_3p5_all =(e4+f4 + F4 + g4 + G4 + a4 + A4 + b4 + c5 + C5 + d5 + D5 202 + e5 + f5 + F5 + g5 + G5) * (1.0 - bass_engaged) 203 + a5 + A5 + b5 + c6 + C6 + d6 + D6 204 + e6 + f6 + F6 + g6 + G6 + a6 + A6 + b6 + c7 + C7 + d7 + D7 205 + e7 + f7 + F7 + g7 + G7 + a7 + A7 + b7 + c8 + C8 + d8 + D8 206 + e8 + f8 + F8 + g8 + G8 + a8 + A8 + b8 + c8 + C8 + d8 + D8 207 + e8; 208 209 bus_1_3p5_bleed = bus_1_3p5_all - bus_1_3p5 : bus_bleed_filter : apply_realism; 210 211 // ******** BUS 2 212 213 bus_2 = (key_c0*c4 + key_C0*C4 + key_d0*d4 + key_D0*D4 + key_e0*e4 + key_f0*f4 + key_F0*F4 + key_g0*g4 + key_G0*G4 + key_a0*a4 + key_A0*A4 + key_b0*b4 214 + key_c1*c5 + key_C1*C5 + key_d1*d5 + key_D1*D5 + key_e1*e5) * (1.0 - bass_engaged) 215 + key_f1*f5 + key_F1*F5 + key_g1*g5 + key_G1*G5 + key_a1*a5 + key_A1*A5 + key_b1*b5 216 + key_c2*c6 + key_C2*C6 + key_d2*d6 + key_D2*D6 + key_e2*e6 + key_f2*f6 + key_F2*F6 + key_g2*g6 + key_G2*G6 + key_a2*a6 + key_A2*A6 + key_b2*b6 217 + key_c3*c7 + key_C3*C7 + key_d3*d7 + key_D3*D7 + key_e3*e7 + key_f3*f7 + key_F3*F7 + key_g3*g7 + key_G3*G7 + key_a3*a7 + key_A3*A7 + key_b3*b7 218 + key_c4*c8 + key_C4*C8 + key_d4*d8 + key_D4*D8 + key_e4*e8 + key_f4*f8 + key_F4*F8 + key_g4*g8 + key_G4*G8 + key_a4*a8 + key_A4*A8 + key_b4*b8 219 + key_c5*c8; 220 221 bus_2_all = (c4 + C4 + d4 + D4 + e4 + f4 + F4 + g4 + G4 + a4 + A4 + b4 222 + c5 + C5 + d5 + D5 + e5) * (1.0 - bass_engaged) 223 + f5 + F5 + g5 + G5 + a5 + A5 + b5 224 + c6 + C6 + d6 + D6 + e6 + f6 + F6 + g6 + G6 + a6 + A6 + b6 225 + c7 + C7 + d7 + D7 + e7 + f7 + F7 + g7 + G7 + a7 + A7 + b7 226 + c8 + C8 + d8 + D8 + e8 + f8 + F8 + g8 + G8 + a8 + A8 + b8 227 + c8; 228 229 bus_2_bleed = bus_2_all - bus_2 : bus_bleed_filter : apply_realism; 230 231 // ******** BUS 2 2/3 232 233 bus_2_2p3 = (key_c0*g3 + key_C0*G3 + key_d0*a3 + key_D0*A3 + key_e0*b3 + key_f0*c4 + key_F0*C4 + key_g0*d4 + key_G0*D4 + key_a0*e4 + key_A0*f4 + key_b0*F4 234 + key_c1*g4 + key_C1*G4 + key_d1*a4 + key_D1*A4 + key_e1*b4) * (1.0 - bass_engaged) 235 + key_f1*c5 + key_F1*C5 + key_g1*d5 + key_G1*D5 + key_a1*e5 + key_A1*f5 + key_b1*F5 236 + key_c2*g5 + key_C2*G5 + key_d2*a5 + key_D2*A5 + key_e2*b5 + key_f2*c6 + key_F2*C6 + key_g2*d6 + key_G2*D6 + key_a2*e6 + key_A2*f6 + key_b2*F6 237 + key_c3*g6 + key_C3*G6 + key_d3*a6 + key_D3*A6 + key_e3*b6 + key_f3*c7 + key_F3*C7 + key_g3*d7 + key_G3*D7 + key_a3*e7 + key_A3*f7 + key_b3*F7 238 + key_c4*g7 + key_C4*G7 + key_d4*a7 + key_D4*A7 + key_e4*b7 + key_f4*c8 + key_F4*C8 + key_g4*d8 + key_G4*D8 + key_a4*e8 + key_A4*f8 + key_b4*F8 239 + key_c5*g8; 240 241 bus_2_2p3_all=(g3+ G3 + a3 + A3 + b3 + c4 + C4 + d4 + D4 + e4 + f4 + F4 242 + g4 + G4 + a4 + A4 + b4) * (1.0 - bass_engaged) 243 + c5 + C5 + d5 + D5 + e5 + f5 + F5 244 + g5 + G5 + a5 + A5 + b5 + c6 + C6 + d6 + D6 + e6 + f6 + F6 245 + g6 + G6 + a6 + A6 + b6 + c7 + C7 + d7 + D7 + e7 + f7 + F7 246 + g7 + G7 + a7 + A7 + b7 + c8 + C8 + d8 + D8 + e8 + f8 + F8 247 + g8; 248 249 bus_2_2p3_bleed = bus_2_2p3_all - bus_2_2p3 : bus_bleed_filter : apply_realism; 250 251 // ******** BUS 4 252 253 bus_4 = bass_keys_4 * (1.0 - bass_engaged) + key_f1*f4 + key_F1*F4 + key_g1*g4 + key_G1*G4 + key_a1*a4 + key_A1*A4 + key_b1*b4 254 + key_c2*c5 + key_C2*C5 + key_d2*d5 + key_D2*D5 + key_e2*e5 + key_f2*f5 + key_F2*F5 + key_g2*g5 + key_G2*G5 + key_a2*a5 + key_A2*A5 + key_b2*b5 255 + key_c3*c6 + key_C3*C6 + key_d3*d6 + key_D3*D6 + key_e3*e6 + key_f3*f6 + key_F3*F6 + key_g3*g6 + key_G3*G6 + key_a3*a6 + key_A3*A6 + key_b3*b6 256 + key_c4*c7 + key_C4*C7 + key_d4*d7 + key_D4*D7 + key_e4*e7 + key_f4*f7 + key_F4*F7 + key_g4*g7 + key_G4*G7 + key_a4*a7 + key_A4*A7 + key_b4*b7 257 + key_c5*c8; 258 259 bus_4_all = bass_keys_4_all * (1.0 - bass_engaged) 260 + f4 + F4 + g4 + G4 + a4 + A4 + b4 261 + c5 + C5 + d5 + D5 + e5 + f5 + F5 + g5 + G5 + a5 + A5 + b5 262 + c6 + C6 + d6 + D6 + e6 + f6 + F6 + g6 + G6 + a6 + A6 + b6 263 + c7 + C7 + d7 + D7 + e7 + f7 + F7 + g7 + G7 + a7 + A7 + b7 264 + c8; 265 266 bus_4_bleed = bus_4_all - bus_4 : bus_bleed_filter : apply_realism; 267 268 // ******** BUS 8 269 270 bus_8 = bass_keys_8 * (1.0 - bass_engaged) + key_f1*f3 + key_F1*F3 + key_g1*g3 + key_G1*G3 + key_a1*a3 + key_A1*A3 + key_b1*b3 271 + key_c2*c4 + key_C2*C4 + key_d2*d4 + key_D2*D4 + key_e2*e4 + key_f2*f4 + key_F2*F4 + key_g2*g4 + key_G2*G4 + key_a2*a4 + key_A2*A4 + key_b2*b4 272 + key_c3*c5 + key_C3*C5 + key_d3*d5 + key_D3*D5 + key_e3*e5 + key_f3*f5 + key_F3*F5 + key_g3*g5 + key_G3*G5 + key_a3*a5 + key_A3*A5 + key_b3*b5 273 + key_c4*c6 + key_C4*C6 + key_d4*d6 + key_D4*D6 + key_e4*e6 + key_f4*f6 + key_F4*F6 + key_g4*g6 + key_G4*G6 + key_a4*a6 + key_A4*A6 + key_b4*b6 274 + key_c5*c7; 275 276 bus_8_all = bass_keys_8_all * (1.0 - bass_engaged) 277 + f3 + F3 + g3 + G3 + a3 + A3 + b3 278 + c4 + C4 + d4 + D4 + e4 + f4 + F4 + g4 + G4 + a4 + A4 + b4 279 + c5 + C5 + d5 + D5 + e5 + f5 + F5 + g5 + G5 + a5 + A5 + b5 280 + c6 + C6 + d6 + D6 + e6 + f6 + F6 + g6 + G6 + a6 + A6 + b6 281 + c7; 282 283 bus_8_bleed = bus_8_all - bus_8 : bus_bleed_filter : apply_realism; 284 285 // ******** BUS 16 286 287 // compensate for the different impedance on the 16' bus bar compared to other bus bars by adding 4.5dB of gain 288 bus_16 = bass_keys_16 * (1.0 - bass_engaged) + key_f1*f2 + key_F1*F2 + key_g1*g2 + key_G1*G2 + key_a1*a2 + key_A1*A2 + key_b1*b2 289 + key_c2*c3 + key_C2*C3 + key_d2*d3 + key_D2*D3 + key_e2*e3 + key_f2*f3 + key_F2*F3 + key_g2*g3 + key_G2*G3 + key_a2*a3 + key_A2*A3 + key_b2*b3 290 + key_c3*c4 + key_C3*C4 + key_d3*d4 + key_D3*D4 + key_e3*e4 + key_f3*f4 + key_F3*F4 + key_g3*g4 + key_G3*G4 + key_a3*a4 + key_A3*A4 + key_b3*b4 291 + key_c4*c5 + key_C4*C5 + key_d4*d5 + key_D4*D5 + key_e4*e5 + key_f4*f5 + key_F4*F5 + key_g4*g5 + key_G4*G5 + key_a4*a5 + key_A4*A5 + key_b4*b5 292 + key_c5*c6 : *(1.679); 293 294 bus_16_all= bass_keys_16_all * (1.0 - bass_engaged) 295 + f2 + F2 + g2 + G2 + a2 + A2 + b2 296 + c3 + C3 + d3 + D3 + e3 + f3 + F3 + g3 + G3 + a3 + A3 + b3 297 + c4 + C4 + d4 + D4 + e4 + f4 + F4 + g4 + G4 + a4 + A4 + b4 298 + c5 + C5 + d5 + D5 + e5 + f5 + F5 + g5 + G5 + a5 + A5 + b5 299 + c6 : *(1.679); 300 301 bus_16_bleed = bus_16_all - bus_16 : bus_bleed_filter : apply_realism; 302 303 304 // No bleed for bass buses, as there is a low pass filter which would clean up most of the bleed anyway 305 306 bass_bus_4 = bass_keys_4 * bass_engaged; 307 bass_bus_8 = bass_keys_8 * bass_engaged; 308 bass_bus_16 = bass_keys_16 * bass_engaged; 309 310 // ********* BASS BUS 4 311 312 bass_keys_4 = (key_c0*c3 + key_C0*C3 + key_d0*d3 + key_D0*D3 + key_e0*e3 + key_f0*f3 + key_F0*F3 + key_g0*g3 + key_G0*G3 + key_a0*a3 + key_A0*A3 + key_b0*b3 313 + key_c1*c4 + key_C1*C4 + key_d1*d4 + key_D1*D4 + key_e1*e4); 314 bass_keys_4_all =(c3+C3 + d3 + D3 + e3 + f3 + F3 + g3 + G3 + a3 + A3 + b3 315 + c4 + C4 + d4 + D4 + e4); 316 317 // ********* BASS BUS 8 318 319 bass_keys_8 = (key_c0*c2 + key_C0*C2 + key_d0*d2 + key_D0*D2 + key_e0*e2 + key_f0*f2 + key_F0*F2 + key_g0*g2 + key_G0*G2 + key_a0*a2 + key_A0*A2 + key_b0*b2 320 + key_c1*c3 + key_C1*C3 + key_d1*d3 + key_D1*D3 + key_e1*e3); 321 bass_keys_8_all=(c2+ C2 + d2 + D2 + e2 + f2 + F2 + g2 + G2 + a2 + A2 + b2 322 + c3 + C3 + d3 + D3 + e3); 323 324 // ********* BASS BUS 16 325 326 bass_keys_16 = (key_c0*c1 + key_C0*C1 + key_d0*d1 + key_D0*D1 + key_e0*e1 + key_f0*f1 + key_F0*F1 + key_g0*g1 + key_G0*G1 + key_a0*a1 + key_A0*A1 + key_b0*b1 327 + key_c1*c2 + key_C1*C2 + key_d1*d2 + key_D1*D2 + key_e1*e2); 328 bass_keys_16_all=(c1+C1 + d1 + D1 + e1 + f1 + F1 + g1 + G1 + a1 + A1 + b1 329 + c2 + C2 + d2 + D2 + e2); 330 331}; 332 333