1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-30 07:39:42 +02:00
audacity/lib-src/portsmf/apps/allegroconvert.cpp
2013-10-31 07:23:14 +00:00

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;
}