Пример #1
0
int main(int argc, char *const argv[]){
        char *alg, *f0, *f1;
        compute_alignment c = NULL;
        int err;

        if(argc < 3) usage();
        alg = argv[1];
        f0 = argv[2];
        f1 = argv[3];
        if(strcmp(alg,"dfs") == 0){
                c = &call_dfs_solver; /* from dfs_solver.c */
        }else if(strcmp(alg,"dyn") == 0){
                c = &dyn_programming_solution;
        }else{
                printf("Algorithm %s not recognized, expected dfs or dyn\n",
                       alg);
                return EXIT_FAILURE;
        }
        err = align_files(f0, f1,c);
        if (err) return EXIT_FAILURE;
        return EXIT_SUCCESS;
}
Пример #2
0
int main(int argc, char *argv []) 
{	
    const char *progname, *infilename0, *infilename1;
    const char *smooth_filename, *path_filename, *trans_filename;
    const char *midi_filename, *beat_filename, *image_filename;
    
    //just transcribe if trasncribe == 1
    int transcribe = 0;
	
    // Default for the user definable parameters
    
    path_filename = "path.data";
    smooth_filename = "smooth.data";
    trans_filename = "transcription.txt";
    midi_filename = "midi.mid";
    beat_filename = "beatmap.txt";
    image_filename = "distance.pnm";

    progname = strrchr(argv [0], '/'); 
    progname = progname ? progname + 1 : argv[0] ;

    // If no arguments, return usage 
    if (argc < 2) {
        print_usage(progname);
        return 1;
    }

	

    /*******PARSING CODE BEGINS*********/
    int i = 1; 
    while (i < argc) {
        //expected flagged argument
        if (argv[i][0] == '-') {
            char flag = argv[i][1];
            if (flag == 'h') {
                sa.frame_period = atof(argv[i+1]);	
            } else if (flag == 'w') {
                sa.window_size = atof(argv[i+1]); 
            } else if (flag == 'r') {
                path_filename = argv[i+1];
            } else if (flag == 's') {
                smooth_filename = argv[i+1];
            } else if (flag == 't') {
                trans_filename = argv[i+1]; 
            } else if (flag == 'm') {
                midi_filename = argv[i+1];
            } else if (flag == 'i') {
                image_filename = argv[i+1];
            } else if (flag == 'b') {
                beat_filename = argv[i+1];
            } else if (flag == 'o') {
                sa.smooth_time = atof(argv[i+1]);
            } else if (flag == 'p') {
                sa.presmooth_time = atof(argv[i+1]);
            } else if (flag == 'x') {
                sa.line_time = atof(argv[i+1]);
            } else if (flag == 'd') {
                sa.silence_threshold = atof(argv[i+1]);
            }
            i++;
        }
        // When aligning audio to midi we must force file0 to be midi 
        else {			
            // file 1 is midi
            if (transcribe == 0) {
                infilename0 = argv[i];
                transcribe++;
            }
            // file 2 is audio or a second midi 
            else {
                infilename1 = argv[i];
                transcribe++;
            }	
        }
        i++;
    }
    /**********END PARSING ***********/
    if (sa.presmooth_time > 0 && sa.line_time > 0) {
        printf("WARNING: both -p and -x options selected.\n");
    }

    if (transcribe == 1) {
	// if only one midi file, just write transcription and exit, 
        // no alignment
        save_transcription(infilename0, "", false, trans_filename,NULL, NULL, NULL);
        printf("Wrote %s\n", trans_filename);
        goto finish;
    }


    // if midi only in infilename1, make it infilename0
    if (is_midi_file(infilename1) && !is_midi_file(infilename0)) {
        const char *temp; 
        temp = infilename0; 
        infilename0 = infilename1;
        infilename1 = temp;
    }

    if (!align_files(infilename0, infilename1, sa, true /* verbose */)) {
        printf("An error occurred, not saving path and transcription data\n");
        goto finish;
    }
    if (sa.file0_frames <= 2 || sa.file1_frames <= 2) {
        printf("Error: file frame counts are low: %d (for input 1) and %d "
               "for input 2)\n...not saving path and transcription data\n",
               sa.file0_frames, sa.file1_frames);
    goto finish;
    }
    // save path
    save_path(path_filename, sa.pathlen, sa.pathx, sa.pathy, 
              sa.actual_frame_period_0, sa.actual_frame_period_1);
    // save image of distance matrix
    save_image(image_filename, sa);
    // save smooth, midi, transcription
    save_transcription(infilename0, infilename1, true, trans_filename, 
                       smooth_filename, midi_filename, beat_filename);

    // print what the chroma matrix looks like
    /*
      printf("file0 chroma table: \n"); 
      print_chroma_table(chrom_energy0,file0_frames);
      printf("\nfile1 chroma table: \n"); 
      print_chroma_table(chrom_energy1, file1_frames); 
    */
	
    // only path and smooth are written when aligning two audio files
    if (is_midi_file(infilename0) || is_midi_file(infilename1))
        printf("Wrote %s, %s, %s, and %s.\n", path_filename, smooth_filename, 
               trans_filename, beat_filename);
    else
        printf("Wrote %s and %s.", path_filename, smooth_filename); 
    
finish:

#ifdef WIN32
    printf("Type RETURN to exit\n");
    getchar();
#endif

    return 0 ;
} /* main */