2010-01-10 70 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不熟悉。)