mix.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:18k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     TiMidity -- Experimental MIDI to WAVE converter
  3.     Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
  4.     Suddenly, you realize that this program is free software; you get
  5.     an overwhelming urge to redistribute it and/or modify it under the
  6.     terms of the GNU General Public License as published by the Free
  7.     Software Foundation; either version 2 of the License, or (at your
  8.     option) any later version.
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.     You should have received another copy of the GNU General Public
  14.     License along with this program; if not, write to the Free
  15.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.     I bet they'll be amazed.
  17.     mix.c */
  18. #include <math.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include "config.h"
  22. #include "common.h"
  23. #include "instrum.h"
  24. #include "playmidi.h"
  25. #include "output.h"
  26. #include "ctrlmode.h"
  27. #include "tables.h"
  28. #include "resample.h"
  29. #include "mix.h"
  30. /* Returns 1 if envelope runs out */
  31. int recompute_envelope(int v)
  32. {
  33.   int stage;
  34.   stage = voice[v].envelope_stage;
  35.   if (stage>5)
  36.     {
  37.       /* Envelope ran out. */
  38.       int tmp=(voice[v].status == VOICE_DIE); /* Already displayed as dead */
  39.       voice[v].status = VOICE_FREE;
  40.       if(!tmp)
  41. ctl->note(v);
  42.       return 1;
  43.     }
  44.   if (voice[v].sample->modes & MODES_ENVELOPE)
  45.     {
  46.       if (voice[v].status==VOICE_ON || voice[v].status==VOICE_SUSTAINED)
  47. {
  48.   if (stage>2)
  49.     {
  50.       /* Freeze envelope until note turns off. Trumpets want this. */
  51.       voice[v].envelope_increment=0;
  52.       return 0;
  53.     }
  54. }
  55.     }
  56.   voice[v].envelope_stage=stage+1;
  57.   if (voice[v].envelope_volume==voice[v].sample->envelope_offset[stage])
  58.     return recompute_envelope(v);
  59.   voice[v].envelope_target=voice[v].sample->envelope_offset[stage];
  60.   voice[v].envelope_increment = voice[v].sample->envelope_rate[stage];
  61.   if (voice[v].envelope_target<voice[v].envelope_volume)
  62.     voice[v].envelope_increment = -voice[v].envelope_increment;
  63.   return 0;
  64. }
  65. void apply_envelope_to_amp(int v)
  66. {
  67.   FLOAT_T lamp=voice[v].left_amp, ramp, lramp, rramp, ceamp, lfeamp;
  68.   int32 la,ra, lra, rra, cea, lfea;
  69.   if (voice[v].panned == PANNED_MYSTERY)
  70.     {
  71.       lramp=voice[v].lr_amp;
  72.       ramp=voice[v].right_amp;
  73.       ceamp=voice[v].ce_amp;
  74.       rramp=voice[v].rr_amp;
  75.       lfeamp=voice[v].lfe_amp;
  76.       if (voice[v].tremolo_phase_increment)
  77. {
  78.   FLOAT_T tv = voice[v].tremolo_volume;
  79.   lramp *= tv;
  80.   lamp *= tv;
  81.   ceamp *= tv;
  82.   ramp *= tv;
  83.   rramp *= tv;
  84.   lfeamp *= tv;
  85. }
  86.       if (voice[v].sample->modes & MODES_ENVELOPE)
  87. {
  88.   FLOAT_T ev = (FLOAT_T)vol_table[voice[v].envelope_volume>>23];
  89.   lramp *= ev;
  90.   lamp *= ev;
  91.   ceamp *= ev;
  92.   ramp *= ev;
  93.   rramp *= ev;
  94.   lfeamp *= ev;
  95. }
  96.       la = (int32)FSCALE(lamp,AMP_BITS);
  97.       ra = (int32)FSCALE(ramp,AMP_BITS);
  98.       lra = (int32)FSCALE(lramp,AMP_BITS);
  99.       rra = (int32)FSCALE(rramp,AMP_BITS);
  100.       cea = (int32)FSCALE(ceamp,AMP_BITS);
  101.       lfea = (int32)FSCALE(lfeamp,AMP_BITS);
  102.       
  103.       if (la>MAX_AMP_VALUE) la=MAX_AMP_VALUE;
  104.       if (ra>MAX_AMP_VALUE) ra=MAX_AMP_VALUE;
  105.       if (lra>MAX_AMP_VALUE) lra=MAX_AMP_VALUE;
  106.       if (rra>MAX_AMP_VALUE) rra=MAX_AMP_VALUE;
  107.       if (cea>MAX_AMP_VALUE) cea=MAX_AMP_VALUE;
  108.       if (lfea>MAX_AMP_VALUE) lfea=MAX_AMP_VALUE;
  109.       voice[v].lr_mix=FINAL_VOLUME(lra);
  110.       voice[v].left_mix=FINAL_VOLUME(la);
  111.       voice[v].ce_mix=FINAL_VOLUME(cea);
  112.       voice[v].right_mix=FINAL_VOLUME(ra);
  113.       voice[v].rr_mix=FINAL_VOLUME(rra);
  114.       voice[v].lfe_mix=FINAL_VOLUME(lfea);
  115.     }
  116.   else
  117.     {
  118.       if (voice[v].tremolo_phase_increment)
  119. lamp *= voice[v].tremolo_volume;
  120.       if (voice[v].sample->modes & MODES_ENVELOPE)
  121. lamp *= (FLOAT_T)vol_table[voice[v].envelope_volume>>23];
  122.       la = (int32)FSCALE(lamp,AMP_BITS);
  123.       if (la>MAX_AMP_VALUE)
  124. la=MAX_AMP_VALUE;
  125.       voice[v].left_mix=FINAL_VOLUME(la);
  126.     }
  127. }
  128. static int update_envelope(int v)
  129. {
  130.   voice[v].envelope_volume += voice[v].envelope_increment;
  131.   /* Why is there no ^^ operator?? */
  132.   if (((voice[v].envelope_increment < 0) &&
  133.        (voice[v].envelope_volume <= voice[v].envelope_target)) ||
  134.       ((voice[v].envelope_increment > 0) &&
  135.    (voice[v].envelope_volume >= voice[v].envelope_target)))
  136.     {
  137.       voice[v].envelope_volume = voice[v].envelope_target;
  138.       if (recompute_envelope(v))
  139. return 1;
  140.     }
  141.   return 0;
  142. }
  143. static void update_tremolo(int v)
  144. {
  145.   int32 depth=voice[v].sample->tremolo_depth<<7;
  146.   if (voice[v].tremolo_sweep)
  147.     {
  148.       /* Update sweep position */
  149.       voice[v].tremolo_sweep_position += voice[v].tremolo_sweep;
  150.       if (voice[v].tremolo_sweep_position>=(1<<SWEEP_SHIFT))
  151. voice[v].tremolo_sweep=0; /* Swept to max amplitude */
  152.       else
  153. {
  154.   /* Need to adjust depth */
  155.   depth *= voice[v].tremolo_sweep_position;
  156.   depth >>= SWEEP_SHIFT;
  157. }
  158.     }
  159.   voice[v].tremolo_phase += voice[v].tremolo_phase_increment;
  160.   /* if (voice[v].tremolo_phase >= (SINE_CYCLE_LENGTH<<RATE_SHIFT))
  161.      voice[v].tremolo_phase -= SINE_CYCLE_LENGTH<<RATE_SHIFT;  */
  162.   voice[v].tremolo_volume = (FLOAT_T) 
  163.     (1.0 - FSCALENEG((sine(voice[v].tremolo_phase >> RATE_SHIFT) + 1.0)
  164.     * depth * TREMOLO_AMPLITUDE_TUNING,
  165.     17));
  166.   /* I'm not sure about the +1.0 there -- it makes tremoloed voices'
  167.      volumes on average the lower the higher the tremolo amplitude. */
  168. }
  169. /* Returns 1 if the note died */
  170. static int update_signal(int v)
  171. {
  172.   if (voice[v].envelope_increment && update_envelope(v))
  173.     return 1;
  174.   if (voice[v].tremolo_phase_increment)
  175.     update_tremolo(v);
  176.   apply_envelope_to_amp(v);
  177.   return 0;
  178. }
  179. #ifdef LOOKUP_HACK
  180. #  define MIXATION(a) *lp++ += mixup[(a<<8) | (uint8)s];
  181. #else
  182. #  define MIXATION(a) *lp++ += (a)*s;
  183. #endif
  184. #define MIXSKIP lp++
  185. #define MIXMAX(a,b) *lp++ += ((a>b)?a:b) * s
  186. #define MIXCENT(a,b) *lp++ += (a/2+b/2) * s
  187. #define MIXHALF(a) *lp++ += (a>>1)*s;
  188. static void mix_mystery_signal(resample_t *sp, int32 *lp, int v, int count)
  189. {
  190.   Voice *vp = voice + v;
  191.   final_volume_t 
  192.     left_rear=vp->lr_mix, 
  193.     left=vp->left_mix, 
  194.     center=vp->ce_mix, 
  195.     right=vp->right_mix, 
  196.     right_rear=vp->rr_mix, 
  197.     lfe=vp->lfe_mix;
  198.   int cc;
  199.   resample_t s;
  200.   if (!(cc = vp->control_counter))
  201.     {
  202.       cc = control_ratio;
  203.       if (update_signal(v))
  204. return; /* Envelope ran out */
  205. left_rear = vp->lr_mix;
  206. left = vp->left_mix;
  207. center = vp->ce_mix;
  208. right = vp->right_mix;
  209. right_rear = vp->rr_mix;
  210. lfe = vp->lfe_mix;
  211.     }
  212.   
  213.   while (count)
  214.     if (cc < count)
  215.       {
  216. count -= cc;
  217. while (cc--)
  218.   {
  219.     s = *sp++;
  220.        MIXATION(left);
  221.        MIXATION(right);
  222. if (num_ochannels >= 4) {
  223. MIXATION(left_rear);
  224. MIXATION(right_rear);
  225. }
  226. if (num_ochannels == 6) {
  227. MIXATION(center);
  228. MIXATION(lfe);
  229. }
  230.   }
  231. cc = control_ratio;
  232. if (update_signal(v))
  233.   return; /* Envelope ran out */
  234. left_rear = vp->lr_mix;
  235. left = vp->left_mix;
  236. center = vp->ce_mix;
  237. right = vp->right_mix;
  238. right_rear = vp->rr_mix;
  239. lfe = vp->lfe_mix;
  240.       }
  241.     else
  242.       {
  243. vp->control_counter = cc - count;
  244. while (count--)
  245.   {
  246.     s = *sp++;
  247.        MIXATION(left);
  248.        MIXATION(right);
  249. if (num_ochannels >= 4) {
  250. MIXATION(left_rear);
  251. MIXATION(right_rear);
  252. }
  253. if (num_ochannels == 6) {
  254. MIXATION(center);
  255. MIXATION(lfe);
  256. }
  257.   }
  258. return;
  259.       }
  260. }
  261. static void mix_center_signal(resample_t *sp, int32 *lp, int v, int count)
  262. {
  263.   Voice *vp = voice + v;
  264.   final_volume_t 
  265.     left=vp->left_mix;
  266.   int cc;
  267.   resample_t s;
  268.   if (!(cc = vp->control_counter))
  269.     {
  270.       cc = control_ratio;
  271.       if (update_signal(v))
  272. return; /* Envelope ran out */
  273.       left = vp->left_mix;
  274.     }
  275.   
  276.   while (count)
  277.     if (cc < count)
  278.       {
  279. count -= cc;
  280. while (cc--)
  281.   {
  282.     s = *sp++;
  283. if (num_ochannels == 2) {
  284.      MIXATION(left);
  285.      MIXATION(left);
  286. }
  287. else if (num_ochannels == 4) {
  288. MIXATION(left);
  289. MIXSKIP;
  290. MIXATION(left);
  291. MIXSKIP;
  292. }
  293. else if (num_ochannels == 6) {
  294. MIXSKIP;
  295. MIXSKIP;
  296. MIXSKIP;
  297. MIXSKIP;
  298. MIXATION(left);
  299. MIXATION(left);
  300. }
  301.   }
  302. cc = control_ratio;
  303. if (update_signal(v))
  304.   return; /* Envelope ran out */
  305. left = vp->left_mix;
  306.       }
  307.     else
  308.       {
  309. vp->control_counter = cc - count;
  310. while (count--)
  311.   {
  312.     s = *sp++;
  313. if (num_ochannels == 2) {
  314.      MIXATION(left);
  315.      MIXATION(left);
  316. }
  317. else if (num_ochannels == 4) {
  318. MIXATION(left);
  319. MIXSKIP;
  320. MIXATION(left);
  321. MIXSKIP;
  322. }
  323. else if (num_ochannels == 6) {
  324. MIXSKIP;
  325. MIXSKIP;
  326. MIXSKIP;
  327. MIXSKIP;
  328. MIXATION(left);
  329. MIXATION(left);
  330. }
  331.   }
  332. return;
  333.       }
  334. }
  335. static void mix_single_left_signal(resample_t *sp, int32 *lp, int v, int count)
  336. {
  337.   Voice *vp = voice + v;
  338.   final_volume_t 
  339.     left=vp->left_mix;
  340.   int cc;
  341.   resample_t s;
  342.   
  343.   if (!(cc = vp->control_counter))
  344.     {
  345.       cc = control_ratio;
  346.       if (update_signal(v))
  347. return; /* Envelope ran out */
  348.       left = vp->left_mix;
  349.     }
  350.   
  351.   while (count)
  352.     if (cc < count)
  353.       {
  354. count -= cc;
  355. while (cc--)
  356.   {
  357.     s = *sp++;
  358. if (num_ochannels == 2) {
  359. MIXATION(left);
  360.      MIXSKIP;
  361. }
  362. if (num_ochannels >= 4) {
  363. MIXHALF(left);
  364.      MIXSKIP;
  365. MIXATION(left);
  366.      MIXSKIP;
  367. }
  368. if (num_ochannels == 6) {
  369.      MIXSKIP;
  370. MIXATION(left);
  371. }
  372.   }
  373. cc = control_ratio;
  374. if (update_signal(v))
  375.   return; /* Envelope ran out */
  376. left = vp->left_mix;
  377.       }
  378.     else
  379.       {
  380. vp->control_counter = cc - count;
  381. while (count--)
  382.   {
  383.     s = *sp++;
  384. if (num_ochannels == 2) {
  385. MIXATION(left);
  386.      MIXSKIP;
  387. }
  388. if (num_ochannels >= 4) {
  389. MIXHALF(left);
  390.      MIXSKIP;
  391. MIXATION(left);
  392.      MIXSKIP;
  393. }
  394. if (num_ochannels == 6) {
  395.      MIXSKIP;
  396. MIXATION(left);
  397. }
  398.   }
  399. return;
  400.       }
  401. }
  402. static void mix_single_right_signal(resample_t *sp, int32 *lp, int v, int count)
  403. {
  404.   Voice *vp = voice + v;
  405.   final_volume_t 
  406.     left=vp->left_mix;
  407.   int cc;
  408.   resample_t s;
  409.   
  410.   if (!(cc = vp->control_counter))
  411.     {
  412.       cc = control_ratio;
  413.       if (update_signal(v))
  414. return; /* Envelope ran out */
  415.       left = vp->left_mix;
  416.     }
  417.   
  418.   while (count)
  419.     if (cc < count)
  420.       {
  421. count -= cc;
  422. while (cc--)
  423.   {
  424.     s = *sp++;
  425. if (num_ochannels == 2) {
  426.      MIXSKIP;
  427. MIXATION(left);
  428. }
  429. if (num_ochannels >= 4) {
  430.      MIXSKIP;
  431. MIXHALF(left);
  432.      MIXSKIP;
  433. MIXATION(left);
  434. } if (num_ochannels == 6) {
  435.      MIXSKIP;
  436. MIXATION(left);
  437. }
  438.   }
  439. cc = control_ratio;
  440. if (update_signal(v))
  441.   return; /* Envelope ran out */
  442. left = vp->left_mix;
  443.       }
  444.     else
  445.       {
  446. vp->control_counter = cc - count;
  447. while (count--)
  448.   {
  449.     s = *sp++;
  450. if (num_ochannels == 2) {
  451.      MIXSKIP;
  452. MIXATION(left);
  453. }
  454. if (num_ochannels >= 4) {
  455.      MIXSKIP;
  456. MIXHALF(left);
  457.      MIXSKIP;
  458. MIXATION(left);
  459. } if (num_ochannels == 6) {
  460.      MIXSKIP;
  461. MIXATION(left);
  462. }
  463.   }
  464. return;
  465.       }
  466. }
  467. static void mix_mono_signal(resample_t *sp, int32 *lp, int v, int count)
  468. {
  469.   Voice *vp = voice + v;
  470.   final_volume_t 
  471.     left=vp->left_mix;
  472.   int cc;
  473.   resample_t s;
  474.   
  475.   if (!(cc = vp->control_counter))
  476.     {
  477.       cc = control_ratio;
  478.       if (update_signal(v))
  479. return; /* Envelope ran out */
  480.       left = vp->left_mix;
  481.     }
  482.   
  483.   while (count)
  484.     if (cc < count)
  485.       {
  486. count -= cc;
  487. while (cc--)
  488.   {
  489.     s = *sp++;
  490.     MIXATION(left);
  491.   }
  492. cc = control_ratio;
  493. if (update_signal(v))
  494.   return; /* Envelope ran out */
  495. left = vp->left_mix;
  496.       }
  497.     else
  498.       {
  499. vp->control_counter = cc - count;
  500. while (count--)
  501.   {
  502.     s = *sp++;
  503.     MIXATION(left);
  504.   }
  505. return;
  506.       }
  507. }
  508. static void mix_mystery(resample_t *sp, int32 *lp, int v, int count)
  509. {
  510.   final_volume_t 
  511.     left_rear=voice[v].lr_mix, 
  512.     left=voice[v].left_mix, 
  513.     center=voice[v].ce_mix, 
  514.     right=voice[v].right_mix, 
  515.     right_rear=voice[v].rr_mix, 
  516.     lfe=voice[v].lfe_mix;
  517.   resample_t s;
  518.   
  519.   while (count--)
  520.     {
  521.       s = *sp++;
  522.        MIXATION(left);
  523.        MIXATION(right);
  524. if (num_ochannels >= 4) {
  525. MIXATION(left_rear);
  526. MIXATION(right_rear);
  527. }
  528. if (num_ochannels == 6) {
  529. MIXATION(center);
  530. MIXATION(lfe);
  531. }
  532.     }
  533. }
  534. static void mix_center(resample_t *sp, int32 *lp, int v, int count)
  535. {
  536.   final_volume_t 
  537.     left=voice[v].left_mix;
  538.   resample_t s;
  539.   
  540.   while (count--)
  541.     {
  542.       s = *sp++;
  543. if (num_ochannels == 2) {
  544.        MIXATION(left);
  545.        MIXATION(left);
  546. }
  547. else if (num_ochannels == 4) {
  548.        MIXATION(left);
  549.        MIXATION(left);
  550. MIXSKIP;
  551. MIXSKIP;
  552. }
  553. else if (num_ochannels == 6) {
  554. MIXSKIP;
  555. MIXSKIP;
  556. MIXSKIP;
  557. MIXSKIP;
  558. MIXATION(left);
  559. MIXATION(left);
  560. }
  561.     }
  562. }
  563. static void mix_single_left(resample_t *sp, int32 *lp, int v, int count)
  564. {
  565.   final_volume_t 
  566.     left=voice[v].left_mix;
  567.   resample_t s;
  568.   
  569.   while (count--)
  570.     {
  571.       s = *sp++;
  572. if (num_ochannels == 2) {
  573. MIXATION(left);
  574.        MIXSKIP;
  575. }
  576. if (num_ochannels >= 4) {
  577. MIXHALF(left);
  578.        MIXSKIP;
  579. MIXATION(left);
  580.        MIXSKIP;
  581. }
  582.         if (num_ochannels == 6) {
  583.        MIXSKIP;
  584. MIXATION(left);
  585. }
  586.     }
  587. }
  588. static void mix_single_right(resample_t *sp, int32 *lp, int v, int count)
  589. {
  590.   final_volume_t 
  591.     left=voice[v].left_mix;
  592.   resample_t s;
  593.   
  594.   while (count--)
  595.     {
  596.       s = *sp++;
  597. if (num_ochannels == 2) {
  598.        MIXSKIP;
  599. MIXATION(left);
  600. }
  601. if (num_ochannels >= 4) {
  602.        MIXSKIP;
  603. MIXHALF(left);
  604.        MIXSKIP;
  605. MIXATION(left);
  606. }
  607.         if (num_ochannels == 6) {
  608.        MIXSKIP;
  609. MIXATION(left);
  610. }
  611.     }
  612. }
  613. static void mix_mono(resample_t *sp, int32 *lp, int v, int count)
  614. {
  615.   final_volume_t 
  616.     left=voice[v].left_mix;
  617.   resample_t s;
  618.   
  619.   while (count--)
  620.     {
  621.       s = *sp++;
  622.       MIXATION(left);
  623.     }
  624. }
  625. /* Ramp a note out in c samples */
  626. static void ramp_out(resample_t *sp, int32 *lp, int v, int32 c)
  627. {
  628.   /* should be final_volume_t, but uint8 gives trouble. */
  629.   int32 left_rear, left, center, right, right_rear, lfe, li, ri;
  630.   resample_t s = 0; /* silly warning about uninitialized s */
  631.   /* Fix by James Caldwell */
  632.   if ( c == 0 ) c = 1;
  633.   left = voice[v].left_mix;
  634.   li = -(left/c);
  635.   if (!li) li = -1;
  636.   /* printf("Ramping out: left=%d, c=%d, li=%dn", left, c, li); */
  637.   if (!(play_mode->encoding & PE_MONO))
  638.     {
  639.       if (voice[v].panned==PANNED_MYSTERY)
  640. {
  641.   left_rear = voice[v].lr_mix;
  642.   center=voice[v].ce_mix;
  643.   right=voice[v].right_mix;
  644.   right_rear = voice[v].rr_mix;
  645.   lfe = voice[v].lfe_mix;
  646.   ri=-(right/c);
  647.   while (c--)
  648.     {
  649.       left_rear += li; if (left_rear<0) left_rear=0;
  650.       left += li; if (left<0) left=0;
  651.       center += li; if (center<0) center=0;
  652.       right += ri; if (right<0) right=0;
  653.       right_rear += ri; if (right_rear<0) right_rear=0;
  654.       lfe += li; if (lfe<0) lfe=0;
  655.       s=*sp++;
  656.        MIXATION(left);
  657.        MIXATION(right);
  658. if (num_ochannels >= 4) {
  659. MIXATION(left_rear);
  660. MIXATION(right_rear);
  661. }
  662. if (num_ochannels == 6) {
  663. MIXATION(center);
  664. MIXATION(lfe);
  665. }
  666.     }
  667. }
  668.       else if (voice[v].panned==PANNED_CENTER)
  669. {
  670.   while (c--)
  671.     {
  672.       left += li;
  673.       if (left<0)
  674. return;
  675.       s=*sp++;
  676. if (num_ochannels == 2) {
  677.        MIXATION(left);
  678.        MIXATION(left);
  679. }
  680. else if (num_ochannels == 4) {
  681. MIXATION(left);
  682.        MIXATION(left);
  683. MIXSKIP;
  684. MIXSKIP;
  685. }
  686. else if (num_ochannels == 6) {
  687. MIXSKIP;
  688. MIXSKIP;
  689. MIXSKIP;
  690. MIXSKIP;
  691.        MIXATION(left);
  692.        MIXATION(left);
  693. }
  694.     }
  695. }
  696.       else if (voice[v].panned==PANNED_LEFT)
  697. {
  698.   while (c--)
  699.     {
  700.       left += li;
  701.       if (left<0)
  702. return;
  703.       s=*sp++;
  704.       MIXATION(left);
  705.       MIXSKIP;
  706. if (num_ochannels >= 4) {
  707. MIXATION(left);
  708.        MIXSKIP;
  709. } if (num_ochannels == 6) {
  710. MIXATION(left);
  711. MIXATION(left);
  712. }
  713.     }
  714. }
  715.       else if (voice[v].panned==PANNED_RIGHT)
  716. {
  717.   while (c--)
  718.     {
  719.       left += li;
  720.       if (left<0)
  721. return;
  722.       s=*sp++;
  723.       MIXSKIP;
  724.       MIXATION(left);
  725. if (num_ochannels >= 4) {
  726.        MIXSKIP;
  727. MIXATION(left);
  728. } if (num_ochannels == 6) {
  729. MIXATION(left);
  730. MIXATION(left);
  731. }
  732.     }
  733. }
  734.     }
  735.   else
  736.     {
  737.       /* Mono output.  */
  738.       while (c--)
  739. {
  740.   left += li;
  741.   if (left<0)
  742.     return;
  743.   s=*sp++;
  744.   MIXATION(left);
  745. }
  746.     }
  747. }
  748. /**************** interface function ******************/
  749. void mix_voice(int32 *buf, int v, int32 c)
  750. {
  751.   Voice *vp=voice+v;
  752.   int32 count=c;
  753.   resample_t *sp;
  754.   if (c<0) return;
  755.   if (vp->status==VOICE_DIE)
  756.     {
  757.       if (count>=MAX_DIE_TIME)
  758. count=MAX_DIE_TIME;
  759.       sp=resample_voice(v, &count);
  760.       ramp_out(sp, buf, v, count);
  761.       vp->status=VOICE_FREE;
  762.     }
  763.   else
  764.     {
  765.       sp=resample_voice(v, &count);
  766.       if (count<0) return;
  767.       if (play_mode->encoding & PE_MONO)
  768. {
  769.   /* Mono output. */
  770.   if (vp->envelope_increment || vp->tremolo_phase_increment)
  771.     mix_mono_signal(sp, buf, v, count);
  772.   else
  773.     mix_mono(sp, buf, v, count);
  774. }
  775.       else
  776. {
  777.   if (vp->panned == PANNED_MYSTERY)
  778.     {
  779.       if (vp->envelope_increment || vp->tremolo_phase_increment)
  780. mix_mystery_signal(sp, buf, v, count);
  781.       else
  782. mix_mystery(sp, buf, v, count);
  783.     }
  784.   else if (vp->panned == PANNED_CENTER)
  785.     {
  786.       if (vp->envelope_increment || vp->tremolo_phase_increment)
  787. mix_center_signal(sp, buf, v, count);
  788.       else
  789. mix_center(sp, buf, v, count);
  790.     }
  791.   else
  792.     { 
  793.       /* It's either full left or full right. In either case,
  794.  every other sample is 0. Just get the offset right: */
  795.       
  796.       if (vp->envelope_increment || vp->tremolo_phase_increment)
  797.       {
  798.         if (vp->panned == PANNED_RIGHT)
  799. mix_single_right_signal(sp, buf, v, count);
  800. else mix_single_left_signal(sp, buf, v, count);
  801.       }
  802.       else 
  803.       {
  804.         if (vp->panned == PANNED_RIGHT)
  805. mix_single_right(sp, buf, v, count);
  806. else mix_single_left(sp, buf, v, count);
  807.       }
  808.     }
  809. }
  810.     }
  811. }