Отрегулируйте громкость ноты MIDI - PullRequest
0 голосов
/ 06 октября 2010

[Я делаю эту работу на Java, но думаю, что вопрос не зависит от языка.]

У меня есть громкость MIDI Note On (называемая «data2», это 0-127), которую я настраиваю с помощью фейдера (от 0 до 127). «Математика», которую я использую, проста:

newData2 = oldData2 * faderVolume / 127;

Ноль работает отлично, а 127 тоже, , но громкости, близкие к нижней части диапазона, слишком громкие, особенно громкие ноты. Какими могут быть отношения, отличные от линейных (в псевдокоде было бы замечательно)? Мне придется вставить их в код и, конечно, попробовать.

Я понимаю, что этот вопрос зависит от инструмента, на котором играют ноты (набор BFD в Ableton Live, который мало что дает), но, возможно, нет, и, возможно, есть стандартный способ регулировки громкости Midi Note On с фейдером.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

Ваше уравнение верное. Вы вычисляете скорость ноты относительно фейдера линейным способом. Пара записок ...

Параметр, который вы настраиваете, это скорость. Это не обязательно означает объем! У этих двух есть корреляция для большинства синтезаторов (включая вашу ударную установку в Ableton), но это может быть не так сильно, как вы думаете.

0-скорость эквивалентна записке и никогда не будет воспроизводить звук. Я говорю это потому, что, если разница между 0 и 1 значительна, возможно, объем не будет зависеть от параметра скорости так, как вы думаете.

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

Существует MIDI-сообщение для громкости канала, которое вы должны использовать для громкости, и это CC 7.

1 голос
/ 06 октября 2010

Как я уже сказал в своем комментарии, при воспроизведении со звуком, звуком или любыми слышимыми технологиями лучше использовать двойные или плавающие числа (в зависимости от характеристик оборудования или API).

Вы возвращаете целое число на newData2. Скорее конвертируйте его в double или float (для точности).

, например

float newData2 = (float)oldData2 * (float)faderVolume / (float)127;

Надеюсь, это поможет.

...