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