diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index e006f01fd..8f801533d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1364,6 +1364,7 @@ void FurnaceGUI::actualSampleList() { ImGui::TableNextColumn(); if (ImGui::Selectable(fmt::sprintf("%d: %s##_SAM%d",i,sample->name,i).c_str(),curSample==i)) { curSample=i; + updateSampleTex=true; } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Bank %d: %s",i/12,sampleNote[i%12]); @@ -7094,7 +7095,9 @@ FurnaceGUI::FurnaceGUI(): scaleMax(100.0f), fadeMode(false), randomMode(false), - oldOrdersLen(0) { + oldOrdersLen(0), + sampleZoom(1.0), + samplePos(0) { // octave 1 /* diff --git a/src/gui/gui.h b/src/gui/gui.h index 677f2b54e..c1ce40e2f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -714,6 +714,11 @@ class FurnaceGUI { std::deque undoHist; std::deque redoHist; + // sample editor specific + double sampleZoom; + int samplePos; + + // visualizer float keyHit[DIV_MAX_CHANS]; int lastIns[DIV_MAX_CHANS]; diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 6592e2151..e6d156e7b 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -45,6 +45,7 @@ void FurnaceGUI::drawSampleEdit() { } } ImGui::Text("Name"); + ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::InputText("##SampleName",&sample->name); @@ -97,6 +98,18 @@ void FurnaceGUI::drawSampleEdit() { ImGui::EndTable(); } + if (ImGui::InputDouble("Zoom",&sampleZoom,0.1,2.0)) { + if (sampleZoom<0.01) sampleZoom=0.01; + + updateSampleTex=true; + } + if (ImGui::InputInt("Pos",&samplePos,1,10)) { + if (samplePos>=(int)sample->samples) samplePos=sample->samples-1; + if (samplePos<0) samplePos=0; + + updateSampleTex=true; + } + /* if (ImGui::Button("Apply")) { e->renderSamplesP(); @@ -112,7 +125,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::Separator(); ImVec2 avail=ImGui::GetContentRegionAvail(); - //int availX=avail.x; + int availX=avail.x; int availY=avail.y; if (sampleTex==NULL || sampleTexW!=avail.x || sampleTexH!=avail.y) { @@ -122,7 +135,7 @@ void FurnaceGUI::drawSampleEdit() { } if (avail.x>=1 && avail.y>=1) { logD("recreating sample texture.\n"); - sampleTex=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ARGB8888,SDL_TEXTUREACCESS_STREAMING,avail.x,avail.y); + sampleTex=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ABGR8888,SDL_TEXTUREACCESS_STREAMING,avail.x,avail.y); sampleTexW=avail.x; sampleTexH=avail.y; if (sampleTex==NULL) { @@ -135,17 +148,45 @@ void FurnaceGUI::drawSampleEdit() { if (sampleTex!=NULL) { if (updateSampleTex) { - unsigned char* data=NULL; + unsigned int* data=NULL; int pitch=0; logD("updating sample texture.\n"); if (SDL_LockTexture(sampleTex,NULL,(void**)&data,&pitch)!=0) { logE("error while locking sample texture! %s\n",SDL_GetError()); } else { - for (int i=0; i=sample->samples) break; + int y1, y2; + int totalAdvance=0; + y1=((unsigned short)sample->data16[xCoarse]^0x8000)*availY/65536; + xFine+=xAdvanceFine; + if (xFine>=16777216) { + xFine-=16777216; + totalAdvance++; + } + totalAdvance+=xAdvanceCoarse; + if (xCoarse>=sample->samples) break; + do { + y2=((unsigned short)sample->data16[xCoarse]^0x8000)*availY/65536; + if (y1>y2) { + y2^=y1; + y1^=y2; + y2^=y1; + } + for (int j=y1; j<=y2; j++) { + data[i+availX*j]=lineColor; + } + if (totalAdvance>0) xCoarse++; + } while ((totalAdvance--)>0); } SDL_UnlockTexture(sampleTex); }