主な質問を明示的に述べるところから始めます: Java シンセサイザーを使用して Java シーケンサーに記録するときに、正しいマイクロ秒の位置で ShortMessages からの正しい「ティック」で midi イベントを作成する正しい方法は何ですか?
私は数日間これを理解しようとしてきました。私の小さな MIDI プログラムは非常にシンプルです。少なくともそうあるべきです。ピアノのレイアウトと 3 つのボタンがあります。シンセサイザーを使用するピアノは素晴らしい作品です。マウスまたはコンピューターのキーボードでノートを再生できます。
Oracle Docs の指示を前後に (そして多くのフォーラム スレッドを) 読みましたが、明らかに何かが欠けています。
現在、ShortMessage、MidiEvent を手動で作成し、それらをシーケンサーに送信する/トラックに追加することで、シーケンサーに録音させることができますが、一度しか録音できません。プレイバックも通常は間違ったタイミングで再生します。これらを実行するコードは次のとおりです (追加のコードまたはすべてのコードを投稿する場合はお知らせください)。
記録/停止/ボタンをクリックしたときに何が起こるかのコード:
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "Record")
{
mySeq.deleteTrack(track);
track = mySeq.createTrack();
try {
seq.setSequence(mySeq);
} catch (InvalidMidiDataException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
seq.recordEnable(track, ChannelNum);
seq.startRecording();
}
else if(e.getActionCommand() == "Stop")
{
seq.stop();
}
else if(e.getActionCommand() == "Play")
{
mySeq.deleteTrack(track);
track = mySeq.createTrack();
addEvents(track);
seq.setTickPosition(10);
seq.start();
}
}
これは、ユーザーがピアノで音符を弾くときのコードです。
// The Mouse presses a key, the note on the channel is turned on
// A MidiEvent and ShortMessage are created using the CreateOnEvent method
public void mousePressed (MouseEvent e) {
Key key = (Key) e.getSource ();
channel.noteOn (key.getNote (), 127);
CreateOnEvent(key);
}
public void mouseReleased (MouseEvent e) {
Key key = (Key) e.getSource ();
channel.noteOff (key.getNote ());
CreateOffEvent(key);
}
public void mouseClicked (MouseEvent e) { }
public void mouseEntered (MouseEvent e) { }
public void mouseExited (MouseEvent e) { }
最後に、CreateOnEvent メソッドを次に示します。
// I originally was sending the events directly to the sequencer
// but here I'm adding the events to an ArrayList of MidiEvents to attempt a work around
// I can then add those events to a track to play them
public void CreateOnEvent(Key key)
{
if(seq.isRecording())
{
ShortMessage myMsg = new ShortMessage();
try {
myMsg.setMessage(ShortMessage.NOTE_ON, ChannelNum, key.getNote(), 127);
} catch (InvalidMidiDataException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
long timeStamp = synth.getMicrosecondPosition();
long tick = seq.getTickPosition();
event = new MidiEvent(myMsg, tick);
seqReceiver.send(myMsg, timeStamp);
Events.add(event);
}
}