2016-05-05 11 views
1

私はcoreMIDIとAudioToolBoxを使って音楽シーケンスを作成しましたが、今度はループしたシーケンスの現在のビート位置をUIに表示したいと思います。ループが4ビートしかない場合は、ディスプレイが1,2,3,4の間でトグルし、シーケンスループとして1に戻るようにしたいと思います(Logic Proのようなプログラムのトランスポートによく似ています)。私はMusicSequenceGetBeatsForSeconds()を使って、プレイが押されてから経過した時間量(CFAbsoluteTimeGetCurrent()を使用)に基づいてビートを計算する機能を作ったが、これは値が線形的に増加し続ける(ディスプレイが " 5.0 ")。シーケンスの現在のビートを読み取るにはどうすればよいですか?MusicSequence(coreMIDI/Swift)の現在のビート位置を表示します

答えて

1

トラックメッセージの最後をスキップします。あなたはそれに頼ることはできません。

代わりにMusicSequenceUserCallbackを作成してください。次に、ユーザーイベントを保持するトラックをシーケンスに追加します。イベントの実際のデータは重要ではありません。

var event = MusicEventUserData(length: 1, data: (0xAA)) 
let status = MusicTrackNewUserEvent(markerTrack, endBeat, &event) 

コールバックで、この任意のデータ値を探して、やりたいことをします。

let d = eventData.memory 
if d.data == 0xAA { 

Swift 2.2では、コールバックをクロージャにすることはできません。だからグローバルな機能にしてください。

+0

はしばらくかかりましたが、最終的にユーザコールバックを設定する方法を考え出しました非常に感謝@GeneDeLisa – drockFai

+0

あなたはそれがうまく動作するようになった。それらのユーザーイベントに関する1つのこと。私が別のトラックに入れた理由は、シーケンスをMDIファイルに保存してからSibeliusのような別のアプリケーションに読み込もうとすると、読み込みがうまくできなくなってしまうからです。 –

+0

私は、心に留めておきます - ありがとう! – drockFai

1

代わりにMuscPlayerのMusicPlayerGetTime関数を見てください。

目的に応じて、MusicSequenceのエンドポイントとして仮想宛先を設定し、その読み取りブロックでイベントが発生したときに応答することができます。

+0

ありがとう@GeneDeLisa、私は 'MusicPlayerGetTime'関数を見落としました。以前は 'CFAbsoluteTime'を使って思いついた関数よりもはるかにクリーンですが、シーケンスが繰り返されているにもかかわらず、拍数が直線的に増加しています。私はMIDIPacketListから派生した情報に目を通し、測定の現在の位置を読み取れるようなものは見つけられませんでした。無関心を許す必要があります。プログラムを学ぶピアニストだけです。 – drockFai

+0

または、ループ内でシーケンスのビート数を受け取り、ループが繰り返された後に1にリセットされる関数を作成する必要がありますか? – drockFai

+0

仮想目的地に到着したトラックのMIDIメッセージの終わりを探し、カウンターを入手したらリセットすることができます。それは、4ビートのシーケンスだけでなく、どんな長さでも機能します。 –

関連する問題