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

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

?? lkeymidi.cpp

?? ldraw_DOS游戲開發包
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
   else {
      inst = midi_channel[channel].patch;
      corrected_note = note;
      bend = midi_channel[channel].pitch_bend;
      sort_out_pitch_bend(&bend, &corrected_note);
   }

   /* play the note */
   midi_alloc_channel = channel;
   midi_alloc_note = note;
   midi_alloc_vol = vol;

   midi_driver->key_on(inst, corrected_note, bend, 
		       sort_out_volume(channel, vol), 
		       midi_channel[channel].pan);
}
/* all_notes_off:
 *  Turns off all active notes.
 */
static void all_notes_off(int channel)
{
   if (midi_driver->raw_midi) {
      midi_driver->raw_midi(0xB0+channel);
      midi_driver->raw_midi(123);
      midi_driver->raw_midi(0);
      return;
   }
   else {
      int note, layer;

      for (note=0; note<128; note++)
	 for (layer=0; layer<MIDI_LAYERS; layer++)
	    if (midi_channel[channel].note[note][layer] >= 0)
	       midi_note_off(channel, note);
   }
}

/* reset_controllers:
 *  Resets volume, pan, pitch bend, etc, to default positions.
 */
static void reset_controllers(int channel)
{
   midi_channel[channel].new_volume = 128;
   midi_channel[channel].new_pitch_bend = 0x2000;

   switch (channel % 3) {
      case 0:  midi_channel[channel].pan = ((channel/3) & 1) ? 60 : 68; break;
      case 1:  midi_channel[channel].pan = 104; break;
      case 2:  midi_channel[channel].pan = 24; break;
   }

   if (midi_driver->raw_midi) {
      midi_driver->raw_midi(0xB0+channel);
      midi_driver->raw_midi(10);
      midi_driver->raw_midi(midi_channel[channel].pan);
   }
}

/* update_controllers:
 *  Checks cached controller information and updates active voices.
 */
static void update_controllers()
{
   int c, c2;

   for (c=0; c<16; c++) {
      /* check for volume controller change */
      if ((midi_channel[c].volume != midi_channel[c].new_volume) ||
	  (old_midi_volume != lm_midi_volume)) {
	 midi_channel[c].volume = midi_channel[c].new_volume;
	 if (midi_driver->raw_midi) {
	    midi_driver->raw_midi(0xB0+c);
	    midi_driver->raw_midi(7);
	    midi_driver->raw_midi(global_volume_fix(midi_channel[c].volume-1));
	 }
	 else {
	    for (c2=0; c2<MIDI_VOICES; c2++) {
	       if ((midi_voice[c2].channel == c) &&
		  (midi_voice[c2].note >= 0)) {
		  int vol = sort_out_volume(c, midi_voice[c2].volume);
		  midi_driver->set_volume(c2 + midi_driver->basevoice, vol);
	       }
	    }
	 }
      }

      /* check for pitch bend change */
      if (midi_channel[c].pitch_bend != midi_channel[c].new_pitch_bend) {
	 midi_channel[c].pitch_bend = midi_channel[c].new_pitch_bend;
	 if (midi_driver->raw_midi) {
	    midi_driver->raw_midi(0xE0+c);
	    midi_driver->raw_midi(midi_channel[c].pitch_bend & 0x7F);
	    midi_driver->raw_midi(midi_channel[c].pitch_bend >> 7);
	 }
	 else {
	    for (c2=0; c2<MIDI_VOICES; c2++) {
	       if ((midi_voice[c2].channel == c) &&
		  (midi_voice[c2].note >= 0)) {
		  int bend = midi_channel[c].pitch_bend;
		  int note = midi_voice[c2].note;
		  sort_out_pitch_bend(&bend, &note);
		  midi_driver->set_pitch(c2 + midi_driver->basevoice, note, bend);
	       }
	    }
	 }
      }
   }

   old_midi_volume = lm_midi_volume;
}

/* process_controller:
 *  Deals with a MIDI controller message on the specified channel.
 */
static void process_controller(int channel, int ctrl, int data)
{
   switch (ctrl) {

      case 7:                                   /* main volume */
	 midi_channel[channel].new_volume = data+1;
	 break;

      case 10:                                  /* pan */
	 midi_channel[channel].pan = data;
	 if (midi_driver->raw_midi) {
	    midi_driver->raw_midi(0xB0+channel);
	    midi_driver->raw_midi(10);
	    midi_driver->raw_midi(data);
	 }
	 break;

      case 121:                                 /* reset all controllers */
	 reset_controllers(channel);
	 break;

      case 123:                                 /* all notes off */
      case 124:                                 /* omni mode off */
      case 125:                                 /* omni mode on */
      case 126:                                 /* poly mode off */
      case 127:                                 /* poly mode on */
	 all_notes_off(channel);
	 break;
   }
}

/* process_meta_event:
 *  Processes the next meta-event on the specified track.
 */
static void process_meta_event(unsigned char **pos, long *timer)
{
   unsigned char metatype = *((*pos)++);
   long length = parse_var_len(pos);
   long tempo;

   if (midi_meta_callback)
      midi_meta_callback(metatype, *pos, length);

   if (metatype == 0x2F) {                      /* end of track */
      *pos = NULL;
      *timer = LONG_MAX;
      return;
   }

   if (metatype == 0x51) {                      /* tempo change */
      tempo = (*pos)[0] * 0x10000L + (*pos)[1] * 0x100 + (*pos)[2];
      midi_new_speed = (tempo/1000) * (TIMERS_PER_SECOND/1000);
      midi_new_speed /= midifile->divisions;
   }

   (*pos) += length;
}

/* process_midi_event:
 *  Processes the next MIDI event on the specified track.
 */
static void process_midi_event(unsigned char **pos, unsigned char *running_status, long *timer)
{
   unsigned char byte1, byte2; 
   int channel;
   unsigned char event;
   long l;

   event = *((*pos)++); 

   if (event & 0x80) {                          /* regular message */
      /* no running status for sysex and meta-events! */
      if ((event != 0xF0) && (event != 0xF7) && (event != 0xFF))
	 *running_status = event;
      byte1 = (*pos)[0];
      byte2 = (*pos)[1];
   }
   else {                                       /* use running status */
      byte1 = event; 
      byte2 = (*pos)[0];
      event = *running_status; 
      (*pos)--;
   }

   /* program callback? */
   if ((midi_msg_callback) && 
       (event != 0xF0) && (event != 0xF7) && (event != 0xFF))
      midi_msg_callback(event, byte1, byte2);

   channel = event & 0x0F;

   switch (event>>4) {

      case 0x08:                                /* note off */
	 midi_note_off(channel, byte1);
	 (*pos) += 2;
	 break;

      case 0x09:                                /* note on */
	 midi_note_on(channel, byte1, byte2, 1);
	 (*pos) += 2;
	 break;

      case 0x0A:                                /* note aftertouch */
	 (*pos) += 2;
	 break;

      case 0x0B:                                /* control change */
	 process_controller(channel, byte1, byte2);
	 (*pos) += 2;
	 break;

      case 0x0C:                                /* program change */
	 midi_channel[channel].patch = byte1;
	 if (midi_driver->raw_midi)
	    raw_program_change(channel, byte1);
	 (*pos) += 1;
	 break;

      case 0x0D:                                /* channel aftertouch */
	 (*pos) += 1;
	 break;

      case 0x0E:                                /* pitch bend */
	 midi_channel[channel].new_pitch_bend = byte1 + (byte2<<7);
	 (*pos) += 2;
	 break;

      case 0x0F:                                /* special event */
	 switch (event) {
	    case 0xF0:                          /* sysex */
	    case 0xF7: 
	       l = parse_var_len(pos);
	       if (midi_sysex_callback)
		  midi_sysex_callback(*pos, l);
	       (*pos) += l;
	       break;

	    case 0xF2:                          /* song position */
	       (*pos) += 2;
	       break;

	    case 0xF3:                          /* song select */
	       (*pos)++;
	       break;

	    case 0xFF:                          /* meta-event */
	       process_meta_event(pos, timer);
	       break;

	    default:
	       /* the other special events don't have any data bytes,
		  so we don't need to bother skipping past them */
	       break;
	 }
	 break;

      default:
	 /* something has gone badly wrong if we ever get to here */
	 break;
   }
}
void lmMidiPause()
{
   int c;

   if (!lmMidiFlag) return;

   if (midifile==NULL||lmMidiFlag==0) return;
   lt_remove_int(midi_player);

   for (c=0; c<16; c++)
      all_notes_off(c);
}
int lmMidiSeek(int target)
{
   int old_midi_loop;
   MIDI *old_midifile;
   MIDI_DRIVER *old_driver;
   int old_patch[16];
   int old_volume[16];
   int old_pan[16];
   int old_pitch_bend[16];
   int c;

   if (midifile==NULL||lmMidiFlag==0) return -1;

   /* first stop the player */
   lmMidiPause();

   /* store current settings */
   for (c=0; c<16; c++) {
      old_patch[c] = midi_channel[c].patch;
      old_volume[c] = midi_channel[c].volume;
      old_pan[c] = midi_channel[c].pan;
      old_pitch_bend[c] = midi_channel[c].pitch_bend;
   }

   /* save some variables and give temporary values */
   old_driver = midi_driver;
   //midi_driver = &midi_none;
   old_midi_loop = midi_loop;
   midi_loop = 0;
   old_midifile = midifile;

   /* set flag to tell midi_player not to reinstall itself */
   midi_seeking = 1;

   /* are we seeking backwards? If so, skip back to the start of the file */
   if (target <= midi_pos)
      prepare_to_play(midifile);

   /* now sit back and let midi_player get to the position */
   while ((midi_pos < target) && (midi_pos != -1)) {
      int mmpc = midi_pos_counter;
      int mmp = midi_pos;

      mmpc -= midi_timer_speed;
      while (mmpc <= 0) {
	 mmpc += midi_pos_speed;
	 mmp++;
      }

      if (mmp >= target)
	 break;

      midi_player();
   }

   /* restore previously saved variables */
   midi_loop = old_midi_loop;
   midi_driver = old_driver;
   midi_seeking = 0;

   if (midi_pos != -1) {
      /* refresh the driver with any changed parameters */
      if (midi_driver->raw_midi) {
	 for (c=0; c<16; c++) {
	    /* program change (this sets the volume as well) */
	    if ((midi_channel[c].patch != old_patch[c]) ||
		(midi_channel[c].volume != old_volume[c]))
	       raw_program_change(c, midi_channel[c].patch);

	    /* pan */
	    if (midi_channel[c].pan != old_pan[c]) {
	       midi_driver->raw_midi(0xB0+c);
	       midi_driver->raw_midi(10);
	       midi_driver->raw_midi(midi_channel[c].pan);
	    }

	    /* pitch bend */
	    if (midi_channel[c].pitch_bend != old_pitch_bend[c]) {
	       midi_driver->raw_midi(0xE0+c);
	       midi_driver->raw_midi(midi_channel[c].pitch_bend & 0x7F);
	       midi_driver->raw_midi(midi_channel[c].pitch_bend >> 7);
	    }
	 }
      }

      /* if we didn't hit the end of the file, continue playing */
      if (!midi_looping) {
	 lt_install_int(midi_player, 20);
      }
      return 0;
   }

   if ((midi_loop) && (!midi_looping)) {  /* was file was looped? */
      prepare_to_play(old_midifile);
      lt_install_int(midi_player, 20);
      return 2;                           /* seek past EOF => file restarted */
   }

   return 1;                              /* seek past EOF => file stopped */
}

/* midi_player:
 *  The core MIDI player: to be used as a timer callback.
 */
static void midi_player()
{  static int c,active;
   static long l;

   if (!midifile) return;
   if (midi_semaphore) {
      midi_timer_speed += BPS_TO_TIMER(40);
      lt_install_int_ex(midi_player, BPS_TO_TIMER(40));
      return;
   }
   midi_semaphore = TRUE;
   _midi_tick++;

   do_it_all_again:

   for (c=0; c<MIDI_VOICES; c++)
      midi_waiting[c].note = -1;

   /* deal with each track in turn... */
   for (c=0; c<MIDI_TRACKS; c++) { 
      if (midi_track[c].pos) {
	 midi_track[c].timer -= midi_timer_speed;

	 /* while events are waiting, process them */
	 while (midi_track[c].timer <= 0) { 
	    process_midi_event(&midi_track[c].pos, 
			       &midi_track[c].running_status,
			       &midi_track[c].timer); 

	    /* read next time offset */
	    if (midi_track[c].pos) { 
	       l = parse_var_len(&midi_track[c].pos);
	       l *= midi_speed;
	       midi_track[c].timer += l;
	    }
	 }
      }
   }

   /* update global position value */
   midi_pos_counter -= midi_timer_speed;
   while (midi_pos_counter <= 0) {
      midi_pos_counter += midi_pos_speed;
      midi_pos++;
   }

   /* tempo change? */
   if (midi_new_speed > 0) {
      for (c=0; c<MIDI_TRACKS; c++) {
	 if (midi_track[c].pos) {
	    midi_track[c].timer /= midi_speed;
	    midi_track[c].timer *= midi_new_speed;
	 }
      }
      midi_pos_counter /= midi_speed;
      midi_pos_counter *= midi_new_speed;

      midi_speed = midi_new_speed;
      midi_pos_speed = midi_new_speed * midifile->divisions;
      midi_new_speed = -1;
   }

   /* figure out how long until we need to be called again */
   active = 0;
   midi_timer_speed = LONG_MAX;
   for (c=0; c<MIDI_TRACKS; c++) {
      if (midi_track[c].pos) {
	 active = 1;
	 if (midi_track[c].timer < midi_timer_speed)
	    midi_timer_speed = midi_track[c].timer;
      }
   }

   /* end of the music? */
   if ((!active) || ((midi_loop_end > 0) && (midi_pos >= midi_loop_end))) {
      if ((midi_loop) && (!midi_looping)) {
	 if (midi_loop_start > 0) {
	    lt_remove_int(midi_player);
	    midi_semaphore = FALSE;
	    midi_looping = TRUE;
	    if (lmMidiSeek(midi_loop_start) != 0) {
	       midi_looping = FALSE;
               lmStopMidi();
	       return;
	    }
	    midi_looping = FALSE;
	    midi_semaphore = TRUE;
	    goto do_it_all_again;
	 }
	 else {
	    for (c=0; c<16; c++)
	       all_notes_off(c);
	    prepare_to_play(midifile);
	    goto do_it_all_again;
	 }
      }
      else {
         lmStopMidi();
         midi_semaphore = FALSE;
         return; 
      }
   }

   /* reprogram the timer */
   if (midi_timer_speed < BPS_TO_TIMER(40))
      midi_timer_speed = BPS_TO_TIMER(40);

   if (!midi_seeking) lt_install_int_ex(midi_player, midi_timer_speed);
   /* controller changes are cached and only processed here, so we can 
      condense streams of controller data into just a few voice updates */ 
   update_controllers();

   /* and deal with any notes that are still waiting to be played */
   for (c=0; c<MIDI_VOICES; c++)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91高清视频在线| 热久久久久久久| 色综合久久综合中文综合网| 国产精品卡一卡二| 成人自拍视频在线观看| 中日韩av电影| 色八戒一区二区三区| 一区二区三区在线观看国产| 欧洲国内综合视频| 免费精品视频在线| 欧美极品另类videosde| 粉嫩嫩av羞羞动漫久久久| 国产精品午夜久久| 色婷婷亚洲一区二区三区| 一区二区三区在线视频播放| 欧美日本国产视频| 国产在线麻豆精品观看| 国产精品无码永久免费888| 色又黄又爽网站www久久| 午夜私人影院久久久久| 精品精品国产高清一毛片一天堂| 国产一区 二区 三区一级| 国产精品系列在线| 欧美日韩在线观看一区二区| 久久成人免费网| 中文字幕一区三区| 欧美一区二区三区视频免费播放| 国产精品综合久久| 亚洲一二三四区| 精品久久久网站| 色婷婷av一区二区三区软件| 亚洲高清免费在线| 欧美丰满高潮xxxx喷水动漫| 国产福利一区在线| 亚洲一区二区三区三| 日韩免费一区二区| 91免费国产在线观看| 日韩av在线播放中文字幕| 欧美国产日韩在线观看| 欧美日韩一二三区| 高清不卡在线观看| 日本网站在线观看一区二区三区| 国产欧美一区二区三区在线老狼| 欧美日韩日日夜夜| proumb性欧美在线观看| 久久97超碰国产精品超碰| 成人免费一区二区三区视频| 精品国产伦理网| 欧美日韩亚洲综合| 色综合久久久久久久久| 国产成人在线视频播放| 日韩精品色哟哟| 亚洲激情图片一区| 中文字幕一区不卡| 欧美国产成人精品| 久久久青草青青国产亚洲免观| 欧美精品 日韩| 欧洲精品视频在线观看| 91美女在线看| 成人激情图片网| 国产老肥熟一区二区三区| 日韩成人一级片| 亚洲1区2区3区4区| 亚洲午夜国产一区99re久久| 亚洲私人黄色宅男| 国产精品白丝在线| 日韩欧美123| 亚洲一二三区视频在线观看| 中文字幕日韩一区二区| 国产欧美精品在线观看| 精品入口麻豆88视频| 51精品久久久久久久蜜臀| 欧美亚男人的天堂| 在线观看91视频| 欧美中文字幕一区二区三区亚洲| 色综合久久六月婷婷中文字幕| 国产91露脸合集magnet| 国产精品一二二区| 丰满少妇久久久久久久 | 亚洲少妇最新在线视频| 亚洲国产精品av| 欧美激情综合五月色丁香小说| 国产日韩欧美综合在线| 国产精品水嫩水嫩| 亚洲色图在线视频| 亚洲午夜精品17c| 亚洲成人av中文| 麻豆成人av在线| 韩国理伦片一区二区三区在线播放| 精品一区二区三区免费| 国产美女精品人人做人人爽| 国产精品影视网| 成人国产精品免费观看动漫 | 97精品电影院| 在线观看三级视频欧美| 欧美日韩一区二区欧美激情| 欧美午夜精品理论片a级按摩| 欧美美女喷水视频| 欧美一区二区视频在线观看2022 | 在线视频欧美精品| 欧美老人xxxx18| 精品久久一二三区| 中文字幕精品在线不卡| 亚洲制服丝袜在线| 美女被吸乳得到大胸91| 国产成人高清在线| 在线观看免费视频综合| 日韩视频在线一区二区| 国产精品久久久久四虎| 亚洲r级在线视频| 国产精品一级在线| 色综合色狠狠天天综合色| 欧美一区二区精品在线| 国产色婷婷亚洲99精品小说| 亚洲精品国产第一综合99久久 | 国产一区二区三区在线看麻豆| 成人精品视频网站| 精品视频免费在线| 欧美精彩视频一区二区三区| 亚洲精品国产品国语在线app| 看片网站欧美日韩| 91蝌蚪国产九色| 欧美大片免费久久精品三p| 国产精品久久久久7777按摩| 日韩高清在线不卡| 91天堂素人约啪| 精品福利一区二区三区| 亚洲一区二区三区四区五区中文 | 中文天堂在线一区| 日韩中文欧美在线| 99九九99九九九视频精品| 欧美精品粉嫩高潮一区二区| 国产女主播在线一区二区| 香蕉成人伊视频在线观看| 成人av一区二区三区| 日韩一区二区在线观看视频| 亚洲欧美日韩小说| 国产91综合一区在线观看| 欧美男女性生活在线直播观看 | 亚洲视频香蕉人妖| 国产一区在线观看麻豆| 欧美一区二区三区播放老司机| 综合精品久久久| 成人免费观看视频| 国产日韩欧美激情| 日韩精品免费视频人成| 91精彩视频在线观看| 日本一区二区三级电影在线观看| 欧美aaaaaa午夜精品| 欧美久久久久免费| 依依成人综合视频| 99精品1区2区| 国产日产欧美一区| 国产一区三区三区| 精品播放一区二区| 麻豆freexxxx性91精品| 7777精品伊人久久久大香线蕉| 亚洲精品自拍动漫在线| 91同城在线观看| 亚洲男同性恋视频| 一本大道综合伊人精品热热| 亚洲女性喷水在线观看一区| av在线一区二区| 亚洲男同1069视频| 色偷偷久久人人79超碰人人澡| 亚洲欧洲三级电影| 96av麻豆蜜桃一区二区| 中文字幕一区二区三区在线播放| 国产白丝网站精品污在线入口| 亚洲精品一线二线三线| 麻豆一区二区三区| 欧美成人性战久久| 麻豆专区一区二区三区四区五区| 日韩欧美国产高清| 国产一区二区在线观看免费| 欧美精品一区二区三区久久久| 国内成+人亚洲+欧美+综合在线| 久久亚洲免费视频| 粉嫩一区二区三区性色av| 国产精品久久久久影院| 99久久er热在这里只有精品66| 一区二区三区在线观看视频| 欧美日韩一区二区三区不卡 | 自拍偷拍亚洲欧美日韩| 91精品福利视频| 日韩主播视频在线| 久久尤物电影视频在线观看| 国产**成人网毛片九色| 自拍偷在线精品自拍偷无码专区| 在线精品视频小说1| 蜜桃av噜噜一区| 久久色在线观看| 99在线精品视频| 午夜精品123| 国产性做久久久久久| 91免费版在线| 蜜桃av噜噜一区| 中文字幕永久在线不卡| 欧美久久久久久蜜桃| 懂色一区二区三区免费观看|