* bandlimited transient reset -- needs testing & refinement

This commit is contained in:
Chris Cannam
2007-11-09 13:19:29 +00:00
parent 472a4a251f
commit 94f85c2db4
4 changed files with 39 additions and 14 deletions

View File

@@ -34,8 +34,9 @@ public:
static const int OptionStretchElastic = 0x00000000; static const int OptionStretchElastic = 0x00000000;
static const int OptionStretchPrecise = 0x00000010; static const int OptionStretchPrecise = 0x00000010;
static const int OptionTransientsCrisp = 0x00000000; static const int OptionTransientsMixed = 0x00000000;
static const int OptionTransientsSmooth = 0x00000100; static const int OptionTransientsSmooth = 0x00000100;
static const int OptionTransientsCrisp = 0x00000200;
static const int OptionPhasePeakLocked = 0x00000000; static const int OptionPhasePeakLocked = 0x00000000;
static const int OptionPhaseIndependent = 0x00001000; static const int OptionPhaseIndependent = 0x00001000;

View File

@@ -604,6 +604,7 @@ RubberBandStretcher::Impl::getLatency() const
void void
RubberBandStretcher::Impl::setTransientsOption(Options options) RubberBandStretcher::Impl::setTransientsOption(Options options)
{ {
//!!!
if (options & OptionTransientsSmooth) { if (options & OptionTransientsSmooth) {
m_options |= OptionTransientsSmooth; m_options |= OptionTransientsSmooth;
} else { } else {

View File

@@ -568,13 +568,17 @@ RubberBandStretcher::Impl::modifyChunk(size_t channel, size_t outputIncrement,
} }
bool lockThis = lock; bool lockThis = lock;
/*!!!
size_t low = lrint((150 * m_blockSize) / rate); if (!(m_options & OptionTransientsSmooth) &&
size_t high = lrint((1000 * m_blockSize) / rate); !(m_options & OptionTransientsCrisp)) {
if (lockThis) { // must be OptionTransientsMixed
if (i > low && i < high) lockThis = false; size_t low = lrint((150 * m_blockSize) / rate);
size_t high = lrint((1000 * m_blockSize) / rate);
if (lockThis) {
if (i > low && i < high) lockThis = false;
}
} }
*/
if (!lockThis) { if (!lockThis) {
if (i == 0 || p != pp) { if (i == 0 || p != pp) {

View File

@@ -36,13 +36,18 @@ int main(int argc, char **argv)
bool realtime = false; bool realtime = false;
bool precise = false; bool precise = false;
bool threaded = true; bool threaded = true;
bool transients = true;
bool peaklock = true; bool peaklock = true;
bool longwin = false; bool longwin = false;
bool shortwin = false; bool shortwin = false;
int crispness = -1; int crispness = -1;
bool help = false; bool help = false;
enum {
NoTransients,
BandLimitedTransients,
Transients
} transients = Transients;
float fthresh0 = -1.f; float fthresh0 = -1.f;
float fthresh1 = -1.f; float fthresh1 = -1.f;
float fthresh2 = -1.f; float fthresh2 = -1.f;
@@ -70,6 +75,7 @@ int main(int argc, char **argv)
{ "thresh0", 1, 0, '5' }, { "thresh0", 1, 0, '5' },
{ "thresh1", 1, 0, '6' }, { "thresh1", 1, 0, '6' },
{ "thresh2", 1, 0, '7' }, { "thresh2", 1, 0, '7' },
{ "bl-transients", 0, 0, '8' },
{ 0, 0, 0 } { 0, 0, 0 }
}; };
@@ -86,13 +92,14 @@ int main(int argc, char **argv)
case 'R': realtime = true; break; case 'R': realtime = true; break;
case 'P': precise = true; break; case 'P': precise = true; break;
case '0': threaded = false; break; case '0': threaded = false; break;
case '1': transients = false; break; case '1': transients = NoTransients; break;
case '2': peaklock = false; break; case '2': peaklock = false; break;
case '3': longwin = true; break; case '3': longwin = true; break;
case '4': shortwin = true; break; case '4': shortwin = true; break;
case '5': fthresh0 = atof(optarg); break; case '5': fthresh0 = atof(optarg); break;
case '6': fthresh1 = atof(optarg); break; case '6': fthresh1 = atof(optarg); break;
case '7': fthresh2 = atof(optarg); break; case '7': fthresh2 = atof(optarg); break;
case '8': transients = BandLimitedTransients; break;
case 'c': crispness = atoi(optarg); break; case 'c': crispness = atoi(optarg); break;
default: break; default: break;
} }
@@ -146,10 +153,10 @@ int main(int argc, char **argv)
switch (crispness) { switch (crispness) {
case -1: crispness = 2; break; case -1: crispness = 2; break;
case 0: transients = false; peaklock = false; longwin = false; shortwin = false; break; case 0: transients = NoTransients; peaklock = false; longwin = false; shortwin = false; break;
case 1: transients = true; peaklock = false; longwin = false; shortwin = false; break; case 1: transients = Transients; peaklock = false; longwin = false; shortwin = false; break;
case 2: transients = true; peaklock = true; longwin = false; shortwin = false; break; case 2: transients = Transients; peaklock = true; longwin = false; shortwin = false; break;
case 3: transients = true; peaklock = false; longwin = false; shortwin = true; break; case 3: transients = Transients; peaklock = false; longwin = false; shortwin = true; break;
}; };
char *fileName = strdup(argv[optind++]); char *fileName = strdup(argv[optind++]);
@@ -188,12 +195,24 @@ int main(int argc, char **argv)
RubberBandStretcher::Options options = 0; RubberBandStretcher::Options options = 0;
if (realtime) options |= RubberBandStretcher::OptionProcessRealTime; if (realtime) options |= RubberBandStretcher::OptionProcessRealTime;
if (precise) options |= RubberBandStretcher::OptionStretchPrecise; if (precise) options |= RubberBandStretcher::OptionStretchPrecise;
if (!transients) options |= RubberBandStretcher::OptionTransientsSmooth; // if (!transients) options |= RubberBandStretcher::OptionTransientsSmooth;
if (!peaklock) options |= RubberBandStretcher::OptionPhaseIndependent; if (!peaklock) options |= RubberBandStretcher::OptionPhaseIndependent;
if (!threaded) options |= RubberBandStretcher::OptionThreadingNone; if (!threaded) options |= RubberBandStretcher::OptionThreadingNone;
if (longwin) options |= RubberBandStretcher::OptionWindowLong; if (longwin) options |= RubberBandStretcher::OptionWindowLong;
if (shortwin) options |= RubberBandStretcher::OptionWindowShort; if (shortwin) options |= RubberBandStretcher::OptionWindowShort;
switch (transients) {
case NoTransients:
options |= RubberBandStretcher::OptionTransientsSmooth;
break;
case BandLimitedTransients:
options |= RubberBandStretcher::OptionTransientsMixed;
break;
case Transients:
options |= RubberBandStretcher::OptionTransientsCrisp;
break;
}
if (pitchshift != 1.0) { if (pitchshift != 1.0) {
frequencyshift *= pow(2.0, pitchshift / 12); frequencyshift *= pow(2.0, pitchshift / 12);
} }