问题标签 [sound-synthesis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
601 浏览

vst - 如何发送要由合成器处理的音频块——没有间断

我正在使用Juce框架来构建 VST/AU 音频插件。音频插件接受 MIDI,并将 MIDI 渲染为音频样本——通过发送 MIDI 消息由FluidSynth(一种声音合成器)处理。

这几乎可以工作了。MIDI 消息正确发送到 FluidSynth。事实上,如果音频插件告诉 FluidSynth 将 MIDI 消息直接渲染到它的音频驱动程序——使用正弦波声音字体——我们会得到一个完美的结果:

完美的正弦波,通过将音频直接发送给驱动程序

但我不应该要求 FluidSynth 直接渲染到音频驱动程序。因为这样 VST 主机将不会收到任何音频。

要正确执行此操作:我需要实现一个renderer。VST 主机每秒会询问我 (44100÷512) 次以呈现 512 个音频样本。


我尝试按需渲染音频样本块,并将其输出到 VST 主机的音频缓冲区,但这是我得到的那种波形:

渲染音频块,效果不佳

这是同一个文件,每 512 个样本(即每个音频块)都有标记:

带标记

所以,很明显我做错了什么。我没有得到连续的波形。我处理的每个音频块之间的不连续性非常明显。


这是我的代码中最重要的部分:我对 JUCE 的SynthesiserVoice.

这是要求合成器的每个声音产生 512 个音频样本块的地方。

这里的重要功能是SynthesiserVoice::renderNextBlock(),我要求fluid_synth_process()生成一个音频样本块。


这是告诉每个声音的代码renderNextBlock():我的AudioProcessor.

AudioProcessor::processBlock()是音频插件的主循环。在其中,Synthesiser::renderNextBlock()调用每个声音的SynthesiserVoice::renderNextBlock()


我在这里有什么误解吗?让 FluidSynth 给我与前一个样本块背靠背的样本是否需要一些时间上的微妙之处?也许我需要传入一个偏移量?

也许 FluidSynth 是有状态的,并且有我需要控制的自己的时钟?

我的波形是一些众所周知的问题的症状吗?

源代码在这里,以防我遗漏了任何重要的东西。提交时发布的问题95605

0 投票
1 回答
203 浏览

java - 什么是 Java 中的合成器和音序器(javax.sound.midi)?

我想知道合成器和音序器的实际工作,或者他们实际做了什么?

0 投票
1 回答
449 浏览

sound-synthesis - 在 SuperCollider 中设置 FFT 链的各个 bin

我正在研究图像到声音的项目,并尝试在SuperCollider中实现加法合成。我想使用逆 DFFT 对(数百个)正弦波求和,而不是SinOsc为每个正弦波创建一个合成器。

所有 SuperCollider 文档都说,它消耗了由(并由函数转换)IFFT产生的称为“FFT 链”的东西:FFTPV_*

但是对于我的应用,我不需要FFT 阶段,因为我已经知道我的信号在频域中是如何表示的。我想要的是:

“频域信号”是一个 numpy 数组序列,表示我在 Python 应用程序中已经拥有的频域信号。所以,我需要将此信息传递给 SuperCollider。

据我了解, FFT 链意味着某种数据流,但我不明白如何手动将数据写入其中。

我也尝试过使用静音 FFT 链(例如 get FTTof Silence.ar),但我也不知道如何手动设置单个频率箱。

0 投票
1 回答
349 浏览

c++ - 基本软件合成器的延迟随时间增长

我正在完成一个 MIDI 控制的软件合成器。MIDI 输入和合成工作正常,但播放音频本身似乎有问题。

我使用jackd它作为我的音频服务器是因为可以将它配置为低延迟应用程序,例如在我的情况下,实时 MIDI 乐器,alsa作为jackd后端。

在我的程序中,我使用RtAudio的是一个相当知名的 C++ 库,用于连接各种声音服务器并在它们上提供基本的流操作。顾名思义,它针对实时音频进行了优化。

我还使用了该Vc库,它是一个为各种数学函数提供矢量化的库,以加快加法合成过程。我基本上是将大量不同频率和幅度的正弦波相加,以便在输出上产生复杂的波形,例如锯齿波或方波。

现在,问题不在于延迟很高,因为这可能可以解决或归咎于很多事情,例如 MIDI 输入或其他问题。问题是我的软合成器和最终音频输出之间的延迟开始非常低,几分钟后,它变得难以忍受。

因为我打算用它来“现场”播放,即在我的家里,我真的不会因为我的击键和我听到的音频反馈之间不断增长的延迟而烦恼。

我试图减少一直重现问题的代码库,但我无法再进一步减少它。

编译g++ -march=native -pthread -o synth -Ofast main.cpp /usr/local/lib/libVc.a -lrtaudio

该程序需要一个采样率作为第一个参数。在我的设置中,我jackd -P 99 -d alsa -p 256 -n 3 &用作我的声音服务器(需要当前用户的实时优先级权限)。由于默认采样率为jackd48 kHz,因此我使用./synth 48000.

alsa可以用作声音服务器,尽管jackd出于模糊的原因(包括交互) pulseaudio,我更喜欢在可能的情况下使用。alsa

如果您要运行该程序,您应该会听到一个希望不会太烦人的锯齿波播放并且不是定期播放,并且控制台输出在播放应该开始和停止时打开。当noteOn设置为true时,合成器开始以任何频率产生锯齿波,并在noteOn设置为 false 时停止。

希望您一开始会看到这一点,noteOn true并且false与音频播放和停止几乎完全对应,但是音频源开始逐渐滞后,直到在我的机器上大约 1 分钟到 1 分 30 秒左右开始变得非常明显。

由于以下原因,我 99% 确信它与我的程序无关。

“音频”在程序中采用这条路径。

  • 键被按下。

  • 时钟在 48 kHz 处滴答sample_processing_thread并调用Synthesizer::get_sample并将输出传递给std::queue用作稍后的样本缓冲区的输出。

  • 每当RtAudio流需要样本时,它都会从样本缓冲区中获取样本并继续移动。

这里唯一可能导致延迟增加的原因是时钟滴答,但它的滴答速度与流消耗样本的速率相同,所以不可能。如果时钟滴答作响,RtAudio则会抱怨流欠载,并且会出现明显的音频损坏,这不会发生。

然而,时钟可以更快地点击,但我不认为是这种情况,因为我已经在很多场合自己测试过时钟,虽然它确实显示出一点点抖动,以纳秒为单位,这是为了被期望。时钟本身没有累积延迟。

因此,延迟增长的唯一可能来源是RtAudio声音服务器的内部功能或声音服务器本身。我用谷歌搜索了一下,没有发现任何用处。

我已经尝试解决这个问题一两个星期了,并且我已经测试了我这边可能出现的所有问题,并且它按预期工作,所以我真的不知道会发生什么。


我试过的

  • 检查时钟是否有某种累积延迟:没有注意到累积延迟
  • 计时按键和生成的第一个音频样本之间的延迟,以查看此延迟是否随时间增长:延迟不随时间增长
  • 计时请求样本的流和发送到流的样本之间的延迟(开始和结束stream_callback):延迟不随时间增长
0 投票
1 回答
29 浏览

audio-processing - 调制指数 = Modulator Operator 中的“Out”电平

我正在阅读有关频率调制中的算法。在大多数合成器中,每个算法操作员都有一个“Out”电平旋钮,在载体中,这个旋钮控制输出音量。然而,对于调制器,电平旋钮决定了它对载波所做的更改量。

这个量是调制指数吗?

0 投票
0 回答
142 浏览

puredata - 在 FM 合成算法中将调制器连接到调制器

我想在纯数据中实现一些 Fm 合成算法,我需要知道我的方法是否正确。

假设我有这个算法: 算法 1

使用纯数据,我试图像这样实现它: 纯数据补丁

我关心的是我应该如何连接运营商 5 和 4,我只是阅读了一些关于如何将调制器连接到载波(如运营商 2 和 1)的示例,但从未阅读过如何将调制器连接到另一个调制器,所以我不知道如果我使用正确的对象( +~ 或 *~ ?)做得正确。

您还可以注意到,算法还有第六个运算符,我还没有添加到我的补丁中。忽略这一点,因为我必须询问反馈,我想我可以在另一个问题中问它。

而那个 dac~ 对象仅用于测试目的。

0 投票
0 回答
26 浏览

matlab - 如何使用 MATLAB 将 LPT 代码转换为声音文件(例如 WAV)

我正在尝试在 Matlab 中合成一个可以转换为声音文件的长期增强 (LTP) 代码。我已经能够合成代码,但我需要帮助解析代码,然后将其转换为声音文件。

这是我当前的脚本:

0 投票
1 回答
210 浏览

javascript - 波表合成 - WebAudioApi

我正在尝试使用 Web Audio Api 创建波表合成器。我想要实现的是从一种波形线性交换到另一种波形(如 Massive 或 Serum)的可能性。

例如:从正弦波开始,我旋转一个旋钮,它会逐渐将其转换为方波。

我已经搜索了文档,到目前为止我发现了如何创建自定义波形:

主要问题是该波形是静态的,我无法将其逐渐更改为其他波形。

我怎样才能实现我的目标?我正在考虑在每个波之后放置 2 个增益节点,它们将相互补充。

例如:我的正弦波输入Gain1为 10,方波输入Gain2为 0。然后我将它们更改为互补,Gain1=5,Gain2=5 等等。

这是一种有效的方法吗?

0 投票
1 回答
270 浏览

java - 为什么这段代码会产生非常嘈杂的正弦波?

我正在尝试用 Java 编写一个非常简单的声音合成器。我正在使用该javax.sound.sampled软件包。下面的代码有效,但正弦波非常嘈杂,听起来像在波旁播放某种安静的温暖噪音。

我将生成的声音放入 EQ 中,以验证声音是否真的很嘈杂,果然:

这就是我得到的

主要频率是 440 赫兹,但还有一些其他频率不应该出现。为什么会这样?我如何解决它?

0 投票
1 回答
216 浏览

audio - Audiokit 中合成声音的连续频率变化是否可能?

我有兴趣在 ios 上开发一个简单的测试应用程序(使用 Swift),根据连续网格上的浮点位置,从左到右移动鼠标光标来控制正在播放的声音的频率。我会寻找这样的东西:https ://www.szynalski.com/tone-generator/

我创建了指数频率曲线的基本可视化来帮助自己入门:

一个八度频率图,较深的颜色代表整个音调

声音必须在运行时生成并连续播放,频率变化也应该是连续/瞬时的(如弯音)。AudioKit 似乎是一个很棒的 AP​​I,可以帮助我快速完成某些事情,但仔细研究它,看起来很多文档齐全的便利功能仅适用于预制音频。例如,网页上说弯音示例仅用于播放器声音,而不是生成的声音。

浏览教程,我没有看到我的用例被涵盖——可能是在复杂的音频合成器中。还有一个问题是我将如何使频率变化和音频处于优先级线程中,因为这是应用程序的重点。我记得读到使用 UI 事件循环是行不通的。

为了表明我已经努力寻找解决方案,我想链接我找到的几个页面:

这是 MIDI 音符输出的示例,但它不是连续的: https ://audiokit.io/playgrounds/Synthesis/Oscillator%20Bank/

我在 stackoverflow 上发现的唯一频率问题之一适用于使用麦克风进行音高检测,这并不真正相关: AudioKit (iOS) - Add observer for frequency/amplitude change

这谈到了连续振荡,但没有描述如何动态改变频率或产生声音 如何在 Audiokit 中不断改变 AKMorphinOscillatorBank 的频率?

我认为这是我发现的最接近的东西(产生声音,使用运行时参数来调整频率): AudioKit:根据陀螺数据改变声音/摆动手机?

如果最后一页有解决方案,那我该怎么办AKOperationGenerator?我很想看到一个完整的例子。

简而言之:如何在 AudioKit 中创建一个简单的示例(或者我是否需要 CoreAudio 和 AudioUnits?),其中可以使用在运行时不断更新的浮点坐标来连续和瞬时地改变生成声音的频率?如何创建这样的声音(我想我不仅想合成正弦波,还想合成听起来更像真实乐器或 FM 合成器的东西),打开/关闭它,并以我的方式控制它需要?

我是 AudioKit 的初学者,但我已经设置好了开发环境。我能帮上忙吗?