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()がtrueのときにユーザーが停止/開始ボタンを押したときに音楽を停止するには、次のようにします。

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

ここで、ユーザーが音楽の再生中にパラメーターを変更し、更新された音楽パターンを作成して、そのパターンを再生できるようにする機能を実装したいと思います。基本的には、ユーザーのために生成された音楽の「リアルタイム」調整をシミュレートするという考え方です。

さて、私は数週間これで壁に頭を打ちつけてきました。私はすべての標準的なJavaドキュメントを読み、フォーラムを調査、読み、検索しましたが、さまざまなアイデアを試しましたが、どれも成功しませんでした。

私が試したすべてのアプローチで遭遇した問題は、新しい更新された音楽パターンで新しいスレッドを開始すると、すべての古いスレッドも開始し、希望する出力の代わりに理解できないノイズの不協和音が発生することです。

私が集めたものから、問題は、私が遭遇したすべてのメソッドが、スレッドが「フラグ」変数の値を定期的にチェックし、その「実行」ブロック内から自分自身をシャットダウンできることを必要とすることであるようです。その変数に応じて。ただし、私のスレッドは実行(音楽の再生)に最低数分かかる呼び出しを行い、これを実行している間にスレッドを終了する必要があるため、実際には安全な方法はありません。

ですから、スレッドに関して欠けているものがあるのか​​、それともまったく異なるアプローチを使用して目標を達成できるのか、疑問に思っています。任意のアイデアやガイダンスは大歓迎です!ありがとうございました!

4

1 に答える 1

1

シーケンス全体を再生する代わりに、その短い部分を再生します。次に、中止を確認し、そうでない場合は次のパートを再生します。サブパターン インターフェイスやトークン化インターフェイスを使用したり、別のスレッドからパターンにフラグメントを慎重にストリーミングしたりすることもできます。

于 2012-11-12T05:13:29.510 に答える