English

MDPW for Java

インストール

音の定義

音列の定義

和音の定義

曲を作る

ビジター


ダウンロード
mdpw30.zip

戻る

インストール

アーカイブmdpw30.zipをダウンロードして解凍すると mdpw.jarファイルが現れます。それを貴方のシステムのJava環境にくわえて下さい。 この製品は内容的にJavaプログラマー向けなのでこの説明で分って頂きたいところですが 大体以下の3つの方法があります。
  • java, javac コマンド実行時にクラスパス引数で指定する。
  • CLASSPATH環境変数にアーカイブの場所をくわえる。
  • jre/lib/extフォルダにmdpw.jarを置く

ページの先頭| 次のステップへ

音の定義

まずは音が一つなるだけの例です。 これでplayerクラスの使い方が分って頂けると思います。 またDataNoteの引数ですが ピッチ(高さ:0-127), デュレーション(長さ:正のdouble), ベロシティ(強さ:0 - 127), プログラムナンバー(音色:0 - 127, 129) の順に指定します。
import com.cwbp.mdpw.*;
public class tNote {
  public static void main(String[] a){
    // player クラスを作る
    Player p = new MIDIFilePlayer();
    // 出力ファイル名を設定
    p.init("tNote.mid");
    // テンポの設定
    p.setTempo(120);
    // 一音のみ生成し演奏
    p.play(new DataNote(60, 1, 64, 1));
    // ファイルへの書き出し実行
    p.end();
  }
}

ページの先頭| 次のステップへ

音列の定義

音列とは時間的に連続して鳴る一連の音の事です。 以下のように音列オブジェクトに音をくわえる事により、実現可能です。 ドレミと音がするはずです。 DataNoteで引数が足りない場合は前の音の値を用います。
import com.cwbp.mdpw.*;
public class tSeq {
  public static void main(String[] a){
    Player p = new MIDIFilePlayer();
    // 音列インスタンスの生成
    DataSequence s = new DataSequence();
    // 音列に音を加える
    s.addElement(new DataNote(60, 1, 64, 0));//ド
    s.addElement(new DataNote(62, 1));       //レ
    s.addElement(new DataNote(64, 1));       //ミ
    // 以下ファイルに書き出し
    p.init("tSeq.mid");
    p.setTempo(120);
    p.play(s);
    p.end();
  }
}

ページの先頭| 次のステップへ

和音の定義

和音は以下のように和音オブジェクトに音をくわえる事により、実現可能です。 ドミソの和音の例です。 やはりDataNoteで引数が足りない場合は前の音の値を用います。
import com.cwbp.mdpw.*;
public class tChord {
  public static void main(String[] a){
    Player p = new MIDIFilePlayer();
    DataChord c = new DataChord();
    c.addElement(new DataNote(60, 1, 64, 0));//ド
    c.addElement(new DataNote(64, 1));       //ミ
    c.addElement(new DataNote(67, 1));       //ソ
    p.init("tChord.mid");
    p.setTempo(120);
    p.play(c);
    p.end();
  }
}

ページの先頭| 次のステップへ

曲を作る

音列と和音で曲を作ります。 自由に入れ子に出来るので和音の列を始め何段でもリスト構造を作る事が出来ます。 ついでにplayerでplayを複数呼び出すと連続して演奏される事も使ってみました。 「チューリップ」最初の2小節です。
import com.cwbp.mdpw.*;
public class tSample {
  public static void main(String[] a){
    Player p = new MIDIFilePlayer();
    DataChord c = new DataChord();           //コード:C
    c.addElement(new DataNote(60, 2, 64, 0));
    c.addElement(new DataNote(64, 2));
    c.addElement(new DataNote(67, 2));
    DataSequence b = new DataSequence();     //伴奏
    b.addElement(c);
    b.addElement(c);
    DataSequence s = new DataSequence();     //メロディー
    s.addElement(new DataNote(60, 1, 80, 0));
    s.addElement(new DataNote(62, 1));
    s.addElement(new DataNote(64, 1));
    s.addElement(new DataNote(64, 1, 0));    //休符
    DataChord m = new DataChord();           //1フレーズ
    m.addElement(s);
    m.addElement(b);
    p.init("tSample.mid");
    p.setTempo(120);
    p.play(m);                              //2回繰り返し
    p.play(m);
    p.end();
  }
}

ページの先頭| 次のステップへ

Visitor

Visitorとは音(Note)への処理のみを記述すれば、列(Sequence)や和音(Chord)中に含まれる音に対する処理がなされるというものです。 その処理はproccess(DataNote n, double t)中でなされます。第一引数は処理対象となる音で第二引数はその音の出現するタイミングが入ります。 例は音列に対して音がだんだん大きくなる処理を記述しています。
import com.cwbp.mdpw.*;
public class tVisitorCrescendo implements Visitor {
	double duration;
	int startVelocity;
	int endVelocity;
	public tVisitorCrescendo(double d, int s, int e){
	  duration = d;
	  startVelocity = s;
	  endVelocity = e;
	}
   public void process(DataNote n, double t){
   	  n.setVelocity((int)((endVelocity-startVelocity)*t/duration+startVelocity));
   	  System.out.println("tVisitorCrescendo:"+n.getVelocity());
   }

  public static void main(String[] a){
    Player p = new MIDIFilePlayer();
    DataSequence s = new DataSequence();
    s.addElement(new DataNote(60, 2, 32, 0));
    s.addElement(new DataNote(62));
    s.addElement(new DataNote(64));
    s.addElement(new DataNote(65));
  	tVisitorCrescendo v = new tVisitorCrescendo(s.getDuration(), 16, 89);
  	s.visit(v);
  	
    p.init("tVisitor.mid");
    p.setTempo(120);
    p.play(s);
    p.end();
  }
}
後は貴方のアイデア次第で、音楽プログラミングをお楽しみ下さい。
ページの先頭