Как непрерывно менять высоту тона в звуке Java?

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

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


person Peter    schedule 10.01.2010    source источник


Ответы (5)


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

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

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

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

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

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

person David Koelle    schedule 12.01.2010
comment
Спасибо, это звучит как правильный способ сделать это. Однако почему-то кажется, что скорость атаки — это синоним громкости. а0 вообще не слышно, а5 еле слышно и так далее. Я пробовал с несколькими разными непрерывными инструментами (тромбон, альт и т. д.), и результаты были одинаковыми. - person Peter; 13.01.2010
comment
Это отличается от громкости, но я думаю, что понимаю, что здесь происходит - говоря, что атака = 0, затухание = 0 не дает инструменту достаточно времени для достижения максимальной громкости для воспроизведения ноты. Попробуйте без a/d и используйте более короткие длительности (например, 64-е ноты — «s» в JFugue) и посмотрите, поможет ли это. - person David Koelle; 13.01.2010

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

person Geoff Reedy    schedule 21.01.2010

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

person Warpin    schedule 10.01.2010
comment
Я пробовал эту технику и тестировал с разными значениями, но это не то же самое. Две ноты слишком далеко друг от друга. Чтобы правильно имитировать постепенное изменение высоты тона, необходимы микротональные ноты, которые API звука Java не поддерживает. - person Peter; 10.01.2010

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

person Pete Kirkham    schedule 10.01.2010

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

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

person volley    schedule 14.03.2011