• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Grabbing MusicPlayer events during playback
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Grabbing MusicPlayer events during playback


  • Subject: Re: Grabbing MusicPlayer events during playback
  • From: James Maxwell <email@hidden>
  • Date: Tue, 28 Feb 2012 09:41:42 -0800

okay, geez. That was way easier than I thought -- already up and running!
I guess that's why Apple just sits back and ignores people like me complaining about 'missing features'... ;-)
(Though I have to say that it feels weird to duplicate all of my note events with user events...)

Thanks again.

J.


On 2012-02-28, at 7:58 AM, David Hicks wrote:

Hi James,

The first thing to note is that there aren’t too many of us MIDI guys on the CoreAudio list. And, not totally coincidentally, Apple isn’t putting much effort into this end of their technology.

 

When I did my first OS X app, I didn’t know about MusicSequence, and created my own Note and Track classes. It appears that Apple forces separate tracks from channels in loading SMFs, and my own data includes many multi-channel tracks, and so this would have bugged me. Though now I see MusicTrackMerge...

 

But I’m working on a new app and am thinking about using the technique I mentioned. Since I have to analyze my tracks specifically to get Duration into my Note instances anyway, I think it wouldn’t cost much to create a method that returns an array of all Notes, with durations, and another that adds UserEvents (and replaces NoteOn and NoteOff events with extendedNoteEvents??) to a track.

 

And, if I put the UserEvents in ahead of the (extendedNote) events, I could consult UI-generated changes (velocity, pitch) and change the note events (especially extendedNoteEvents, with duration!) on the fly, in the track, by using MusicTrackClear and AddNewExtendedNoteEvent. I’d be jammin’!

 

Well, good luck!

David


From: coreaudio-api-bounces+d.hicks=email@hidden [mailto:coreaudio-api-bounces+d.hicks=email@hidden] On Behalf Of James Maxwell
Sent: Tuesday, February 28, 2012 10:12 AM
To: email@hidden
Subject: Re: Grabbing MusicPlayer events during playback

 

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 haven’t done this, but it looks like it would work. If you’re willing to fiddle with the events in your tracks, you could do this by adding UserEvents to a MusicSequence’s 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

 

MusicSequenceSetUserCallback

Registers a user callback function with a music sequence.

OSStatus MusicSequenceSetUserCallback (

    MusicSequence              inSequence,

    MusicSequenceUserCallback  inCallback,

    void                       *inClientData

);
Parameters

inSequence

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 Value

A result code.

Discussion

The 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.

MusicTrackNewUserEvent

Adds an event of type MusicEventUserData to a music track.

OSStatus MusicTrackNewUserEvent (

    MusicTrack                inTrack,

    MusicTimeStamp            inTimeStamp,

    const MusicEventUserData  *inUserData

);

 

 


From: coreaudio-api-bounces+d.hicks=email@hidden [mailto:coreaudio-api-bounces+d.hicks=email@hidden] On Behalf Of James Maxwell
Sent: Monday, February 27, 2012 10:01 PM
To: email@hidden
Subject: Grabbing MusicPlayer events during playback

 

Hello All,

 

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?

 

thanks,

 

J.

 

------------------------------------------------------

James B. Maxwell

Composer/Researcher/PhD Candidate

 

 

 




 

 

------------------------------------------------------

James B. Maxwell

Composer/Researcher/PhD Candidate

 

 

 



 


------------------------------------------------------
James B. Maxwell
Composer/Researcher/PhD Candidate






 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • RE: Grabbing MusicPlayer events during playback
      • From: David Hicks <email@hidden>
  • Prev by Date: Re: Grabbing MusicPlayer events during playback
  • Next by Date: RE: Grabbing MusicPlayer events during playback
  • Previous by thread: Re: Grabbing MusicPlayer events during playback
  • Next by thread: RE: Grabbing MusicPlayer events during playback
  • Index(es):
    • Date
    • Thread