【问题标题】:track.add, MidiEvent, and shortMessage (volume control)track.add、MidiEvent 和 shortMessage(音量控制)
【发布时间】:2013-09-25 18:39:17
【问题描述】:

在我的客户端上,我试图让 MIDI 文件淡出,然后再继续播放序列中的下一个 MIDI,但我遇到了麻烦。

使用下面的代码,它会在 track.add 处导致 nullpointerException,我想知道我做错了什么?

我对 Java 编程比较陌生,所以请具体回答

public void run() {
    active = true
    String s = findcachedir();
    uid = getuid(s);


            if(midiplay)
            {
                /*
                    midi = s + savereq;
                    midiplay = false;
                 */

                midi = s + savereq;
                try {
                    //System.out.println("Play MIDI " + midi);
                    if (musicSr != null)
                    {
                        musicSr.stop();
                        musicSr.close();
                    }
                    musicSr = null;
                    musicS = null;

                    File music = new File(midi);
                    if(music.exists())
                    {
                        musicS = MidiSystem.getSequence(music);
                    }
                    for (int k = 0; k < 16; k++) {
                        musicS.getTracks();
                        track.add(
                                new MidiEvent(
                                        new ShortMessage(
                                                ShortMessage.CONTROL_CHANGE,
                                                k, 
                                                7,
                                                20),
                                                track.getTicks()));
                    }

                        // Create a sequencer for the sequence
                        musicSr = MidiSystem.getSequencer();
                        musicSr.open();
                        musicSr.setSequence(musicS);
                        musicSr.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
                        musicSr.start();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }


                midiplay = false;

            }
            savereq = null;
        }

}


public static Sequencer musicSr = null;
Sequence musicS = null;

` 如果您出于任何原因需要,整个班级

http://pastebin.com/6C7GNnib

【问题讨论】:

  • 您的曲目在哪里声明?
  • 我在班级底部有它private Track track;

标签: java exception audio sequence midi


【解决方案1】:

变量track 似乎没有被初始化。也许你应该这样做:

private Track track = new Track();

或者如果你实现了getter setter,那么在使用add方法之前设置track中的值。类似setTrack(trackObj);

【讨论】:

  • 它说构造函数 Track() 不可见
  • 哦,是的..我的错误。通过调用 Sequence.createTrack() 方法创建一个新的(空)轨道,而不是直接调用 Track 构造函数 - docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track.html
  • 没错,您不能在 Track[] 上调用 add。这里不需要轨道阵列。创建 Track 对象并调用 add。即使你使用数组,它也会像 Track[0].add
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多