繁体   English   中英

Head First 设计模式 - 组合模式

[英]Head First Design Patterns - Combined Pattern

我正在阅读 Head First Design Patterns 中关于组合模式的第 12 章。 在第 541 页,示例 DJView,它无法在我的计算机中正确运行。当我按下“开始”时,程序只响一次而不是循环响起。 我不确定是否因为我的系统环境。 但是如果我在 class BeatModel的方法中添加一行代码,它可以工作。就像:

  public void meta(MetaMessage message) {
        if (message.getType() == 47) {
            beatEvent();
            sequencer.setMicrosecondPosition(0);  //add this line
            sequencer.start();
            setBPM(getBPM());
        }
    }

谁能告诉我为什么? 我很困惑,是书上给出的代码有问题还是其他原因? 帮我。 提前致谢!!
不好意思,代码太长没放在这里,你可以到官网下载,这里是链接http://www.headfirstlabs.com/books/hfdp/HeadFirstDesignPatterns_code102507.zip
您可以在此文件夹 '\HeadFirstDesignPatterns_code102507\HF_DP\src\headfirst\combined\djview' 中找到示例。
运行 class DJTestDrive.java
期待您的帮助。

编辑#2 :为了完整起见,Head First Design Patterns Elisabeth Freeman 的作者本人已经注意到,她书中的代码仅使用 Java 1.4 进行了测试。 她已承诺会考虑我们的反馈。


编辑:在播放过程中, Sequencer.setTempoInBPM似乎存在错误。 您将微秒 position 设置为0的方法是正确的方法——它基本上在定序器结束后立即倒带(即消息类型 = 47)。


不幸的是,示例代码似乎不正确。 有几个问题:

  1. sequencer器未初始化为循环播放
  2. meta()方法重置 BPM 并重新通知所有侦听器,但不会将定序器重置为其原始 position,这是您为使其工作而进行的。 但是,只要将音序器设置为循环播放,此方法就不需要执行任何操作。
  3. off()方法将 BPM 设置为0 ,这将使音序器快进到所有循环的末尾——这意味着下次启动播放器时,它将从末尾开始,并且不会播放任何内容。

这些更改应该可以解决问题:

#1在方法BeatModel.buildTrackAndStart中,添加sequencer.setLoopCount如下:

 public void buildTrackAndStart() {
    // ...
    try {
        sequencer.setSequence(sequence);
        sequencer.setLoopCount(Integer.MAX_VALUE); // play forever
    } catch(Exception e) {
    // ...
} 

#2从方法BeatModel.meta(MetaMessage)中删除所有语句:

public void meta(MetaMessage message) {
}

#3从方法BeatModel.off()中删除setBPM(0) ) :

public void off() {
    // -- remove this -- setBPM(0);
    sequencer.stop();
}

在 Java 8 上,只需添加

sequencer.setMicrosecondPosition(0);

到 BeatModel.meta() 使它工作得很好!

向所有人问好,hebgeenbrug

我在阅读时遇到了类似的错误。 在我的电脑中,processBar 没有更新。

1.首先我添加“sequencer.setMicrosecondPosition(0);” 在“公共无效元(MetaMessage 消息)”中;

2.其次我删除“sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);” 在“公共无效 setUpMidi()”中; 它连续声音但“元(MetaMessage消息)”不会被注意到,所以ProcessBar不会更新。

3.然后它工作

可能是我的经验可以帮助别人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM