ページ更新: 2010-06-11 (金) (3142日前)

関連: 規格/MIDI, Music/楽器, Music/楽器/YAMAHA WX, Music/楽器/AKAI EWI

[編集]

情報源 #

[編集]

sun #

Java Sound API

Frequently Asked Questions

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 Plug-in 1.4 開発者ガイド

Java Sound Programmer Guide (J2SE 1.4.2)

javax.sound.midi (J2SE 1.4.0)

The Source for Developers Search Results ('MIDI')

  • MIDI 関連の BugID を検索。
[編集]

#

Java Sound Resources

MIDI programming with Java

Java sound FAQ

[編集]

試したサンプルコードのメモ #

[編集]

Java Sound Resources : MidiPlayer (2004-02-19) #

Java Sound Resources より Examples > MIDI Playback and Recording > MidiPlayer

  • 試してみたけど、外部のMIDI音源で再生できない。PCのソフトシンセが鳴ってしまう。
  • 常に 'Java Sound Sequencer' を使用してしまうのが原因。
  • コレのようだ。
    bug id: 4783745 Sequencer cannot access external MIDI devices
  • 情報源は JAVAPRESS vol.34 の「Magazine Cafe International - Javaユーザのための海外誌評 第22回」の Javaで音楽 - JAVA DEVELOPER'S JOURNAL (November 2003, Valume 8, Issue 11) - 'MIDI WITH JAVA'。
    • シーケンサクラスがソフトシンセサイザしか利用できない (Sun BugID 4783745)
    • タイミング生成が劣る (Sun BugID 4773012)
    • よって、自前でシーケンサクラスを作る、と言う記事、の紹介

ソースコードと必要なjar

  • MidiPlayer.java
  • DumpReceiver.java
  • MidiCommon.java
  • java-getopt-1.0.9.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版が必要と書いてあったので、こちらから入手した:

次の環境を用いた

  • Java: Java SE 6.0 update 20 JDK (Java SE Downloads)、
  • OS: Windows 7 Professional 64bit
  • MIDIインターフェイス: MOTU MIDI Express XT USB,

コンパイルや実行には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に移動