Hi David,
Thanks for the tip. I had thought of using the user event/SequenceCallback system, but was kind of hoping somebody out there had some alternative magic! It just seems like a very fussy way to go about something that should be quite simple; i.e., adding events that are already all in the sequence, and are thus entirely redundant. I can see that this probably isn't a common request, but I know there have been plenty of posts here in the past by people wanting to "track" events during playback, which is basically what I'm trying to do. I wish Apple would add a simpler way...
I was wondering whether there might be a way to use the MusicEventIterator. For example, starting the iterator when MusicPlayer is started, then using MusicEventIteratorNextEvent to grab the coming event. I'd just store it until MusicPlayerGetTime (which I'd have to poll) returns a value greater than the event's time. It wouldn't be perfect, since the timing would depend on the poll rate, but the function I'm writing doesn't actually need perfect timing, it just needs to know what it's playing at any given time, so it can "think ahead", so to speak.
I'll look into both options, but if anybody has any other tricks they've used, I'd love to hear them.
Thanks again.
J.
On 2012-02-28, at 6:47 AM, David Hicks wrote:
James,
I
havent done this, but it looks like it would work. If youre
willing to fiddle with the events in your tracks, you could do this by adding
UserEvents to a MusicSequences MusicTracks (at the same timestamps as
your NoteOn events). If you analyze the track before playback and know the
durations, you could add the duration info to these UserEvents. Then, with a
SequenceCallback registered, you will get alerted at every UserEvent with your duration
Info. See MusicSequence & MusicTrack references.
David
MusicSequenceSetUserCallbackRegisters
a user callback function with a music sequence.
OSStatus MusicSequenceSetUserCallback (
MusicSequence inSequence,
MusicSequenceUserCallback inCallback,
void *inClientData
);
ParametersinSequence The music sequence
that you want to add a user callback function to. inCallback A reference to your
callback function. Use NULL to remove a registered callback function. inClientData Your data that the
music sequence provides back to your callback function when it is invoked.
Return
ValueA result code.
DiscussionThe music sequence invokes your callback for each user
event added to any music track owned by the sequence. If there is a callback
registered, then UserEvents will be chased when MusicPlayerSetTime is called.
In that case the inStartSliceBeat and inEndSliceBeat will both be the same
value and will be the beat that the player is chasing to.
MusicTrackNewUserEventAdds an event of
type MusicEventUserData to a music track.
OSStatus MusicTrackNewUserEvent (
MusicTrack inTrack,
MusicTimeStamp inTimeStamp,
const MusicEventUserData *inUserData
);
I'm wondering if there's a good way to grab MusicPlayer events within
an application, during playback, **without** using a MIDI
endpoint? I have a system that has to "listen" to its own playback,
but I don't want to use the actual MIDI
endpoint, in order to avoid feedback loops. Also, it would be great to be able
to get the duration info, which I wouldn't normally have in "live"
playback (i.e., I don't know when a note will end), but would have directly
from the sequence/track. Any way to do this?
------------------------------------------------------
Composer/Researcher/PhD
Candidate
------------------------------------------------------ James B. Maxwell Composer/Researcher/PhD Candidate
|