[Diary/2012/May]

Swingのインタフェース作り / 2012-05-17 (木)

今日

昨日エンジンが出来た部分のインタフェース作り.
JComboBoxを使ってプルダウンで音色を変更できるようにした.
このシステムは一つのエンジンで,Swingで共通部分作って,それに貼付けるJPanelの内部はそれぞれProcessingやJoGL, Java3Dを使った,たくさんのインタフェースが用意されているんだが,
それに関する自分の設計が結構真っ当だったということを再確認.
設計だけして生きられればなぁ……

今回の実装にあたって,大体全部のJAVA内蔵シンセサイザの音色を聞いたけど,テストプログラムならわざわざ外に音源つながなくてもコレで充分だな.
まぁ外にシンセつないで駆動するのは,Java1.5から可能になったから,最近だけど.
以前は,Javaからシンセサイザのリストを表示はできたんだけど,外部接続のものは出来なかったんだよね.


[Diary/2012/May]

凡ミス発見 / 2012-05-16 (水)

今日

昨日に引き続き,修士で作ったJavaで書いた作曲支援システムのMIDIの音色変更の部分.

ミスの原因は,なぜかノートを0チャンネルではなく1チャンネルに書き込んでいたという.
だからいくら0チャンネルの音色を変更しても適用されなかっただけ.
いくら音色変更部分を見直しても分からなかった訳だ.
なんでこんな書き方をしたのか意味不明.


[Diary/2012/May]

Java内蔵シンセサイザMIDI音色変更 / 2012-05-15 (火)

今日

修士で作ったJavaで書いた作曲支援システムのMIDIの音色変更の部分.

基本は,SequenceクラスのインスタンスをSequencerクラスのインスタンスに食わせてJava内蔵シンセサイザの音をならす.

import javax.sound.midi.spi.*;
import javax.sound.midi.*;
public class HelloFile {
  public static void main(String[] args){
    try {

      //Sequenceの作成とトラックの生成
      Sequence sequence = new Sequence(Sequence.PPQ, 24);
      Track track = sequence.createTrack();

      //試しにならす音のChannel, NoteNumber, Velocity
      int channel = 0;
      int pitch = 48;
      int velocity = 127;

      //Instrument: GMの番号でよし
      int instrument = 6;

      //Set Tempo
      MetaMessage mmessage = new MetaMessage();
      int tempo = 20;
      int l = 60*1000000/tempo;
      mmessage.setMessage(0x51, 
                          new byte[]{(byte)(l/65536), (byte)(l%65536/256), (byte)(l%256)}, 
                          3);
      track.add(new MidiEvent(mmessage, 0));

      //set instrument
      ShortMessage message = new ShortMessage();
      message.setMessage(ShortMessage.PROGRAM_CHANGE, channel, instrument, 0);
      track.add(new MidiEvent(message, 0));

      // Note on
      message = new ShortMessage();
      message.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
      track.add(new MidiEvent(message, 0));
      // Note off after quater (24tick)
      message = new ShortMessage();
      message.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity);
      track.add(new MidiEvent(message, 24));

      // 再生してみる.
      //Sequencerのインスタンスを作成して,Sequenceを食わせる
      Sequencer sequencer = MidiSystem.getSequencer();
      sequencer.open();
      sequencer.setSequence(sequence);

      //Synthesizerを作成して,TransmitterとReceiverを接続する.
      Synthesizer synthesizer = MidiSystem.getSynthesizer();
      synthesizer.open();
      Receiver synthReceiver = synthesizer.getReceiver();
      Transmitter seqTransmitter = sequencer.getTransmitter();
      seqTransmitter.setReceiver(synthReceiver);

      sequencer.start();

      //write to file
      MidiSystem.write(sequence, 0,new java.io.File("hello.mid"));
     } catch(Exception e){
      e.printStackTrace();
    }
  }
}

この小さいプログラムではきちんと音色変更できるのだが,なぜか直しているプログラムでは音色変更されない.
コードをもうちょっときちんとトレースして,使いやすくするために書いたラッパクラスやメソッドなどを消していく必要有りか.