2

何度も何度も例外がスローされ続けています。新しいシーケンサ オブジェクトを作成しようとすると、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)

最初は PC で MIDI ファイルを再生できませんでしたが、その後動作するようになったので、MIDI ファイルを再生できるようになりました。サウンドカードを使用するすべてのプロセスを閉じようとしましたが、エラーはまだ残っています。誰でも私を助けることができますか?

4

3 に答える 3

1

プロセス リストをチェックして、実行中のプログラムのコピーがあるかどうかを確認します。かつて機能していた場合は、次の行である可能性が高くなります。

sequencer.open();

シーケンサーが別のプログラムによって排他アクセス用に既に開かれているため、失敗しています。おそらく、その「他のプログラム」は、何らかの理由で実行中のプログラムの単なるコピーです。その場合、シャットダウンするプログラムは「java」プログラムの 1 つかもしれません。他の midi プログラムをシャットダウンする実験を既に行っているようですね。

また、「間違った」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で詳しく説明されています。

于 2010-04-26T19:31:15.177 に答える
1

エラーを説明しようとするつもりはありませんが、あなたの問題に似た問題を解決するために次のことを行いました。

1. timidity プレーヤーをインストールする

$ 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 &'

于 2012-09-14T18:24:32.887 に答える
0

私の推測は:

  1. システムにハードウェアシンセサイザーがありません(または、ハードウェアシンセサイザーはありますが、サウンドカードドライバーが認識しません)。
  2. サウンドバンクがインストールされていないため、Javaサウンドシンセサイザーを開くことができません
  3. 接続されていないシーケンサーを入手することはできますがMidiSystem.getSequencer(false)、それはあまり役に立ちません。

臆病などのアプリケーションは、独自のソフトウェア合成を実行するため、影響を受けません。

仮想MIDIポートを使用して、Javaからの臆病さを再生できる場合があります。

于 2011-07-17T12:37:19.787 に答える