问题标签 [synthesizer]

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 投票
0 回答
245 浏览

java - 安卓方波

我目前正在尝试制作一个可以创建多个波形的振荡器,但是我的方波方法会产生错误,我可能会犯一些愚蠢的错误,但我们将不胜感激。这是我的代码:

0 投票
1 回答
1324 浏览

java - Android AudioTrack 错误

我目前正在尝试使用 AudioTrack 在 Android 上构建一个多波形振荡器,但是我尝试实现方波我得到了同样的致命错误,我似乎找不到任何解决方法,任何帮助都是有用的,这是我的代码:

我的 Play Wave 类看起来像这样:

我得到的错误是这样的:

0 投票
1 回答
846 浏览

javascript - WebAudio 计时是如何工作的?使用 setInterval 是一个不好的解决方案吗?

我正在尝试使用 WebAudio API 制作合成器/音序器。主要是尝试制作可以播放由音符和事件组成的歌曲的东西,例如 MIDI,以控制合成器的多个通道。但我仍然需要解决时间方面的问题。

我已阅读有关 WebAudio API 的教程,但我不太了解计时/调度/时钟的工作原理。起初我做了一个复音合成器,它可以为按键播放音符,这不需要任何时间考虑。然后我使振荡器在特定时间间隔播放一组音符,使用setInterval. 但是我过去注意到谷歌浏览器中切换标签时,播放速度显着减慢,我认为资源密集型较少 - 但其他合成库没有这个问题。此外,我只能假设使用setInterval对于平滑(缓冲正确的词?)播放不是很好,尤其是在考虑 ADSR 包络振荡器时。

从我正在阅读的内容来看,WebAudio API 有一个不断增加的currentTime计时器变量。但是,如果笔记存储在一个数组中并且我想以设定的速率循环它,那么如何操纵 WebAudio 计时器以按照设定的速率迭代数组?我的setInterval 解决方案(音量警告)根本不考虑 WebAudio 计时器,只是调用voice()withsetInterval来播放音符,覆盖最后播放的声音。

是否有更好或更有效的方法来播放/循环除 之外的一系列音符setInterval

只是更新澄清一下:当我写这个问题时,我setInterval习惯于以固定的间隔播放一系列音符(例如,不定期的 - 不断启动/停止振荡器)并且想知道更可靠的方式来播放音符。我发现更好的解决方案是使用setValueAtTimeonosc.frequencyGainNode. 对于一个简单的原型合成器,这很好用,但更高级的合成器可以使用定时器 onosc.startosc.stop。问题是循环播放歌曲。为了循环,我需要不断地安排更多的音符,以便在歌曲结束时重新开始。我可以用它setInterval来安排整个歌曲循环,但它仍然必须保持播放歌曲的时间,并且setInterval(甚至是 Web Workers'onmessage例如,当标签不活动时,可以放慢速度)。setInterval 的时钟甚至不可靠,所以我只需每 5 毫秒检查一次是否(currentTime >= songTime)满足条件,并安排时间。这种方法可能效率不高。我到目前为止所拥有的

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 投票
0 回答
234 浏览

c# - microsoft.speech 合成器 Speak 命令挂起

多年来,我一直在不同的 PC 和不同版本的 Windows 上使用 Microsoft.Speech 合成器。我正在尝试在新的 Windows 10 PC 上设置开发和支持环境,但我无法让 spsynthesizer 正常工作。我现在已经下载了 Microsoft SDK5.1 和声音两次,以确保没有任何损坏。我已经使用调试器逐步完成了每一行代码,一切都按预期工作,直到调用 spsynthesizer.speak ......调用永远不会说话,也永远不会返回程序。我尝试以 x86、x64 和 AnyCPU 执行,并且我有一个 Microsoft.Speech 的参考条目。

有什么建议么?这是简单的 C# 测试应用程序。

}

0 投票
0 回答
133 浏览

c++ - 限带合成 - 获得谐波数量

我正在通过总结谐波进行简单的蛮力带限合成。我从维基百科复制了公式,但没有信息如何获得最高谐波数。谁能给我一个公式?

这是我的直觉:

脉冲波:

三角波:

锯齿波:

0 投票
1 回答
254 浏览

java - 如何设置 libpd 以在 Java 中使用?

PureData 是一种用于声音合成的编程语言。LibPD 是它的包装器,因此我们可以在 Java/C#/Android 等中使用补丁。这是包含它的 GitHub 页面:https ://github.com/libpd/libpd

现在要在 Java 中使用 LibPD,我认为首先我应该将它的库导入我的项目,然后使用它的类和方法来调用我的补丁并调整它。问题是,我找不到要添加到项目中的 jar 文件。我是否必须“构建”一些东西才能生成 jar 文件?

如果有人向我解释程序,我将不胜感激。
谢谢

更新 1[2017-01-11]:
在关注 @umläute 的帖子后,我收到以下错误:(我MinGW在 Windows 7/64 位和MinGW-makefor 中使用make

更新 2 [2017-01-11]:
我已经安装了MSYS2, mingw32and 64and make(感谢@milleniumbug 的帮助)。我已经为mingw64maketo添加了目录PATH。现在当我这样做时,make javalib我得到了这个错误:

更新 3 [4-11-2017]: 修复 jni.h了问题。我的 PATH 指向旧的 jdk 而不是更新的 jdk。现在我收到此错误:

用 32 位 MinGW gcc 测试它......仍然是同样的错误......

更新 4 [2017 年 6 月 11 日]:
修复了问题
看来我已经设法解决了。这是我通常所做的:
1- 首先我安装了 msys2 并彻底安装它,MinGW32并且注意:如果您从旧的原始站点获得它MinGW64,请删除它。它不再更新,您可能会遇到依赖性问题。 2- 将 PATH 更改为使用 MinGW32(因此应报告 32 位版本) 3- 将 JAVA_HOME 更改为更新后的 jdk 目录。似乎更新 java 不会自动更新 env。变量(这解决了问题)。 4-通过命令安装和获取(按照存储库自述文件中的说明) 5- 6- 7-make
mingw32
gcc -v
jni header not found
gitlibpdgit
make clean
make clean libpd
make clean javalib

我希望这可以帮助别人

0 投票
1 回答
238 浏览

python - 无需读取或写入 wav 文件或数组即可实时播放合成音频

是否可以在 python 中通过直接写入音频输出来播放音频,而无需制作或读取 wav 文件或制作要播放的数组。

我一直在做一个合成器项目,我想实时合成和调制声音。我目前正在使用 mac 进行编程,但最终的软件将在树莓派上。使用 arduino,a 能够通过使用 8 位 R2R 梯形图作为 DAC 并直接写入组成 DAC 的 GPIO 引脚来做到这一点。这是一个用于在 arduino 上制造“白”噪声的小简化代码:

另一个制作漂亮的 8 位底鼓的例子。我想即时计算正弦波,但 arduino 太慢了,无法做到:

在笔记本电脑或树莓派上运行 python 会不会发生这样的事情?

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 回答
916 浏览

ios - 在 Objective-C 中创建方波、锯齿波和三角波

我正在尝试为我正在开发的一个简单的波表合成器 iOS 应用程序生成不同的波形。这就是我生成正弦波的方式:

对于方波,我假设这会起作用,但它没有:

我将如何创建锯齿波和三角波,方波哪里出错了?

谢谢,我是 iOS 编程新手,喜欢使用音频。