这种延迟和攻击与演奏音符的时间有关。延迟指定在播放下一个音符之前发生buffer_size的次数。在这种情况下,攻击意味着在什么帧位置插入注释。
需要纠正
AgsSoundcard实现的延迟和攻击大小是AGS_SOUNDCARD_DEFAULT_PERIOD的2倍。但目前只使用了第一个句号。
假设您有一个具有以下节奏和预设的项目:
制动压力=136
段=1/16*4
采样率=44100
缓冲区大小=1024
这将为您提供以下绝对延迟:
绝对延迟=60.0*((采样/缓冲大小)/bpm)*段=4.749971278
这将导致可变攻击,具体取决于所玩的偏移量。这不是GSequencer中的工作方式。
修正的延迟
延迟的纠正方式是定期进行攻击。这意味着在AGS_SOUNDCARD_DEFAULT_PERIOD时间延迟后,我们可以获得:
攻击=0
攻击背后的魔法在ags_soundcard_util中计算。c(c)
http://git.savannah.nongnu.org/cgit/gsequencer.git/tree/ags/audio/ags_soundcard_util.c
因此,我们计算AGS_SOUNDCARD_DEFAULT_PERIOD之后的剩余帧,并使用total_correct_frame_count调整绝对延迟。
default_tact_frames=绝对延迟*缓冲区大小;
total_correct_frame_count=((guint)AGS_SOUNDCARD_DEFAULT_PERIOD*DEFAULT_tact_frames)%buffer_size;
correct_frame_count=(gdouble)total_correct_frames_count/AGS_SOUNDCARD_DEFAULT_PERIOD;
corrected_delay=绝对延迟+(correct_frame_count/buffer_size);
因此,我们的延迟从4.749971278变为4.750918277。差异为0.000946999,导致不准确度约为段持续时间的千分之一。
在这里,我们在一秒钟内有8个播放键。这段0.125秒的持续时间除以1000可以得出时间上的误差。
作者:Joöl