0

MIDI を読み取り、音楽に合わせてキーボードに音符を表示する iPad iOS 5 用のプログラムがあります。正常に動作しますが、タイムスタンプ A からタイムスタンプ B までのセクションを何度も繰り返す「リピートセクション」機能を追加しようとしています。

タイムスタンプを繰り返しセクションの境界として機能させることができましたが、繰り返しを適切に機能させるのに問題があります。セクションをリピートしようとすると、キーボード アニメーションが表示されなくなります。この問題にはハイパースレッディングが必要になると感じていますが、よくわかりません。以下にやりたいことを疑似コードで概説しました。

//Start Repeat Method
while (the repeat switch is toggled) {
     Stop music player.

     Set music player to the start point of the repeat.

     while (the current play point is before the end point of the repeat) {
          Check the current play point.
     }
}
//End Repeat Method

基本的に、私がやりたいことは、ユーザーがスイッチをオフにするまで何度も呼び出されるスイッチを押したときにメソッドがトリガーされるようにすることです。このメソッドでは、プレーヤーを停止し、リピートの開始点に設定し、リピートの最後に到達するまでリピートを再生してから、メソッドを最初からやり直します。

この部分がこれほどトリッキーになるとは思いませんでした。私が抱えているもう1つの問題は、これをスイッチに接続すると、スイッチをオフにすることができず、永遠に続くことです.

アドバイスをいただきありがとうございます。

**編集

これが私がこれまでに持っているものです。セクションをループできますが、アニメーションが表示され、UI を操作できず、Xcode の停止ボタンでプログラムを終了する必要があります。

- (IBAction)playRepeat:(id)sender {
     if (repeatToggle.on) {
          MusicPlayerStop(player);
          playerIsPlaying = NO;

          MusicPlayerSetTime(player, sequenceRepeatStartTime);
          moviePlayerViewController.moviePlayer.currentPlaybackTime = rollRepeatStartTime;

          MusicPlayerStart(player);
          [moviePlayerViewController.moviePlayer play];
          playerIsPlaying = YES;

          float difference = rollRepeatEndTime - rollRepeatStartTime;
          [NSThread sleepForTimeInterval:difference];

          MusicPlayerStop(player);
          playerIsPlaying = NO;
          [moviePlayerViewController.moviePlayer pause];

          [self playRepeat:sender];
     }
     else if (!repeatToggle.on) {
          MusicPlayerStop(player);
          playerIsPlaying = NO;
     }
}
4

1 に答える 1

2

ループwhileは実行を続けて何も待機しないため、CPU を使い果たします。これを別のスレッドに入れると役立つかもしれませんが、プレーヤーがスレッドセーフでない場合はロック機構が必要になります。

プレイヤー自身からの通知がなければ、正しいタイミングで繰り返すのは難しいというわけではありません。MIDI プレーヤーが、再生が指定したポイントに到達したときに通知を受け取るために使用できる通知またはデリゲート コールバックをサポートしているかどうかを確認する必要があります。

とにかく、私はあなたに適した方法を提供します。このようなことを行うことで、タイマーを使用して、おそらく100ミリ秒ごとにプレーヤーをチェックできます。

-(void) repeatCheck {
    if (the repeat switch is ON) {
        if (the current play point is NOT before the end point of the repeat) {
            Stop music player.
            Set music player to the start point of the repeat.
        }
    }
    [self performSelector:_cmd withObject:nil afterDelay:0.1];
}

-(IBAction) repeatSwitchToggled {
    if (the repeat switch is ON) {
        [self repeatCheck];
    }
    else {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(repeatCheck) object:nil];
    }
}
于 2012-06-02T02:37:19.003 に答える