2010-01-10 43 views
1

我正在使用Java声音API使用MIDI。基本上我试图达到滑音效果,我可以在不同音符之间滑动。我得到的最接近的是在MidiChannel中使用setPitchBend()方法。但是,这仅允许从我开始的音符开始的2个半音范围。是否有另一种方法来实现这种滑音效果,或者改变弯音范围?如何在Java声音中连续改变音高?

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

回答

0

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

+0

我试过这种技术,并用不同的值进行了测试,但它不一样。这两个音符相隔太远。为了正确模拟音高弯曲的逐渐变化,需要微调音符,这是Java声音API不支持的。 – Peter

0

这可能会过时 - 自从我放弃MIDI并转换为无品质低音后将近二十年 - 但对于您以前必须演奏一个音符的较长的幻灯片,将其音高调高至中途下一个音符,然后播放下一个音符,向下弯曲一半,以相同的音高相遇,然后重复该过程。

1

JFugue支持微量元素。 (它通过JavaSound API,并结合大量的数学运算)

它是否能够完全符合您的要求是另一个问题。我相信你会遇到的问题是,你弹奏的每个新音符都会听起来像是一个新音符,而不是一堆音符连在一起。如果音符的攻击和衰减值不是0,或者乐器在音符的开始和结尾处有固有不同的声音,这将特别显着。

在JFugue,您可以通过添加“a”和“d”,然后从值0-128,说明后设置一个音符的攻击和衰变: C5wa0d0 - C-注,第5倍频,全持续时间,攻击= 0,衰减= 0。

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

找到你要找的东西的一种方法是定义频率和字符串,然后使用for循环创建一个模式... Pattern p = new Pattern("[A400]wa0d0 [A410]wa0d0 [A420]wa0d0"...);您可以使用大于1赫兹的步长每个音符,因为我们的耳朵无法区分这种轻微的频率差异。

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

+0

谢谢,这听起来像是正确的做法。但是,由于某些原因,似乎攻击速度与体积同义。 a0根本听不见,a5几乎听不见,等等。我尝试了几种不同的连续乐器(长号,中提琴等),结果是一样的 – Peter

+0

它与音量不同,但我想我看到这里发生了什么 - 说攻击= 0,衰减= 0没有给乐器有足够的时间达到最大音量播放音符。尝试没有a/d并使用更短的持续时间(例如JFugue中的第64个音符),看看是否有帮助。 –

0

MIDI对滑音幻灯片有滑音控制。尝试拨打controlChange(65,127)打开portametno控制,然后播放两个音符。 controlChange(5, xxx)应该改变音高滑动的速度。 controlChange(65,0)将关闭滑音。

0

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

(我对JFugue不熟悉。)