diff options
Diffstat (limited to 'utils/midiplay')
-rw-r--r-- | utils/midiplay/adlmidiplay.cpp | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp index 9fb9033..a095390 100644 --- a/utils/midiplay/adlmidiplay.cpp +++ b/utils/midiplay/adlmidiplay.cpp @@ -3,6 +3,7 @@ #include <string> #include <cstdio> #include <cctype> +#include <cmath> #include <cstdlib> #include <cstring> #include <deque> @@ -84,6 +85,11 @@ static void sighandler(int dum) int main(int argc, char **argv) { + std::fprintf(stdout, "==========================================\n" + " libADLMIDI demo utility\n" + "==========================================\n\n"); + std::fflush(stdout); + if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h") { std::printf( @@ -130,6 +136,8 @@ int main(int argc, char **argv) std::printf(" This build of libADLMIDI has no embedded banks!\n\n"); } + std::fflush(stdout); + return 0; } @@ -161,8 +169,7 @@ int main(int argc, char **argv) } bool recordWave = false; - - adl_setLoopEnabled(myDevice, 1); + int loopEnabled = 1; while(argc > 2) { @@ -173,14 +180,11 @@ int main(int argc, char **argv) else if(!std::strcmp("-v", argv[2])) adl_setHVibrato(myDevice, 1); else if(!std::strcmp("-w", argv[2])) - { recordWave = true; - adl_setLoopEnabled(myDevice, 0);//Disable loop while record WAV - } else if(!std::strcmp("-t", argv[2])) adl_setHTremolo(myDevice, 1); else if(!std::strcmp("-nl", argv[2])) - adl_setLoopEnabled(myDevice, 0); + loopEnabled = 0; else if(!std::strcmp("-s", argv[2])) adl_setScaleModulators(myDevice, 1); else break; @@ -190,6 +194,9 @@ int main(int argc, char **argv) argc -= (had_option ? 2 : 1); } + //Turn loop on/off (for WAV recording loop must be disabled!) + adl_setLoopEnabled(myDevice, recordWave ? 0 : loopEnabled); + if(!recordWave) { // Set up SDL @@ -201,7 +208,8 @@ int main(int argc, char **argv) } if(spec.samples != obtained.samples) { - std::fprintf(stderr, "Wanted (samples=%u,rate=%u,channels=%u); obtained (samples=%u,rate=%u,channels=%u)\n", + std::fprintf(stderr, " - Audio wanted (samples=%u,rate=%u,channels=%u);\n" + " - Audio obtained (samples=%u,rate=%u,channels=%u)\n", spec.samples, spec.freq, spec.channels, obtained.samples, obtained.freq, obtained.channels); std::fflush(stderr); @@ -218,10 +226,12 @@ int main(int argc, char **argv) printError(adl_errorString()); return 1; } + std::fprintf(stdout, " - Use embedded bank #%d [%s]\n", bankno, adl_getBankNames()[bankno]); + std::fflush(stdout); } else { - std::fprintf(stdout, "Loading custom bank file %s...", argv[2]); + std::fprintf(stdout, " - Use custom bank [%s]...", argv[2]); std::fflush(stdout); if(adl_openBankFile(myDevice, argv[2]) != 0) { @@ -242,7 +252,7 @@ int main(int argc, char **argv) printError(adl_errorString()); return 1; } - std::fprintf(stdout, "Number of cards %s\n", argv[3]); + std::fprintf(stdout, " - Number of cards %s\n", argv[3]); } else { @@ -261,7 +271,7 @@ int main(int argc, char **argv) printError(adl_errorString()); return 1; } - std::fprintf(stdout, "Number of four-ops %s\n", argv[4]); + std::fprintf(stdout, " - Number of four-ops %s\n", argv[4]); } if(adl_openFile(myDevice, argv[1]) != 0) @@ -276,10 +286,26 @@ int main(int argc, char **argv) signal(SIGHUP, sighandler); #endif + double total = adl_totalTimeLength(myDevice); + double loopStart = adl_loopStartTime(myDevice); + double loopEnd = adl_loopEndTime(myDevice); + if(!recordWave) { + std::fprintf(stdout, " - Loop is turned %s\n", loopEnabled ? "ON" : "OFF"); + if(loopStart >= 0.0 && loopEnd >= 0.0) + std::fprintf(stdout, " - Has loop points: %10f ... %10f\n", loopStart, loopEnd); + std::fprintf(stdout, "\n==========================================\n"); + std::fflush(stdout); + SDL_PauseAudio(0); + #ifdef DEBUG_SEEKING_TEST + int delayBeforeSeek = 50; + std::fprintf(stdout, "DEBUG: === Random position set test is active! ===\n"); + std::fflush(stdout); + #endif + while(!stop) { short buff[4096]; @@ -287,6 +313,10 @@ int main(int argc, char **argv) if(got <= 0) break; + std::fprintf(stdout, " \r"); + std::fprintf(stdout, "Time position: %10f / %10f\r", adl_positionTell(myDevice), total); + std::fflush(stdout); + AudioBuffer_lock.Lock(); size_t pos = AudioBuffer.size(); AudioBuffer.resize(pos + got); @@ -299,14 +329,24 @@ int main(int argc, char **argv) { SDL_Delay(1); } - } + #ifdef DEBUG_SEEKING_TEST + if(delayBeforeSeek-- <= 0) + { + delayBeforeSeek = rand() % 50; + double seekTo = double((rand() % int(adl_totalTimeLength(myDevice)) - delayBeforeSeek - 1 )); + adl_positionSeek(myDevice, seekTo); + } + #endif + } + std::fprintf(stdout, " \n\n"); SDL_CloseAudio(); } else { std::string wave_out = std::string(argv[1]) + ".wav"; - std::fprintf(stdout, "Recording WAV file %s...\n", wave_out.c_str()); + std::fprintf(stdout, " - Recording WAV file %s...\n", wave_out.c_str()); + std::fprintf(stdout, "\n==========================================\n"); std::fflush(stdout); if(wave_open(spec.freq, wave_out.c_str()) == 0) @@ -319,10 +359,19 @@ int main(int argc, char **argv) if(got <= 0) break; wave_write(buff, (long)got); + + double complete = std::floor(100.0 * adl_positionTell(myDevice) / total); + std::fprintf(stdout, " \r"); + std::fprintf(stdout, "Recording WAV... [%d%% completed]\r", (int)complete); + std::fflush(stdout); } wave_close(); + std::fprintf(stdout, " \n\n"); - std::fprintf(stdout, "Completed!\n"); + if(stop) + std::fprintf(stdout, "Interrupted! Recorded WAV is incomplete, but playable!\n"); + else + std::fprintf(stdout, "Completed!\n"); std::fflush(stdout); } else |