冷门项目,有关音频编程的,留给有缘的大神解答
本帖最后由 白天 于 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;
}
你这个代码乍一看似乎是没有什么问题的,是不是时间单位不对呢? 又测试了一下,如果把音符的时值写的长些,比如用全音符,第一种代码也能正常播放。如果短了就不行。我想这是因为VSTI插件是根据接收到的MIDI信息调用相应的音频文件来处理,由于程序的播放代码不完善,不能够中途停止播放文件,造成了该音频文件播放完前短的音符继续播放。
页:
[1]