如何在Objective-c中获得每首歌曲的节拍数

时间:2012-03-14 06:04:21

标签: iphone objective-c

我做了很多R& D但没有得到任何好的答案。我正在研究iphone中的音乐类型应用程序,我必须根据每分钟的节拍对歌曲进行分类。所以我的首要任务是找出歌曲的BPM。我们怎么能这样做?我得到了一些答案: 1.使用MPMediaItem类的MPMediaItemPropertyBeatsPerMinute属性,它会正常工作。我对此有疑问,因为有些人说它会返回null。 你有任何示例代码或逻辑来获得这个。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以使用http://www.un4seen.com/来检测歌曲的BPM。

以下是使用此库计算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 :(得分:1)

在一分钟内获得音频歌曲的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);

答案 2 :(得分:0)

Apple提供aurioTouch示例代码,以一种形式显示输入音频,常规时域波形,频域波形(通过对输入信号执行快速傅立叶变换计算)和超声波图view(一个显示信号频率内容随时间变化的视图,颜色信号相对功率,y轴为频率,x为时间)。