亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lkeymidi.cpp

?? ldraw_DOS游戲開發包
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
   /* on OPL3, 0xC0 contains pan info, so don't set it until fm_key_on() */
   if (midi_card != MIDI_OPL3)
      lsFMWrite(0xC0+VOICE_OFFSET(voice), inst->feedback);
}
/* fm_set_drum_op1:
 *  Sets the sound for operator #1 of a drum channel.
 */
static inline void fm_set_drum_op1(int voice, FM_INSTRUMENT *inst)
{
   lsFMWrite(0x20+fm_offset[voice], inst->characteristic1);
   lsFMWrite(0x60+fm_offset[voice], inst->attackdecay1);
   lsFMWrite(0x80+fm_offset[voice], inst->sustainrelease1);
   lsFMWrite(0xE0+fm_offset[voice], inst->wave1);
}
/* fm_set_drum_op2:
 *  Sets the sound for operator #2 of a drum channel.
 */
static inline void fm_set_drum_op2(int voice, FM_INSTRUMENT *inst)
{
   lsFMWrite(0x23+fm_offset[voice], inst->characteristic2);
   lsFMWrite(0x63+fm_offset[voice], inst->attackdecay2);
   lsFMWrite(0x83+fm_offset[voice], inst->sustainrelease2);
   lsFMWrite(0xE3+fm_offset[voice], inst->wave2);
}
/* fm_set_drum_vol_op1:
 *  Sets the volume for operator #1 of a drum channel.
 */
static inline void fm_set_drum_vol_op1(int voice, int vol)
{
   vol = 63 * fm_vol_table[vol] / 128;
   vol = MIN((vol * lm_volume_step)>>2,63);
   lsFMWrite(0x40+fm_offset[voice], (63-vol));
}
/* fm_set_drum_vol_op2:
 *  Sets the volume for operator #2 of a drum channel.
 */
static inline void fm_set_drum_vol_op2(int voice, int vol)
{
   vol = 63 * fm_vol_table[vol] / 128;
   vol = MIN((vol * lm_volume_step)>>2,63);
   lsFMWrite(0x43+fm_offset[voice], (63-vol));
}



/* fm_set_drum_pitch:
 *  Sets the pitch of a drum channel.
 */
static inline void fm_set_drum_pitch(int voice, FM_INSTRUMENT *drum)
{
   lsFMWrite(0xA0+VOICE_OFFSET(voice), drum->freq);
   lsFMWrite(0xB0+VOICE_OFFSET(voice), drum->key & 0x1F);
}



/* fm_trigger_drum:
 *  Triggers a note on a drum channel.
 */
static inline void fm_trigger_drum(int inst, int vol)
{
   FM_INSTRUMENT *drum = fm_drum+inst;
   int d;

   if (!fm_drum_mode)
      fm_set_drum_mode(TRUE);

   if (drum->type == FM_BD)
      d = 0;
   else if (drum->type == FM_SD)
      d = 1;
   else if (drum->type == FM_TT)
      d = 2;
   else if (drum->type == FM_CY)
      d = 3;
   else
      d = 4;

   /* don't let drum sounds come too close together */
   if (fm_drum_cached_time[d] == _midi_tick)
      return;

   fm_drum_cached_time[d] = _midi_tick;

   fm_drum_mask &= (~drum->type);
   lsFMWrite(0xBD, fm_drum_mask);

   vol = vol*3/4;


   if (fm_drum_op1[d]) {
      if (fm_drum_cached_inst1[d] != drum) {
	 fm_drum_cached_inst1[d] = drum;
	 fm_set_drum_op1(fm_drum_channel[d], drum);
      }

      if (fm_drum_cached_vol1[d] != vol) {
	 fm_drum_cached_vol1[d] = vol;
	 fm_set_drum_vol_op1(fm_drum_channel[d], vol);
      }
   }

   if (fm_drum_op2[d]) {
      if (fm_drum_cached_inst2[d] != drum) {
	 fm_drum_cached_inst2[d] = drum;
	 fm_set_drum_op2(fm_drum_channel[d], drum);
      }

      if (fm_drum_cached_vol2[d] != vol) {
	 fm_drum_cached_vol2[d] = vol;
	 fm_set_drum_vol_op2(fm_drum_channel[d], vol);
      }
   }

   fm_set_drum_pitch(fm_drum_channel[d], drum);

   fm_drum_mask |= drum->type;
   lsFMWrite(0xBD, fm_drum_mask);
}


/* fm_key_on:
 *  Triggers the specified voice. The instrument is specified as a GM
 *  patch number, pitch as a midi note number, and volume from 0-127.
 *  The bend parameter is _not_ expressed as a midi pitch bend value.
 *  It ranges from 0 (no pitch change) to 0xFFF (almost a semitone sharp).
 *  Drum sounds are indicated by passing an instrument number greater than
 *  128, in which case the sound is GM percussion key #(inst-128).
 */
int lm_midi_allocate_voice(int min,int max);
static void fm_key_on(int inst, int note, int bend, int vol, int pan)
{
   int voice;

   if (inst > 127) {                               /* drum sound? */
      inst -= 163;
      if (inst < 0)
	 inst = 0;
      else if (inst > 46)
	 inst = 46;

      fm_trigger_drum(inst, vol);
   }
   else {                                          /* regular instrument */
      if (midi_card == MIDI_2XOPL2) {
	 /* the SB Pro-1 has fixed pan positions per voice... */
	 if (pan < 64)
	    voice = lm_midi_allocate_voice(0, 5);
	 else
	    voice = lm_midi_allocate_voice(9, midi_driver->voices-1);
      }
      else
	 /* on other cards we can use any voices */
	 voice = lm_midi_allocate_voice(-1, -1);

      if (voice < 0)
	 return;

      /* make sure the voice isn't sounding */
      lsFMWrite(0x43+fm_offset[voice], 63);
      if (fm_feedback[voice] & 1)
	 lsFMWrite(0x40+fm_offset[voice], 63);

      /* make sure the voice is set up with the right sound */
      if (inst != fm_patch[voice]) {
	 fm_set_voice(voice, fm_instrument+inst);
	 fm_patch[voice] = inst;
      }

      /* set pan position */
      if (midi_card == MIDI_OPL3) {
	 if (pan < 48)
	    pan = 0x10;
	 else if (pan >= 80)
	    pan = 0x20;
	 else
	    pan = 0x30;

	 lsFMWrite(0xC0+VOICE_OFFSET(voice), pan | fm_feedback[voice]);
      }

      /* and play the note */
      fm_set_pitch(voice, note, bend);
      fm_set_volume(voice, vol);
   }
}
/* fm_key_off:
 *  Hey, guess what this does :-)
 */
static void fm_key_off(int voice)
{
   lsFMWrite(0xB0+VOICE_OFFSET(voice), fm_key[voice] & 0xDF);
}
/* fm_set_volume:
 *  Sets the volume of the specified voice (vol range 0-127).
 */
static void fm_set_volume(int voice, int vol)
{
   vol = fm_level[voice] * fm_vol_table[vol] / 128;
   vol = MIN((vol*lm_volume_step)>>2,63);    // by lin wei
   lsFMWrite(0x43+fm_offset[voice], (63-vol) | fm_keyscale[voice]);
   if (fm_feedback[voice] & 1)
      lsFMWrite(0x40+fm_offset[voice], (63-vol) | fm_keyscale[voice]);
}

/* fm_set_pitch:
 *  Sets the pitch of the specified voice.
 */
static void fm_set_pitch(int voice, int note, int bend)
{
   int oct = 1;
   int freq;

   note -= 24;
   while (note >= 12) {
      note -= 12;
      oct++;
   }

   freq = fm_freq[note];
   if (bend)
      freq += (fm_freq[note+1] - fm_freq[note]) * bend / 0x1000;

   fm_key[voice] = (oct<<2) | (freq >> 8);

   lsFMWrite(0xA0+VOICE_OFFSET(voice), freq & 0xFF); 
   lsFMWrite(0xB0+VOICE_OFFSET(voice), fm_key[voice] | 0x20);
}

/* fm_load_patches:
 *  Called before starting to play a MIDI file, to check if we need to be
 *  in rhythm mode or not.
 */
static int fm_load_patches(char *patches, char *drums)
{
   int i;
   int usedrums = FALSE;

   for (i=6; i<9; i++) {
      fm_key[i] = 0;
      fm_keyscale[i] = 0;
      fm_feedback[i] = 0;
      fm_level[i] = 0;
      fm_patch[i] = -1;
      lsFMWrite(0x40+fm_offset[i], 63);
      lsFMWrite(0x43+fm_offset[i], 63);
   }

   for (i=0; i<5; i++) {
      fm_drum_cached_inst1[i] = NULL;
      fm_drum_cached_inst2[i] = NULL;
      fm_drum_cached_vol1[i] = -1;
      fm_drum_cached_vol2[i] = -1;
      fm_drum_cached_time[i] = 0;
   }

   for (i=0; i<128; i++) {
      if (drums[i]) {
	 usedrums = TRUE;
	 break;
      }
   }

   fm_set_drum_mode(usedrums);

   return 0;
}

/* fm_mixer_volume:
 *  For SB-Pro cards, sets the mixer volume for FM output.
 */
static int fm_mixer_volume(int volume)
{ 
   return lsSetMixer(-1, volume);
}
/* fm_is_there:
 *  Checks for the presence of an OPL synth at the current port.
 */
static int fm_is_there()
{
   lsFMWrite(1, 0);                        /* init test register */

   lsFMWrite(4, 0x60);                     /* reset both timers */
   lsFMWrite(4, 0x80);                     /* enable interrupts */

   if (inp(lk_fm_port) & 0xE0)
      return FALSE;

   lsFMWrite(2, 0xFF);                     /* write 0xFF to timer 1 */
   lsFMWrite(4, 0x21);                     /* start timer 1 */

   delay(100);

   if ((inp(lk_fm_port) & 0xE0) != 0xC0)
      return FALSE;

   lsFMWrite(4, 0x60);                     /* reset both timers */
   lsFMWrite(4, 0x80);                     /* enable interrupts */

   return TRUE;
}

/* fm_detect:
 *  Adlib detection routine.
 */
static int fm_detect()
{
   static int ports[] = 
	 { 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x388, 0 };
   int i;
   char *s;
   int opl_type;

   if (lk_fm_port < 0||lk_sb_port < 0) {
      if (midi_card == MIDI_OPL2||midi_card == MIDI_OPL3) {
	 lk_fm_port = 0x388;
	 if (fm_is_there())
	    goto found_it;
      }
      for (i=0; ports[i]; i++) {          /* find the card */
	 lk_fm_port = ports[i];
	 if (fm_is_there())
	    goto found_it;
      }
   }
   if (!fm_is_there()) {
      strcpy(lm_error_msg, "OPL synth not found");
      return FALSE;
   }
found_it:
   if ((inp(lk_fm_port) & 6) == 0) {    /* check for OPL3 */
      opl_type = MIDI_OPL3;
      lsGetDspVersion();
   }
   else {                                 /* check for second OPL2 */
      if (lsGetDspVersion() >= 0x300)
	 opl_type = MIDI_2XOPL2;
      else
	 opl_type = MIDI_OPL2;
   }

   if (midi_card == MIDI_OPL3) {
      if (opl_type != MIDI_OPL3) {
	 strcpy(lm_error_msg, "OPL3 synth not found");
	 return FALSE;
      }
   }
   else if (midi_card == MIDI_2XOPL2) {
      if (opl_type != MIDI_2XOPL2) {
	 strcpy(lm_error_msg, "Second OPL2 synth not found");
	 return FALSE;
      }
   }
   else if (midi_card != MIDI_OPL2)
      midi_card = opl_type;

   if (midi_card == MIDI_OPL2)
      s = "OPL2 synth";
   else if (midi_card == MIDI_2XOPL2)
      s = "Dual OPL2 synths";
   else
      s = "OPL3 synth";

   sprintf(adlib_desc, "%s on port %X", s, lk_fm_port);
   midi_adlib.voices = (midi_card == MIDI_OPL2) ? 9 : 18;
   midi_adlib.def_voices = midi_adlib.max_voices = midi_adlib.voices;

   return TRUE;
}

/* load_ibk:
 *  Reads in a .IBK patch set file, for use by the Adlib driver.
 */
int lmFM_load_ibk(char *filename, int drums)
{
   char sig[4];
   FM_INSTRUMENT *inst;
   int c, note, oct, skip, count;

   FILE *f = fopen(filename, "rb");
   if (!f)
      return -1;

   fread(sig, 4, 1, f);
   if (memcmp(sig, "IBK\x1A", 4) != 0) {
      fclose(f);
      return -1;
   }

   if (drums) {
      inst = fm_drum;
      skip = 35;
      count = 47;
   }
   else {
      inst = fm_instrument;
      skip = 0;
      count = 128;
   }

   for (c=0; c<skip*16; c++)
      fgetc(f);

   for (c=0; c<count; c++) {
      inst->characteristic1 = fgetc(f);
      inst->characteristic2 = fgetc(f);
      inst->level1 = fgetc(f);
      inst->level2 = fgetc(f);
      inst->attackdecay1 = fgetc(f);
      inst->attackdecay2 = fgetc(f);
      inst->sustainrelease1 = fgetc(f);
      inst->sustainrelease2 = fgetc(f);
      inst->wave1 = fgetc(f);
      inst->wave2 = fgetc(f);
      inst->feedback = fgetc(f);

      if (drums) {
	 switch (fgetc(f)) {
	    case 6:  inst->type = FM_BD;  break;
	    case 7:  inst->type = FM_HH;  break;
	    case 8:  inst->type = FM_TT;  break;
	    case 9:  inst->type = FM_SD;  break;
	    case 10: inst->type = FM_CY;  break;
	    default: inst->type = 0;      break;
	 }

	 fgetc(f);

	 note = fgetc(f) - 24;
	 oct = 1;

	 while (note >= 12) {
	    note -= 12;
	    oct++;
	 }

	 inst->freq = fm_freq[note];
	 inst->key = (oct<<2) | (fm_freq[note] >> 8);
      }
      else {
	 inst->type = 0;
	 inst->freq = 0;
	 inst->key = 0;

	 fgetc(f);
	 fgetc(f);
	 fgetc(f);
      }

      fgetc(f);
      fgetc(f);

      inst++;
   }

   fclose(f);
   return 0;
}
char *lmFM_read_inst_loc(int drums)
{ if (drums) return (char*)fm_drum;
  return (char*)fm_instrument;
}
void lmFM_load_map(int choice,int drums)
{ FM_INSTRUMENT *inst,*source; int count,i;
   if (drums) {
      inst = fm_drum; 
      source = fm_drum_dat[choice];
      count = 47;
   }
   else {
      inst = fm_instrument;
      source = fm_instrument_dat[choice];
      count = 128;
   }
  for (i=0;i<count;i++,inst++,source++) 
      memcpy(inst,source,sizeof(FM_INSTRUMENT));
}

/* fm_init:
 *  Setup the adlib driver.
 */
static int fm_init(int voices)
{
   char *s;
   int i;

   fm_reset(1);
   lmFM_load_map(0,0); lmFM_load_map(0,1);
   for (i=0; i<2; i++) {
      if (i==0) s=lmMidiMapFile[0]; else s=lmMidiMapFile[1];
      if ((s) && (s[0])) {
	 if (lmFM_load_ibk(s, (i > 0)) != 0) {
	    sprintf(lm_error_msg, "Error reading .IBK file '%s'", s);
	    return FALSE;
	 }
      }
   }

   return TRUE;
}

static void fm_exit()
{
   fm_reset(0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人亚洲综合a∨猫咪| 在线播放日韩导航| 欧美成va人片在线观看| 精品久久久久一区| 亚洲精品一卡二卡| 国产精品综合网| 欧美一区二区三区视频| 亚洲天堂av老司机| 国产超碰在线一区| 日韩精品一区二区在线观看| 亚洲午夜精品在线| 99综合电影在线视频| 久久精品男人的天堂| 九九视频精品免费| 91麻豆精品国产91久久久资源速度 | 亚洲欧洲国产日本综合| 国产露脸91国语对白| 在线播放91灌醉迷j高跟美女 | 蜜桃视频在线一区| 欧美探花视频资源| 亚洲男人都懂的| 99久久综合国产精品| 久久综合色婷婷| 精品一区二区影视| 欧美变态tickle挠乳网站| 石原莉奈一区二区三区在线观看| 91在线观看下载| 亚洲婷婷综合色高清在线| 国产v综合v亚洲欧| 欧美国产日本视频| 波多野结衣在线一区| 国产精品国产三级国产aⅴ原创| 国产成人在线影院| 中文字幕在线免费不卡| 97久久精品人人做人人爽| 亚洲欧洲性图库| 欧美性猛交xxxxxxxx| 亚洲精品国产一区二区精华液 | 精品国内二区三区| 久久精品久久精品| 日本一区二区三区高清不卡 | 欧美日本在线播放| 日韩电影在线免费看| 欧美成人a在线| 国产精品资源站在线| 中文字幕不卡三区| 91传媒视频在线播放| 日韩成人午夜精品| 久久亚洲欧美国产精品乐播| 成a人片国产精品| 一区二区三区波多野结衣在线观看| 在线观看亚洲精品| 国产一区二区三区免费播放 | 亚洲成年人网站在线观看| 911精品国产一区二区在线| 久久国产婷婷国产香蕉| 国产午夜精品久久久久久久| 色综合久久中文字幕| 日韩国产在线一| 国产亚洲制服色| 91精品福利在线| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品久久久久久福利一牛影视| 欧美日韩一区二区在线观看视频| 免费在线成人网| 中文字幕字幕中文在线中不卡视频| 欧美日韩免费不卡视频一区二区三区| 久久精品久久综合| 一区二区三区免费网站| 精品国免费一区二区三区| 91网站最新网址| 久久99国产精品久久| 亚洲人成伊人成综合网小说| 555夜色666亚洲国产免| 国产成人综合精品三级| 五月综合激情日本mⅴ| 国产精品无遮挡| 日韩美女视频在线| 日本二三区不卡| 国产精品亚洲人在线观看| 亚洲综合色自拍一区| 国产亚洲精品超碰| 日韩欧美国产一区二区三区| 99九九99九九九视频精品| 奇米777欧美一区二区| 亚洲男女一区二区三区| 国产日韩精品一区二区浪潮av| 欧美美女直播网站| 色综合天天综合狠狠| 国产精品一区在线观看你懂的| 亚洲不卡一区二区三区| 亚洲天堂免费看| 中文字幕欧美国产| 久久午夜国产精品| 精品久久久三级丝袜| 91麻豆精品国产自产在线| 色乱码一区二区三区88| 9i在线看片成人免费| 福利一区二区在线| 国产精品自拍毛片| 国内欧美视频一区二区 | 亚洲bt欧美bt精品777| 中文字幕色av一区二区三区| 国产人成一区二区三区影院| 精品99一区二区| 日韩一区二区三区在线| 欧美精品电影在线播放| 欧美在线观看一区| 欧美日韩高清影院| 欧美三级中文字| 3atv在线一区二区三区| 制服丝袜国产精品| 日韩三级在线免费观看| 日韩欧美国产一二三区| 337p粉嫩大胆色噜噜噜噜亚洲| 精品剧情v国产在线观看在线| 欧美mv和日韩mv的网站| 国产精品护士白丝一区av| 国产亚洲精品久| 国产精品国产三级国产aⅴ入口| 中文字幕国产一区二区| 17c精品麻豆一区二区免费| 自拍偷拍国产精品| 亚洲伊人色欲综合网| 天天色天天操综合| 久久精品国产澳门| 国产成人99久久亚洲综合精品| 国产99一区视频免费| 99热国产精品| 欧美久久一二区| 26uuu亚洲婷婷狠狠天堂| 久久久久久久久久久99999| 国产精品欧美精品| 亚洲精品美腿丝袜| 日本中文字幕一区二区视频| 免费在线观看日韩欧美| 国产精品一区二区三区99| 成人黄色综合网站| 91精品1区2区| 日韩精品综合一本久道在线视频| 久久婷婷国产综合精品青草 | 91精品国产入口| 精品国产乱码久久久久久闺蜜 | 成人自拍视频在线观看| 91福利精品视频| 精品久久人人做人人爰| 亚洲婷婷综合色高清在线| 免费成人av资源网| 成人午夜视频福利| 91精品国产综合久久香蕉的特点 | 亚洲一区二区五区| 国产一区久久久| 欧美视频你懂的| 久久久国产午夜精品| 亚洲电影中文字幕在线观看| 久久精品久久99精品久久| 99国产精品久久久| 日韩三级.com| 亚洲一区二区偷拍精品| 国产精品一级片| 欧美精品电影在线播放| 18成人在线视频| 激情五月激情综合网| 在线观看一区不卡| 国产精品全国免费观看高清| 天天影视网天天综合色在线播放| 成人午夜在线视频| 日韩三区在线观看| 亚洲综合色婷婷| 9i在线看片成人免费| 久久婷婷成人综合色| 天堂精品中文字幕在线| 91视频在线观看免费| 欧美精品一区二区不卡 | 丁香婷婷深情五月亚洲| 日韩欧美一级二级三级久久久| 亚洲精品成人悠悠色影视| 国产99久久久国产精品潘金| 欧美一区二区在线看| 洋洋成人永久网站入口| 成人手机在线视频| 久久精品一区八戒影视| 男人的j进女人的j一区| 欧美日韩国产小视频| 一区二区三区在线视频观看| 欧美日韩五月天| 亚洲精品高清在线| 91麻豆福利精品推荐| 亚洲人精品一区| av资源网一区| 最新热久久免费视频| 成人午夜激情视频| 国产调教视频一区| 国产盗摄一区二区| 国产亚洲婷婷免费| 国内外成人在线| 久久精品一区二区| 成人免费看黄yyy456| 欧美国产精品中文字幕| 不卡一区二区三区四区|