我正在阅读第12章关于“头第一设计模式”中的组合模式。在第541页的示例DJView中,它不能在我的computer.when中正确运行--我按下'start',程序只听一次而不是循环。我不确定是不是因为我的系统环境。但是,如果我在类BeatModel的方法meta中添加一行代码,则它是works.like:
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
期待你的帮助。
发布于 2011-07-01 06:31:26
编辑#2:为了完整起见,Head First Design的作者Elisabeth自己注意到,她的书中的代码只经过了Java1.4的测试。她答应考虑我们的反馈意见。
编辑:在游戏中似乎与Sequencer.setTempoInBPM有一个bug。将微秒位置设置为0的方法是正确的方法--它基本上是在排序器结束时立即回滚(即消息类型= 47)。
不幸的是,示例代码似乎不正确。有几个问题:
sequencer未初始化为在循环meta()方法重置BPM并重命名所有侦听器,但不会将排序器重置到原来的位置,这是为使其工作而做的。但是,只要将排序器设置为在循环中播放,此方法就不需要执行任何操作。off()方法将BPM设置为0,这将将排序器快速转发到所有循环的末尾--这意味着下次启动播放机时,它将从结束时开始,而不会播放任何内容。这些改变应该起到了作用:
#1 In method 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();
}发布于 2014-04-29 18:49:55
在Java 8上添加
sequencer.setMicrosecondPosition(0);
BeatModel.meta()使它工作得很好!
向所有的人问好,希布根布鲁格
发布于 2020-04-25 10:05:37
我在阅读时遇到了类似的错误。在我的电脑里,processBar不更新。
1.在“公共空元(sequencer.setMicrosecondPosition消息)”中添加“MetaMessage(0)”;
2.第二,我删除了"sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);“中的"public setUpMidi()";它不断发出声音,但是"meta(MetaMessage消息)”不会被通知,所以ProcessBar不会更新。
3.那它就起作用了
也许我的经验可以帮助别人。
https://stackoverflow.com/questions/6543341
复制相似问题