JavaMIDI-如何从JavaSynth到JavaSequencer创建Midi事件/记录?

JavaMIDI-如何从JavaSynth到JavaSequencer创建Midi事件/记录?,java,midi,Java,Midi,首先,我将明确说明我的主要问题:当使用Java合成器向Java sequencer录制时,从具有正确微秒位置的短消息中创建具有正确“滴答声”的midi事件的正确方法是什么 这几天我一直在想办法。我的midi小程序非常简单,或者至少应该很简单。有一个钢琴布局和三个按钮。使用合成器的钢琴效果很好;你可以用鼠标或电脑键盘弹奏音符 我已经前后阅读了Oracle文档说明(以及许多论坛帖子),但显然我遗漏了一些东西 目前,我可以通过手动创建一条短消息、一个MidiEvent并将它们发送到sequencer/

首先,我将明确说明我的主要问题:当使用Java合成器向Java sequencer录制时,从具有正确微秒位置的短消息中创建具有正确“滴答声”的midi事件的正确方法是什么

这几天我一直在想办法。我的midi小程序非常简单,或者至少应该很简单。有一个钢琴布局和三个按钮。使用合成器的钢琴效果很好;你可以用鼠标或电脑键盘弹奏音符

我已经前后阅读了Oracle文档说明(以及许多论坛帖子),但显然我遗漏了一些东西

目前,我可以通过手动创建一条短消息、一个MidiEvent并将它们发送到sequencer/将它们添加到曲目中,让sequencer进行录制,但它只录制一次。回放通常也会在错误的时间回放。下面是执行这些代码的代码:(如果您想让我发布其他或所有代码,请告知)

单击记录/停止/按钮时发生的代码:

    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) { }
最后是CreateOneEvent方法:

    // 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);
    }

}