Жопа кота

Регулировка громкости звука midi в Java

Регулировка звука MIDI файлов JAVA я устал искать информацию вот краткая выжимка. Звук можно регулировать но не сильно не знаю почему значение 0 игнорируется.

И так
Sequencer это само устройства которое воспроизводит миди у него есть славные методы start и stop, беда в том что он не умеет регулировать звук

Sequence это последовательность миди данных в него мы пихаем наш миди файл а его засовываем в Sequencer, Sequence тоже не умеет менять звук.

Звук умеет менять синтезатор Synthesizer как достать синтизатор из сквенсера я не понял по этому я решил делать новый синтезатор и подключать его к сквенсору. И так как код изобилует try cath приведу его тут так

Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();

Получаем и открываем сквенсер

InputStream resource = Main.class.getResourceAsStream("Test.mid");

получаем инпутстрим на наш миди файл, у меня это написано так, потому что я собираю все Jar.

Sequence sequence = MidiSystem.getSequence(resource);

Засовываем инпутстрим куда вставлена миди в  sequence

Получим синтезатор и откроем его

Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();

Теперь возьмем передатчик сквенсера изменим ему приемник на приемник синтезатора

sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());

теперь засунем нашу мелодию в сквенсер

sequencer.setSequence(sequence)

Теперь получим каналы нашего синтезатора

MidiChannel[] channels = synthesizer.getChannels();

Поменяем на нем громкость в цикле на 60, в спеке говориться что диапазон значений от 0 до 120 и что за звук отвечает 7 канал

int volume = 60;
for (int i = 0; i < channels.length; i++) {
     channels[i].controlChange(7, volume);
}

Скажу сразу геморрой пройдет только от части, да значения звука будут меняться но не до конца очень тихо или громко сделать не получиться, слегка изменить уровень звука. Если есть знатоки миди то прошу оставить комментарий как можно нормально регулировать громкость миди.

full code

Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
InputStream resource = Main.class.getResourceAsStream("Test.mid");
Sequence sequence = MidiSystem.getSequence(resource);
Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());
sequencer.setSequence(sequence)
MidiChannel[] channels = synthesizer.getChannels();
int volume = 60;
for (int i = 0; i < channels.length; i++) {
     channels[i].controlChange(7, volume);
}
sequencer.start();
Поделиться
Отправить
 124   2023   java   midi   sequencer   громкость
Популярное