Intereting Posts
Сбой приложения при загрузке изображения в ведро AWS S3 для быстрого 3 touchIDLockout устарел в iOS 11.0 как остановить обновление func (_ currentTime: TimeInterval) в Spritekit Приложение iOS с удаленным сервером – мне не нужны данные для сохранения в приложении, должен ли я использовать CoreData? Понимание подсчета ссылок / памяти и свойств Как сделать sprite-прыжок внутри цикла обновления в Cocos2D Проблема распределения ткани (мы не смогли найти следующие устройства в вашем профиле) Переход от iOS к OS X – где я могу поместить свой код? Могу ли я подписывать приложение IOS без учетных данных разработчика? Перезапуск Sprite – комплект игры Swift Изменение размера Кордова InAppBrowser, поэтому оно появляется как окно, а не охватывает весь экран в iOS vBulletin для мобильных API login_login? Содержимое Base64 PDF в PDF удалить элементы списка, добавленные через .append по событию click на отдельном элементе использование AVSystemController в приложении iPhone

Как получить доступ к MusicTracks в MusicSequence?

Итак, я пытаюсь выяснить API MusicPlayer для iOS. Мне удалось получить MIDI-плеер, поэтому моя последовательность есть и заполнена чем-то полезным, но я не могу получить доступ к трекам (или в этом случае трек, так как есть только один музыкальный трек, другой это темп-трек).

Если я запустил MusicSequenceGetTrackCount на «mySequence», я получаю возврат 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 

Solutions Collecting From Web of "Как получить доступ к MusicTracks в MusicSequence?"

Чтобы получить доступ к любому треку, вам сначала нужно получить доступ к musicSequence. В вашем случае у вас есть mySequence для этого, вы также знаете общее количество треков в музыкальной последовательности как trackCount . Теперь для доступа к определенному треку вам просто нужно будет использовать

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

Это даст вам трек. Также убедитесь, что trackIndex < trackCount .

Обновить

В соответствии с документом .

Музыкальный трек и связанные с ним непрозрачные типы объявляются в файле заголовка 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);