Как получить удары в минуту песни в объективе-с - PullRequest
1 голос
/ 14 марта 2012

Я много занимался исследованиями и разработками, но не получил хорошего ответа.Я работаю над приложением типа «музыка» в iphone, и мне приходится классифицировать песни по количеству ударов в минуту. Итак, моя первая задача - определить BPM песни. Как мы можем это сделать?Я получил несколько ответов, таких как: 1.Используя свойство MPMediaItemPropertyBeatsPerMinute класса MPMediaItem, все будет работать нормально.Я сомневаюсь в этом, потому что некоторые ребята сказали, что он вернет ноль.У вас есть пример кода или логика, чтобы получить это.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Вы можете использовать http://www.un4seen.com/ для определения ударов в минуту песни.

Вот код для расчета BPM с использованием этой библиотеки.

HSTREAM mainStream = BASS_StreamCreateFile(FALSE,[pathStr UTF8String],0,0,BASS_SAMPLE_FLOAT|BASS_STREAM_PRESCAN|BASS_STREAM_DECODE);

float playBackDuration=BASS_ChannelBytes2Seconds(mainStream, BASS_ChannelGetLength(mainStream, BASS_POS_BYTE));

HSTREAM  bpmStream=BASS_StreamCreateFile(FALSE, [pathStr UTF8String], 0, 0, BASS_STREAM_PRESCAN|BASS_SAMPLE_FLOAT|BASS_STREAM_DECODE);

float BpmValue= BASS_FX_BPM_DecodeGet(
                                bpmStream,
                                0.00,
                                playBackDuration,
                                MAKELONG(45,256),
                                BASS_FX_BPM_MULT2,
                                 NULL);


    //Check if BpmValue have any value or not.
    //If it haven't any value then set default value to 128.
    if(BpmValue<=0)
          BpmValue = 128.00;

Вы можете сделать много других вещей, таких как царапины, используя эту библиотеку.

1 голос
/ 23 марта 2012

Получите Bpm аудио песен в течение минуты:

BASS_SetConfig(BASS_CONFIG_IOS_MIXAUDIO, 0); // Disable mixing. To be called before BASS_Init.

if (HIWORD(BASS_GetVersion()) != BASSVERSION) {
    NSLog(@"An incorrect version of BASS was loaded");
}

// Initialize default device.
if (!BASS_Init(-1, 44100, 0, NULL, NULL)) {
    NSLog(@"Can't initialize device");

}

//NSArray *array = [NSArray arrayWithObject:@""

NSString *respath = [[NSBundle mainBundle] pathForResource:@"[Songs.PK] Paathshaala - 01 - Aye Khuda" ofType:@"mp3"];

DWORD chan1;
if(!(chan1=BASS_StreamCreateFile(FALSE, [respath UTF8String], 0, 0, BASS_SAMPLE_LOOP))) {
    NSLog(@"Can't load stream!");

}

mainStream=BASS_StreamCreateFile(FALSE, [respath cStringUsingEncoding:NSUTF8StringEncoding], 0, 0, BASS_SAMPLE_FLOAT|BASS_STREAM_PRESCAN|BASS_STREAM_DECODE);

float playBackDuration=BASS_ChannelBytes2Seconds(mainStream, BASS_ChannelGetLength(mainStream, BASS_POS_BYTE));
NSLog(@"Play back duration is %f",playBackDuration);
HSTREAM bpmStream=BASS_StreamCreateFile(FALSE, [respath UTF8String], 0, 0, BASS_STREAM_PRESCAN|BASS_SAMPLE_FLOAT|BASS_STREAM_DECODE);
//BASS_ChannelPlay(bpmStream,FALSE);
BpmValue= BASS_FX_BPM_DecodeGet(bpmStream,0.0,
                                 playBackDuration,
                                 MAKELONG(45,256),
                                 BASS_FX_BPM_MULT2,
                                NULL);
NSLog(@"BPM is %f",BpmValue);
0 голосов
/ 14 марта 2012

Apple предоставляет образец кода aurioTouch , который отображает входной аудиосигнал в одной из форм, сигнал регулярной временной области, сигнал частотной области (вычисляется путем выполнения быстрого преобразования Фурье для входящего сигнала) и вид сонограммы (вид, отображающий частотное содержание сигнала с течением времени, с относительной мощностью цветовой сигнализации, осью y является частота, а x является временем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...