Почему java midi synth на mac перестает играть ноты - PullRequest
4 голосов
/ 13 октября 2011

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

Вот демонстрационное приложение, которое показывает проблему.Если вы удерживаете кнопку ввода в консоли, вы будете слышать заметку несколько раз.Через некоторое время (вероятно, менее чем через минуту) звук прекратится (если вы удерживаете кнопку нажатой), а затем вернется.

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;

public class TestMidi2 {

    public static void main( String[] args ) throws Exception {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();

        BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
        boolean on = true;
        while ( in.readLine() != null ) {
            if ( on ) {
                synth.getChannels()[0].noteOn( 45, 127 );
            } else {
                synth.getChannels()[0].noteOff( 45 );
            }
            on = !on;
        }
    }

}

Я на MacOS X lion, если это сделатьразница (что, я думаю, так и есть).

Есть идеи?Обходной путь?Я хотел бы попробовать другой программный синтезатор, но не смог найти ни одного.Я также готов попробовать аппаратный миди-синтезатор, если он умеет играть на основном пианино, флейте и гитаре (мне не нужно ничего профессионального, просто приличный звук).

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Это проблема льва.Я разрабатываю инструмент, который отправляет MIDI на разные порты и тестировал его на многих платформах.Java Sound Synthesizer работает хорошо для всех версий OS X, кроме Lion.Там, похоже, переполнен буфер синтезатора.После нескольких заметок он перестает играть, если я отправляю удар нот, он снова начинает работать и снова останавливается, ..

Однако, к сожалению, Java Sound Synthesizer - старая вещь, где, кажется, никто ее больше не поддерживает.

Кто-нибудь знает другие возможности воспроизведения MIDI-звуков через Java, кроме отправки их стороннему секвенсору?Было бы хорошо, если бы было что-то похожее на другую General MIDI Library.

Спасибо и greez!

0 голосов
/ 13 октября 2011

Ваша проблема не в миди, а в следующем:

while ( in.readLine() != null )

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

Попробуйте просто нажать Enter один раз и посмотреть, поддерживает ли это непрерывную ноту.

Я бы нашел лучший способ прочитать ключи в вашей программе. См. этот SO вопрос для возможного способа сделать это.

...