mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-15 15:49:36 +02:00
107 lines
3.4 KiB
C++
107 lines
3.4 KiB
C++
/* scorealign.h
|
|
*
|
|
* RBD
|
|
*/
|
|
|
|
// turn on lots of debugging, comment this line out to disable
|
|
// #define SA_VERBOSE 1
|
|
|
|
#ifdef SA_VERBOSE
|
|
#define SA_V(stmt) stmt
|
|
#else
|
|
#define SA_V(stmt)
|
|
#endif
|
|
|
|
|
|
class Scorealign {
|
|
public:
|
|
float frame_period; // time in seconds
|
|
float window_size;
|
|
float presmooth_time;
|
|
float line_time;
|
|
float smooth_time; // duration of smoothing window
|
|
int smooth; // number of points used to compute the smooth time map
|
|
|
|
Scorealign() {
|
|
frame_period = 0.25;
|
|
window_size = 0.25;
|
|
presmooth_time = 0.0;
|
|
line_time = 0.0;
|
|
smooth_time = 1.75;
|
|
pathlen = 0;
|
|
path_count = 0;
|
|
pathx = NULL;
|
|
pathy = NULL;
|
|
}
|
|
|
|
~Scorealign() {
|
|
if (pathx) free(pathx);
|
|
if (pathy) free(pathy);
|
|
}
|
|
|
|
// chromagrams and lengths, path data
|
|
float *chrom_energy1;
|
|
int file1_frames; // number of frames in file1
|
|
float *chrom_energy2;
|
|
int file2_frames; //number of frames in file2
|
|
short *pathx; //for midi (when aligning midi and audio)
|
|
short *pathy; //for audio (when aligning midi and audio)
|
|
int pathlen;
|
|
void set_pathlen(int p) { pathlen = p; }
|
|
float *time_map;
|
|
float *smooth_time_map;
|
|
|
|
// chroma vectors are calculated from an integer number of samples
|
|
// that approximates the nominal frame_period. Actual frame period
|
|
// is calculated and stored here:
|
|
// time in seconds for midi (when aligning midi and audio)
|
|
float actual_frame_period_1;
|
|
// time in seconds for audio (when aligning midi and audio)
|
|
float actual_frame_period_2;
|
|
|
|
/* gen_chroma.cpp stuff:
|
|
generates the chroma energy for a given file
|
|
with a low cutoff and high cutoff.
|
|
The chroma energy is placed in the float** chrom_energy.
|
|
this 2D is an array of pointers. the pointers point to an array
|
|
of length 12, representing the 12 chroma bins
|
|
The function returns the number of frames
|
|
(i.e. the length of the 1st dimention of chrom_energy
|
|
*/
|
|
int gen_chroma_audio(Audio_reader &reader, int hcutoff, int lcutoff,
|
|
float **chrom_energy, float *actual_frame_period,
|
|
int id, bool verbose);
|
|
|
|
int gen_chroma_midi(Alg_seq &seq, int hcutoff, int lcutoff,
|
|
float **chrom_energy, float *actual_frame_period,
|
|
int id, bool verbose);
|
|
|
|
/* scorealign.cpp stuff: */
|
|
float map_time(float t1);
|
|
void midi_tempo_align(Alg_seq &seq , char *midiname, char *beatname);
|
|
void align_midi_to_audio(Alg_seq &seq, Audio_reader &reader,
|
|
bool verbose);
|
|
void align_midi_to_midi(Alg_seq &seq1, Alg_seq &seq2, bool verbose);
|
|
void align_audio_to_audio(Audio_reader &reader1,
|
|
Audio_reader &reader2, bool verbose);
|
|
void align_chromagrams(bool verbose);
|
|
|
|
int path_count; // for debug log formatting
|
|
void path_step(int i, int j);
|
|
void path_reverse();
|
|
int sec_to_pathy_index(float sec);
|
|
void compare_chroma(bool verbose);
|
|
void linear_regression(int n, int width, float &a, float &b);
|
|
void compute_smooth_time_map();
|
|
void presmooth();
|
|
void compute_regression_lines();
|
|
void midi_tempo_align(Alg_seq &seq, bool verbose);
|
|
};
|
|
|
|
#define DEBUG_LOG 0
|
|
#if DEBUG_LOG
|
|
extern FILE *dbf;
|
|
#endif
|
|
|
|
int find_midi_duration(Alg_seq &seq, float *dur);
|