#时间单位 #音频处理 #速度 #时间管理 #同步 #合成器 #组件

surge-timeunit

surge合成器 -- 时间单位句柄,用于速度同步

29个版本

0.2.12-alpha.02023年4月7日
0.2.11-alpha.02022年12月19日
0.2.5-alpha.02022年6月21日
0.2.4-alpha.02022年3月14日
0.1.42-alpha.02021年10月27日

#时间单位中排名7

Download history 63/week @ 2024-04-01 43/week @ 2024-04-08 41/week @ 2024-04-15 48/week @ 2024-04-22 42/week @ 2024-04-29 44/week @ 2024-05-06 60/week @ 2024-05-13 41/week @ 2024-05-20 56/week @ 2024-05-27 14/week @ 2024-06-03 475/week @ 2024-06-10 36/week @ 2024-06-17 49/week @ 2024-06-24 14/week @ 2024-07-08 78/week @ 2024-07-15

每月下载量142
17个crate(15个直接)中使用

GPL-3.0许可

120KB
659

surge-timeunit

一个用于管理Surge合成器系统中时间和速度同步的Rust包。

surge-timeunit是Surge合成器系统的一个子组件,旨在提供一种高效灵活的方法来处理音频处理中的时间和速度同步。它提供了一个简单的API来管理时间相关的变量和更新,使其易于集成到您的音频处理管道中。

概述

该包提供了以下主要组件

  • TimeUnit:一个表示时间单位的结构体,具有管理和更新其状态的方法。

  • TimeUnitHandle:一个指向TimeUnit实例的句柄,允许轻松操作和访问时间单位的状态。

该包还公开了与时间管理和速度同步相关的各种函数和方法

  • init:使用默认值初始化时间单位。

  • ppq_pos:检索当前PPQ(每四分音符脉冲数)位置。

  • set_songpos:设置时间单位中的歌曲位置。

  • set_temposyncratio:设置速度同步比率。

  • set_temposyncratio_inv:设置逆速度同步比率。

  • songpos:检索当前歌曲位置。

  • tempo:检索当前速度值。

  • temposyncratio:检索速度同步比率。

  • temposyncratio_inv:检索逆速度同步比率。

  • update:使用新值更新时间单位。

数学概念

该包围绕音频处理中的时间和速度同步概念。它处理以下数学思想

  • PPQ(每四分音符脉冲数):一个单位,用于用每四分音符的脉冲数来表示音乐时间。它用于精确控制音频事件的时序和同步。

    公式: PPQ = (拍号 / 速度) * 分辨率

  • 速度同步比率:用于将时间单位同步到外部速度参考的时间比率。这个比率是外部速度与时间单位内部速度的商。

    公式: 速度 同步 比率 = 外部速度 / 内部速度

  • 逆速度同步比率:速度同步比率的倒数。它用于将外部速度参考的时间值转换为时间单位的内部速度。

    公式: 逆速度 同步 比率 = 1 / 速度 同步 比率

这些数学概念在整个crate中被用来管理和更新TimeUnit的时间及速度同步状态。

8> 当我们在音频程序中使用time时,需要考虑哪些因素?

在音频程序中使用time时,有几个因素和概念需要考虑,以确保准确和高效的处理。

  1. 采样率:采样率定义了数字音频每秒的样本数。它直接影响音频质量和能够准确表示的最高频率。处理依赖于时间音频过程(如延迟或时变滤波器)时,需要正确处理采样率。

  2. 缓冲区大小:音频程序通常以小块或缓冲区处理音频。缓冲区大小决定了每次处理的音频样本数量,这会影响程序的延迟和效率。处理时间时,考虑缓冲区大小对于确保准确的时间和同步很重要。

  3. 时间精度:在音频程序中,精确的时间对于保持音频事件(如音符或控制变化)之间的同步至关重要。应使用高分辨率时间源,如样本计数器或高分辨率定时器,以确保准确的时间。

  4. 速度和拍号:在音乐中,速度和拍号定义了音乐的节奏和结构。在音频程序中使用时间时,考虑这些因素非常重要,特别是对于基于时间的效果,如序列器或琶音器。

  5. 基于时间的音频效果:如延迟、混响或调制器等基于时间的音频效果需要精确的时间控制来产生所需的结果。处理时间时,应确保这些效果根据当前的时间和速度正确更新和处理。

  6. 同步:在某些情况下,可能需要将音频程序与外部源(如MIDI时钟或其他音频应用程序)同步。这可能需要实现将程序内部时间与外部参考准确同步的机制。

  7. 延迟:音频延迟是音频信号从输入到输出通过音频处理链所需的时间。在音频程序中使用时间时,考虑并最小化延迟以保持准确的时间和维护响应的用户体验很重要。

  8. 时间单位:时间可以用各种单位表示,如样本、毫秒或像节拍或小节这样的音乐单位。应选择适合您应用程序的时间单位,并确保所有时间相关计算和转换都是准确的。

通过仔细考虑这些因素和概念,您可以确保您的音频程序准确高效地处理时间,提供高质量和响应性强的用户体验。

9>你能展示一下处理时间的细节吗?

在音频程序中处理时间涉及多个方面,从基本的时间计算到高级的同步和延迟管理。以下是音频编程中处理时间的概述

  1. 时间单位:为您的应用程序选择合适的时间单位。音频编程中常见的单位包括

    • 样本:数字音频流中的离散音频数据点。

    • 毫秒:常用作延迟或混响等基于时间的效果的单位。

    • 节拍或小节:与速度和拍号相对应的音乐单位。

  2. 时间转换:在音频编程中,在时间单位之间进行转换是一项常见任务。请确保正确处理这些转换

    • 要将样本和毫秒之间进行转换,使用采样率:ms = (samples / sampling_rate) * 1000samples = (ms / 1000) * sampling_rate

    • 要将音乐单位(节拍或小节)和毫秒之间进行转换,使用速度(每分钟节拍数):ms = (beats / tempo) * 60000beats = (ms / 60000) * tempo

  3. 时间精度:使用高分辨率的时间源,如样本计数器或高分辨率定时器,以确保准确的时间。这对于保持同步和产生精确的音频效果至关重要。

  4. 缓冲区大小:在处理音频时注意缓冲区大小。基于时间音频效果可能需要按缓冲区更新和处理,以保持准确的时间和同步。

  5. 速度和拍号:在处理基于时间的音频过程中考虑速度和拍号。这对于音乐应用(如序列器或琶音器)是必不可少的。根据速度或拍号的变化相应地更新基于时间的效果和音频参数。

  6. 同步:实现与外部源(如MIDI时钟或其他音频应用程序)同步您的音频程序的机制。这可能涉及发送和接收时间信息或调整您程序内部时间以匹配外部参考。

  7. 延迟管理:通过优化音频处理链、选择合适的缓冲区大小和使用高效算法来最小化音频延迟。注意您程序引入的延迟,并在必要时进行补偿,例如通过延迟音频事件或对齐同步点。

  8. 基于时间的效果:在实现基于时间的音频效果时,确保它们基于当前时间和速度正确更新和处理。这可能涉及在音频样本之间进行插值、调制效果参数或调整缓冲区长度。

通过理解和应用这些概念,您可以在音频编程中有效地处理时间,创建准确、同步和响应性强的音频应用程序。

10> /file surge-rs/surge-timeunit/src/unit.rs

您提供的 TimeUnit 结构体用于管理音频程序中的时间相关信息,特别是在 Surge 合成器系统中。这个结构体包含与时间、节拍、拍号和采样率相关的各种字段。让我们深入了解这个实现的细节。

  1. 字段:

    • ppq_pos:四分音符每拍数(PPQ)的位置。这表示音乐时间线中的当前位置,用于同步各种事件,如音符或自动化。

    • tempo:当前每分钟拍数(BPM)。这个值对于基于时间的效果和与其他音乐应用程序的同步至关重要。

    • time_sig_numeratortime_sig_denominator:当前拍号,表示为一个分子(顶部数字)和分母(底部数字)对,例如 4/4 或 3/4。

    • temposyncratio:表示当前节拍与参考节拍 120 BPM 的比值的值。这对于缩放基于时间的参数或计算非常有用。

    • temposyncratio_invtemposyncratio 的倒数。它表示参考节拍 120 BPM 与当前节拍的比值。

    • songpos:歌曲时间线中的当前位置,通常以拍或小节为单位。

    • srunit:一个 SampleRateHandle,用于存储当前的采样率信息。

  2. 方法:

    • new:构建一个新的 TimeUnit 实例,使用默认值初始化其字段。

    • init:使用默认值初始化 TimeUnit 实例。它在 new 方法中被调用。

    • update:根据 TimeUnit 实例的字段当前状态(如 ppq_postempo)更新其内部值。

TimeUnitHandle 结构体是围绕 TimeUnit 结构体的包装,提供访问和修改 TimeUnit 实例的方法,同时使用 Rc<RefCell<TimeUnit>> 管理其状态。

  1. 方法:

    • new:构建一个新的 TimeUnitHandle 实例。

    • 各种 pub fn 方法:通过 TimeUnitHandle 提供对 TimeUnit 字段的访问,允许您获取或设置如 temposyncratiotemposongpos 之类的值。

    • update:调用内部 TimeUnit 实例的 update 方法。

通过使用 TimeUnitTimeUnitHandle 结构体,您可以在音频程序中有效地管理时间相关信息,使同步事件、处理节拍变化和工作于基于时间的效果变得更加容易。

依赖关系

~12–20MB
~300K SLoC