2010/12/07

JavaのMIDI音源

今のところMIDIはやらないのだが、Sound関係のソフトをいじっていたら気になったので、ここに記しておく。Windowsには標準でローランド製のMIDI音源が使えるようになっている。音は悪くはないのだが、よくもない。まぁ標準的なもの。そこで、Java純正のMIDI音源を試してみた。

Microsoft GS Wavetable SW Synth WindowsXP 標準MIDI音源 (Roland)
サウンドとオーディオ デバイスのプロパティ > オーディオタグ > MIDI音楽の再生 > バージョン情報ボタンから見ることができる。ちなみにgm.dlsというファイルにwavetableを持っている。このサイズは3361KB。場所はここ。C:\WINDOWS\system32\drivers\gm.dls

Java Sound Synthesizer JavaMIDI音源
Javaをインストールしても付いてないので、自分でインストールする必要がある。以下のサイトから直接ダウンロードする。
Downloads Java Sound API: Soundbanks(英語)
http://java.sun.com/products/java-media/sound/soundbanks.html

ダウンロードできる音源は3つあり、サイズが大きいほど高音質という。

soundbank-min.gm 483KB
soundbank-mid.gm 1128KB
soundbank-deluxe.gm 5018KB


インストール方法
上記ファイルをJavaがインストールされているフォルダに入れるだけ。3つ入れると大きいサイズを優先するようだ。気に入った音源をひとつだけ入れればOK。
C:\Program Files\Java\jre6\lib\audio\soundbank-min.gm

試したら、JMF(Java Media Framework)をインストールしているとJavaMIDI音源でMIDIを再生できないようだ。何か方法があるかもしれないが、JMFがなければ素直にJavaMIDI音源を利用できた。

さて、実際の音は・・・
リバーブの調整までできるJava音源に期待したのだが、ノイジーだったり、バランスが悪かったり・・・ 結果はRolandの方が上かもしれない。JavaMIDI音源用にしっかり作りこめば話は違うのかもしれないが、あまり期待できないという結果になった。min~deluxeの違いは意外と少なめで、小さい容量でそこそこ鳴るminはすごいかもしれない。またリバーブのかかり具合がdeluxeだけ違うが、ナチュラルさではdeluxeがひとつ上かな。Java音源全体に言えることだが、リバーブが邪魔しているようなので調整したほうがよさそう。

音はこんな感じ。

min


mid


deluxe


Windows標準(Roland)


上記サウンドはJavaの自作MIDIプレーヤーで再生した。ソースコードは以下の通り。手動でコメントアウトしながら、各MIDI音源を切り替えて録音した。GUIでちゃんと作ればいいのだけど、面倒だったので、中身だけという結果に。

import java.io.FileInputStream;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class MIDIdevices {
   static Sequencer sequencer;
   static MidiDevice sounddevice;

   public static void main(String[] args) throws Exception {
   try {
       mididevices();
       }
   finally {
       if (sequencer != null && sequencer.isOpen()) sequencer.close();
       }
    }
  static void mididevices() throws Exception {
       MidiDevice.Info[] info = MidiSystem.getMidiDeviceInfo();
             for (int i = 0; i < info.length; i++) {

    /* VSTi用 仮想MIDIケーブル */     
    //  if (info[i].getName().equals("Out To MIDI Yoke:  1") &&
    //  info[i].getDescription().equals("External MIDI Port"))

    /* Java音源 */             
        if (info[i].getName().equals("Java Sound Synthesizer") &&
        info[i].getDescription().equals
            ("Software wavetable synthesizer and receiver"))

    /* Windows標準音源 Roland */
    // if (info[i].getName().equals("Microsoft GS Wavetable SW Synth") &&
    // info[i].getDescription().equals("Internal software synthesizer"))
   {
     sounddevice = MidiSystem.getMidiDevice(info[i]);
     sounddevice.open();
    }
  }
     try {
         Sequencer sequencer = MidiSystem.getSequencer();
         if (sounddevice == null) throw new RuntimeException
                                       ("MIDI devices not found.");
         sequencer = (Sequencer)MidiSystem.getSequencer(false);
         sequencer.getTransmitter().setReceiver
                                  (sounddevice.getReceiver());
         sequencer.open();

         FileInputStream midisound = new FileInputStream("test.mid");
         Sequence music = MidiSystem.getSequence(midisound);
         sequencer.setSequence(music);
         sequencer.start();
     } catch (Exception e) {
         e.printStackTrace();
          }
     }
}


sound programming 目次はこちら