Java MIDI音轨不改变音高或乐器

Java MIDI音轨不改变音高或乐器,java,audio,midi,Java,Audio,Midi,我对java编程相当陌生,我正试着对javax.sound API(特别是midi sequencers)了如指掌,在一些公认的基本问题上遇到了麻烦。根据ShortMessage类的文档,重载的setmessage方法之一采用int命令、int通道、int数据1、int数据2。我理解前两个论点,但我不完全确定最后两个选项是什么。我想学习的那本书说,音高和速度是有意义的,但当我改变这些音高时,音高和扬声器发出的音符的音量都不会改变。下面是我的源代码 import javax.sound.midi.

我对java编程相当陌生,我正试着对javax.sound API(特别是midi sequencers)了如指掌,在一些公认的基本问题上遇到了麻烦。根据ShortMessage类的文档,重载的setmessage方法之一采用int命令、int通道、int数据1、int数据2。我理解前两个论点,但我不完全确定最后两个选项是什么。我想学习的那本书说,音高和速度是有意义的,但当我改变这些音高时,音高和扬声器发出的音符的音量都不会改变。下面是我的源代码

import javax.sound.midi.*;

public class BeastBoxStarter {

    public static void main(String args[]) {
        BeastBoxStarter playWithThis = new BeastBoxStarter();
        playWithThis.play();
    }

    public void play(){
        try {
            Sequencer player = MidiSystem.getSequencer();
            try{
                Sequence seq = new Sequence(Sequence.PPQ, 4);
                Track track = seq.createTrack(); //initialize a track

                ShortMessage one = new ShortMessage(); //initialize a new ShortMessage
                one.setMessage(ShortMessage.NOTE_ON, 1, 127, 1); //set the message
                MidiEvent NoteOn = new MidiEvent(one, 1); //add a midi method to turn on the note
                track.add(NoteOn); //add the midi to the sequence track

                ShortMessage two = new ShortMessage(); //initialize a new ShortMessage
                one.setMessage(ShortMessage.NOTE_OFF, 1, 127, 1); //set the message
                MidiEvent NoteOff = new MidiEvent(two, 16); //add a midi method to turn on the note
                track.add(NoteOff); //add the midi to the track

                player.setSequence(seq); //add the sequence to the sequencer

                player.open();
                player.start(); //play the sequence with the sequencer
            }
            catch(InvalidMidiDataException iex){
                iex.printStackTrace();
            }

        }
        catch (MidiUnavailableException mex) {
            mex.printStackTrace();
        }
    }


}

谢谢你的帮助

值是MIDI消息的数据字节(如果有)

假设您知道MIDI消息的格式。 看到了,还是一个

对于消息上的注释,
data1
是注释编号,
data2
是速度(=音量)。
对于备忘信息,
data1
是备忘编号,
data2
是速度(通常会被忽略)。

这就是我所想的,只是我不确定在哪里可以找到任何说明这一点的文档。但我的问题仍然存在:当我改变数据字节1时,音符的音高根本没有改变,你到底要把它改成什么?0到127之间的任何数字。当您可能不执行更改后的代码时,它不会改变音高,无论它更改为多少。我已重新启动IDE,重新编译代码,尝试通过命令行进行编译,但音高没有任何变化。如果你是说我没有在改变数字之间重新编译代码,那就没有任何意义了。如果你说“那么你的代码一定是错的”,那么是的,我知道。这就是为什么我要寻求帮助来找出它的问题所在。我不明白你在说什么,你听起来好像只是觉得我是个白痴,这绝对不会让我想继续编程,我相信这是stackoverflow的目标。