MidiSystem.getSequencer () возвращает аудиоустройство недоступно - PullRequest
2 голосов
/ 26 апреля 2010

Я получаю исключение, и так далее. Когда я пытаюсь создать новый объект Sequencer, я продолжаю получать исключение javax.sound.midi.MidiUnavailableException: Audio Device Unavailable. Итак, вот код:

import javax.sound.midi.*;

public class MiniMusicPlayer1
{
  public static void main(String[] args)
  {
    try
    {
      Sequencer sequencer = MidiSystem.getSequencer();
      sequencer.open();
      Sequence seq = new Sequence(Sequence.PPQ, 4);
      Track track = seq.createTrack();
      for (int i = 5; i < 61; i += 4)
      {
        track.add(makeEvent(144, 1, i, 100, i));
        track.add(makeEvent(128, 1, i, 100, (i+2)));
      }
      sequencer.setSequence(seq);
      sequencer.setTempoInBPM(220);
      sequencer.start();            
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick)
  {
    MidiEvent event = null;
    try
    {
      ShortMessage a = new ShortMessage();
      a.setMessage(comd, chan, one, two);
      event = new MidiEvent(a, tick);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return event;
  }
}

А вот полная ошибка (при компиляции):

javax.sound.midi.MidiUnavailableException: Audio Device Unavailable
    at com.sun.media.sound.MixerSynth.implOpen(MixerSynth.java:165)
    at com.sun.media.sound.AbstractMidiDevice.doOpen(AbstractMidiDevice.java:144)
    at com.sun.media.sound.AbstractMidiDevice.openInternal(AbstractMidiDevice.java:134)
    at com.sun.media.sound.AbstractMidiDevice.getReceiverReferenceCounting(AbstractMidiDevice.java:339)
    at javax.sound.midi.MidiSystem.getReceiver(MidiSystem.java:243)
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:442)
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348)
    at MiniMusicPlayer1.main(MiniMusicPlayer1.java:9)

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

Ответы [ 3 ]

1 голос
/ 14 сентября 2012

Я не буду пытаться объяснить ошибку, но я сделал следующее, чтобы решить мою проблему, похожую на вашу.

1.Установите проигрыватель робости

$ sudo apt-get install timidity

После установки выполните проигрыватель

$ aplaymidi -l

1    Port    Client name                      Port name
2    14:0    Midi Through                     Midi Through Port-0

в случаевышеприведенная команда не работает, возможно, вам придется перезагрузить компьютер

2.Завершение установки alsa-oss ALSA (Advanced Linux Sound Architecture)

$ sudo apt-get install alsa-oss

3.Выполните файл

$ aoss java MidiClassTest

Если вы используете Eclipse или другую IDE, которую вы можете использовать, например,

$ aoss eclipse

или используйте псевдоним

alias eclipse='aoss eclipse-indigo &'

1 голос
/ 26 апреля 2010

Проверьте список процессов, чтобы увидеть, есть ли какие-либо копии запущенной программы. Если это когда-то работало, шансы хороши, что строка:

sequencer.open();

терпит неудачу, потому что секвенсор уже был открыт для монопольного доступа другой программой. Возможно, эта «другая программа» является просто копией программы, над которой вы работаете, по какой-либо причине. Если это так, то программа для закрытия может быть одной из программ "Java". Похоже, вы уже экспериментировали с закрытием других миди-программ.

Кроме того, вы можете открывать «неправильное» MIDI-устройство.

Sequencer sequencer = MidiSystem.getSequencer();

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

MidiSystem.getMidiDeviceInfo()

и просматривайте возвращенные устройства, как показано в этом отрывке

// Obtain information about all the installed synthesizers.
Vector synthInfos;
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
    try {
        device = MidiSystem.getMidiDevice(infos[i]);
    } catch (MidiUnavailableException e) {
          // Handle or throw exception...
    }
    if (device instanceof Synthesizer) {
        synthInfos.add(infos[i]);
    }
}
// Now, display strings from synthInfos list in GUI.

, который объясняется более подробно на http://java.sun.com/docs/books/tutorial/sound/accessing-MIDI.html

0 голосов
/ 17 июля 2011

Мое предположение:

  1. В вашей системе нет аппаратного синтезатора (или, возможно, он есть, но драйвер звуковой карты его не распознает).
  2. Не удается открыть Java Sound Synthesizer, так как у вас не установлен звуковой банк
  3. Вы все еще можете получить несвязанный секвенсор с MidiSystem.getSequencer(false), хотя это будет не очень полезно.

Такие приложения, как робость, не будут затронуты, поскольку они выполняют собственный синтез программного обеспечения.

Может быть возможно использовать виртуальный MIDI-порт для игры через робость из Java.

...