首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定时同步

定时同步
EN

Stack Overflow用户
提问于 2014-12-02 23:03:03
回答 2查看 187关注 0票数 0

我正在尝试将便条时间和这个网格同步起来:(放大以正确地查看网格)

(注意其中2行对齐不对齐),但我尝试的每一件事似乎都不起作用。我的主要问题是这个必须实时完成,我不能对它进行预处理。(它已经足够慢了)

为了解释这个图像:

图像的第一行是音符播放的最大速度。它是20 NPS (音符每秒)。第二行与网格不对齐,为13.25 NPS。第3批10名NPS。第四批为6.25NPS。其余的都是从3到20的n为20/n。

如果我们将网格的每个部分称为“帧”,并且考虑到20个NPS与帧匹配,那么我们就有20个FPS。我在这里唯一能做的就是选择在哪一帧中播放音符。也就是说,对于20个NPS,我在每个帧上播放一个音符,而对于10个NPS,我跳过每个音符一个帧,等等……

我要做的是想出一个跳过帧的算法,这样13.25 NPS歌曲听起来仍然不错,即使我必须匹配/对齐20 NPS/FPS网格的音符。

对我怎么做有什么想法吗?

你可以看到我在这里已经尝试过的一切:https://github.com/SoniEx2/NBSPlayer/commits/eef9ad465a1e337b17ad4e27e9a22d8a9dddfe4d/ats

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 13:51:32

链接的代码将永远无法工作,因为有一个带有makes ()的错误使其睡眠时间过长。但这里有一个解决办法:

与其直接调用睡眠(),不如按如下方式调用它:

代码语言:javascript
复制
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代码,显示了bug:

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2014-12-03 08:42:06

我不认为如果没有高利率的抽样,任何变化都不会有任何好处。

  • 声音是很棘手的,例如
    1. 如果要添加可变时间跳过以匹配20个nps网格中的13.25nps
      • 这将在20个nps的几乎每一个音符中创建跳过。
      • 但并不是所有的
      • 因为我们如何通过大脑对声音进行解读和解码。

代码语言:javascript
复制
1. if you align 13.25nps to 10 nps instead 
    - then of coarse you are out of sync in time anyway resp. out of wanted tempo

,所以我认为是使用更高采样率的唯一方法,

  • LCM最不常见的乘法或足够高,以降低定时误差,所以它是不明显的。
  • 例如,使用grid: 2000 nps +变量跳过,这会造成最多1ms的同步错误。
  • 这一点只有通过很好的听音乐的人才能看到,而这些人并不多。

如何实现变量跳过

  • 这和绘制2D线是一样的。
  • 所以使用Bresenham,DDA,(子)部门或者其他什么
  • 只需交换轴x=sampling速率网格,y=target速率网格
  • 例如,类似这样的内容(在C++中): int f0=200000,f1=1325,f2=2000,cnt1=f1,cnt2=f2;//速率为*100,以避免(ix=0;ix
  • 粗略地说,我假设您的笔记定义了长度,所以您需要设置更多的每个注释样本,然后设置一个这样设置的样本ix,ix+1,ix+2,...
  • 如您所见,您可以根据需要添加多少个节拍,只需为每个节拍添加cnt?,f?变量即可。
  • 您可以使用(cnt?<0)或使用framerates-1来实现不同的对齐/混叠样式。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27260688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档