ページ更新: 2010-06-11 (金) (3875日前)
これらのキーワードがハイライトされています:#comment
関連: 規格/MIDI, Music/楽器, Music/楽器/YAMAHA WX, Music/楽器/AKAI EWI [編集]情報源 #[編集]sun #Java Sound API: What's new in version 1.4.2 Java Sound API: Java Sound Demo Java Sound API プログラマーズガイド (J2SE 1.5.0) JavaSound API Programmer's Guide (J2SE 1.5.0) Java Sound API プログラマーズガイド (J2SE 1.4) Java Sound Programmer Guide (J2SE 1.4.2) The Source for Developers Search Results ('MIDI')
他 #
試したサンプルコードのメモ #[編集]Java Sound Resources : MidiPlayer (2004-02-19) #Java Sound Resources より Examples > MIDI Playback and Recording > MidiPlayer
ソースコードと必要なjar
コンパイル C:> javac -classpath java-getopt-1.0.9.jar *.java 実行(オプション表示) C:> java -classpath java-getopt-1.0.9.jar;. MidiPlayer MidiPlayer: usage: java MidiPlayer -h gives help information java MidiPlayer -l lists available MIDI devices java MidiPlayer [-s] [-m] [-d <output device name>] [-c] [-S <sequencer name>] [-D] <midifile> -s plays on the default synthesizer -m plays on the MIDI port -d <output device name> outputs to named device (see '-l') -c dumps to the console -S <sequencer name> uses named sequencer (see '-l') -D enables debugging output All options may be used together. No option is equal to giving -s. 実行(デバイスリスト表示) C:> java -classpath java-getopt-1.0.9.jar;. MidiPlayer -l Available MIDI OUT Devices: 0 Java Sound Synthesizer 1 Java Sound Sequencer 2 Microsoft MIDI ?}?b?p?[ 3 Microsoft GS Wavetable SW Synth 4 YAMAHA USB OUT 0-1 5 YAMAHA USB OUT 0-2 6 YAMAHA USB OUT 0-3 7 YAMAHA USB OUT 0-4 8 YAMAHA USB OUT 0-5 9 YAMAHA USB OUT 0-6 10 YAMAHA USB OUT 0-7 11 YAMAHA USB OUT 0-8 12 YAMAHA USB OUT 0-9 13 YAMAHA USB OUT 0-10 14 YAMAHA USB OUT 0-11 15 YAMAHA USB OUT 0-12 16 YAMAHA USB OUT 0-13 17 YAMAHA USB OUT 0-14 18 YAMAHA USB OUT 0-15 19 YAMAHA USB OUT 0-16 デバイスを指定して実行 C:> java -classpath java-getopt-1.0.9.jar;. MidiPlayer -d "YAMAHA USB OUT 0-1" c:/windows/media/flourish.mid ここでなぜか内蔵ソフトシンセで再生されてしまう。しかも、Windowsのコントロールパネルで "YAMAHA USB OUT 0-1"を選んで、以下のようにデバイス指定なしでも同じ。 C:> java -classpath java-getopt-1.0.9.jar;. MidiPlayer c:/windows/media/flourish.mid[編集] MidiInDump (2010-06-11) #(2010-06-11) 今回は、以下のページのサンプルコードを用いた:
また、Getopt (コマンドライン引数の解析ライブラリ) のJava版が必要と書いてあったので、こちらから入手した:
次の環境を用いた
コンパイルや実行にはEclipse 3.5を使用しているが、このページではEclipseの説明はしない。 その代わりにコマンドラインでコンパイルと実行を行う手順を述べる。 コンパイル手順 (Javaのソースコードを3つと、Getoptライブラリを同一のディレクトリに置いておくこと): ★ダウンロードしたファイルを確認する。 C:> dir /b DumpReceiver.java java-getopt-1.0.13.jar MidiCommon.java MidiInDump.java ★コンパイルする。 C:> javac -cp java-getopt-1.0.13.jar *.java ★コンパイルして出来たファイルの一覧を確認する。 C:> dir /b *.class DumpReceiver.class MidiCommon.class MidiInDump.class 実行例(デバイス一覧を表示): C:> java -cp .;java-getopt-1.0.13.jar MidiInDump -l Available MIDI IN Devices: 0 MXPXT: Sync In - Out All 1 Port 1 on MXPXT 2 Port 2 on MXPXT 3 Port 3 on MXPXT 4 Port 4 on MXPXT 5 Port 5 on MXPXT 6 Port 6 on MXPXT 7 Port 7 on MXPXT 8 Port 8 on MXPXT 9 M-16DX 10 nanoKEY 11 nanoPAD 12 nanoKONTROL 13 2- A-PRO MIDI IN 14 2- A-PRO 1 15 2- A-PRO 2 33 Real Time Sequencer 実行例 (デバイスを名前で指定して、MIDI INで受信したデータを表示): C:> java -cp .;java-getopt-1.0.13.jar MidiInDump "Port 1 on MXPXT" MidiInDump.main(): device name: Port 1 on MXPXT now running; interupt the program with [ENTER] when finished timestamp 4784000 us: [B0 12 1B] channel 1: control change 18 value: 27 ★汎用操作子 3 (WX5 DIP SW: Lip+ = on) timestamp 4890000 us: [B0 12 19] channel 1: control change 18 value: 25 timestamp 5050000 us: [B0 12 1B] channel 1: control change 18 value: 27 timestamp 5065000 us: [B0 12 1E] channel 1: control change 18 value: 30 timestamp 5077000 us: [B0 12 23] channel 1: control change 18 value: 35 timestamp 5089000 us: [B0 12 26] channel 1: control change 18 value: 38 timestamp 5101000 us: [B0 12 28] channel 1: control change 18 value: 40 timestamp 5113000 us: [B0 12 2B] channel 1: control change 18 value: 43 timestamp 5126000 us: [B0 12 2D] channel 1: control change 18 value: 45 timestamp 5133000 us: [B0 02 13] channel 1: control change 2 value: 19 ★ブレス timestamp 5143000 us: [90 3D 1E] channel 1: note On C#4 velocity: 30 ★ノートオン timestamp 5145000 us: [B0 02 16] channel 1: control change 2 value: 22 timestamp 5145000 us: [B0 02 1A] channel 1: control change 2 value: 26 timestamp 5145000 us: [B0 12 2F] channel 1: control change 18 value: 47 timestamp 5147000 us: [B0 02 1E] channel 1: control change 2 value: 30 timestamp 5153000 us: [B0 02 25] channel 1: control change 2 value: 37 timestamp 5159000 us: [B0 02 2C] channel 1: control change 2 value: 44 timestamp 5165000 us: [B0 02 32] channel 1: control change 2 value: 50 timestamp 5171000 us: [B0 02 34] channel 1: control change 2 value: 52 timestamp 5177000 us: [B0 02 38] channel 1: control change 2 value: 56 : (略) timestamp 6469000 us: [E0 10 08] channel 1: pitch wheel change 1040 timestamp 6479000 us: [E0 0C 06] channel 1: pitch wheel change 780 timestamp 6489000 us: [E0 08 04] channel 1: pitch wheel change 520 timestamp 6499000 us: [E0 06 03] channel 1: pitch wheel change 390 timestamp 6509000 us: [E0 04 02] channel 1: pitch wheel change 260 timestamp 6519000 us: [E0 02 01] channel 1: pitch wheel change 130 timestamp 6529000 us: [E0 00 00] channel 1: pitch wheel change 0 Received 0 sysex messages with a total of 0 bytes ★ENTER を押すと終了する Received 173 short messages with a total of 519 bytes Received a total of 519 bytes[編集] ブレス (CC#2) をバーで表示してみた #(2010-06-11) (for: Music/楽器/YAMAHA WX, Music/楽器/AKAI EWI, VL70-m + BC-3) DumpReceiver を改造して、ブレス (CC#2) をバーで表示してみた。こんな感じ: MidiInDump.main(): device name: Port 1 on MXPXT now running; interupt the program with [ENTER] when finished 81 : ***************:***************:******** : | 改造個所は DumpReceiver.java の DumpReceiver クラスのみ。 send メソッドを以下のように書き換える(まるごと置き換える): public void send(final MidiMessage message, final long lTimeStamp) { if (message instanceof ShortMessage) { final ShortMessage s = (ShortMessage) message; if ((s.getCommand() == 0xb0) && (s.getData1() == 2)) { // CC#2 なら値とバーを表示 (0xb0 = コントロールチェンジ, 2 = ブレス) final int value = s.getData2(); final int bar = value / 2; // 0-127 を 0-63 にする (画面からはみ出ないようにする) m_printStream.printf("%3d : %s\r", value, makeBar(64, bar)); } } } さらに、以下の makeBar メソッドを追加する: /** * 値を示すバー(1/4ごとに目盛つき)を作成する * @param max 値の最大値 * @param value 値 (0 <= value < max) * @return バーの文字列 */ String makeBar(final int max, final int value) { final int notch = max / 4; final StringBuffer sb = new StringBuffer(); for (int i = 0; i < max - 1; i++) { final char ch; if (i % notch == notch - 1) ch = ':'; // 目盛 else if (i < value) ch = '*'; // value未満ならバーの印 else ch = ' '; // 残りは空白 sb.append(ch); } sb.append("|"); // 上限 return sb.toString(); } コンパイルする: C:> javac -cp java-getopt-1.0.13.jar *.java 実行し、MIDI-INに繋いだ WX5 を演奏すると、CC#2の値とバーが表示される: C:> java -cp .;java-getopt-1.0.13.jar MidiInDump -d "Port 1 on MXPXT" MidiInDump.main(): device name: Port 1 on MXPXT now running; interupt the program with [ENTER] when finished 81 : ***************:***************:******** : | 動作を確認できたら、以下のようなバッチファイルを作って、さらにバッチファイルのショートカットをデスクトップなどに置いておくと、簡単に実行できる: MidiInDump.cmd @java -cp .;java-getopt-1.0.13.jar MidiInDump -d "Port 1 on MXPXT"[編集] コメント #→コメント/Javaに移動 |