找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1800|回复: 2

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

[复制链接]
发表于 2019-4-2 15:40:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

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

回复

使用道具 举报

发表于 2019-4-2 21:45:58 | 显示全部楼层
你这个代码乍一看似乎是没有什么问题的,是不是时间单位不对呢?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-4-3 12:53:44 | 显示全部楼层
又测试了一下,如果把音符的时值写的长些,比如用全音符,第一种代码也能正常播放。如果短了就不行。我想这是因为VSTI插件是根据接收到的MIDI信息调用相应的音频文件来处理,由于程序的播放代码不完善,不能够中途停止播放文件,造成了该音频文件播放完前短的音符继续播放。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-21 22:51 , Processed in 0.029416 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表