mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-22 20:45:11 +00:00
more MIDI work... still not there
This commit is contained in:
parent
c26123e782
commit
77798f6ed7
6 changed files with 657 additions and 176 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
@ -965,4 +1028,4 @@ class FurnaceGUI {
|
|||
FurnaceGUI();
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -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,
|
||||
|
@ -168,4 +376,5 @@ const int availableSystems[]={
|
|||
DIV_SYSTEM_VIC20,
|
||||
DIV_SYSTEM_VRC6,
|
||||
0 // don't remove this last one!
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -26,4 +26,5 @@ extern const char* pitchLabel[11];
|
|||
extern const char* insTypes[];
|
||||
extern const char* sampleDepths[17];
|
||||
extern const char* resampleStrats[];
|
||||
extern const int availableSystems[];
|
||||
extern const int availableSystems[];
|
||||
extern const char* guiActions[][2];
|
||||
|
|
209
src/gui/midiMap.cpp
Normal file
209
src/gui/midiMap.cpp
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
@ -2071,4 +2069,4 @@ void FurnaceGUI::applyUISettings() {
|
|||
|
||||
if (fileDialog!=NULL) delete fileDialog;
|
||||
fileDialog=new FurnaceGUIFileDialog(settings.sysFileDialog);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue