more MIDI work... still not there

This commit is contained in:
tildearrow 2022-03-29 16:09:15 -05:00
parent c26123e782
commit 77798f6ed7
6 changed files with 657 additions and 176 deletions

View file

@ -379,6 +379,7 @@ src/gui/editing.cpp
src/gui/editControls.cpp
src/gui/insEdit.cpp
src/gui/mixer.cpp
src/gui/midiMap.cpp
src/gui/newSong.cpp
src/gui/orders.cpp
src/gui/osc.cpp

View file

@ -492,12 +492,74 @@ struct UndoStep {
std::vector<UndoPatternData> pat;
};
// -1 = any
struct MIDIBind {
int type, channel, data1, data2;
int action;
MIDIBind():
type(-1),
channel(-1),
data1(-1),
data2(-1),
action(0) {}
};
struct MIDIMap {
// access method: map[type][channel][data1][data2];
// channel 16 = any
// data1 128 = any
// data2 128 = any
int**** map;
std::vector<MIDIBind> binds;
bool noteInput, volInput, rawVolume, polyInput, directChannel, programChange, midiClock, midiTimeCode;
// 0: disabled
//
// 1: C- C# D- D# E- F- F# G- G# A- A# B-
// o1 1 3 6 8 A
// 0 2 4 5 7 9 B
// C- C# D- D# E- F- F# G- G# A- A# B-
// o2 D F
// C E
//
// 2: C- C# D- D# E- F- F# G- G# A- A# B-
// o1 1 3 6 8 A
// 0 2 4 5 7 9 B
// C- C# D- D# E- F- F# G- G# A- A# B-
// o2 D F 2 4 6
// C E 0 1 3 5 7
//
// 3: C- C# D- D# E- F- F# G- G# A- A# B-
// o1 A B C D E
// 0 1 2 3 4 5 6
// C- C# D- D# E- F- F# G- G# A- A# B-
// o2 F
// 7 8 9
//
// 4: use dual CC for value input (nibble)
// 5: use 14-bit CC for value input (MSB/LSB)
int valueInputStyle;
int valueInputControlMSB; // on 4
int valueInputControlLSB; // on 4
float volExp;
void compile();
void deinit();
int at(TAMidiMessage& where);
bool read(String path);
bool write(String path);
MIDIMap():
map(NULL),
noteInput(true),
volInput(false),
rawVolume(false),
polyInput(false),
directChannel(false),
programChange(true),
midiClock(false),
midiTimeCode(false),
valueInputStyle(1),
volExp(1.0f) {}
};
struct Particle {
@ -572,6 +634,7 @@ class FurnaceGUI {
std::mutex midiLock;
std::queue<TAMidiMessage> midiQueue;
MIDIMap midiMap;
ImFont* mainFont;
ImFont* iconFont;

View file

@ -19,6 +19,7 @@
// guiConst: constants used in the GUI like arrays, strings and other stuff
#include "guiConst.h"
#include "gui.h"
#include "../engine/song.h"
const int opOrder[4]={
@ -123,6 +124,213 @@ const char* resampleStrats[]={
"best possible"
};
const char* guiActions[GUI_ACTION_MAX][2]={
{"GLOBAL_MIN", "---Global"},
{"OPEN", "Open file"},
{"OPEN_BACKUP", "Restore backup"},
{"SAVE", "Save file"},
{"SAVE_AS", "Save as"},
{"UNDO", "Undo"},
{"REDO", "Redo"},
{"PLAY_TOGGLE", "Play/Stop (toggle)"},
{"PLAY", "Play"},
{"STOP", "Stop"},
{"PLAY_REPEAT", "Play (repeat pattern)"},
{"PLAY_CURSOR", "Play from cursor"},
{"STEP_ONE", "Step row"},
{"OCTAVE_UP", "Octave up"},
{"OCTAVE_DOWN", "Octave down"},
{"INS_UP", "Previous instrument"},
{"INS_DOWN", "Next instrument"},
{"STEP_UP", "Increase edit step"},
{"STEP_DOWN", "Decrease edit step"},
{"TOGGLE_EDIT", "Toggle edit mode"},
{"METRONOME", "Metronome"},
{"REPEAT_PATTERN", "Toggle repeat pattern"},
{"FOLLOW_ORDERS", "Follow orders"},
{"FOLLOW_PATTERN", "Follow pattern"},
{"PANIC", "Panic"},
{"WINDOW_EDIT_CONTROLS", "Edit Controls"},
{"WINDOW_ORDERS", "Orders"},
{"WINDOW_INS_LIST", "Instrument List"},
{"WINDOW_INS_EDIT", "Instrument Editor"},
{"WINDOW_SONG_INFO", "Song Information"},
{"WINDOW_PATTERN", "Pattern"},
{"WINDOW_WAVE_LIST", "Wavetable List"},
{"WINDOW_WAVE_EDIT", "Wavetable Editor"},
{"WINDOW_SAMPLE_LIST", "Sample List"},
{"WINDOW_SAMPLE_EDIT", "Sample Editor"},
{"WINDOW_ABOUT", "About"},
{"WINDOW_SETTINGS", "Settings"},
{"WINDOW_MIXER", "Mixer"},
{"WINDOW_DEBUG", "Debug Menu"},
{"WINDOW_OSCILLOSCOPE", "Oscilloscope"},
{"WINDOW_VOL_METER", "Volume Meter"},
{"WINDOW_STATS", "Statistics"},
{"WINDOW_COMPAT_FLAGS", "Compatibility Flags"},
{"WINDOW_PIANO", "Piano"},
{"WINDOW_NOTES", "Song Comments"},
{"WINDOW_CHANNELS", "Channels"},
{"WINDOW_REGISTER_VIEW", "Register View"},
{"COLLAPSE_WINDOW", "Collapse/expand current window"},
{"CLOSE_WINDOW", "Close current window"},
{"GLOBAL_MAX", ""},
{"PAT_MIN", "---Pattern"},
{"PAT_NOTE_UP", "Transpose (+1)"},
{"PAT_NOTE_DOWN", "Transpose (-1)"},
{"PAT_OCTAVE_UP", "Transpose (+1 octave)"},
{"PAT_OCTAVE_DOWN", "Transpose (-1 octave)"},
{"PAT_SELECT_ALL", "Select all"},
{"PAT_CUT", "Cut"},
{"PAT_COPY", "Copy"},
{"PAT_PASTE", "Paste"},
{"PAT_PASTE_MIX", "Paste Mix (foreground)"},
{"PAT_PASTE_MIX_BG", "Paste Mix (background)"},
{"PAT_PASTE_FLOOD", "Paste Flood"},
{"PAT_PASTE_OVERFLOW", "Paste Overflow"},
{"PAT_CURSOR_UP", "Move cursor up"},
{"PAT_CURSOR_DOWN", "Move cursor down"},
{"PAT_CURSOR_LEFT", "Move cursor left"},
{"PAT_CURSOR_RIGHT", "Move cursor right"},
{"PAT_CURSOR_UP_ONE", "Move cursor up by one (override Edit Step)"},
{"PAT_CURSOR_DOWN_ONE", "Move cursor down by one (override Edit Step)"},
{"PAT_CURSOR_LEFT_CHANNEL", "Move cursor to previous channel"},
{"PAT_CURSOR_RIGHT_CHANNEL", "Move cursor to next channel"},
{"PAT_CURSOR_NEXT_CHANNEL", "Move cursor to previous channel (overflow)"},
{"PAT_CURSOR_PREVIOUS_CHANNEL", "Move cursor to next channel (overflow)"},
{"PAT_CURSOR_BEGIN", "Move cursor to beginning of pattern"},
{"PAT_CURSOR_END", "Move cursor to end of pattern"},
{"PAT_CURSOR_UP_COARSE", "Move cursor up (coarse)"},
{"PAT_CURSOR_DOWN_COARSE", "Move cursor down (coarse)"},
{"PAT_SELECTION_UP", "Expand selection upwards"},
{"PAT_SELECTION_DOWN", "Expand selection downwards"},
{"PAT_SELECTION_LEFT", "Expand selection to the left"},
{"PAT_SELECTION_RIGHT", "Expand selection to the right"},
{"PAT_SELECTION_UP_ONE", "Expand selection upwards by one (override Edit Step)"},
{"PAT_SELECTION_DOWN_ONE", "Expand selection downwards by one (override Edit Step)"},
{"PAT_SELECTION_BEGIN", "Expand selection to beginning of pattern"},
{"PAT_SELECTION_END", "Expand selection to end of pattern"},
{"PAT_SELECTION_UP_COARSE", "Expand selection upwards (coarse)"},
{"PAT_SELECTION_DOWN_COARSE", "Expand selection downwards (coarse)"},
{"PAT_DELETE", "Delete"},
{"PAT_PULL_DELETE", "Pull delete"},
{"PAT_INSERT", "Insert"},
{"PAT_MUTE_CURSOR", "Mute channel at cursor"},
{"PAT_SOLO_CURSOR", "Solo channel at cursor"},
{"PAT_UNMUTE_ALL", "Unmute all channels"},
{"PAT_NEXT_ORDER", "Go to next order"},
{"PAT_PREV_ORDER", "Go to previous order"},
{"PAT_COLLAPSE", "Collapse channel at cursor"},
{"PAT_INCREASE_COLUMNS", "Increase effect columns"},
{"PAT_DECREASE_COLUMNS", "Decrease effect columns"},
{"PAT_INTERPOLATE", "Interpolate"},
{"PAT_FADE", "Fade"},
{"PAT_INVERT_VALUES", "Invert values"},
{"PAT_FLIP_SELECTION", "Flip selection"},
{"PAT_COLLAPSE_ROWS", "Collapse rows"},
{"PAT_EXPAND_ROWS", "Expand rows"},
{"PAT_COLLAPSE_PAT", "Collapse pattern"},
{"PAT_EXPAND_PAT", "Expand pattern"},
{"PAT_COLLAPSE_SONG", "Collapse song"},
{"PAT_EXPAND_SONG", "Expand song"},
{"PAT_LATCH", "Set note input latch"},
{"PAT_MAX", ""},
{"INS_LIST_MIN", "---Instrument list"},
{"INS_LIST_ADD", "Add"},
{"INS_LIST_DUPLICATE", "Duplicate"},
{"INS_LIST_OPEN", "Open"},
{"INS_LIST_SAVE", "Save"},
{"INS_LIST_MOVE_UP", "Move up"},
{"INS_LIST_MOVE_DOWN", "Move down"},
{"INS_LIST_DELETE", "Delete"},
{"INS_LIST_EDIT", "Edit"},
{"INS_LIST_UP", "Cursor up"},
{"INS_LIST_DOWN", "Cursor down"},
{"INS_LIST_MAX", ""},
{"WAVE_LIST_MIN", "---Wavetable list"},
{"WAVE_LIST_ADD", "Add"},
{"WAVE_LIST_DUPLICATE", "Duplicate"},
{"WAVE_LIST_OPEN", "Open"},
{"WAVE_LIST_SAVE", "Save"},
{"WAVE_LIST_MOVE_UP", "Move up"},
{"WAVE_LIST_MOVE_DOWN", "Move down"},
{"WAVE_LIST_DELETE", "Delete"},
{"WAVE_LIST_EDIT", "Edit"},
{"WAVE_LIST_UP", "Cursor up"},
{"WAVE_LIST_DOWN", "Cursor down"},
{"WAVE_LIST_MAX", ""},
{"SAMPLE_LIST_MIN", "---Sample list"},
{"SAMPLE_LIST_ADD", "Add"},
{"SAMPLE_LIST_DUPLICATE", "Duplicate"},
{"SAMPLE_LIST_OPEN", "Open"},
{"SAMPLE_LIST_SAVE", "Save"},
{"SAMPLE_LIST_MOVE_UP", "Move up"},
{"SAMPLE_LIST_MOVE_DOWN", "Move down"},
{"SAMPLE_LIST_DELETE", "Delete"},
{"SAMPLE_LIST_EDIT", "Edit"},
{"SAMPLE_LIST_UP", "Cursor up"},
{"SAMPLE_LIST_DOWN", "Cursor down"},
{"SAMPLE_LIST_PREVIEW", "Preview"},
{"SAMPLE_LIST_STOP_PREVIEW", "Stop preview"},
{"SAMPLE_LIST_MAX", ""},
{"SAMPLE_MIN", "---Sample editor"},
{"SAMPLE_SELECT", "Edit mode: Select"},
{"SAMPLE_DRAW", "Edit mode: Draw"},
{"SAMPLE_CUT", "Cut"},
{"SAMPLE_COPY", "Copy"},
{"SAMPLE_PASTE", "Paste"},
{"SAMPLE_PASTE_REPLACE", "Paste replace"},
{"SAMPLE_PASTE_MIX", "Paste mix"},
{"SAMPLE_SELECT_ALL", "Select all"},
{"SAMPLE_RESIZE", "Resize"},
{"SAMPLE_RESAMPLE", "Resample"},
{"SAMPLE_AMPLIFY", "Amplify"},
{"SAMPLE_NORMALIZE", "Normalize"},
{"SAMPLE_FADE_IN", "Fade in"},
{"SAMPLE_FADE_OUT", "Fade out"},
{"SAMPLE_SILENCE", "Apply silence"},
{"SAMPLE_INSERT", "Insert silence"},
{"SAMPLE_DELETE", "Delete"},
{"SAMPLE_TRIM", "Trim"},
{"SAMPLE_REVERSE", "Reverse"},
{"SAMPLE_INVERT", "Invert"},
{"SAMPLE_SIGN", "Signed/unsigned exchange"},
{"SAMPLE_FILTER", "Apply filter"},
{"SAMPLE_PREVIEW", "Preview sample"},
{"SAMPLE_STOP_PREVIEW", "Stop sample preview"},
{"SAMPLE_ZOOM_IN", "Zoom in"},
{"SAMPLE_ZOOM_OUT", "Zoom out"},
{"SAMPLE_ZOOM_AUTO", "Toggle auto-zoom"},
{"SAMPLE_MAX", ""},
{"ORDERS_MIN", "---Orders"},
{"ORDERS_UP", "Previous order"},
{"ORDERS_DOWN", "Next order"},
{"ORDERS_LEFT", "Cursor left"},
{"ORDERS_RIGHT", "Cursor right"},
{"ORDERS_INCREASE", "Increase value"},
{"ORDERS_DECREASE", "Decrease value"},
{"ORDERS_EDIT_MODE", "Switch edit mode"},
{"ORDERS_LINK", "Toggle alter entire row"},
{"ORDERS_ADD", "Add"},
{"ORDERS_DUPLICATE", "Duplicate"},
{"ORDERS_DEEP_CLONE", "Deep clone"},
{"ORDERS_DUPLICATE_END", "Duplicate to end of song"},
{"ORDERS_DEEP_CLONE_END", "Deep clone to end of song"},
{"ORDERS_REMOVE", "Remove"},
{"ORDERS_MOVE_UP", "Move up"},
{"ORDERS_MOVE_DOWN", "Move down"},
{"ORDERS_REPLAY", "Replay"},
{"ORDERS_MAX", ""},
};
// define systems.
const int availableSystems[]={
DIV_SYSTEM_YM2612,
@ -169,3 +377,4 @@ const int availableSystems[]={
DIV_SYSTEM_VRC6,
0 // don't remove this last one!
};

View file

@ -27,3 +27,4 @@ extern const char* insTypes[];
extern const char* sampleDepths[17];
extern const char* resampleStrats[];
extern const int availableSystems[];
extern const char* guiActions[][2];

209
src/gui/midiMap.cpp Normal file
View file

@ -0,0 +1,209 @@
#include "gui.h"
#include "guiConst.h"
#include "../ta-log.h"
int MIDIMap::at(TAMidiMessage& where) {
if (map==NULL) return 0;
int type=(where.type>>4)-8;
int chan=where.type&15;
int data1=where.data[0];
int data2=where.data[1];
if (type<0) return 0;
if (map[type]==NULL) return 0;
int** chanMap=map[type][chan];
if (chanMap==NULL) {
chanMap=map[type][16];
if (chanMap==NULL) return 0;
}
int* dataMap=chanMap[data1];
if (dataMap==NULL) {
dataMap=chanMap[128];
if (dataMap==NULL) return 0;
}
int ret=dataMap[data2];
if (ret==0) {
ret=dataMap[128];
if (ret==0) { // maybe this is not the correct mapping
dataMap=chanMap[128];
if (dataMap==NULL) {
chanMap=map[type][16];
if (chanMap==NULL) return 0;
dataMap=chanMap[data1];
if (dataMap==NULL) {
dataMap=chanMap[128];
if (dataMap==NULL) return 0;
}
ret=dataMap[data2];
if (ret==0) {
ret=dataMap[128];
}
} else {
ret=dataMap[data2];
if (ret==0) {
ret=dataMap[128];
}
}
}
}
return ret;
}
bool MIDIMap::read(String path) {
char line[4096];
int curLine=1;
FILE* f=fopen(path.c_str(),"rb");
if (f==NULL) {
logE("error while loading MIDI mapping! %s\n",strerror(errno));
return false;
}
binds.clear();
while (fgets(line,4096,f)) {
char* nlPos=strrchr(line,'\n');
if (nlPos!=NULL) *nlPos=0;
if (strstr(line,"option")==line) {
char optionName[256];
char optionValue[256];
String optionNameS, optionValueS;
int result=sscanf(line,"option %255s %255s",optionName,optionValue);
if (result!=2) {
logW("MIDI map garbage data at line %d: %s\n",curLine,line);
break;
}
optionNameS=optionName;
optionValueS=optionValue;
try {
if (optionNameS=="noteInput") {
noteInput=std::stoi(optionValueS);
} else {
logW("MIDI map unknown option %s at line %d: %s\n",optionName,curLine,line);
}
} catch (std::out_of_range& e) {
logW("MIDI map invalid value %s for option %s at line %d: %s\n",optionValue,optionName,curLine,line);
} catch (std::invalid_argument& e) {
logW("MIDI map invalid value %s for option %s at line %d: %s\n",optionValue,optionName,curLine,line);
}
curLine++;
continue;
}
char bindAction[256];
MIDIBind bind;
int result=sscanf(line,"%d %d %d %d %255s",&bind.type,&bind.channel,&bind.data1,&bind.data2,bindAction);
if (result!=5 || result==EOF) {
logW("MIDI map garbage data at line %d: %s\n",curLine,line);
break;
}
bool foundAction=false;
for (int i=0; i<GUI_ACTION_MAX; i++) {
if (strcmp(bindAction,guiActions[i][0])==0) {
bind.action=i;
foundAction=true;
break;
}
}
if (!foundAction) {
logW("MIDI map unknown action %s at line %d: %s\n",bindAction,curLine,line);
break;
}
curLine++;
}
fclose(f);
return true;
}
#define WRITE_OPTION(x) fprintf(f,"option " #x "%d\n",x);
#define WRITE_FLOAT_OPTION(x) fprintf(f,"option " #x "%f\n",x);
bool MIDIMap::write(String path) {
FILE* f=fopen(path.c_str(),"wb");
if (f==NULL) {
logE("error while saving MIDI mapping! %s\n",strerror(errno));
return false;
}
WRITE_OPTION(noteInput);
WRITE_OPTION(volInput);
WRITE_OPTION(rawVolume);
WRITE_OPTION(polyInput);
WRITE_OPTION(directChannel);
WRITE_OPTION(programChange);
WRITE_OPTION(midiClock);
WRITE_OPTION(midiTimeCode);
WRITE_OPTION(valueInputStyle);
WRITE_OPTION(valueInputControlMSB);
WRITE_OPTION(valueInputControlLSB);
WRITE_FLOAT_OPTION(volExp);
for (MIDIBind& i: binds) {
if (fprintf(f,"%d %d %d %d %s\n",i.type,i.channel,i.data1,i.data2,guiActions[i.action][0])<0) {
logW("did not write MIDI mapping entirely! %s\n",strerror(errno));
break;
}
}
fclose(f);
return true;
}
void MIDIMap::deinit() {
if (map!=NULL) {
for (int i=0; i<8; i++) {
if (map[i]!=NULL) {
for (int j=0; j<17; j++) {
if (map[i][j]!=NULL) {
for (int k=0; k<129; k++) {
if (map[i][j][k]!=NULL) {
delete[] map[i][j][k];
}
}
delete[] map[i][j];
}
}
delete[] map[i];
}
}
delete[] map;
map=NULL;
}
}
void MIDIMap::compile() {
deinit();
map=new int***[8];
memset(map,0,sizeof(int***)*8);
for (MIDIBind& i: binds) {
if (i.type<8 || i.type>15) continue;
if (i.channel<0 || i.channel>16) continue;
if (i.data1<0 || i.data1>128) continue;
if (i.data2<0 || i.data2>128) continue;
if (map[i.type-8]==NULL) {
map[i.type-8]=new int**[17];
memset(map[i.type-8],0,sizeof(int**)*17);
}
if (map[i.type-8][i.channel]==NULL) {
map[i.type-8][i.channel]=new int*[129];
memset(map[i.type-8][i.channel],0,sizeof(int*)*129);
}
if (map[i.type-8][i.channel][i.data1]==NULL) {
map[i.type-8][i.channel][i.data1]=new int[129];
memset(map[i.type-8][i.channel][i.data1],0,sizeof(int)*129);
}
map[i.type-8][i.channel][i.data1][i.data2]=i.action;
logD("MIDI mapping %d %d %d %d to %d\n",i.type-8,i.channel,i.data1,i.data2,i.action);
}
}

View file

@ -21,13 +21,11 @@
#include "fonts.h"
#include "../ta-log.h"
#include "util.h"
#include "guiConst.h"
#include "ImGuiFileDialog.h"
#include "IconsFontAwesome4.h"
#include "misc/cpp/imgui_stdlib.h"
#include <SDL_keycode.h>
#include <SDL_scancode.h>
#include <fmt/printf.h>
#include <imgui.h>
#ifdef __APPLE__
#define FURKMOD_CMD FURKMOD_META
@ -102,10 +100,10 @@ const char* saaCores[]={
ImGui::EndTable(); \
}
#define UI_KEYBIND_CONFIG(what,label) \
#define UI_KEYBIND_CONFIG(what) \
ImGui::TableNextRow(); \
ImGui::TableNextColumn(); \
ImGui::Text(label); \
ImGui::TextUnformatted(guiActions[what][1]); \
ImGui::TableNextColumn(); \
if (ImGui::Button(fmt::sprintf("%s##KC_" #what,(bindSetPending && bindSetTarget==what)?"Press key...":getKeyName(actionKeys[what])).c_str())) { \
promptKey(what); \
@ -662,30 +660,30 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Global hotkeys")) {
KEYBIND_CONFIG_BEGIN("keysGlobal");
UI_KEYBIND_CONFIG(GUI_ACTION_OPEN,"Open file");
UI_KEYBIND_CONFIG(GUI_ACTION_OPEN_BACKUP,"Restore backup");
UI_KEYBIND_CONFIG(GUI_ACTION_SAVE,"Save file");
UI_KEYBIND_CONFIG(GUI_ACTION_SAVE_AS,"Save as");
UI_KEYBIND_CONFIG(GUI_ACTION_UNDO,"Undo");
UI_KEYBIND_CONFIG(GUI_ACTION_REDO,"Redo");
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_TOGGLE,"Play/Stop (toggle)");
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY,"Play");
UI_KEYBIND_CONFIG(GUI_ACTION_STOP,"Stop");
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_REPEAT,"Play (repeat pattern)");
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_CURSOR,"Play from cursor");
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_ONE,"Step row");
UI_KEYBIND_CONFIG(GUI_ACTION_OCTAVE_UP,"Octave up");
UI_KEYBIND_CONFIG(GUI_ACTION_OCTAVE_DOWN,"Octave down");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_UP,"Previous instrument");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_DOWN,"Next instrument");
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_UP,"Increase edit step");
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_DOWN,"Decrease edit step");
UI_KEYBIND_CONFIG(GUI_ACTION_TOGGLE_EDIT,"Toggle edit mode");
UI_KEYBIND_CONFIG(GUI_ACTION_METRONOME,"Metronome");
UI_KEYBIND_CONFIG(GUI_ACTION_REPEAT_PATTERN,"Toggle repeat pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_FOLLOW_ORDERS,"Follow orders");
UI_KEYBIND_CONFIG(GUI_ACTION_FOLLOW_PATTERN,"Follow pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PANIC,"Panic");
UI_KEYBIND_CONFIG(GUI_ACTION_OPEN);
UI_KEYBIND_CONFIG(GUI_ACTION_OPEN_BACKUP);
UI_KEYBIND_CONFIG(GUI_ACTION_SAVE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAVE_AS);
UI_KEYBIND_CONFIG(GUI_ACTION_UNDO);
UI_KEYBIND_CONFIG(GUI_ACTION_REDO);
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_TOGGLE);
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY);
UI_KEYBIND_CONFIG(GUI_ACTION_STOP);
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_REPEAT);
UI_KEYBIND_CONFIG(GUI_ACTION_PLAY_CURSOR);
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_ONE);
UI_KEYBIND_CONFIG(GUI_ACTION_OCTAVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_OCTAVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_STEP_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_TOGGLE_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_METRONOME);
UI_KEYBIND_CONFIG(GUI_ACTION_REPEAT_PATTERN);
UI_KEYBIND_CONFIG(GUI_ACTION_FOLLOW_ORDERS);
UI_KEYBIND_CONFIG(GUI_ACTION_FOLLOW_PATTERN);
UI_KEYBIND_CONFIG(GUI_ACTION_PANIC);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -693,31 +691,31 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Window activation")) {
KEYBIND_CONFIG_BEGIN("keysWindow");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_EDIT_CONTROLS,"Edit Controls");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_ORDERS,"Orders");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_INS_LIST,"Instrument List");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_INS_EDIT,"Instrument Editor");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SONG_INFO,"Song Information");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_PATTERN,"Pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_WAVE_LIST,"Wavetable List");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_WAVE_EDIT,"Wavetable Editor");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SAMPLE_LIST,"Sample List");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SAMPLE_EDIT,"Sample Editor");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_ABOUT,"About");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SETTINGS,"Settings");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_MIXER,"Mixer");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_DEBUG,"Debug Menu");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_OSCILLOSCOPE,"Oscilloscope");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_VOL_METER,"Volume Meter");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_STATS,"Statistics");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_COMPAT_FLAGS,"Compatibility Flags");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_PIANO,"Piano");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_NOTES,"Song Comments");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_CHANNELS,"Channels");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_REGISTER_VIEW,"Register View");
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_EDIT_CONTROLS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_ORDERS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_INS_LIST);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_INS_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SONG_INFO);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_PATTERN);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_WAVE_LIST);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_WAVE_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SAMPLE_LIST);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SAMPLE_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_ABOUT);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_SETTINGS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_MIXER);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_DEBUG);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_OSCILLOSCOPE);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_VOL_METER);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_STATS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_COMPAT_FLAGS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_PIANO);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_NOTES);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_CHANNELS);
UI_KEYBIND_CONFIG(GUI_ACTION_WINDOW_REGISTER_VIEW);
UI_KEYBIND_CONFIG(GUI_ACTION_COLLAPSE_WINDOW,"Collapse/expand current window");
UI_KEYBIND_CONFIG(GUI_ACTION_CLOSE_WINDOW,"Close current window");
UI_KEYBIND_CONFIG(GUI_ACTION_COLLAPSE_WINDOW);
UI_KEYBIND_CONFIG(GUI_ACTION_CLOSE_WINDOW);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -808,49 +806,49 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Pattern")) {
KEYBIND_CONFIG_BEGIN("keysPattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NOTE_UP,"Transpose (semitone up)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NOTE_DOWN,"Transpose (semitone down");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_OCTAVE_UP,"Transpose (octave up)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_OCTAVE_DOWN,"Transpose (octave down)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECT_ALL,"Select all");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CUT,"Cut");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_COPY,"Copy");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PASTE,"Paste");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP,"Move cursor up");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN,"Move cursor down");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_LEFT,"Move cursor left");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_RIGHT,"Move cursor right");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP_ONE,"Move cursor up by one (override Edit Step)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN_ONE,"Move cursor down by one (override Edit Step)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_LEFT_CHANNEL,"Move cursor to previous channel");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_RIGHT_CHANNEL,"Move cursor to next channel");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_PREVIOUS_CHANNEL,"Move cursor to previous channel (overflow)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_NEXT_CHANNEL,"Move cursor to next channel (overflow)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_BEGIN,"Move cursor to beginning of pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_END,"Move cursor to end of pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP_COARSE,"Move cursor up (coarse)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN_COARSE,"Move cursor down (coarse)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP,"Expand selection upwards");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN,"Expand selection downwards");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_LEFT,"Expand selection to the left");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_RIGHT,"Expand selection to the right");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP_ONE,"Expand selection upwards by one (override Edit Step)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN_ONE,"Expand selection downwards by one (override Edit Step)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_BEGIN,"Expand selection to beginning of pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_END,"Expand selection to end of pattern");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP_COARSE,"Expand selection upwards (coarse)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN_COARSE,"Expand selection downwards (coarse)");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_DELETE,"Delete");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PULL_DELETE,"Pull delete");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_INSERT,"Insert");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_MUTE_CURSOR,"Mute channel at cursor");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SOLO_CURSOR,"Solo channel at cursor");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_UNMUTE_ALL,"Unmute all channels");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NEXT_ORDER,"Go to next order");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PREV_ORDER,"Go to previous order");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_COLLAPSE,"Collapse channel at cursor");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_INCREASE_COLUMNS,"Increase effect columns");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_DECREASE_COLUMNS,"Decrease effect columns");
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NOTE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NOTE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_OCTAVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_OCTAVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECT_ALL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CUT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_COPY);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PASTE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_LEFT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_RIGHT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP_ONE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN_ONE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_LEFT_CHANNEL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_RIGHT_CHANNEL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_PREVIOUS_CHANNEL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_NEXT_CHANNEL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_BEGIN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_END);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_UP_COARSE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CURSOR_DOWN_COARSE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_LEFT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_RIGHT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP_ONE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN_ONE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_BEGIN);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_END);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_UP_COARSE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SELECTION_DOWN_COARSE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PULL_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_INSERT);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_MUTE_CURSOR);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_SOLO_CURSOR);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_UNMUTE_ALL);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_NEXT_ORDER);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_PREV_ORDER);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_COLLAPSE);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_INCREASE_COLUMNS);
UI_KEYBIND_CONFIG(GUI_ACTION_PAT_DECREASE_COLUMNS);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -858,16 +856,16 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Instrument list")) {
KEYBIND_CONFIG_BEGIN("keysInsList");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_ADD,"Add");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DUPLICATE,"Duplicate");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_OPEN,"Open");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_SAVE,"Save");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_UP,"Move up");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_DOWN,"Move down");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DELETE,"Delete");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_EDIT,"Edit");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_UP,"Cursor up");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DOWN,"Cursor down");
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_ADD);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DUPLICATE);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_OPEN);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_SAVE);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DOWN);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -875,16 +873,16 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Wavetable list")) {
KEYBIND_CONFIG_BEGIN("keysWaveList");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_ADD,"Add");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DUPLICATE,"Duplicate");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_OPEN,"Open");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_SAVE,"Save");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_MOVE_UP,"Move up");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_MOVE_DOWN,"Move down");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DELETE,"Delete");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_EDIT,"Edit");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_UP,"Cursor up");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DOWN,"Cursor down");
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_ADD);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DUPLICATE);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_OPEN);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_SAVE);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_MOVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_MOVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_WAVE_LIST_DOWN);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -892,18 +890,18 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Sample list")) {
KEYBIND_CONFIG_BEGIN("keysSampleList");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_ADD,"Add");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DUPLICATE,"Duplicate");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_OPEN,"Open");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_SAVE,"Save");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_MOVE_UP,"Move up");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_MOVE_DOWN,"Move down");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DELETE,"Delete");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_EDIT,"Edit");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_UP,"Cursor up");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DOWN,"Cursor down");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_PREVIEW,"Preview");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,"Stop preview");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_ADD);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DUPLICATE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_OPEN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_SAVE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_MOVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_MOVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_EDIT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_PREVIEW);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -911,23 +909,23 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Orders")) {
KEYBIND_CONFIG_BEGIN("keysOrders");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_UP,"Previous order");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DOWN,"Next order");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_LEFT,"Cursor left");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_RIGHT,"Cursor right");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_INCREASE,"Increase value");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DECREASE,"Decrease value");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_EDIT_MODE,"Switch edit mode");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_LINK,"Toggle alter entire row");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_ADD,"Add");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DUPLICATE,"Duplicate");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DEEP_CLONE,"Deep clone");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DUPLICATE_END,"Duplicate to end of song");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DEEP_CLONE_END,"Deep clone to end of song");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_REMOVE,"Remove");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_MOVE_UP,"Move up");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_MOVE_DOWN,"Move down");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_REPLAY,"Replay");
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_LEFT);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_RIGHT);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_INCREASE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DECREASE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_EDIT_MODE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_LINK);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_ADD);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DUPLICATE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DEEP_CLONE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DUPLICATE_END);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_DEEP_CLONE_END);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_REMOVE);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_MOVE_UP);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_MOVE_DOWN);
UI_KEYBIND_CONFIG(GUI_ACTION_ORDERS_REPLAY);
KEYBIND_CONFIG_END;
ImGui::TreePop();
@ -935,33 +933,33 @@ void FurnaceGUI::drawSettings() {
if (ImGui::TreeNode("Sample editor")) {
KEYBIND_CONFIG_BEGIN("keysSampleEdit");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SELECT,"Edit mode: Select");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_DRAW,"Edit mode: Draw");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_CUT,"Cut");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_COPY,"Copy");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE,"Paste");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE_REPLACE,"Paste replace");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE_MIX,"Paste mix");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SELECT_ALL,"Select all");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_RESIZE,"Resize");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_RESAMPLE,"Resample");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_AMPLIFY,"Amplify");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_NORMALIZE,"Normalize");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FADE_IN,"Fade in");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FADE_OUT,"Fade out");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_INSERT,"Insert silence");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SILENCE,"Apply silence");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_DELETE,"Delete");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_TRIM,"Trim");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_REVERSE,"Reverse");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_INVERT,"Invert");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SIGN,"Signed/unsigned exchange");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FILTER,"Apply filter");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PREVIEW,"Preview sample");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_STOP_PREVIEW,"Stop sample preview");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_IN,"Zoom in");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_OUT,"Zoom out");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_AUTO,"Toggle auto-zoom");
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SELECT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_DRAW);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_CUT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_COPY);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE_REPLACE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PASTE_MIX);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SELECT_ALL);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_RESIZE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_RESAMPLE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_AMPLIFY);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_NORMALIZE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FADE_IN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FADE_OUT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_INSERT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SILENCE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_DELETE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_TRIM);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_REVERSE);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_INVERT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_SIGN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_FILTER);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_PREVIEW);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_STOP_PREVIEW);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_IN);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_OUT);
UI_KEYBIND_CONFIG(GUI_ACTION_SAMPLE_ZOOM_AUTO);
KEYBIND_CONFIG_END;
ImGui::TreePop();