今日
修士で作った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();
}
}
}
この小さいプログラムではきちんと音色変更できるのだが,なぜか直しているプログラムでは音色変更されない.
コードをもうちょっときちんとトレースして,使いやすくするために書いたラッパクラスやメソッドなどを消していく必要有りか.