Diff for /np2/sound/vermouth/midiout.c between versions 1.1.1.1 and 1.7

version 1.1.1.1, 2003/10/16 17:58:10 version 1.7, 2003/12/25 05:07:49
Line 2 Line 2
 #include        "midiout.h"  #include        "midiout.h"
   
   
 #define MIDIOUT_VERSION         0x101  #define MIDIOUT_VERSION         0x104
 #define MIDIOUT_VERSTRING       "VERMOUTH 1.01"  #define MIDIOUT_VERSTRING       "VERMOUTH 1.04"
   
   
 static const char vermouthver[] = MIDIOUT_VERSTRING;  static const char vermouthver[] = MIDIOUT_VERSTRING;
Line 406  static void allnotesoff(MIDIHDL midi, CH Line 406  static void allnotesoff(MIDIHDL midi, CH
         v = midi->voice;          v = midi->voice;
         vterm = v + VOICE_MAX;          vterm = v + VOICE_MAX;
         do {          do {
   #if 1
                   if ((v->phase & (VOICE_ON | VOICE_SUSTAIN)) && (v->channel == ch)) {
                           voice_off(v);
                   }
   #else
                 if ((v->phase & VOICE_ON) && (v->channel == ch)) {                  if ((v->phase & VOICE_ON) && (v->channel == ch)) {
                         if (ch->flag & CHANNEL_SUSTAIN) {                          if (ch->flag & CHANNEL_SUSTAIN) {
                                 voice_setphase(v, VOICE_SUSTAIN);                                  voice_setphase(v, VOICE_SUSTAIN);
Line 414  static void allnotesoff(MIDIHDL midi, CH Line 419  static void allnotesoff(MIDIHDL midi, CH
                                 voice_off(v);                                  voice_off(v);
                         }                          }
                 }                  }
   #endif
                 v++;                  v++;
         } while(v < vterm);          } while(v < vterm);
 }  }
Line 447  static void ctrlchange(MIDIHDL midi, CHA Line 453  static void ctrlchange(MIDIHDL midi, CHA
   
                 case CTRL_EXPRESS:                  case CTRL_EXPRESS:
                         ch->expression = val;                          ch->expression = val;
                           TRACEOUT(("exp = %d", val));
                         volumeupdate(midi, ch);                          volumeupdate(midi, ch);
                         break;                          break;
   
Line 610  static void allresetmidi(MIDIHDL midi) { Line 617  static void allresetmidi(MIDIHDL midi) {
         CHANNEL chterm;          CHANNEL chterm;
         UINT    flag;          UINT    flag;
   
           midi->master = 127;
         ch = midi->channel;          ch = midi->channel;
         chterm = ch + 16;          chterm = ch + 16;
         ZeroMemory(ch, sizeof(_CHANNEL) * 16);          ZeroMemory(ch, sizeof(_CHANNEL) * 16);
Line 647  MIDIHDL midiout_create(MIDIMOD module, U Line 655  MIDIHDL midiout_create(MIDIMOD module, U
         worksize = min(worksize, 512);          worksize = min(worksize, 512);
         worksize = max(worksize, 16384);          worksize = max(worksize, 16384);
         size = sizeof(_MIDIHDL);          size = sizeof(_MIDIHDL);
         size += sizeof(SINT32) * worksize;          size += sizeof(SINT32) * 2 * worksize;
         size += sizeof(_SAMPLE) * worksize;          size += sizeof(_SAMPLE) * worksize;
         ret = (MIDIHDL)_MALLOC(size, "MIDIHDL");          ret = (MIDIHDL)_MALLOC(size, "MIDIHDL");
         if (ret) {          if (ret) {
Line 655  MIDIHDL midiout_create(MIDIMOD module, U Line 663  MIDIHDL midiout_create(MIDIMOD module, U
                 ret->samprate = module->samprate;                  ret->samprate = module->samprate;
                 ret->worksize = worksize;                  ret->worksize = worksize;
                 ret->module = module;                  ret->module = module;
                 ret->master = 127;          //      ret->master = 127;
                 ret->bank0[0] = module->tone[0];                  ret->bank0[0] = module->tone[0];
                 ret->bank0[1] = module->tone[1];                  ret->bank0[1] = module->tone[1];
                 ret->sampbuf = (SINT32 *)(ret + 1);                  ret->sampbuf = (SINT32 *)(ret + 1);
                 ret->resampbuf = (SAMPLE)(ret->sampbuf + worksize);                  ret->resampbuf = (SAMPLE)(ret->sampbuf + worksize * 2);
                 allresetmidi(ret);                  allresetmidi(ret);
         }          }
         return(ret);          return(ret);
Line 725  void midiout_shortmsg(MIDIHDL hdl, UINT3 Line 733  void midiout_shortmsg(MIDIHDL hdl, UINT3
         }          }
 }  }
   
   static void longmsg_gm(MIDIHDL hdl, const BYTE *msg, UINT size) {
   
           if ((size > 5) && (msg[2] == 0x7f) && (msg[3] == 0x09)) {
                   allresetmidi(hdl);                                              // GM reset
           }
   }
   
   static void longmsg_roland(MIDIHDL hdl, const BYTE *msg, UINT size) {
   
           UINT    addr;
           UINT    part;
           CHANNEL ch;
   
           if ((size > 10) && (msg[2] == 0x10) &&
                   (msg[3] == 0x42) && (msg[4] == 0x12)) {         // GS data set
                   addr = (msg[5] << 16) + (msg[6] << 8) + msg[7];
                   if ((addr & (~0x400000)) == 0x7f) {                     // GS reset
                           allresetmidi(hdl);
                           TRACEOUT(("GS-Reset"));
                   }
                   else if (addr == 0x400004) {                            // Vol
                           hdl->master = msg[8] & 0x7f;
                           allvolupdate(hdl);
                   }
                   else if ((addr & (~(0x000f00))) == 0x401015) {  // Tone/Rhythm
                           part = (addr >> 8) & 0x0f;
                           if (part == 0) {                                                        // part10
                                   part = 9;
                           }
                           else if (part < 10) {                                           // part1-9
                                   part--;
                           }
                           ch = hdl->channel + part;
                           if (msg[8] == 0) {
                                   ch->flag &= ~CHANNEL_RHYTHM;
                                   TRACEOUT(("ch%d - tone", part + 1));
                           }
                           else if ((msg[8] == 1) || (msg[8] == 2)) {
                                   ch->flag |= CHANNEL_RHYTHM;
                                   TRACEOUT(("ch%d - rhythm", part + 1));
                           }
                   }
                   else {
                           TRACEOUT(("Roland GS - %.6x", addr));
                   }
           }
   }
   
 void midiout_longmsg(MIDIHDL hdl, const BYTE *msg, UINT size) {  void midiout_longmsg(MIDIHDL hdl, const BYTE *msg, UINT size) {
   
           UINT    id;
   
         if ((hdl == NULL) || (msg == NULL)) {          if ((hdl == NULL) || (msg == NULL)) {
                 return;                  return;
         }          }
         if ((size > 5) && (msg[1] == 0x7e)) {                   // GM          if (size > 3) {                                                 // (msg[size - 1] == 0xf7)
                 if ((msg[2] == 0x7f) && (msg[3] == 0x09)) {                  id = msg[1];
                         allresetmidi(hdl);                                              // GM reset                  if (id == 0x7e) {                                       // GM
                           longmsg_gm(hdl, msg, size);
                   }
                   else if (id == 0x41) {                          // Roland
                           longmsg_roland(hdl, msg, size);
                 }                  }
         }          }
 }  }
Line 882  void midiout_setgain(MIDIHDL hdl, int ga Line 944  void midiout_setgain(MIDIHDL hdl, int ga
                 else if (gain > 8) {                  else if (gain > 8) {
                         gain = 8;                          gain = 8;
                 }                  }
                 hdl->gain = (char)gain;                  hdl->gain = (SINT8)gain;
                 allvolupdate(hdl);                  allvolupdate(hdl);
         }          }
 }  }

Removed from v.1.1.1.1  
changed lines
  Added in v.1.7


RetroPC.NET-CVS <cvs@retropc.net>