2010-01-10 6 views
1

Я работаю с midi, используя API-интерфейс Java. В основном я пытаюсь добиться эффекта портаменто, где я могу скользить между различными нотами. Самое близкое, что я получил, это использовать метод setPitchBend() в MidiChannel. Тем не менее, это позволяет только диапазон из двух полутонов из примечания, которое я начал. Есть ли другой способ достичь этого эффекта портаменто или, возможно, изменить диапазон изгиба тона?Как постоянно менять высоту звука Java?

Если есть способ сделать это в JFugue, это также будет приемлемым.

ответ

0

Просто угадайте - можете ли вы разыграть две ноты последовательных смол и вытереть один, когда вы выцветете другого?

+0

Я попробовал эту технику, и тестируем с различными значениями, но это просто не то же самое. Две ноты слишком далеко друг от друга. Чтобы правильно имитировать постепенное изменение высоты тона, необходимы микротональные заметки, которые API-интерфейс Java не поддерживает. – Peter

0

Это может быть устаревшим - это почти два десятилетия с тех пор, как я сдался на MIDI и переключился на безрезультатный бас, - но для более длинных слайдов вам приходилось играть одну ноту, сгибать ее шаг до половины пути следующее примечание, затем сыграйте следующую заметку, нагнутую на полпути вниз, чтобы они встретились на одном и том же поле, а затем повторили процесс.

1

JFugue поддерживает микротоны. (Он делает это через API JavaSound в сочетании с большим количеством математики)

Может ли он сделать именно то, что вы ищете, это другой вопрос. Я считаю, что проблема, с которой вы столкнетесь, заключается в том, что каждая новая заметка, которую вы играете, будет звучать как новая нота, в отличие от связки заметок, связанных друг с другом. Это было бы особенно заметно, если нота имеет значение атаки и распада, отличное от 0, или если инструмент имеет по-разному разные звуки в начале и конце примечания.

В JFugue, вы можете установить атаку и затухание ноты, добавив «A» и «D», а затем значение от 0-128, после примечания: C5wa0d0 - C-нота, пятая октава, всю продолжительность, атака = 0, распад = 0.

Микрофонный помощник, как записано в настоящее время, позволяет определить одну частоту для строки; например, вы можете сопоставить 400 с «A400». Затем, чтобы использовать это, вы скажете player.play("[A400]w") (обратите внимание на скобки).

Один из способов получить то, что вы ищете, - это определить частоты и строки для любого количества микротонов, которые вы хотите, а затем создать шаблон с использованием цикла for ... Pattern p = new Pattern("[A400]wa0d0 [A410]wa0d0 [A420]wa0d0"...); Возможно, вы можете использовать шаг больше 1 Герца для каждая нота, потому что наши уши не могут отличить такие незначительные различия в частоте.

Если бы было только более элегантное решение! Но посмотрите, поможет ли это.

+0

Спасибо, это звучит как правильный способ сделать это.Однако по какой-то причине кажется, что скорость атаки является синонимом объема. a0 вообще не слышно, a5 едва слышна и так далее. Я пробовал с несколькими различными непрерывными инструментами (тромбон, альт и т. Д.), И результаты одинаковы – Peter

+0

Это отличается от объема, но я думаю, что вижу, что здесь происходит - говоря, что атака = 0, decay = 0 не дает инструмент достаточно времени, чтобы достигнуть максимального объема, чтобы воспроизвести заметку. Попробуйте это без а/d и используйте более короткие длительности (например, 64-й ноты - 's' в JFugue) и посмотрите, поможет ли это. –

0

MIDI имеет управление портаменто для слайдов. Попробуйте позвонить controlChange(65,127), чтобы включить portametno, а затем сыграть две ноты. controlChange(5, xxx) должен изменить скорость ползуна. controlChange(65,0) отключит портаменто.

0

Управление поворотом высоты тона просто определяет диапазон; то, как его интерпретировать, зависит от принимающей стороны (например, синтезатора). Если принимающий конец поддерживает два полутона, то два полутона - это то, что вы получаете - если только он не может быть переконфигурирован! На большинстве синтезаторов вы можете перенастроить диапазон изменения высоты тона; Каково ваше целевое устройство?

(я не знаком с JFugue.)