时序同步
2015-5-12 13:52:15
收藏:0
阅读:100
评论:2
我要 masochistically 同步音符来对齐这个网格: (放大图片看网格正常)

(注意到2行没有对齐) 但是我尝试的所有方法似乎都不起作用。我的主要问题是这必须是实时完成,我不能预处理它。(因为它已经足够慢了)
为了解释图片: 图片的第一行是音符播放的最大速度。它是20 NPS(每秒音符数)。第二行不对齐到网格,它是13.25 NPS,第3行是10 NPS,第4行是6.25 NPS。所有其他行都是20/n(n从3到20)。
如果我们把网格的每个部分称为“帧”,并且考虑20 NPS与帧匹配,我们有20 FPS。我能做的唯一的事情就是选择在哪个帧中播放一个音符。也就是说,对于20 NPS,我在每个帧上播放一个音符,但对于10 NPS,我每个音符跳过1个帧,以此类推...
我要做的是想出一种算法,跳过帧,以便13.25 NPS的歌曲即使必须与20 NPS / FPS网格匹配/对齐,仍然听起来不错。
有什么想法吗?
您可以在此处查看我已经尝试过的所有内容:https://github.com/SoniEx2/NBSPlayer/commits/eef9ad465a1e337b17ad4e27e9a22d8a9dddfe4d/ats
点赞
用户3691554
链接的代码永远无法运行,因为 sleep() 有一个 bug 使它休眠的时间太长了。但是这里有一个解决办法:
不要直接调用 sleep(),而是要这样调用它:
local function sleep_workaround(d)
local t = d * 20
for i=1,math.floor(t) do
sleep(0.05) -- 0.05s sleeps don't trigger the bug
end
end
这是因为有缺陷的 ComputerCraft 代码每个周期执行 x -= 0.05,导致浮点数错误,而不是将输入转换成整数并且每个周期执行 x -= 1。因为 ComputerCraft 使用 Java,这是一些简单的 Java 代码来显示这个缺陷:
for (double d : new double[]{0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0}) {
int i;
double in = d;
for (i = 0; d > 0.0; i++, d -= 0.05) {}
System.out.println(in + " " + i);
}
2015-05-12 13:51:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我认为,如果没有高采样率的采样,任何改变都没有用。
因此,我认为使用更高的采样率是唯一的方法
如何实现可变跳跃
int f0=200000,f1=1325,f2=2000,cnt1=f1,cnt2=f2; // rates are *100 to avoid use of floats for (ix=0;ix<???;ix++) sample[ix]=0; // erase all samples before so you can add more then one sample in single pass later for (ix=0;ix<???;ix++) // loop to handle your samples ... { cnt1-=f1; if (cnt1<=0) { cnt1+=f0; sample[ix]+=???; /*/ here add samples for tempo 1 /*/ } cnt2-=f2; if (cnt2<=0) { cnt2+=f0; sample[ix]+=???; /*/ here add samples for tempo 2 /*/ } }当然,我假设您的音符已经定义了长度,因此您需要设置多个样本以覆盖一个节奏,因此设置样本
ix,ix + 1,ix + 2,...正如您所看到的,您可以添加任意数量的节奏,只需对每个节奏都有
cnt?,f?变量即可您可以使用
(cnt?<0)或使用帧速率-1来实现不同的对齐/混叠样式...