more work

This commit is contained in:
tildearrow 2023-12-05 17:06:46 -05:00
parent bf212779a7
commit 02bc89f8cb

View file

@ -1226,7 +1226,7 @@ void FurnaceGUI::drawSampleEdit() {
ImGui::SameLine(); ImGui::SameLine();
ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale)); ImGui::Dummy(ImVec2(4.0*dpiScale,dpiScale));
sameLineMaybe(); sameLineMaybe();
ImGui::Button(ICON_FUR_CROSSFADE "##Crossfade"); ImGui::Button(ICON_FUR_CROSSFADE "##CrossFade");
if (ImGui::IsItemHovered()) { if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("Crossfade loop points"); ImGui::SetTooltip("Crossfade loop points");
} }
@ -1237,59 +1237,59 @@ void FurnaceGUI::drawSampleEdit() {
if (ImGui::BeginPopupContextItem("SCrossFadeOpt",ImGuiPopupFlags_MouseButtonLeft)) { if (ImGui::BeginPopupContextItem("SCrossFadeOpt",ImGuiPopupFlags_MouseButtonLeft)) {
if (sampleCrossFadeLoopLength>sample->loopStart) sampleCrossFadeLoopLength=sample->loopStart; if (sampleCrossFadeLoopLength>sample->loopStart) sampleCrossFadeLoopLength=sample->loopStart;
if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) sampleCrossFadeLoopLength=sample->loopEnd-sample->loopStart; if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) sampleCrossFadeLoopLength=sample->loopEnd-sample->loopStart;
if (ImGui::SliderInt("Number of samples", &sampleCrossFadeLoopLength, 0, 100000)) { if (ImGui::SliderInt("Number of samples",&sampleCrossFadeLoopLength,0,100000)) {
if (sampleCrossFadeLoopLength<0) sampleCrossFadeLoopLength=0; if (sampleCrossFadeLoopLength<0) sampleCrossFadeLoopLength=0;
if (sampleCrossFadeLoopLength>sample->loopStart) sampleCrossFadeLoopLength=sample->loopStart; if (sampleCrossFadeLoopLength>sample->loopStart) sampleCrossFadeLoopLength=sample->loopStart;
if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) sampleCrossFadeLoopLength=sample->loopEnd-sample->loopStart; if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) sampleCrossFadeLoopLength=sample->loopEnd-sample->loopStart;
if (sampleCrossFadeLoopLength>100000) sampleCrossFadeLoopLength=100000; if (sampleCrossFadeLoopLength>100000) sampleCrossFadeLoopLength=100000;
} }
if (ImGui::SliderInt("Linear <-> Equal power", &sampleCrossFadeLoopLaw, 0, 100)) { if (ImGui::SliderInt("Linear <-> Equal power",&sampleCrossFadeLoopLaw,0,100)) {
if (sampleCrossFadeLoopLaw<0) sampleCrossFadeLoopLaw=0; if (sampleCrossFadeLoopLaw<0) sampleCrossFadeLoopLaw=0;
if (sampleCrossFadeLoopLaw>100) sampleCrossFadeLoopLaw=100; if (sampleCrossFadeLoopLaw>100) sampleCrossFadeLoopLaw=100;
} }
if (ImGui::Button("Apply")) { if (ImGui::Button("Apply")) {
if (sampleCrossFadeLoopLength>sample->loopStart) { if (sampleCrossFadeLoopLength>sample->loopStart) {
SAMPLE_WARN(warnLoop,"Crossfade: length would go out of bounds. Aborted..."); showError("Crossfade: length would go out of bounds. Aborted...");
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} } else if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) {
if (sampleCrossFadeLoopLength>(sample->loopEnd-sample->loopStart)) { showError("Crossfade: length would overflow loopStart. Try a smaller random value.");
SAMPLE_WARN(warnLoop,"Crossfade: length would overflow loopStart. Try a smaller random value.");
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} } else {
sample->prepareUndo(true); sample->prepareUndo(true);
e->lockEngine([this,sample]{ e->lockEngine([this,sample] {
SAMPLE_OP_BEGIN; SAMPLE_OP_BEGIN;
double l=1.0/(double)sampleCrossFadeLoopLength; double l=1.0/(double)sampleCrossFadeLoopLength;
double evar=1.0-sampleCrossFadeLoopLaw/200.0; double evar=1.0-sampleCrossFadeLoopLaw/200.0;
if (sample->depth==DIV_SAMPLE_DEPTH_8BIT) { if (sample->depth==DIV_SAMPLE_DEPTH_8BIT) {
unsigned int crossFadeInput=sample->loopStart-sampleCrossFadeLoopLength; unsigned int crossFadeInput=sample->loopStart-sampleCrossFadeLoopLength;
unsigned int crossFadeOutput=sample->loopEnd-sampleCrossFadeLoopLength; unsigned int crossFadeOutput=sample->loopEnd-sampleCrossFadeLoopLength;
for (int i=0;i<sampleCrossFadeLoopLength;i++) { for (int i=0; i<sampleCrossFadeLoopLength; i++) {
double f1=std::pow(i*l,evar); double f1=pow(i*l,evar);
double f2=std::pow((sampleCrossFadeLoopLength-i)*l, evar); double f2=pow((sampleCrossFadeLoopLength-i)*l,evar);
signed char out=(signed char)(((double)sample->data8[crossFadeInput])*f1+((double)sample->data8[crossFadeOutput])*f2); signed char out=(signed char)(((double)sample->data8[crossFadeInput])*f1+((double)sample->data8[crossFadeOutput])*f2);
sample->data8[crossFadeOutput]=out; sample->data8[crossFadeOutput]=out;
crossFadeInput++; crossFadeInput++;
crossFadeOutput++; crossFadeOutput++;
}
} else if (sample->depth==DIV_SAMPLE_DEPTH_16BIT) {
unsigned int crossFadeInput=sample->loopStart-sampleCrossFadeLoopLength;
unsigned int crossFadeOutput=sample->loopEnd-sampleCrossFadeLoopLength;
for (int i=0; i<sampleCrossFadeLoopLength; i++) {
double f1=std::pow(i*l,evar);
double f2=std::pow((sampleCrossFadeLoopLength-i)*l,evar);
short out=(short)(((double)sample->data16[crossFadeInput])*f1+((double)sample->data16[crossFadeOutput])*f2);
sample->data16[crossFadeOutput]=out;
crossFadeInput++;
crossFadeOutput++;
}
} }
} else if (sample->depth==DIV_SAMPLE_DEPTH_16BIT) { updateSampleTex=true;
unsigned int crossFadeInput=sample->loopStart-sampleCrossFadeLoopLength;
unsigned int crossFadeOutput=sample->loopEnd-sampleCrossFadeLoopLength;
for (int i=0;i<sampleCrossFadeLoopLength;i++) {
double f1=std::pow(i*l,evar);
double f2=std::pow((sampleCrossFadeLoopLength-i)*l,evar);
short out = (short)(((double)sample->data16[crossFadeInput])*f1+((double)sample->data16[crossFadeOutput])*f2);
sample->data16[crossFadeOutput]=out;
crossFadeInput++;
crossFadeOutput++;
}
}
updateSampleTex=true;
e->renderSamples(curSample); e->renderSamples(curSample);
}); });
MARK_MODIFIED; MARK_MODIFIED;
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
}
} }
ImGui::EndPopup(); ImGui::EndPopup();
} }