8

Java で MIDI ファイルを再生するのに問題があります。私が得たのは、MidiUnavailableException (MIDI OUT transmitter not available)再生しようとしたときです。私のコードは標準です:

try {
    midiseq = MidiSystem.getSequencer();
    midiseq.open();
    midiseq.setSequence(MidiSystem.getSequence(sound1));
    midiseq.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
    midiseq.start();
} catch (Exception e) {e.printStackTrace();}

midiseqですSequencersound1ですInputStream

このコードは他のいくつかのコンピューターで動作し、コマンド プロンプトから起動したときだけでなく、Eclipse でも動作し、JAR ファイルで使用した場合でも動作します。より安定した Java midi アプリケーションをダウンロードしましたが、同じ例外がスローされました。

Eclipse は問題なく実行できるため、ハードウェアの問題ではありません。また、他のコンピューターで正しく実行されるため、コーディングの問題でもありません。この 1 行のコードでも、次の例外がスローされます。

javax.sound.midi.MidiSystem.getSequencer();

前もって感謝します。

編集: 私のオペレーティング システムは Windows Vista です。この質問をする前に、最新の JRE と JDK (1.6.0_13 だと思います) をダウンロードしました。

編集:コード:

ClassLoader.getSystemClassLoader().loadClass("com.sun.media.sound.RealTimeSequencer");
System.out.println( "Sequencer class loaded" );// Otherwise ClassNotFoundException

「シーケンサークラスがロードされました」と出力します。

しかし、このコード:

  try{
        System.out.println(javax.sound.midi.MidiSystem.getSequencer());
        System.exit(0);
      } catch(Exception e) {
        throw new RuntimeException(e);
      }
      System.exit(1);

を投げるMidiUnavailableException.

また、このコード:

    MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
    if (devices.length == 0) {
        System.out.println("No MIDI devices found");
    } else {
        for (MidiDevice.Info dev : devices) {
            System.out.println(dev);
        }
    }

私にこれを与える:

    マイクロソフト MIDI マッパー
    Microsoft GS ウェーブテーブル シンセ
    リアルタイム シーケンサー
    Java サウンド シンセサイザー
4

9 に答える 9

4

まず、システムの機能を見てください。

MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
if (devices.length == 0) {
    System.out.println("No MIDI devices found");
} else {
    for (MidiDevice.Info dev : devices) {
        System.out.println(dev);
    }
}

そこに何もない場合は、サウンドバンクをインストールして、 jvmがソフトウェア シーケンサーを作成できるようにする必要がある場合があります。

また、MidiSystem.getReceiver() の出力も確認してください。レシーバーを作成できない場合は、恐ろしい MidiUnavailableException も発生します ( MidiSystem javadoc )。

サウンドバンク ファイルをインストールすると、jvm がシンセサイザー レシーバーにフォールバックする機会が与えられ、ハードウェアへのアクセスが不要になると思います (これは失敗するようです:)

于 2009-04-19T08:04:26.147 に答える
2

許可と関係がある可能性はありますか?単純なコマンドライン プログラムとは異なる (より特権のある) ユーザーとして JAR ファイルを実行している場合、それが違いを説明している可能性があります。そうでない場合は、おそらく Java システム プロパティの一部です...同じコードを JAR ファイルとして実行するか、個々の .class ファイルとして実行するかで違いが生じるものは他に考えられません。

質問を編集して、プログラムを実行してきたさまざまな方法に関する詳細を提供すると役立つ場合があります。

于 2009-04-18T04:59:51.667 に答える
2

JMF2.1.1e をインストールしたら、JMF ディレクトリだけでなく、jre および jdk ディレクトリにもインストールされているすべての sound.jar ファイルを削除します。

http://www.coderanch.com/t/274513/java/java/javax-sound-midi-compatibility-JMF言います:

問題はファイル sound.jar です。3 か所で見つけて削除します。

C:\Program Files\JMF2.1.1e\lib\sound.jar

C:\Program Files\Java\jdk1.6.0_07\jre\lib\ext\sound.jar

C:\Program Files\Java\jre1.6.0_07\lib\ext\sound.jar

また、PATH および CLASSPATH から sound.jar 参照を削除します。これは、新しいバージョンの Java で新しいサウンド API を台無しにする古い sound.jar です。

于 2010-11-06T12:43:33.883 に答える
1

オペレーティングシステムとJavaバージョンを追加できますか?

そして、例外を投稿します。Javaは一般的に、何が悪いのかを言って公正な仕事をします。理解するのは必ずしも簡単ではありません:)

java 1.5.0_16を搭載したMacでは、(コマンドラインで)例外は発生しません。

次のプログラム

public class MidiTester {

    public static void main(String[] args) {
      try{
        System.out.println(javax.sound.midi.MidiSystem.getSequencer());
        System.exit(0);
      } catch(Exception e) {
        throw new RuntimeException(e);
      }
      System.exit(1);
    }
}

プリント

com.sun.media.sound.RealTimeSequencer@d08633

クラスパスにシーケンサークラスがあるかどうかを確認できます。

ClassLoader.getSystemClassLoader().loadClass("com.sun.media.sound.RealTimeSequencer");
System.out.println( "Sequencer class loaded" );// Otherwise ClassNotFoundException

これにより、少なくとも(PATHを介してアクセスされるJavaに)クラスがないかどうか、またはアクセス許可の問題のように別のクラスがあるかどうかが明確になります。

于 2009-04-18T12:29:56.873 に答える
1

同じ問題が見つかりました: MIDI を再生できません。しかし、JDK を 1.6.0_10 から 1.6.0_13 にアップグレードしたときに問題が発生したことに気付きました。

簡単なプログラムで両方のJDKをテストしました:

パブリック クラス MidiTester {

public static void main(String[] args) {
  try{
    System.out.println(javax.sound.midi.MidiSystem.getSequencer());
    System.exit(0);
  } catch(Exception e) {
    throw new RuntimeException(e);
  }
  System.exit(1);
}

}

JDK 1.6.0_10 の結果: com.sun.media.sound.RealTimeSequencer@1bd747

JDK 1.6.0_13 の結果: Exception in thread "main" java.lang.RuntimeException: javax.sound.midi.MidiUnavailableException: ivan.seaquest.MidiTester.main(MidiTester.java:10) で MIDI OUT 送信機を使用できません: javax.sound.midi.MidiUnavailableException: com.sun.media.sound.AbstractMidiDevice.createTransmitter(AbstractMidiDevice.java:444) で com.sun.media.sound.AbstractMidiDevice.getTransmitter(AbstractMidiDevice.java: 299) javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:451) で javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348) で ivan.seaquest.MidiTester.main(MidiTester.java:7) で)

Sun でバグを作成します。それが役立つことを願っています...

于 2009-05-19T03:48:15.283 に答える
1

エクスプローラーで JRE フォルダー (プログラムの実行に使用している $PATH の bin フォルダーの上にあるフォルダー) を指定します (例: "C:\Program Files\Java\jre1.6.0")。

\lib フォルダーに移動します。「オーディオ」というフォルダが表示されますか? それには何か入っていますか?そうでない場合は、http://java.sun.com/products/java-media/sound/soundbanks.htmlにアクセスしてください。

説明に従って MIDI バンクのいずれかをダウンロードし、上記のフォルダーにコピーします。それが機能するかどうかをお知らせください!

于 2009-04-24T13:10:47.290 に答える
1

私は同じ問題を抱えていました。エラーは、クラスパスに含まれる JMF が原因でした。

于 2010-07-05T21:28:04.687 に答える