白天 发表于 2019-4-2 15:40:36

冷门项目,有关音频编程的,留给有缘的大神解答

本帖最后由 白天 于 2019-4-2 15:42 编辑

   尝试向VSTI插件发送MIDI消息,期望处理成音频信号播放出来,遇到了问题。播放出来的声音很混乱,音高和时值都对不上。播放代码如下:
      Progress = Timer.GetTimerValue() * 1000000; // 获取当前时间
      EventTime = vec.TrackTime;   //当前音符播放时间
      if (Progress >= EventTime)
      {
            a = vec.EventByte;// 事件号
            b = vec.Param1;   // 音符
            c = vec.Param2;   // 力度
            SendNote(a, b, c);         // 播放音符
            PlayPos += 1;                // 下个音符
      }
   
    试着运行以下代码,播放正常,不知为什么会这样。
    long Lasttime = 0;
    long Interval= 0;
    for (int I = 0; I <= Count - 1; I++)
   {
      Interval =vec.TrackTime-Lasttime;
      System.Threading.Thread.Sleep(Interval/1000);
      a = vec.EventByte;
      b = vec.Param1;
      c = vec.Param2;
      SendNote(a, b, c);
      Lasttime =vec.TrackTime;
   }

0xAA55 发表于 2019-4-2 21:45:58

你这个代码乍一看似乎是没有什么问题的,是不是时间单位不对呢?

白天 发表于 2019-4-3 12:53:44

又测试了一下,如果把音符的时值写的长些,比如用全音符,第一种代码也能正常播放。如果短了就不行。我想这是因为VSTI插件是根据接收到的MIDI信息调用相应的音频文件来处理,由于程序的播放代码不完善,不能够中途停止播放文件,造成了该音频文件播放完前短的音符继续播放。
页: [1]
查看完整版本: 冷门项目,有关音频编程的,留给有缘的大神解答