2012-03-13 53 views
2

所以,我想弄清iOS的MusicPlayer API。我已经能够得到一个MIDI播放,所以我的序列在那里,并填充了一些有用的东西,但我似乎无法访问曲目(或在这种情况下跟踪,因为只有一个音乐曲目,另一个是一个节奏曲目)。如何访问MusicSequence中的音乐曲目?

如果我在“mySequence”上运行MusicSequenceGetTrackCount,则返回2;这是预期的。

如果我运行一个MusicSequenceGetInfoDictionary,它返回3项:

Printing description of sequenceInfo: 
{ 
    tempo = 120; 
    "time signature" = "4/4"; 
    title = "RHand"; 
} 

这是有道理的,因为所有这些信息与我的轨迹相匹配。因此,如果我使用方法MusicSequenceGetIndTrack(MusicSequence inSequence,UInt32 inTrackIndex,MusicTrack * outTrack),所有这些都会让我觉得我应该能够输出曲目,以便我可以进行一些修改。

这是我的代码到目前为止。如果任何人都可以看一眼,看看我哪里出错了,那会很棒。另外,如果有人使用MusicPlayer有一些很好的资源,我会很感激。谢谢。

ViewController.h

#import <UIKit/UIKit.h> 
#import <AudioToolbox/MusicPlayer.h> 

@interface ViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UILabel *noteDisplayLabel; 
@property MusicSequence mySequence; 
@property MusicPlayer player; 
@property MusicEventIterator iterator; 
@property MusicTrack RHand; 
@property MusicTrack LHand; 


- (IBAction)practiceLesson:(id)sender; 
- (IBAction)changeTempo:(id)sender; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 
@synthesize noteDisplayLabel, mySequence, player, iterator, RHand, LHand; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    CFBundleRef appBundle = CFBundleGetMainBundle(); 
    CFStringRef filename = CFSTR("simpleCScale"); 
    CFStringRef ext = CFSTR("mid"); 

    CFURLRef fileLocation = CFBundleCopyResourceURL(appBundle, filename, ext, NULL); 

    NewMusicSequence(&mySequence); 

    MusicSequenceFileLoad(mySequence, fileLocation, 0, kMusicSequenceLoadSMF_ChannelsToTracks); 

    NewMusicPlayer(&player); 

    UInt32 trackCount; 
    MusicSequenceGetTrackCount(mySequence, &trackCount); 

    NSLog(@"Number of tracks: %lu", trackCount); 

    CFDictionaryRef sequenceInfo; 
    sequenceInfo = MusicSequenceGetInfoDictionary(mySequence); 

    UInt32 trackIndex = 0; 
    MusicTrack track; 
    MusicSequenceGetIndTrack (mySequence,trackIndex,&track); 

    MusicEventIterator iter; 
    Boolean hasEvent = 0; 
    NewMusicEventIterator(track, &iter); 

    Boolean hasNextEvent = 1; 

    while (hasNextEvent == 1) { 
     MusicEventIteratorHasCurrentEvent(iter, &hasEvent); 
     NSLog(@"Has Event: %i", hasEvent); 

     MusicTimeStamp timestamp; 
     MusicEventType eventType = 0; 
     void *eventData = NULL; 
     UInt32 eventDataSize; 

     MusicEventIteratorGetEventInfo(iter, &timestamp, &eventType, eventData, &eventDataSize); 
     NSLog(@"Event %f: Type = %lu, Data = %p, Size = %lu", timestamp, eventType, eventData, eventDataSize); 

     MusicEventIteratorNextEvent(iter); 
     MusicEventIteratorHasNextEvent(iter, &hasNextEvent); 
     NSLog(@"More Events? : %i", hasNextEvent); 
    } 
} 

- (void)viewDidUnload 
{ 
    [self setNoteDisplayLabel:nil]; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

- (IBAction)practiceLesson:(id)sender { 
    MusicPlayerSetSequence(player, mySequence); 
    MusicPlayerStart(player); 
} 

- (IBAction)changeTempo:(id)sender { 
} 
@end 

编辑

试图做的viewDidLoad方法如下,但它没有工作:

UInt32 trackIndex = 1; 
MusicTrack *track; 
MusicSequenceGetIndTrack (mySequence,trackIndex,&track); 

EDIT

更新了上述代码包括更改。我有eventIterator现在工作,但我似乎无法获取任何事件数据?运行该程序会给我以下输出:

2012-03-13 14:09:39.709 musicPlayerSandbox[61775:f803] Number of tracks: 2 
2012-03-13 14:09:39.711 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.712 musicPlayerSandbox[61775:f803] Event 0.000000: Type = 7, Data = 0x0, Size = 4 
2012-03-13 14:09:39.713 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.714 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.714 musicPlayerSandbox[61775:f803] Event 0.000000: Type = 7, Data = 0x0, Size = 4 
2012-03-13 14:09:39.715 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.716 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.716 musicPlayerSandbox[61775:f803] Event 0.000000: Type = 7, Data = 0x0, Size = 4 
2012-03-13 14:09:39.717 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.718 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.719 musicPlayerSandbox[61775:f803] Event 0.000000: Type = 7, Data = 0x0, Size = 4 
2012-03-13 14:09:39.719 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.720 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.845 musicPlayerSandbox[61775:f803] Event 0.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.846 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.846 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.847 musicPlayerSandbox[61775:f803] Event 1.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.847 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.848 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.849 musicPlayerSandbox[61775:f803] Event 2.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.850 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.850 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.851 musicPlayerSandbox[61775:f803] Event 3.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.851 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.852 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.853 musicPlayerSandbox[61775:f803] Event 4.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.887 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.888 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.888 musicPlayerSandbox[61775:f803] Event 5.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.889 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.890 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.891 musicPlayerSandbox[61775:f803] Event 6.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.891 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.892 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.893 musicPlayerSandbox[61775:f803] Event 7.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.893 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.894 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.895 musicPlayerSandbox[61775:f803] Event 8.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.899 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.900 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.901 musicPlayerSandbox[61775:f803] Event 9.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.902 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.902 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.903 musicPlayerSandbox[61775:f803] Event 10.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.904 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.905 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.905 musicPlayerSandbox[61775:f803] Event 11.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.906 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.907 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.908 musicPlayerSandbox[61775:f803] Event 12.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.908 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.909 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.928 musicPlayerSandbox[61775:f803] Event 13.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.929 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.930 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.930 musicPlayerSandbox[61775:f803] Event 14.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.931 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.932 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.932 musicPlayerSandbox[61775:f803] Event 15.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.933 musicPlayerSandbox[61775:f803] More Events? : 1 
2012-03-13 14:09:39.933 musicPlayerSandbox[61775:f803] Has Event: 1 
2012-03-13 14:09:39.934 musicPlayerSandbox[61775:f803] Event 16.000000: Type = 6, Data = 0x0, Size = 8 
2012-03-13 14:09:39.935 musicPlayerSandbox[61775:f803] More Events? : 0 

回答

0

要访问任何音轨,您首先需要访问音乐序列。在你的情况下,你有mySequence 因为你也知道音乐序列中的曲目总数为trackCount。现在访问特定的轨道,你只需要简单地使用

MusicTrack *track; 
MusicSequenceGetIndTrack (mySequence,trackIndex,&track); 

这会给你追踪。另外,请确保trackIndex < trackCount

更新

document

音乐曲目和相关的不透明类型在MusicPlayer.h头文件中声明。

所以你需要使用(MusicTrack是不透明类型不是类。)

MusicTrack track; //without star sign. rest remains the same. 

更新EventIterator

正如你所说MusicEventIteratorGetEventInfo()方法的参数const void **outEventData事件数据,因此,你需要把它作为&outEventData而不仅仅是outEventData

因此,在您的代码更改下面一行:

MusicEventIteratorGetEventInfo(iter, &timestamp, &eventType, &eventData, &eventDataSize); 
+0

嘿。我试了一下,它给了我一个警告:“不兼容的指针类型传递'MusicTrack **'(aka'struct OpaqueMusicTrack ***')到参数类型'MusicTrack *'(aka'struct OpaqueMusicTrack **')remove& ”。所以我尝试从轨道前移除&,但这给了我另一个警告:在此处使用变量“轨道”时未初始化。所以,当我设置跟踪到NULL开始,它不会提供任何警告,但它也不起作用:( – Barks 2012-03-13 19:17:44

+0

是啊,它是我的错误,请参阅更新的代码。 – Ravin 2012-03-13 19:37:36

+0

嘿,这工作非常感谢:)我' m试图从事件中获取eventData,但我似乎无法弄清楚如何格式化我的eventData变量。我已将代码更改添加到问题中。引用说eventData类型是“const void ** outEventData”,但我不确定这意味着什么。从我可以告诉,你会需要一个无效的指针指针? – Barks 2012-03-13 20:13:00