所以,我想弄清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, ×tamp, &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
嘿。我试了一下,它给了我一个警告:“不兼容的指针类型传递'MusicTrack **'(aka'struct OpaqueMusicTrack ***')到参数类型'MusicTrack *'(aka'struct OpaqueMusicTrack **')remove& ”。所以我尝试从轨道前移除&,但这给了我另一个警告:在此处使用变量“轨道”时未初始化。所以,当我设置跟踪到NULL开始,它不会提供任何警告,但它也不起作用:( – Barks 2012-03-13 19:17:44
是啊,它是我的错误,请参阅更新的代码。 – Ravin 2012-03-13 19:37:36
嘿,这工作非常感谢:)我' m试图从事件中获取eventData,但我似乎无法弄清楚如何格式化我的eventData变量。我已将代码更改添加到问题中。引用说eventData类型是“const void ** outEventData”,但我不确定这意味着什么。从我可以告诉,你会需要一个无效的指针指针? – Barks 2012-03-13 20:13:00