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でちゃんと作ればいいのだけど、面倒だったので、中身だけという結果に。
sound programming 目次はこちら
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 目次はこちら