技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 170|回复: 2
收起左侧

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

[复制链接]

2

主题

24

帖子

117

积分

用户组: 小·技术宅

UID
3003
精华
0
威望
2 点
宅币
89 个
贡献
0 次
宅之契约
0 份
在线时间
19 小时
注册时间
2017-10-24
发表于 2019-4-2 15:40:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 白天 于 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;
   }

1038

主题

2307

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
217
威望
287 点
宅币
17884 个
贡献
35933 次
宅之契约
0 份
在线时间
1711 小时
注册时间
2014-1-26
发表于 2019-4-2 21:45:58 | 显示全部楼层
你这个代码乍一看似乎是没有什么问题的,是不是时间单位不对呢?

2

主题

24

帖子

117

积分

用户组: 小·技术宅

UID
3003
精华
0
威望
2 点
宅币
89 个
贡献
0 次
宅之契约
0 份
在线时间
19 小时
注册时间
2017-10-24
 楼主| 发表于 2019-4-3 12:53:44 | 显示全部楼层
又测试了一下,如果把音符的时值写的长些,比如用全音符,第一种代码也能正常播放。如果短了就不行。我想这是因为VSTI插件是根据接收到的MIDI信息调用相应的音频文件来处理,由于程序的播放代码不完善,不能够中途停止播放文件,造成了该音频文件播放完前短的音符继续播放。

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-6-16 09:19 , Processed in 0.102457 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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