首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >头第一设计模式-组合模式

头第一设计模式-组合模式
EN

Stack Overflow用户
提问于 2011-07-01 03:37:46
回答 3查看 1.5K关注 0票数 4

我正在阅读第12章关于“头第一设计模式”中的组合模式。在第541页的示例DJView中,它不能在我的computer.when中正确运行--我按下'start',程序只听一次而不是循环。我不确定是不是因为我的系统环境。但是,如果我在类BeatModel的方法meta中添加一行代码,则它是works.like:

代码语言:javascript
复制
  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'.中找到示例。

运行类DJTestDrive.java

期待你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-01 06:31:26

编辑#2:为了完整起见,Head First Design的作者Elisabeth自己注意到,她的书中的代码只经过了Java1.4的测试。她答应考虑我们的反馈意见。

编辑:在游戏中似乎与Sequencer.setTempoInBPM有一个bug。将微秒位置设置为0的方法是正确的方法--它基本上是在排序器结束时立即回滚(即消息类型= 47)。

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

  1. sequencer未初始化为在循环
  2. 中播放meta()方法重置BPM并重命名所有侦听器,但不会将排序器重置到原来的位置,这是为使其工作而做的。但是,只要将排序器设置为在循环中播放,此方法就不需要执行任何操作。
  3. off()方法将BPM设置为0,这将将排序器快速转发到所有循环的末尾--这意味着下次启动播放机时,它将从结束时开始,而不会播放任何内容。

这些改变应该起到了作用:

#1 In method BeatModel.buildTrackAndStart,添加sequencer.setLoopCount如下:

代码语言:javascript
复制
 public void buildTrackAndStart() {
    // ...
    try {
        sequencer.setSequence(sequence);
        sequencer.setLoopCount(Integer.MAX_VALUE); // play forever
    } catch(Exception e) {
    // ...
} 

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

代码语言:javascript
复制
public void meta(MetaMessage message) {
}

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

代码语言:javascript
复制
public void off() {
    // -- remove this -- setBPM(0);
    sequencer.stop();
}
票数 3
EN

Stack Overflow用户

发布于 2014-04-29 18:49:55

在Java 8上添加

sequencer.setMicrosecondPosition(0);

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

向所有的人问好,希布根布鲁格

票数 1
EN

Stack Overflow用户

发布于 2020-04-25 10:05:37

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

1.在“公共空元(sequencer.setMicrosecondPosition消息)”中添加“MetaMessage(0)”;

2.第二,我删除了"sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);“中的"public setUpMidi()";它不断发出声音,但是"meta(MetaMessage消息)”不会被通知,所以ProcessBar不会更新。

3.那它就起作用了

也许我的经验可以帮助别人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6543341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档