如何在Java声音中连续改变音高?

时间:2010-01-10 05:34:43

标签: java audio midi jfugue

我正在使用Java声音API使用midi。基本上我正试图实现滑音效果,我可以在不同的音符之间滑动。我最接近的是在MidiChannel中使用setPitchBend()方法。但是,这只允许从我开始的音符中选择2个半音范围。是否有其他方法可以实现这种滑音效果,或者可能改变弯音范围?

如果有办法在JFugue中完成此任务,那也是可以接受的。

5 个答案:

答案 0 :(得分:1)

JFugue支持microtones。 (它通过JavaSound API完成,并结合了大量的数学运算)

它能否完全满足您的需求是另一个问题。我相信你遇到的问题是,你演奏的每个新音符听起来都像一个新音符,而不是一堆音符绑在一起。当音符具有非0的攻击和衰减值,或者乐器在音符的开头和结尾具有固有的不同声音时,这将特别明显。

在JFugue中,您可以通过添加“a”和“d”来设置音符的攻击和衰减,然后在音符后面添加0-128之间的值: C5wa0d0 - C-note,第5个八度,整个持续时间,攻击= 0,衰减= 0.

当前编写的microtone helper允许您为字符串定义单个频率;例如,您可以将400映射到“A400”。然后使用它,你会说player.play("[A400]w")(注意括号)。

获得所需内容的一种方法是为所需的许多微调定义频率和字符串,然后使用for循环创建模式... Pattern p = new Pattern("[A400]wa0d0 [A410]wa0d0 [A420]wa0d0"...);您可以使用大于每个音符1赫兹,因为我们的耳朵无法区分这种轻微的频率差异。

如果只有更优雅的解决方案!但看看是否有帮助。

答案 1 :(得分:0)

只是一个猜测 - 你可以播放两个连续音高的音符,当你淡出另一个音符时淡入一个吗?

答案 2 :(得分:0)

这可能已经过时了 - 自从我放弃了MIDI并切换到无品贝司已经将近二十年了 - 但是对于更长的幻灯片,您曾经必须播放一个音符,将其音高调高到一半到达接下来的音符,然后播放下一个音符弯曲半下,所以他们以相同的音高相遇,然后重复这个过程。

答案 3 :(得分:0)

MIDI有音调滑块的滑音控件。尝试调用controlChange(65,127)打开portametno控件然后播放两个音符。 controlChange(5, xxx)应该改变音高滑动的速度。 controlChange(65,0)将关闭滑音。

答案 4 :(得分:0)

弯音控制简单地定义了一个范围;它取决于接收端(例如合成器)如何解释它。如果接收端支持两个半音,那么你得到两个半音 - 除非它可以重新配置!在大多数合成器上,您可以重新配置弯音范围;你的目标设备是什么?

(我对JFugue不熟悉。)