diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 6ae3fb8b7..9fb9f4042 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -254,6 +254,9 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) { if (ImGui::MenuItem("make instrument")) { doAction(GUI_ACTION_SAMPLE_MAKE_INS); } + if (ImGui::MenuItem("make me a drum kit")) { + doAction(GUI_ACTION_SAMPLE_LIST_MAKE_MAP); + } if (ImGui::MenuItem("duplicate")) { doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ac0e190f1..3a0ec51be 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5893,6 +5893,26 @@ bool FurnaceGUI::loop() { if (ImGui::BeginPopup("InsTypeList",ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) { char temp[1024]; + if (displayInsTypeListMakeInsSample==-2) { + ImGui::Text("Drum kit mode:"); + if (ImGui::RadioButton("Normal",!makeDrumkitMode)) { + makeDrumkitMode=false; + } + if (ImGui::RadioButton("12 samples per octave",makeDrumkitMode)) { + makeDrumkitMode=true; + } + + if (!makeDrumkitMode) { + ImGui::Text("Starting octave"); + ImGui::SameLine(); + if (ImGui::InputInt("##DKOctave",&makeDrumkitOctave,1,3)) { + if (makeDrumkitOctave<0) makeDrumkitOctave=0; + if (makeDrumkitOctave>9) makeDrumkitOctave=9; + } + } + + ImGui::Separator(); + } for (DivInstrumentType& i: makeInsTypeList) { strncpy(temp,insTypes[i][0],1023); if (ImGui::MenuItem(temp)) { @@ -5907,10 +5927,24 @@ bool FurnaceGUI::loop() { e->song.ins[curIns]->amiga.useNoteMap=true; if (i!=DIV_INS_AMIGA) e->song.ins[curIns]->amiga.useSample=true; - for (int j=0; j<120; j++) { - e->song.ins[curIns]->amiga.noteMap[i].freq=48; - e->song.ins[curIns]->amiga.noteMap[i].map=j; - e->song.ins[curIns]->amiga.noteMap[i].dpcmFreq=15; + if (makeDrumkitMode) { + for (int j=0; j<120; j++) { + e->song.ins[curIns]->amiga.noteMap[j].freq=48; + e->song.ins[curIns]->amiga.noteMap[j].dpcmFreq=15; + e->song.ins[curIns]->amiga.noteMap[j].map=j%12; + if ((j%12)>=e->song.sampleLen) continue; + } + } else { + int index=-makeDrumkitOctave*12; + for (int j=0; j<120; j++) { + e->song.ins[curIns]->amiga.noteMap[j].freq=48; + e->song.ins[curIns]->amiga.noteMap[j].dpcmFreq=15; + if (index<0 || index>=e->song.sampleLen) { + index++; + continue; + } + e->song.ins[curIns]->amiga.noteMap[j].map=index++; + } } nextWindow=GUI_WINDOW_INS_EDIT; @@ -7267,6 +7301,7 @@ FurnaceGUI::FurnaceGUI(): killGraphics(false), safeMode(false), midiWakeUp(true), + makeDrumkitMode(false), audioEngineChanged(false), settingsChanged(false), debugFFT(false), @@ -7277,6 +7312,7 @@ FurnaceGUI::FurnaceGUI(): macroPointSize(16), waveEditStyle(0), displayInsTypeListMakeInsSample(-1), + makeDrumkitOctave(3), mobileEditPage(0), wheelCalmDown(0), shallDetectScale(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index f24cb68ff..badd269ed 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1477,6 +1477,7 @@ class FurnaceGUI { bool killGraphics; bool safeMode; bool midiWakeUp; + bool makeDrumkitMode; bool audioEngineChanged, settingsChanged, debugFFT; bool willExport[DIV_MAX_CHIPS]; int vgmExportVersion; @@ -1486,6 +1487,7 @@ class FurnaceGUI { int macroPointSize; int waveEditStyle; int displayInsTypeListMakeInsSample; + int makeDrumkitOctave; int mobileEditPage; int wheelCalmDown; int shallDetectScale;