beat_detect.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:4k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * beat_detect.c: basic beat detection algorithm
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: beat_detect.c 8205 2004-07-17 13:55:48Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. //
  25. //by Peter Sperl
  26. //
  27. //Takes sound data from wherever and returns beat detection values
  28. //Uses statistical Energy-Based methods. Very simple
  29. //
  30. //Some stuff was taken from Frederic Patin's beat-detection article, you'll find it online
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33. #include "engine_vars.h"
  34. double beat_buffer[32][80],beat_instant[32],beat_history[32];
  35. double *beat_val,*beat_att,*beat_variance;
  36. int beat_buffer_pos;
  37. double vol_buffer[80],vol_instant,vol_history;
  38. void initBeatDetect()
  39. {
  40.   int x,y; 
  41.   vol_instant=0;
  42.   vol_history=0;
  43.   for (y=0;y<80;y++)
  44.     {
  45.       vol_buffer[y]=0;
  46.     }
  47.   beat_buffer_pos=0;
  48.   beat_val=(double *)malloc(32*sizeof(double));
  49.   beat_att=(double *)malloc(32*sizeof(double));
  50.   beat_variance=(double *)malloc(32*sizeof(double));
  51.   for (x=0;x<32;x++)
  52.     {
  53.       beat_instant[x]=0;
  54.       beat_history[x]=0;
  55.       beat_val[x]=1.0;
  56.       beat_att[x]=1.0;
  57.       beat_variance[x]=0;
  58.       for (y=0;y<80;y++)
  59. {
  60.   beat_buffer[x][y]=0;
  61. }
  62.     }
  63. void getBeatVals(double *vdataL,double *vdataR, double *vol)
  64. {
  65.   int linear=0;
  66.   int x,y;
  67.   vol_instant=0;
  68.       for ( x=0;x<16;x++)
  69. {
  70.   
  71.   beat_instant[x]=0;
  72.   for ( y=linear*2;y<(linear+8+x)*2;y++)
  73.     {
  74.       beat_instant[x]+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/(8+x)); 
  75.       vol_instant+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/512.0);
  76.     }
  77.   
  78.   linear=y/2;
  79.   beat_history[x]-=(beat_buffer[x][beat_buffer_pos])*.0125;
  80.   beat_buffer[x][beat_buffer_pos]=beat_instant[x];
  81.   beat_history[x]+=(beat_instant[x])*.0125;
  82.   
  83.   beat_val[x]=(beat_instant[x])/(beat_history[x]);
  84.   
  85.   beat_att[x]+=(beat_instant[x])/(beat_history[x]);
  86.     
  87. }
  88.       
  89.       vol_history-=(vol_buffer[beat_buffer_pos])*.0125;
  90.       vol_buffer[beat_buffer_pos]=vol_instant;
  91.       vol_history+=(vol_instant)*.0125;
  92.       double temp2=0;
  93.       mid=0;
  94.       for(x=1;x<10;x++)
  95. {
  96.  mid+=(beat_instant[x]);
  97.   temp2+=(beat_history[x]);
  98.  
  99. }
  100.  mid=mid/(1.5*temp2);
  101.  temp2=0;
  102.  treb=0;
  103.     for(x=10;x<16;x++)
  104.     { 
  105.       treb+=(beat_instant[x]);
  106.       temp2+=(beat_history[x]);
  107.     }
  108.   treb=treb/(1.5*temp2);
  109.   *vol=vol_instant/(1.5*vol_history);
  110.   
  111.   bass=(beat_instant[0])/(1.5*beat_history[0]);
  112.   treb_att=.6 * treb_att + .4 * treb;
  113.   mid_att=.6 * mid_att + .4 * mid;
  114.   bass_att=.6 * bass_att + .4 * bass;
  115.   //printf("%f %f %f %fn",bass,mid,treb,*vol);
  116.    // *vol=(beat_instant[3])/(beat_history[3]);
  117.   beat_buffer_pos++;
  118.   if( beat_buffer_pos>79)beat_buffer_pos=0;
  119. }
  120. void freeBeatDetect()
  121. {
  122.   free(beat_att);
  123.   free(beat_val);
  124.   free(beat_variance);
  125. }