3

我有一个小程序,它使用 JFugue API 创建音乐并为用户播放。它允许用户输入乐曲所基于的乐句,或者让他们选择随机生成乐句。我一直在使用以下方法(成功)来简单地停止和启动音乐,它使用 JFugue 的 Player 类在线程中运行。

我使用我的类和来自小程序 GUI 的用户输入生成音乐......然后......

private playerThread pthread;
private Thread threadPlyr;
private Player player;
(from variables declaration)

public void startMusic(Pattern p) // pattern is a JFugue object which holds the generated music
{
if (pthread == null)
{ pthread = new playerThread(); }
else
{
    pthread = null;
    pthread = new playerThread();
}
if (threadPlyr == null)
{ threadPlyr = new Thread(pthread); }
else
{
    threadPlyr = null;
    threadPlyr = new Thread(pthread);
}
pthread.setPattern(p);
threadPlyr.start();

}

class playerThread implements Runnable // plays midi using jfugue Player
    {
        private Pattern pt;
        public void setPattern(Pattern p)
        {
            pt = p;
        }
        @Override
        public void run()
        {
                try
                {
                    player.play(pt); // takes a couple mins or more to execute
                    resetGUI();
                }
                catch (Exception exception)
                {
                }
        }
    }

当 Player.isPlaying() 为真时,当用户按下停止/开始按钮时,以下内容将停止音乐:

    public void stopMusic()
{
threadPlyr.interrupt();
threadPlyr = null;
pthread = null;
player.stop();
}

现在我想实现一个功能,允许用户在播放音乐时更改参数,创建一个更新的音乐模式,然后播放那个模式。基本上,这个想法是让它为用户模拟对生成的音乐的“实时”调整。

好吧,我已经为此苦苦挣扎了几个星期。我已经阅读了所有标准的 java 文档,研究、阅读和搜索了论坛,并且尝试了许多不同的想法,但都没有成功。

我尝试过的所有方法都遇到的问题是,当我使用新的、更新的音乐模式启动新线程时,所有旧线程也会启动,并且会出现无法理解的杂音而不是我想要的输出.

从我收集到的信息来看,问题似乎是我遇到的所有方法都要求线程能够定期检查“标志”变量的值,然后从其“运行”块中自行关闭响应该变量。但是,由于我的线程调用最少需要几分钟才能执行(播放音乐),并且我需要在它执行时终止它,所以确实没有安全的方法可以这样做。

所以,我想知道在线程方面我是否缺少一些东西,或者我是否可以使用完全不同的方法来实现我的目标。非常感谢任何想法或指导!谢谢!

4

1 回答 1

1

不要播放整个序列,而是播放其中的一小部分。然后检查中止,如果没有,则播放下一部分。您可以使用子模式接口、标记化接口,甚至可以小心地将片段从另一个线程流式传输到模式。

于 2012-11-12T05:13:29.510 回答