mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-10-31 14:13:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /* allegroconvert.cpp -- convert from allegro to standard midi files */
 | |
| 
 | |
| /* CHANGE LOG
 | |
| 04 apr 03 -- added options to remove tempo track, retaining either 
 | |
|              the original beats or original timing (RBD)
 | |
| */
 | |
| 
 | |
| #include <fstream>
 | |
| #include "allegro.h"
 | |
| 
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| void midi_fail(char *msg)
 | |
| {
 | |
|     printf("Failure: %s\n", msg);
 | |
|     exit(1);
 | |
| }
 | |
| 
 | |
| 
 | |
| void *midi_alloc(size_t s) { return malloc(s); }
 | |
| void midi_free(void *a) { free(a); }
 | |
| 
 | |
| 
 | |
| void print_help()
 | |
| {
 | |
|     printf("%s%s%s%s%s%s%s%s",
 | |
|            "Usage: allegroconvert [-m] [-a] [-t tempo] [-f] <filename>\n",
 | |
|            "    Use -m for midifile->allegro, -a for allegro->midifile.\n",
 | |
|            "    .mid extension implies -m, .gro implies -a\n",
 | |
|            "    If tempo (a float) is specified after -t, the tempo track\n",
 | |
|            "    is deleted and replaced by a fixed tempo.\n",
 | |
|            "    If -f (flatten) is specified, output a flat tempo=60,\n",
 | |
|            "    preserving the original timing of all midi events.\n",
 | |
|            "    Do not use both -t and -f.\n");
 | |
|     exit(-1);
 | |
| }
 | |
| 
 | |
| 
 | |
| // process -- perform tempo changing and flattening operations
 | |
| //
 | |
| void process(Alg_seq_ptr seq, bool tempo_flag, double tempo, 
 | |
|              bool flatten_flag)
 | |
| {
 | |
|     // the tempo changing operation replaces the tempo track with
 | |
|     // a fixed tempo. This changes the timing of the result.
 | |
|     if (tempo_flag) {
 | |
|         seq->convert_to_beats(); // preserve beats
 | |
|     } else if (flatten_flag) {
 | |
|         seq->convert_to_seconds(); // preserve timing
 | |
|     } else return;
 | |
|     // the following finishes both tempo and flatten processing...
 | |
|     seq->get_time_map()->beats.len = 1; // remove contents of tempo map
 | |
|     seq->get_time_map()->last_tempo = tempo / 60.0; // set the new fixed tempo
 | |
|      // (allegro uses beats/second so divide bpm by 60)
 | |
|     seq->get_time_map()->last_tempo_flag = true;
 | |
| }
 | |
| 
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|     if (argc < 2) {
 | |
|         print_help();
 | |
|     }
 | |
|     char *filename = argv[argc - 1];
 | |
|     char outfilename[256];
 | |
|     bool midifile = false;
 | |
|     bool allegrofile = false;
 | |
|     bool flatten_flag = false;
 | |
|     double tempo = 60.0; // default is used for -f (flatten)
 | |
|     bool tempo_flag = false;
 | |
|     char *ext = NULL;
 | |
| 
 | |
|     int i = 1;
 | |
|     while (i < argc - 1) {
 | |
|         if (argv[i][0] != '-') print_help();
 | |
|         if (argv[i][1] == 'm') midifile = true;
 | |
|         else if (argv[i][1] == 'a') allegrofile = true;
 | |
|         else if (argv[i][1] == 't') {
 | |
|             i++;
 | |
|             if (i >= argc - 1) print_help(); // expected tempo
 | |
|             tempo = atof(argv[i]);
 | |
|             tempo_flag = true;
 | |
|         } else if (argv[i][1] == 'f') {
 | |
|             flatten_flag = true;
 | |
|         } else print_help();
 | |
|         i++;
 | |
|     }
 | |
|     // Do not use both -t and -f:
 | |
|     if (tempo_flag & flatten_flag) print_help();
 | |
| 
 | |
|     int len = strlen(filename);
 | |
|     if (!midifile && !allegrofile) {
 | |
|         if (len < 4) print_help();    // no extension, need -m or -a
 | |
|         ext = filename + len - 4;
 | |
|         if (strcmp(ext, ".mid") == 0) midifile = true;
 | |
|         else if (strcmp(ext, ".gro") == 0) allegrofile = true;
 | |
|         else print_help();
 | |
|     } else if (len > 4) {
 | |
|         ext = filename + len - 4;
 | |
|     } 
 | |
|     Alg_seq_ptr seq;
 | |
|     strcpy(outfilename, filename);
 | |
|     if (midifile) {
 | |
|         seq = new Alg_seq(filename, true);
 | |
|         process(seq, tempo_flag, tempo, flatten_flag);
 | |
|         if (ext && strcmp(ext, ".mid") == 0) {
 | |
|             ext = outfilename + strlen(outfilename) - 4;
 | |
|         } else {
 | |
|             ext = outfilename + strlen(outfilename);
 | |
|         }
 | |
|         strcpy(ext, ".gro");
 | |
|         seq->write(outfilename);
 | |
|     } else if (allegrofile) {
 | |
|         seq = new Alg_seq(filename, false);
 | |
|         process(seq, tempo_flag, tempo, flatten_flag);
 | |
|         if (ext && strcmp(ext, ".gro") == 0) {
 | |
|             ext = outfilename + strlen(outfilename) - 4;
 | |
|         } else {
 | |
|             ext = outfilename + strlen(outfilename);
 | |
|         }
 | |
|         strcpy(ext, ".mid");
 | |
|         seq->smf_write(outfilename);
 | |
|     }
 | |
| 
 | |
|     int events = 0;
 | |
|     for (i = 0; i < seq->track_list.length(); i++) {
 | |
|         events += seq->track_list[i].length();
 | |
|     }
 | |
|     printf("%ld tracks, %d events\n", seq->track_list.length(), events);
 | |
|     printf("wrote %s\n", outfilename);
 | |
|     
 | |
|     /* DELETE THE DATA */
 | |
|     delete seq;
 | |
| 
 | |
|     return 0;
 | |
| }
 |