iphone - 如何访问 MusicSequence 中的 MusicTracks?

标签 iphone c ios xcode audio

所以,我正在尝试找出适用于 iOS 的 MusicPlayer API。我已经能够播放 MIDI,所以我的序列在那里并且填充了一些有用的东西但我似乎无法访问轨道(或者在这种情况下轨道,因为只有一个音乐轨道,另一个是节奏轨道)。

如果我在“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);

编辑

更新了上面的代码以包含更改。我现在可以使用 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

最佳答案

要访问任何轨道,您首先需要访问 musicSequence。在你的情况下你有 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);

关于iphone - 如何访问 MusicSequence 中的 MusicTracks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689914/

相关文章:

c - c中流和直接I/O的区别

iphone - 在 iPhone 上更改背景图像的按钮

iOS : UICollectionView inside UIScrollView index not incremented

iphone - 应用程序设置的 NSUserDefaults 与 Appdelegate

c - 使用 itoa() 函数

objective-c - NSObject 子类作为属性

iOS WatchKit - 如何向 Storyboard 中的 WKInterfaceTable 添加一行多行

iPhone 模拟器卡住整个操作系统

iphone - 核心数据故障 : how to load an entities relationship set of objects correctly

c - 嵌入式设备可能的堆栈大小