furnace/src/gui/gui.h

1413 lines
38 KiB
C
Raw Normal View History

2022-02-15 03:12:20 +00:00
/**
* Furnace Tracker - multi-system chiptune tracker
* Copyright (C) 2021-2022 tildearrow and contributors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _FUR_GUI_H
#define _FUR_GUI_H
2021-12-11 07:10:09 +00:00
#include "../engine/engine.h"
2022-05-21 23:36:15 +00:00
#include "../engine/waveSynth.h"
2021-12-11 08:11:40 +00:00
#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_sdlrenderer.h"
#include <SDL.h>
2021-12-24 23:27:55 +00:00
#include <deque>
2022-03-02 07:22:51 +00:00
#include <initializer_list>
2021-12-14 22:45:37 +00:00
#include <map>
2022-03-21 19:11:28 +00:00
#include <future>
#include <mutex>
#include <vector>
2021-12-11 07:10:09 +00:00
#include "fileDialog.h"
2022-03-01 03:42:52 +00:00
#define rightClickable if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) ImGui::SetKeyboardFocusHere(-1);
#define ctrlWheeling ((ImGui::IsKeyDown(ImGuiKey_LeftCtrl) || ImGui::IsKeyDown(ImGuiKey_RightCtrl)) && wheelY!=0)
2022-03-01 03:42:52 +00:00
#define handleUnimportant if (settings.insFocusesPattern && patternOpen) {nextWindow=GUI_WINDOW_PATTERN;}
#define unimportant(x) if (x) {handleUnimportant}
#define MARK_MODIFIED modified=true;
2022-04-16 23:35:25 +00:00
#define WAKE_UP drawHalt=16;
#define TOGGLE_COLOR(x) ((x)?uiColors[GUI_COLOR_TOGGLE_ON]:uiColors[GUI_COLOR_TOGGLE_OFF])
#define BIND_FOR(x) getKeyName(actionKeys[x],true).c_str()
// TODO:
// - add colors for FM envelope and waveform
// - maybe add "alternate" color for FM modulators/carriers (a bit difficult)
2021-12-13 22:09:46 +00:00
enum FurnaceGUIColors {
GUI_COLOR_BACKGROUND=0,
GUI_COLOR_FRAME_BACKGROUND,
GUI_COLOR_MODAL_BACKDROP,
2021-12-13 22:09:46 +00:00
GUI_COLOR_HEADER,
GUI_COLOR_TEXT,
GUI_COLOR_ACCENT_PRIMARY,
GUI_COLOR_ACCENT_SECONDARY,
2022-04-06 05:34:26 +00:00
GUI_COLOR_BORDER,
GUI_COLOR_BORDER_SHADOW,
GUI_COLOR_TOGGLE_OFF,
GUI_COLOR_TOGGLE_ON,
GUI_COLOR_EDITING,
2022-01-27 06:04:26 +00:00
GUI_COLOR_SONG_LOOP,
GUI_COLOR_FILE_DIR,
GUI_COLOR_FILE_SONG_NATIVE,
GUI_COLOR_FILE_SONG_IMPORT,
GUI_COLOR_FILE_INSTR,
GUI_COLOR_FILE_AUDIO,
GUI_COLOR_FILE_WAVE,
GUI_COLOR_FILE_VGM,
GUI_COLOR_FILE_FONT,
GUI_COLOR_FILE_OTHER,
GUI_COLOR_OSC_BG1,
GUI_COLOR_OSC_BG2,
GUI_COLOR_OSC_BG3,
GUI_COLOR_OSC_BG4,
GUI_COLOR_OSC_BORDER,
GUI_COLOR_OSC_WAVE,
GUI_COLOR_OSC_WAVE_PEAK,
GUI_COLOR_OSC_REF,
GUI_COLOR_OSC_GUIDE,
2022-01-29 23:56:08 +00:00
GUI_COLOR_VOLMETER_LOW,
GUI_COLOR_VOLMETER_HIGH,
GUI_COLOR_VOLMETER_PEAK,
GUI_COLOR_ORDER_ROW_INDEX,
GUI_COLOR_ORDER_ACTIVE,
GUI_COLOR_ORDER_SIMILAR,
GUI_COLOR_ORDER_INACTIVE,
GUI_COLOR_FM_ALG_BG,
GUI_COLOR_FM_ALG_LINE,
GUI_COLOR_FM_MOD,
GUI_COLOR_FM_PRIMARY_MOD,
GUI_COLOR_FM_SECONDARY_MOD,
GUI_COLOR_FM_BORDER_MOD,
GUI_COLOR_FM_BORDER_SHADOW_MOD,
GUI_COLOR_FM_CAR,
GUI_COLOR_FM_PRIMARY_CAR,
GUI_COLOR_FM_SECONDARY_CAR,
GUI_COLOR_FM_BORDER_CAR,
GUI_COLOR_FM_BORDER_SHADOW_CAR,
GUI_COLOR_FM_ENVELOPE,
GUI_COLOR_FM_ENVELOPE_SUS_GUIDE,
GUI_COLOR_FM_ENVELOPE_RELEASE,
GUI_COLOR_FM_SSG,
GUI_COLOR_FM_WAVE,
GUI_COLOR_MACRO_VOLUME,
GUI_COLOR_MACRO_PITCH,
GUI_COLOR_MACRO_OTHER,
GUI_COLOR_MACRO_WAVE,
2021-12-29 04:10:30 +00:00
GUI_COLOR_INSTR_STD,
GUI_COLOR_INSTR_FM,
2022-01-09 22:48:09 +00:00
GUI_COLOR_INSTR_GB,
GUI_COLOR_INSTR_C64,
GUI_COLOR_INSTR_AMIGA,
GUI_COLOR_INSTR_PCE,
GUI_COLOR_INSTR_AY,
2022-01-14 05:02:10 +00:00
GUI_COLOR_INSTR_AY8930,
2022-01-14 20:21:57 +00:00
GUI_COLOR_INSTR_TIA,
2022-01-15 04:26:22 +00:00
GUI_COLOR_INSTR_SAA1099,
GUI_COLOR_INSTR_VIC,
GUI_COLOR_INSTR_PET,
GUI_COLOR_INSTR_VRC6,
GUI_COLOR_INSTR_OPLL,
GUI_COLOR_INSTR_OPL,
GUI_COLOR_INSTR_FDS,
GUI_COLOR_INSTR_VBOY,
GUI_COLOR_INSTR_N163,
GUI_COLOR_INSTR_SCC,
GUI_COLOR_INSTR_OPZ,
GUI_COLOR_INSTR_POKEY,
GUI_COLOR_INSTR_BEEPER,
GUI_COLOR_INSTR_SWAN,
2022-02-20 17:15:15 +00:00
GUI_COLOR_INSTR_MIKEY,
2022-03-10 22:46:40 +00:00
GUI_COLOR_INSTR_VERA,
GUI_COLOR_INSTR_X1_010,
GUI_COLOR_INSTR_VRC6_SAW,
GUI_COLOR_INSTR_ES5506,
GUI_COLOR_INSTR_MULTIPCM,
GUI_COLOR_INSTR_SNES,
GUI_COLOR_INSTR_SU,
GUI_COLOR_INSTR_NAMCO,
2022-01-09 22:48:09 +00:00
GUI_COLOR_INSTR_UNKNOWN,
2021-12-23 16:29:11 +00:00
GUI_COLOR_CHANNEL_FM,
GUI_COLOR_CHANNEL_PULSE,
GUI_COLOR_CHANNEL_NOISE,
GUI_COLOR_CHANNEL_WAVE,
GUI_COLOR_CHANNEL_PCM,
2021-12-23 22:09:33 +00:00
GUI_COLOR_CHANNEL_OP,
GUI_COLOR_CHANNEL_MUTED,
GUI_COLOR_PATTERN_PLAY_HEAD,
2021-12-23 16:29:11 +00:00
GUI_COLOR_PATTERN_CURSOR,
GUI_COLOR_PATTERN_CURSOR_HOVER,
GUI_COLOR_PATTERN_CURSOR_ACTIVE,
GUI_COLOR_PATTERN_SELECTION,
GUI_COLOR_PATTERN_SELECTION_HOVER,
GUI_COLOR_PATTERN_SELECTION_ACTIVE,
2021-12-13 22:09:46 +00:00
GUI_COLOR_PATTERN_HI_1,
GUI_COLOR_PATTERN_HI_2,
GUI_COLOR_PATTERN_ROW_INDEX,
GUI_COLOR_PATTERN_ROW_INDEX_HI1,
GUI_COLOR_PATTERN_ROW_INDEX_HI2,
2021-12-13 22:09:46 +00:00
GUI_COLOR_PATTERN_ACTIVE,
GUI_COLOR_PATTERN_INACTIVE,
GUI_COLOR_PATTERN_ACTIVE_HI1,
GUI_COLOR_PATTERN_INACTIVE_HI1,
GUI_COLOR_PATTERN_ACTIVE_HI2,
GUI_COLOR_PATTERN_INACTIVE_HI2,
2021-12-13 22:09:46 +00:00
GUI_COLOR_PATTERN_INS,
GUI_COLOR_PATTERN_INS_WARN,
GUI_COLOR_PATTERN_INS_ERROR,
2021-12-13 22:09:46 +00:00
GUI_COLOR_PATTERN_VOLUME_MAX,
GUI_COLOR_PATTERN_VOLUME_HALF,
GUI_COLOR_PATTERN_VOLUME_MIN,
GUI_COLOR_PATTERN_EFFECT_INVALID,
GUI_COLOR_PATTERN_EFFECT_PITCH,
GUI_COLOR_PATTERN_EFFECT_VOLUME,
GUI_COLOR_PATTERN_EFFECT_PANNING,
GUI_COLOR_PATTERN_EFFECT_SONG,
GUI_COLOR_PATTERN_EFFECT_TIME,
GUI_COLOR_PATTERN_EFFECT_SPEED,
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
GUI_COLOR_PATTERN_EFFECT_MISC,
2022-05-17 20:20:56 +00:00
GUI_COLOR_PIANO_BACKGROUND,
GUI_COLOR_PIANO_KEY_BOTTOM,
GUI_COLOR_PIANO_KEY_TOP,
GUI_COLOR_PIANO_KEY_BOTTOM_HIT,
GUI_COLOR_PIANO_KEY_TOP_HIT,
GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE,
GUI_COLOR_PIANO_KEY_TOP_ACTIVE,
GUI_COLOR_LOGLEVEL_ERROR,
GUI_COLOR_LOGLEVEL_WARNING,
GUI_COLOR_LOGLEVEL_INFO,
GUI_COLOR_LOGLEVEL_DEBUG,
GUI_COLOR_LOGLEVEL_TRACE,
GUI_COLOR_EE_VALUE,
2021-12-21 07:30:09 +00:00
GUI_COLOR_PLAYBACK_STAT,
2021-12-13 22:09:46 +00:00
GUI_COLOR_MAX
};
2021-12-14 22:45:37 +00:00
enum FurnaceGUIWindows {
GUI_WINDOW_NOTHING=0,
2021-12-15 22:32:08 +00:00
GUI_WINDOW_EDIT_CONTROLS,
2021-12-14 22:45:37 +00:00
GUI_WINDOW_SONG_INFO,
GUI_WINDOW_ORDERS,
GUI_WINDOW_INS_LIST,
GUI_WINDOW_PATTERN,
GUI_WINDOW_INS_EDIT,
GUI_WINDOW_WAVE_LIST,
GUI_WINDOW_WAVE_EDIT,
GUI_WINDOW_SAMPLE_LIST,
GUI_WINDOW_SAMPLE_EDIT,
GUI_WINDOW_MIXER,
GUI_WINDOW_ABOUT,
GUI_WINDOW_SETTINGS,
GUI_WINDOW_DEBUG,
2022-02-12 07:14:25 +00:00
GUI_WINDOW_OSCILLOSCOPE,
GUI_WINDOW_VOL_METER,
GUI_WINDOW_STATS,
GUI_WINDOW_COMPAT_FLAGS,
GUI_WINDOW_PIANO,
GUI_WINDOW_NOTES,
GUI_WINDOW_CHANNELS,
GUI_WINDOW_REGISTER_VIEW,
2022-04-19 23:44:05 +00:00
GUI_WINDOW_LOG,
GUI_WINDOW_EFFECT_LIST,
GUI_WINDOW_CHAN_OSC,
GUI_WINDOW_SUBSONGS
2021-12-14 22:45:37 +00:00
};
enum FurnaceGUIFileDialogs {
GUI_FILE_OPEN,
GUI_FILE_SAVE,
GUI_FILE_SAVE_DMF_LEGACY,
2022-01-19 08:15:20 +00:00
GUI_FILE_INS_OPEN,
2022-05-05 03:55:11 +00:00
GUI_FILE_INS_OPEN_REPLACE,
2022-01-19 08:15:20 +00:00
GUI_FILE_INS_SAVE,
GUI_FILE_WAVE_OPEN,
GUI_FILE_WAVE_SAVE,
GUI_FILE_SAMPLE_OPEN,
GUI_FILE_SAMPLE_SAVE,
GUI_FILE_EXPORT_AUDIO_ONE,
GUI_FILE_EXPORT_AUDIO_PER_SYS,
GUI_FILE_EXPORT_AUDIO_PER_CHANNEL,
GUI_FILE_EXPORT_VGM,
GUI_FILE_EXPORT_ROM,
GUI_FILE_LOAD_MAIN_FONT,
GUI_FILE_LOAD_PAT_FONT,
GUI_FILE_IMPORT_COLORS,
GUI_FILE_IMPORT_KEYBINDS,
GUI_FILE_IMPORT_LAYOUT,
GUI_FILE_EXPORT_COLORS,
GUI_FILE_EXPORT_KEYBINDS,
GUI_FILE_EXPORT_LAYOUT,
GUI_FILE_YRW801_ROM_OPEN,
GUI_FILE_TG100_ROM_OPEN,
GUI_FILE_MU5_ROM_OPEN
};
2021-12-30 23:52:36 +00:00
enum FurnaceGUIWarnings {
GUI_WARN_QUIT,
GUI_WARN_NEW,
2022-01-29 06:22:32 +00:00
GUI_WARN_OPEN,
2022-03-21 19:32:33 +00:00
GUI_WARN_OPEN_BACKUP,
GUI_WARN_OPEN_DROP,
GUI_WARN_RESET_LAYOUT,
GUI_WARN_RESET_COLORS,
GUI_WARN_RESET_KEYBINDS,
GUI_WARN_CLOSE_SETTINGS,
2022-04-24 21:57:58 +00:00
GUI_WARN_CLEAR,
GUI_WARN_SUBSONG_DEL,
GUI_WARN_GENERIC
2021-12-30 23:52:36 +00:00
};
2022-02-10 06:45:26 +00:00
enum FurnaceGUIFMAlgs {
FM_ALGS_4OP,
FM_ALGS_2OP_OPL,
FM_ALGS_4OP_OPL
};
enum FurnaceGUIActions {
2022-02-11 06:56:59 +00:00
GUI_ACTION_GLOBAL_MIN=0,
GUI_ACTION_OPEN,
2022-03-21 19:32:33 +00:00
GUI_ACTION_OPEN_BACKUP,
GUI_ACTION_SAVE,
GUI_ACTION_SAVE_AS,
GUI_ACTION_UNDO,
GUI_ACTION_REDO,
GUI_ACTION_PLAY_TOGGLE,
GUI_ACTION_PLAY,
GUI_ACTION_STOP,
GUI_ACTION_PLAY_REPEAT,
GUI_ACTION_PLAY_CURSOR,
GUI_ACTION_STEP_ONE,
GUI_ACTION_OCTAVE_UP,
GUI_ACTION_OCTAVE_DOWN,
GUI_ACTION_INS_UP,
GUI_ACTION_INS_DOWN,
GUI_ACTION_STEP_UP,
GUI_ACTION_STEP_DOWN,
GUI_ACTION_TOGGLE_EDIT,
GUI_ACTION_METRONOME,
GUI_ACTION_REPEAT_PATTERN,
GUI_ACTION_FOLLOW_ORDERS,
GUI_ACTION_FOLLOW_PATTERN,
2022-04-17 06:57:50 +00:00
GUI_ACTION_FULLSCREEN,
GUI_ACTION_TX81Z_REQUEST,
GUI_ACTION_PANIC,
GUI_ACTION_WINDOW_EDIT_CONTROLS,
GUI_ACTION_WINDOW_ORDERS,
GUI_ACTION_WINDOW_INS_LIST,
GUI_ACTION_WINDOW_INS_EDIT,
GUI_ACTION_WINDOW_SONG_INFO,
GUI_ACTION_WINDOW_PATTERN,
GUI_ACTION_WINDOW_WAVE_LIST,
GUI_ACTION_WINDOW_WAVE_EDIT,
GUI_ACTION_WINDOW_SAMPLE_LIST,
GUI_ACTION_WINDOW_SAMPLE_EDIT,
GUI_ACTION_WINDOW_ABOUT,
GUI_ACTION_WINDOW_SETTINGS,
GUI_ACTION_WINDOW_MIXER,
GUI_ACTION_WINDOW_DEBUG,
2022-02-12 07:14:25 +00:00
GUI_ACTION_WINDOW_OSCILLOSCOPE,
GUI_ACTION_WINDOW_VOL_METER,
GUI_ACTION_WINDOW_STATS,
GUI_ACTION_WINDOW_COMPAT_FLAGS,
GUI_ACTION_WINDOW_PIANO,
GUI_ACTION_WINDOW_NOTES,
GUI_ACTION_WINDOW_CHANNELS,
GUI_ACTION_WINDOW_REGISTER_VIEW,
GUI_ACTION_WINDOW_LOG,
2022-04-19 23:44:05 +00:00
GUI_ACTION_WINDOW_EFFECT_LIST,
GUI_ACTION_WINDOW_CHAN_OSC,
GUI_ACTION_WINDOW_SUBSONGS,
GUI_ACTION_COLLAPSE_WINDOW,
GUI_ACTION_CLOSE_WINDOW,
2022-02-11 06:56:59 +00:00
GUI_ACTION_GLOBAL_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_MIN,
GUI_ACTION_PAT_NOTE_UP,
GUI_ACTION_PAT_NOTE_DOWN,
GUI_ACTION_PAT_OCTAVE_UP,
GUI_ACTION_PAT_OCTAVE_DOWN,
GUI_ACTION_PAT_VALUE_UP,
GUI_ACTION_PAT_VALUE_DOWN,
GUI_ACTION_PAT_VALUE_UP_COARSE,
GUI_ACTION_PAT_VALUE_DOWN_COARSE,
GUI_ACTION_PAT_SELECT_ALL,
GUI_ACTION_PAT_CUT,
GUI_ACTION_PAT_COPY,
GUI_ACTION_PAT_PASTE,
GUI_ACTION_PAT_PASTE_MIX,
GUI_ACTION_PAT_PASTE_MIX_BG,
GUI_ACTION_PAT_PASTE_FLOOD,
GUI_ACTION_PAT_PASTE_OVERFLOW,
GUI_ACTION_PAT_CURSOR_UP,
GUI_ACTION_PAT_CURSOR_DOWN,
GUI_ACTION_PAT_CURSOR_LEFT,
GUI_ACTION_PAT_CURSOR_RIGHT,
GUI_ACTION_PAT_CURSOR_UP_ONE,
GUI_ACTION_PAT_CURSOR_DOWN_ONE,
GUI_ACTION_PAT_CURSOR_LEFT_CHANNEL,
GUI_ACTION_PAT_CURSOR_RIGHT_CHANNEL,
GUI_ACTION_PAT_CURSOR_NEXT_CHANNEL,
GUI_ACTION_PAT_CURSOR_PREVIOUS_CHANNEL,
GUI_ACTION_PAT_CURSOR_BEGIN,
GUI_ACTION_PAT_CURSOR_END,
GUI_ACTION_PAT_CURSOR_UP_COARSE,
GUI_ACTION_PAT_CURSOR_DOWN_COARSE,
GUI_ACTION_PAT_SELECTION_UP,
GUI_ACTION_PAT_SELECTION_DOWN,
GUI_ACTION_PAT_SELECTION_LEFT,
GUI_ACTION_PAT_SELECTION_RIGHT,
GUI_ACTION_PAT_SELECTION_UP_ONE,
GUI_ACTION_PAT_SELECTION_DOWN_ONE,
GUI_ACTION_PAT_SELECTION_BEGIN,
GUI_ACTION_PAT_SELECTION_END,
GUI_ACTION_PAT_SELECTION_UP_COARSE,
GUI_ACTION_PAT_SELECTION_DOWN_COARSE,
GUI_ACTION_PAT_DELETE,
GUI_ACTION_PAT_PULL_DELETE,
GUI_ACTION_PAT_INSERT,
GUI_ACTION_PAT_MUTE_CURSOR,
GUI_ACTION_PAT_SOLO_CURSOR,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_UNMUTE_ALL,
GUI_ACTION_PAT_NEXT_ORDER,
GUI_ACTION_PAT_PREV_ORDER,
GUI_ACTION_PAT_COLLAPSE,
GUI_ACTION_PAT_INCREASE_COLUMNS,
GUI_ACTION_PAT_DECREASE_COLUMNS,
GUI_ACTION_PAT_INTERPOLATE,
2022-03-12 08:04:34 +00:00
GUI_ACTION_PAT_FADE,
GUI_ACTION_PAT_INVERT_VALUES,
GUI_ACTION_PAT_FLIP_SELECTION,
GUI_ACTION_PAT_COLLAPSE_ROWS,
GUI_ACTION_PAT_EXPAND_ROWS,
GUI_ACTION_PAT_COLLAPSE_PAT,
GUI_ACTION_PAT_EXPAND_PAT,
GUI_ACTION_PAT_COLLAPSE_SONG,
GUI_ACTION_PAT_EXPAND_SONG,
GUI_ACTION_PAT_LATCH,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_INS_LIST_MIN,
GUI_ACTION_INS_LIST_ADD,
GUI_ACTION_INS_LIST_DUPLICATE,
GUI_ACTION_INS_LIST_OPEN,
2022-05-05 03:55:11 +00:00
GUI_ACTION_INS_LIST_OPEN_REPLACE,
GUI_ACTION_INS_LIST_SAVE,
GUI_ACTION_INS_LIST_MOVE_UP,
GUI_ACTION_INS_LIST_MOVE_DOWN,
GUI_ACTION_INS_LIST_DELETE,
GUI_ACTION_INS_LIST_EDIT,
GUI_ACTION_INS_LIST_UP,
GUI_ACTION_INS_LIST_DOWN,
2022-02-11 06:56:59 +00:00
GUI_ACTION_INS_LIST_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_WAVE_LIST_MIN,
GUI_ACTION_WAVE_LIST_ADD,
GUI_ACTION_WAVE_LIST_DUPLICATE,
GUI_ACTION_WAVE_LIST_OPEN,
GUI_ACTION_WAVE_LIST_SAVE,
GUI_ACTION_WAVE_LIST_MOVE_UP,
GUI_ACTION_WAVE_LIST_MOVE_DOWN,
GUI_ACTION_WAVE_LIST_DELETE,
GUI_ACTION_WAVE_LIST_EDIT,
GUI_ACTION_WAVE_LIST_UP,
GUI_ACTION_WAVE_LIST_DOWN,
2022-02-11 06:56:59 +00:00
GUI_ACTION_WAVE_LIST_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_SAMPLE_LIST_MIN,
GUI_ACTION_SAMPLE_LIST_ADD,
GUI_ACTION_SAMPLE_LIST_DUPLICATE,
GUI_ACTION_SAMPLE_LIST_OPEN,
GUI_ACTION_SAMPLE_LIST_SAVE,
GUI_ACTION_SAMPLE_LIST_MOVE_UP,
GUI_ACTION_SAMPLE_LIST_MOVE_DOWN,
GUI_ACTION_SAMPLE_LIST_DELETE,
GUI_ACTION_SAMPLE_LIST_EDIT,
GUI_ACTION_SAMPLE_LIST_UP,
GUI_ACTION_SAMPLE_LIST_DOWN,
GUI_ACTION_SAMPLE_LIST_PREVIEW,
GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,
2022-02-11 06:56:59 +00:00
GUI_ACTION_SAMPLE_LIST_MAX,
2022-03-22 09:54:01 +00:00
GUI_ACTION_SAMPLE_MIN,
GUI_ACTION_SAMPLE_SELECT,
GUI_ACTION_SAMPLE_DRAW,
GUI_ACTION_SAMPLE_CUT,
GUI_ACTION_SAMPLE_COPY,
GUI_ACTION_SAMPLE_PASTE,
GUI_ACTION_SAMPLE_PASTE_REPLACE,
GUI_ACTION_SAMPLE_PASTE_MIX,
GUI_ACTION_SAMPLE_SELECT_ALL,
GUI_ACTION_SAMPLE_RESIZE,
GUI_ACTION_SAMPLE_RESAMPLE,
GUI_ACTION_SAMPLE_AMPLIFY,
GUI_ACTION_SAMPLE_NORMALIZE,
GUI_ACTION_SAMPLE_FADE_IN,
GUI_ACTION_SAMPLE_FADE_OUT,
GUI_ACTION_SAMPLE_SILENCE,
2022-03-22 22:01:06 +00:00
GUI_ACTION_SAMPLE_INSERT,
2022-03-22 09:54:01 +00:00
GUI_ACTION_SAMPLE_DELETE,
GUI_ACTION_SAMPLE_TRIM,
GUI_ACTION_SAMPLE_REVERSE,
GUI_ACTION_SAMPLE_INVERT,
GUI_ACTION_SAMPLE_SIGN,
GUI_ACTION_SAMPLE_FILTER,
GUI_ACTION_SAMPLE_PREVIEW,
GUI_ACTION_SAMPLE_STOP_PREVIEW,
GUI_ACTION_SAMPLE_ZOOM_IN,
GUI_ACTION_SAMPLE_ZOOM_OUT,
GUI_ACTION_SAMPLE_ZOOM_AUTO,
GUI_ACTION_SAMPLE_MAKE_INS,
2022-03-22 09:54:01 +00:00
GUI_ACTION_SAMPLE_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_ORDERS_MIN,
GUI_ACTION_ORDERS_UP,
GUI_ACTION_ORDERS_DOWN,
GUI_ACTION_ORDERS_LEFT,
GUI_ACTION_ORDERS_RIGHT,
GUI_ACTION_ORDERS_INCREASE,
GUI_ACTION_ORDERS_DECREASE,
GUI_ACTION_ORDERS_EDIT_MODE,
GUI_ACTION_ORDERS_LINK,
GUI_ACTION_ORDERS_ADD,
GUI_ACTION_ORDERS_DUPLICATE,
GUI_ACTION_ORDERS_DEEP_CLONE,
GUI_ACTION_ORDERS_DUPLICATE_END,
GUI_ACTION_ORDERS_DEEP_CLONE_END,
GUI_ACTION_ORDERS_REMOVE,
GUI_ACTION_ORDERS_MOVE_UP,
GUI_ACTION_ORDERS_MOVE_DOWN,
GUI_ACTION_ORDERS_REPLAY,
2022-02-11 06:56:59 +00:00
GUI_ACTION_ORDERS_MAX,
2022-02-10 22:44:27 +00:00
GUI_ACTION_MAX
};
enum PasteMode {
GUI_PASTE_MODE_NORMAL=0,
GUI_PASTE_MODE_MIX_FG,
GUI_PASTE_MODE_MIX_BG,
GUI_PASTE_MODE_FLOOD,
GUI_PASTE_MODE_OVERFLOW
};
2022-04-15 06:29:29 +00:00
#define FURKMOD_CTRL (1U<<31)
2022-02-11 06:56:59 +00:00
#define FURKMOD_SHIFT (1<<29)
#define FURKMOD_META (1<<28)
#define FURKMOD_ALT (1<<27)
#define FURK_MASK 0x40ffffff
2022-02-11 06:56:59 +00:00
#ifdef __APPLE__
#define FURKMOD_CMD FURKMOD_META
#else
#define FURKMOD_CMD FURKMOD_CTRL
#endif
2021-12-14 09:45:44 +00:00
struct SelectionPoint {
int xCoarse, xFine;
int y;
2021-12-14 22:45:37 +00:00
SelectionPoint():
xCoarse(0), xFine(0), y(0) {}
2021-12-14 09:45:44 +00:00
};
2021-12-22 22:59:19 +00:00
enum ActionType {
GUI_UNDO_CHANGE_ORDER,
GUI_UNDO_PATTERN_EDIT,
GUI_UNDO_PATTERN_DELETE,
GUI_UNDO_PATTERN_PULL,
GUI_UNDO_PATTERN_PUSH,
GUI_UNDO_PATTERN_CUT,
GUI_UNDO_PATTERN_PASTE,
GUI_UNDO_PATTERN_CHANGE_INS,
GUI_UNDO_PATTERN_INTERPOLATE,
2022-03-12 08:04:34 +00:00
GUI_UNDO_PATTERN_FADE,
GUI_UNDO_PATTERN_SCALE,
GUI_UNDO_PATTERN_RANDOMIZE,
GUI_UNDO_PATTERN_INVERT_VAL,
GUI_UNDO_PATTERN_FLIP,
GUI_UNDO_PATTERN_COLLAPSE,
GUI_UNDO_PATTERN_EXPAND
2021-12-22 22:59:19 +00:00
};
2021-12-26 23:05:18 +00:00
struct UndoPatternData {
int subSong, chan, pat, row, col;
2021-12-26 23:05:18 +00:00
short oldVal, newVal;
UndoPatternData(int s, int c, int p, int r, int co, short v1, short v2):
subSong(s),
2021-12-26 23:05:18 +00:00
chan(c),
pat(p),
row(r),
2021-12-26 23:28:06 +00:00
col(co),
2021-12-26 23:05:18 +00:00
oldVal(v1),
newVal(v2) {}
};
struct UndoOrderData {
int subSong, chan, ord;
2021-12-26 23:05:18 +00:00
unsigned char oldVal, newVal;
UndoOrderData(int s, int c, int o, unsigned char v1, unsigned char v2):
subSong(s),
2021-12-26 23:05:18 +00:00
chan(c),
ord(o),
oldVal(v1),
newVal(v2) {}
2021-12-22 22:59:19 +00:00
};
struct UndoStep {
ActionType type;
2021-12-26 23:05:18 +00:00
SelectionPoint cursor, selStart, selEnd;
int order;
bool nibble;
int oldOrdersLen, newOrdersLen;
int oldPatLen, newPatLen;
std::vector<UndoOrderData> ord;
std::vector<UndoPatternData> pat;
2021-12-22 22:59:19 +00:00
};
2022-03-29 21:09:15 +00:00
// -1 = any
2022-03-28 23:19:47 +00:00
struct MIDIBind {
int type, channel, data1, data2;
2022-03-29 21:09:15 +00:00
int action;
MIDIBind():
type(0),
channel(16),
data1(128),
data2(128),
2022-03-29 21:09:15 +00:00
action(0) {}
2022-03-28 23:19:47 +00:00
};
struct MIDIMap {
2022-03-29 21:09:15 +00:00
// access method: map[type][channel][data1][data2];
// channel 16 = any
// data1 128 = any
// data2 128 = any
int**** map;
2022-03-28 23:19:47 +00:00
std::vector<MIDIBind> binds;
2022-03-29 21:09:15 +00:00
2022-05-08 07:07:58 +00:00
bool noteInput, volInput, rawVolume, polyInput, directChannel, programChange, midiClock, midiTimeCode, yamahaFMResponse;
2022-03-29 21:09:15 +00:00
// 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)
2022-04-01 06:50:01 +00:00
// 6: use single CC for value input (may be imprecise)
2022-03-29 21:09:15 +00:00
int valueInputStyle;
int valueInputControlMSB; // on 4
int valueInputControlLSB; // on 4
2022-04-01 06:50:01 +00:00
int valueInputControlSingle;
// 0: disabled
// 1: use dual CC (nibble)
// 2: use 14-bit CC (MSB/LSB)
// 3: use single CC (may be imprecise)
int valueInputSpecificStyle[18];
int valueInputSpecificMSB[18];
int valueInputSpecificLSB[18];
int valueInputSpecificSingle[18];
2022-03-29 21:09:15 +00:00
float volExp;
2022-04-01 06:50:01 +00:00
int valueInputCurMSB, valueInputCurLSB, valueInputCurSingle;
int valueInputCurMSBS[18];
int valueInputCurLSBS[18];
int valueInputCurSingleS[18];
2022-03-29 21:09:15 +00:00
void compile();
void deinit();
int at(const TAMidiMessage& where);
2022-03-29 21:09:15 +00:00
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),
2022-05-08 07:07:58 +00:00
yamahaFMResponse(false),
2022-03-29 21:09:15 +00:00
valueInputStyle(1),
2022-04-14 23:25:59 +00:00
valueInputControlMSB(0),
valueInputControlLSB(0),
valueInputControlSingle(0),
2022-04-01 06:50:01 +00:00
volExp(1.0f),
valueInputCurMSB(0),
valueInputCurLSB(0),
valueInputCurSingle(0) {
memset(valueInputSpecificStyle,0,18*sizeof(int));
memset(valueInputSpecificMSB,0,18*sizeof(int));
memset(valueInputSpecificLSB,0,18*sizeof(int));
memset(valueInputSpecificSingle,0,18*sizeof(int));
memset(valueInputCurMSBS,0,18*sizeof(int));
memset(valueInputCurLSBS,0,18*sizeof(int));
memset(valueInputCurSingleS,0,18*sizeof(int));
}
2022-03-28 23:19:47 +00:00
};
2022-02-15 23:52:12 +00:00
struct Particle {
ImU32* colors;
const char* type;
ImVec2 pos, speed;
float gravity, friction, life, lifeSpeed;
bool update(float frameTime);
2022-02-15 23:52:12 +00:00
Particle(ImU32* color, const char* ty, float x, float y, float sX, float sY, float g, float fr, float l, float lS):
colors(color),
type(ty),
pos(x,y),
speed(sX,sY),
gravity(g),
friction(fr),
life(l),
lifeSpeed(lS) {}
};
struct OperationMask {
bool note, ins, vol, effect, effectVal;
OperationMask():
note(true),
ins(true),
vol(true),
effect(true),
effectVal(true) {}
};
2022-05-17 17:46:52 +00:00
struct TouchPoint {
// an ID of -1 represents the mouse cursor.
int id;
float x, y, z;
TouchPoint():
id(-1),
x(0.0f),
y(0.0f),
z(1.0f) {}
TouchPoint(float xp, float yp):
id(-1),
x(xp),
y(yp),
z(1.0f) {}
TouchPoint(int ident, float xp, float yp, float pressure=1.0f):
id(ident),
x(xp),
y(yp),
z(pressure) {}
};
2022-03-01 22:19:52 +00:00
struct FurnaceGUISysDef {
const char* name;
2022-03-02 07:22:51 +00:00
std::vector<int> definition;
FurnaceGUISysDef(const char* n, std::initializer_list<int> def):
name(n), definition(def) {
}
2022-03-01 22:19:52 +00:00
};
struct FurnaceGUISysCategory {
const char* name;
const char* description;
2022-03-01 22:19:52 +00:00
std::vector<FurnaceGUISysDef> systems;
FurnaceGUISysCategory(const char* n, const char* d):
name(n),
description(d) {}
2022-03-01 22:19:52 +00:00
FurnaceGUISysCategory():
name(NULL),
description(NULL) {}
2022-03-01 22:19:52 +00:00
};
2022-05-07 04:52:26 +00:00
struct FurnaceGUIMacroDesc {
DivInstrumentMacro* macro;
int min, max;
float height;
const char* displayName;
const char** bitfieldBits;
const char* modeName;
ImVec4 color;
unsigned int bitOffset;
bool isBitfield, blockMode;
String (*hoverFunc)(int,float);
FurnaceGUIMacroDesc(const char* name, DivInstrumentMacro* m, int macroMin, int macroMax, float macroHeight, ImVec4 col=ImVec4(1.0f,1.0f,1.0f,1.0f), bool block=false, const char* mName=NULL, String (*hf)(int,float)=NULL, bool bitfield=false, const char** bfVal=NULL, unsigned int bitOff=0):
macro(m),
height(macroHeight),
displayName(name),
bitfieldBits(bfVal),
modeName(mName),
color(col),
bitOffset(bitOff),
isBitfield(bitfield),
blockMode(block),
hoverFunc(hf) {
2022-05-07 05:08:38 +00:00
// MSVC -> hell
this->min=macroMin;
this->max=macroMax;
2022-05-07 04:52:26 +00:00
}
};
2021-12-11 07:10:09 +00:00
class FurnaceGUI {
DivEngine* e;
2021-12-11 08:11:40 +00:00
SDL_Window* sdlWin;
SDL_Renderer* sdlRend;
2022-03-17 08:43:02 +00:00
SDL_Texture* sampleTex;
int sampleTexW, sampleTexH;
bool updateSampleTex;
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile;
String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport, workingDirVGMExport, workingDirFont, workingDirColors, workingDirKeybinds, workingDirLayout, workingDirROM;
2022-05-18 23:42:59 +00:00
String mmlString[32];
String mmlStringW;
2022-05-11 21:09:23 +00:00
bool quit, warnQuit, willCommit, edit, modified, displayError, displayExporting, vgmExportLoop, wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu;
bool displayNew, fullScreen, preserveChanPos, wantScrollList;
bool willExport[32];
int vgmExportVersion;
2022-04-16 23:35:25 +00:00
int drawHalt;
2022-04-29 10:39:18 +00:00
int macroPointSize;
2022-05-19 21:35:00 +00:00
ImGuiWindowFlags globalWinFlags;
FurnaceGUIFileDialogs curFileDialog;
2021-12-30 23:52:36 +00:00
FurnaceGUIWarnings warnAction;
FurnaceGUIWarnings postWarnAction;
2021-12-11 08:11:40 +00:00
FurnaceGUIFileDialog* fileDialog;
2021-12-11 08:11:40 +00:00
int scrW, scrH;
double dpiScale;
2022-02-20 09:26:35 +00:00
double aboutScroll, aboutSin;
2021-12-19 04:03:50 +00:00
float aboutHue;
2022-05-16 08:09:59 +00:00
std::atomic<double> backupTimer;
2022-03-21 19:11:28 +00:00
std::future<bool> backupTask;
std::mutex backupLock;
String backupPath;
2022-03-28 23:19:47 +00:00
std::mutex midiLock;
std::queue<TAMidiMessage> midiQueue;
2022-03-29 21:09:15 +00:00
MIDIMap midiMap;
2022-03-31 23:39:01 +00:00
int learning;
2022-03-28 23:19:47 +00:00
2021-12-11 08:11:40 +00:00
ImFont* mainFont;
2021-12-21 05:30:55 +00:00
ImFont* iconFont;
2021-12-11 08:11:40 +00:00
ImFont* patFont;
2021-12-19 04:03:50 +00:00
ImFont* bigFont;
ImWchar* fontRange;
2021-12-13 22:09:46 +00:00
ImVec4 uiColors[GUI_COLOR_MAX];
ImVec4 volColors[128];
ImU32 pitchGrad[256];
ImU32 volGrad[256];
ImU32 noteGrad[256];
ImU32 panGrad[256];
ImU32 insGrad[256];
ImU32 sysCmd1Grad[256];
ImU32 sysCmd2Grad[256];
2021-12-11 08:11:40 +00:00
2022-01-16 22:25:43 +00:00
struct Settings {
int mainFontSize, patFontSize, iconSize;
int audioEngine;
int audioQuality;
2022-01-16 22:25:43 +00:00
int arcadeCore;
int ym2612Core;
int saaCore;
int nesCore;
2022-05-02 21:53:55 +00:00
int fdsCore;
String yrw801Path;
String tg100Path;
String mu5Path;
2022-01-16 22:25:43 +00:00
int mainFont;
int patFont;
int audioRate;
int audioBufSize;
2022-01-19 23:04:07 +00:00
int patRowsBase;
int orderRowsBase;
int soloAction;
int pullDeleteBehavior;
int wrapHorizontal;
int wrapVertical;
2022-01-23 21:34:20 +00:00
int macroView;
2022-01-27 20:01:05 +00:00
int fmNames;
int allowEditDocking;
2022-01-28 08:17:35 +00:00
int chipNames;
int overflowHighlight;
int partyTime;
2022-02-03 19:40:09 +00:00
int germanNotation;
int stepOnDelete;
int scrollStep;
int sysSeparators;
int forceMono;
int controlLayout;
int restartOnFlagChange;
2022-02-15 06:46:03 +00:00
int statusDisplay;
2022-02-15 22:42:56 +00:00
float dpiScale;
int viewPrevPattern;
int guiColorsBase;
int avoidRaisingPattern;
int insFocusesPattern;
int stepOnInsert;
// TODO flags
int unifiedDataView;
int sysFileDialog;
// end
int roundedWindows;
int roundedButtons;
int roundedMenus;
int loadJapanese;
int loadChinese;
int fmLayout;
int sampleLayout;
2022-04-17 00:47:40 +00:00
int waveLayout;
int susPosition;
int effectCursorDir;
int cursorPastePos;
int titleBarInfo;
int titleBarSys;
2022-04-06 05:34:26 +00:00
int frameBorders;
int effectDeletionAltersValue;
2022-04-11 08:34:38 +00:00
int oscRoundedCorners;
int oscTakesEntireWindow;
int oscBorder;
int oscEscapesBoundary;
int separateFMColors;
int insEditColorize;
2022-04-13 07:29:07 +00:00
int metroVol;
int pushNibble;
int scrollChangesOrder;
int oplStandardWaveNames;
int cursorMoveNoScroll;
int lowLatency;
int notePreviewBehavior;
2022-04-16 23:35:25 +00:00
int powerSave;
int absorbInsInput;
2022-04-25 21:46:38 +00:00
int eventDelay;
int moveWindowTitle;
int hiddenSystems;
int horizontalDataView;
int noMultiSystem;
int oldMacroVSlider;
int displayAllInsTypes;
2022-01-16 22:25:43 +00:00
unsigned int maxUndoSteps;
String mainFontPath;
String patFontPath;
2022-02-14 02:42:57 +00:00
String audioDevice;
String midiInDevice;
String midiOutDevice;
std::vector<int> initialSys;
2022-01-16 22:25:43 +00:00
Settings():
mainFontSize(18),
patFontSize(18),
iconSize(16),
audioEngine(DIV_AUDIO_SDL),
audioQuality(0),
2022-01-16 22:25:43 +00:00
arcadeCore(0),
ym2612Core(0),
saaCore(1),
nesCore(0),
2022-05-02 21:53:55 +00:00
fdsCore(0),
yrw801Path(""),
tg100Path(""),
mu5Path(""),
2022-01-16 22:25:43 +00:00
mainFont(0),
patFont(0),
audioRate(44100),
audioBufSize(1024),
2022-01-19 23:04:07 +00:00
patRowsBase(0),
orderRowsBase(1),
soloAction(0),
pullDeleteBehavior(1),
wrapHorizontal(0),
wrapVertical(0),
2022-01-23 21:34:20 +00:00
macroView(0),
2022-01-27 20:01:05 +00:00
fmNames(0),
allowEditDocking(0),
2022-01-28 08:17:35 +00:00
chipNames(0),
overflowHighlight(0),
partyTime(0),
2022-02-03 19:40:09 +00:00
germanNotation(0),
stepOnDelete(0),
scrollStep(0),
sysSeparators(1),
forceMono(0),
2022-03-14 22:40:22 +00:00
controlLayout(3),
restartOnFlagChange(1),
2022-02-15 06:46:03 +00:00
statusDisplay(0),
2022-02-15 22:42:56 +00:00
dpiScale(0.0f),
viewPrevPattern(1),
guiColorsBase(0),
avoidRaisingPattern(0),
insFocusesPattern(1),
stepOnInsert(0),
unifiedDataView(0),
sysFileDialog(1),
roundedWindows(1),
roundedButtons(1),
roundedMenus(0),
loadJapanese(0),
loadChinese(0),
fmLayout(0),
sampleLayout(0),
2022-04-17 00:47:40 +00:00
waveLayout(0),
susPosition(0),
effectCursorDir(1),
cursorPastePos(1),
titleBarInfo(1),
titleBarSys(1),
2022-04-06 05:34:26 +00:00
frameBorders(0),
effectDeletionAltersValue(1),
2022-04-11 08:34:38 +00:00
oscRoundedCorners(1),
oscTakesEntireWindow(0),
oscBorder(1),
oscEscapesBoundary(0),
separateFMColors(0),
insEditColorize(0),
2022-04-13 07:29:07 +00:00
metroVol(100),
pushNibble(0),
scrollChangesOrder(0),
oplStandardWaveNames(0),
cursorMoveNoScroll(0),
lowLatency(0),
notePreviewBehavior(1),
2022-04-16 23:35:25 +00:00
powerSave(1),
absorbInsInput(0),
2022-04-25 21:46:38 +00:00
eventDelay(0),
moveWindowTitle(1),
hiddenSystems(0),
horizontalDataView(0),
noMultiSystem(0),
oldMacroVSlider(0),
displayAllInsTypes(0),
2022-01-16 22:25:43 +00:00
maxUndoSteps(100),
mainFontPath(""),
2022-02-14 02:42:57 +00:00
patFontPath(""),
audioDevice(""),
midiInDevice(""),
midiOutDevice("") {}
2022-01-16 22:25:43 +00:00
} settings;
2021-12-20 03:51:02 +00:00
2021-12-19 21:01:24 +00:00
char finalLayoutPath[4096];
2021-12-19 08:16:24 +00:00
2022-05-05 03:55:11 +00:00
DivInstrument* prevInsData;
2022-04-26 06:07:28 +00:00
int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor;
2022-04-21 23:10:59 +00:00
int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory, latchTarget;
int wheelX, wheelY;
2021-12-15 22:32:08 +00:00
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
2021-12-20 03:51:02 +00:00
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
bool mixerOpen, debugOpen, inspectorOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen;
bool pianoOpen, notesOpen, channelsOpen, regViewOpen, logOpen, effectListOpen, chanOscOpen;
bool subSongsOpen;
/* there ought to be a better way...
bool editControlsDocked, ordersDocked, insListDocked, songInfoDocked, patternDocked, insEditDocked;
bool waveListDocked, waveEditDocked, sampleListDocked, sampleEditDocked, aboutDocked, settingsDocked;
bool mixerDocked, debugDocked, inspectorDocked, oscDocked, volMeterDocked, statsDocked, compatFlagsDocked;
bool pianoDocked, notesDocked, channelsDocked, regViewDocked, logDocked, effectListDocked, chanOscDocked;
bool subSongsDocked;
*/
2022-01-20 07:11:03 +00:00
SelectionPoint selStart, selEnd, cursor;
bool selecting, selectingFull, curNibble, orderNibble, followOrders, followPattern, changeAllOrders, mobileUI;
bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame, tempoView, waveHex, lockLayout, editOptsVisible, latchNibble, nonLatchNibble;
FurnaceGUIWindows curWindow, nextWindow, curWindowLast;
2022-01-29 23:56:08 +00:00
float peak[2];
2022-02-15 18:38:59 +00:00
float patChanX[DIV_MAX_CHANS+1];
float patChanSlideY[DIV_MAX_CHANS+1];
2022-03-02 07:22:51 +00:00
const int* nextDesc;
2021-12-14 22:45:37 +00:00
OperationMask opMaskDelete, opMaskPullDelete, opMaskInsert, opMaskPaste, opMaskTransposeNote, opMaskTransposeValue;
OperationMask opMaskInterpolate, opMaskFade, opMaskInvertVal, opMaskScale;
OperationMask opMaskRandomize, opMaskFlip, opMaskCollapseExpand;
short latchNote, latchIns, latchVol, latchEffect, latchEffectVal;
2022-05-21 23:36:15 +00:00
DivWaveSynth wavePreview;
int wavePreviewLen, wavePreviewHeight;
bool wavePreviewInit;
2022-02-11 06:56:59 +00:00
// bit 31: ctrl
// bit 30: reserved for SDL scancode mask
// bit 29: shift
// bit 28: meta (win)
// bit 27: alt
// bit 24-26: reserved
2022-02-10 22:44:27 +00:00
int actionKeys[GUI_ACTION_MAX];
2022-02-11 06:56:59 +00:00
std::map<int,int> actionMapGlobal;
std::map<int,int> actionMapPat;
std::map<int,int> actionMapOrders;
2022-03-22 09:54:01 +00:00
std::map<int,int> actionMapSample;
2022-02-11 06:56:59 +00:00
std::map<int,int> actionMapInsList;
std::map<int,int> actionMapWaveList;
std::map<int,int> actionMapSampleList;
2022-02-10 22:44:27 +00:00
2022-02-01 23:08:19 +00:00
std::vector<DivRegWrite> pgProgram;
int pgSys, pgAddr, pgVal;
struct ActiveNote {
int chan;
int note;
ActiveNote(int c, int n):
chan(c),
note(n) {}
};
std::vector<ActiveNote> activeNotes;
std::vector<DivCommand> cmdStream;
2022-02-15 23:52:12 +00:00
std::vector<Particle> particles;
std::vector<DivInstrument*> pendingIns;
2022-02-15 23:52:12 +00:00
2022-03-01 22:19:52 +00:00
std::vector<FurnaceGUISysCategory> sysCategories;
bool wavePreviewOn;
SDL_Scancode wavePreviewKey;
int wavePreviewNote;
2022-01-20 21:51:31 +00:00
bool samplePreviewOn;
SDL_Scancode samplePreviewKey;
int samplePreviewNote;
// SDL_Scancode,int
2022-02-21 23:01:41 +00:00
std::map<int,int> noteKeys;
// SDL_Keycode,int
2022-02-21 23:01:41 +00:00
std::map<int,int> valueKeys;
2021-12-11 21:44:02 +00:00
2022-05-17 17:46:52 +00:00
// currently active touch points
std::vector<TouchPoint> activePoints;
// one frame points
std::vector<TouchPoint> pressedPoints;
std::vector<TouchPoint> releasedPoints;
2021-12-12 23:19:43 +00:00
int arpMacroScroll;
2022-04-15 07:51:38 +00:00
int pitchMacroScroll;
2021-12-12 23:19:43 +00:00
ImVec2 macroDragStart;
ImVec2 macroDragAreaSize;
unsigned char* macroDragCTarget;
int* macroDragTarget;
int macroDragLen;
int macroDragMin, macroDragMax;
int macroDragLastX, macroDragLastY;
int macroDragBitOff;
2022-01-21 22:00:28 +00:00
int macroDragScroll;
bool macroDragBitMode;
bool macroDragInitialValueSet;
bool macroDragInitialValue;
bool macroDragChar;
2022-04-13 04:03:20 +00:00
bool macroDragLineMode;
2022-05-08 23:32:16 +00:00
bool macroDragMouseMoved;
2022-04-13 04:03:20 +00:00
ImVec2 macroDragLineInitial;
ImVec2 macroDragLineInitialV;
bool macroDragActive;
2022-05-08 23:32:16 +00:00
FurnaceGUIMacroDesc lastMacroDesc;
int macroOffX, macroOffY;
float macroScaleX, macroScaleY;
ImVec2 macroLoopDragStart;
ImVec2 macroLoopDragAreaSize;
signed char* macroLoopDragTarget;
int macroLoopDragLen;
bool macroLoopDragActive;
2021-12-18 22:54:26 +00:00
ImVec2 waveDragStart;
ImVec2 waveDragAreaSize;
int* waveDragTarget;
int waveDragLen;
int waveDragMin, waveDragMax;
bool waveDragActive;
int bindSetTarget, bindSetPrevValue;
bool bindSetActive, bindSetPending;
float nextScroll, nextAddScroll;
ImVec2 patWindowPos, patWindowSize;
// pattern view specific
ImVec2 fourChars, threeChars, twoChars;
SelectionPoint sel1, sel2;
int dummyRows, demandX;
2022-03-12 08:04:34 +00:00
int transposeAmount, randomizeMin, randomizeMax, fadeMin, fadeMax;
float scaleMax;
bool fadeMode, randomMode, haveHitBounds, pendingStepUpdate;
2021-12-13 22:09:46 +00:00
2021-12-26 23:05:18 +00:00
int oldOrdersLen;
DivOrders oldOrders;
DivPattern* oldPat[DIV_MAX_CHANS];
2021-12-24 23:27:55 +00:00
std::deque<UndoStep> undoHist;
std::deque<UndoStep> redoHist;
2022-03-17 23:08:59 +00:00
// sample editor specific
double sampleZoom;
double prevSampleZoom;
2022-03-17 23:08:59 +00:00
int samplePos;
2022-03-22 22:01:06 +00:00
int resizeSize, silenceSize;
2022-03-19 08:42:44 +00:00
double resampleTarget;
int resampleStrat;
float amplifyVol;
int sampleSelStart, sampleSelEnd;
bool sampleDragActive, sampleDragMode, sampleDrag16, sampleZoomAuto;
2022-03-19 21:14:11 +00:00
void* sampleDragTarget;
ImVec2 sampleDragStart;
ImVec2 sampleDragAreaSize;
2022-03-20 23:25:48 +00:00
unsigned int sampleDragLen;
float sampleFilterL, sampleFilterB, sampleFilterH, sampleFilterRes, sampleFilterCutStart, sampleFilterCutEnd;
unsigned char sampleFilterPower;
2022-03-22 09:54:01 +00:00
short* sampleClipboard;
size_t sampleClipboardLen;
2022-03-22 22:01:06 +00:00
bool openSampleResizeOpt, openSampleResampleOpt, openSampleAmplifyOpt, openSampleSilenceOpt, openSampleFilterOpt;
2022-03-17 23:08:59 +00:00
// oscilloscope
int oscTotal;
float oscValues[512];
float oscZoom;
bool oscZoomSlider;
// per-channel oscilloscope
int chanOscCols;
float chanOscWindowSize;
bool chanOscWaveCorr;
float chanOscLP0[DIV_MAX_CHANS];
float chanOscLP1[DIV_MAX_CHANS];
unsigned short lastNeedlePos[DIV_MAX_CHANS];
unsigned short lastCorrPos[DIV_MAX_CHANS];
2022-03-17 23:08:59 +00:00
// visualizer
2022-02-10 08:15:39 +00:00
float keyHit[DIV_MAX_CHANS];
2022-02-22 05:13:32 +00:00
int lastIns[DIV_MAX_CHANS];
// log window
bool followLog;
2022-02-10 08:15:39 +00:00
2022-04-13 08:24:49 +00:00
// piano
2022-05-17 17:46:52 +00:00
int pianoOctaves, pianoOctavesEdit;
2022-05-17 23:55:44 +00:00
bool pianoOptions, pianoSharePosition, pianoOptionsSet;
2022-04-13 08:24:49 +00:00
float pianoKeyHit[180];
2022-05-17 20:20:56 +00:00
bool pianoKeyPressed[180];
2022-05-17 17:46:52 +00:00
int pianoOffset, pianoOffsetEdit;
2022-05-17 20:48:37 +00:00
int pianoView, pianoInputPadMode;
2022-04-13 08:24:49 +00:00
// TX81Z
bool hasACED;
unsigned char acedData[23];
2022-03-27 08:29:45 +00:00
void drawSSGEnv(unsigned char type, const ImVec2& size);
void drawWaveform(unsigned char type, bool opz, const ImVec2& size);
2022-02-10 06:45:26 +00:00
void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size);
void drawFMEnv(unsigned char tl, unsigned char ar, unsigned char dr, unsigned char d2r, unsigned char rr, unsigned char sl, unsigned char sus, unsigned char egt, unsigned char algOrGlobalSus, float maxTl, float maxArDr, const ImVec2& size, unsigned short instType);
2022-04-17 04:58:29 +00:00
void drawGBEnv(unsigned char vol, unsigned char len, unsigned char sLen, bool dir, const ImVec2& size);
void drawSysConf(int chan, DivSystem type, unsigned int& flags, bool modifyOnChange);
2022-02-10 06:45:26 +00:00
// these ones offer ctrl-wheel fine value changes.
bool CWSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
bool CWVSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
bool CWSliderInt(const char* label, int* v, int v_min, int v_max, const char* format="%d", ImGuiSliderFlags flags=0);
bool CWSliderFloat(const char* label, float* v, float v_min, float v_max, const char* format="%.3f", ImGuiSliderFlags flags=0);
bool CWVSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format="%d", ImGuiSliderFlags flags=0);
2021-12-15 22:32:08 +00:00
void updateWindowTitle();
2021-12-19 21:01:24 +00:00
void prepareLayout();
2021-12-15 22:32:08 +00:00
void readOsc();
void pushAccentColors(const ImVec4& one, const ImVec4& two, const ImVec4& border, const ImVec4& borderShadow);
void popAccentColors();
2022-05-18 05:05:25 +00:00
float calcBPM(int s1, int s2, float hz, int vN, int vD);
2022-03-16 04:30:15 +00:00
void patternRow(int i, bool isPlaying, float lineHeight, int chans, int ord, const DivPattern** patCache, bool inhibitSel);
2022-05-07 04:52:26 +00:00
void drawMacros(std::vector<FurnaceGUIMacroDesc>& macros);
void actualWaveList();
void actualSampleList();
2022-05-18 23:42:59 +00:00
void toggleMobileUI(bool enable, bool force=false);
2022-05-19 03:49:21 +00:00
void drawMobileControls();
2021-12-15 22:32:08 +00:00
void drawEditControls();
2021-12-14 09:45:44 +00:00
void drawSongInfo();
void drawOrders();
void drawPattern();
void drawInsList();
2021-12-14 09:45:44 +00:00
void drawInsEdit();
void drawWaveList();
void drawWaveEdit();
void drawSampleList();
void drawSampleEdit();
void drawMixer();
2022-01-27 22:49:00 +00:00
void drawOsc();
void drawChanOsc();
2022-01-29 23:56:08 +00:00
void drawVolMeter();
void drawStats();
void drawCompatFlags();
void drawPiano();
void drawNotes();
void drawChannels();
void drawRegView();
2021-12-19 04:03:50 +00:00
void drawAbout();
2021-12-20 03:51:02 +00:00
void drawSettings();
2022-01-27 05:29:16 +00:00
void drawDebug();
2022-03-01 22:19:52 +00:00
void drawNewSong();
void drawLog();
2022-04-19 23:44:05 +00:00
void drawEffectList();
void drawSubSongs();
2021-12-20 03:51:02 +00:00
2022-02-11 06:56:59 +00:00
void parseKeybinds();
void promptKey(int which);
void doAction(int what);
2022-02-11 06:56:59 +00:00
bool importColors(String path);
bool exportColors(String path);
bool importKeybinds(String path);
bool exportKeybinds(String path);
bool importLayout(String path);
bool exportLayout(String path);
void resetColors();
void resetKeybinds();
2022-01-16 22:25:43 +00:00
void syncSettings();
2021-12-20 03:51:02 +00:00
void commitSettings();
void processDrags(int dragX, int dragY);
2022-05-17 17:46:52 +00:00
void processPoint(SDL_Event& ev);
2021-12-14 09:45:44 +00:00
void startSelection(int xCoarse, int xFine, int y, bool fullRow=false);
void updateSelection(int xCoarse, int xFine, int y, bool fullRow=false);
2021-12-14 22:45:37 +00:00
void finishSelection();
2022-01-22 08:12:02 +00:00
void moveCursor(int x, int y, bool select);
void moveCursorPrevChannel(bool overflow);
void moveCursorNextChannel(bool overflow);
void moveCursorTop(bool select);
void moveCursorBottom(bool select);
2021-12-14 22:45:37 +00:00
void editAdvance();
2021-12-26 23:05:18 +00:00
void prepareUndo(ActionType action);
void makeUndo(ActionType action);
2021-12-29 05:50:00 +00:00
void doSelectAll();
void doDelete();
2021-12-19 07:12:19 +00:00
void doPullDelete();
void doInsert();
void doTranspose(int amount, OperationMask& mask);
2021-12-19 07:12:19 +00:00
void doCopy(bool cut);
void doPaste(PasteMode mode=GUI_PASTE_MODE_NORMAL);
void doChangeIns(int ins);
void doInterpolate();
2022-03-12 08:04:34 +00:00
void doFade(int p0, int p1, bool mode);
void doInvertValues();
void doScale(float top);
2022-03-12 08:40:56 +00:00
void doRandomize(int bottom, int top, bool mode);
void doFlip();
void doCollapse(int divider);
void doExpand(int multiplier);
2021-12-26 23:05:18 +00:00
void doUndo();
void doRedo();
void editOptions(bool topMenu);
2022-03-31 20:25:58 +00:00
void noteInput(int num, int key, int vol=-1);
2022-04-01 06:50:01 +00:00
void valueInput(int num, bool direct=false, int target=-1);
2021-12-14 22:45:37 +00:00
void doUndoSample();
void doRedoSample();
void play(int row=0);
void setOrder(unsigned char order, bool forced=false);
void stop();
void previewNote(int refChan, int note, bool autoNote=false);
void stopPreviewNote(SDL_Scancode scancode, bool autoNote=false);
2021-12-14 22:45:37 +00:00
void keyDown(SDL_Event& ev);
void keyUp(SDL_Event& ev);
void openFileDialog(FurnaceGUIFileDialogs type);
int save(String path, int dmfVersion);
int load(String path);
void exportAudio(String path, DivAudioExportModes mode);
bool parseSysEx(unsigned char* data, size_t len);
2022-04-11 07:53:21 +00:00
void applyUISettings(bool updateFonts=true);
void initSystemPresets();
void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false);
void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, signed char& macroLoop, int macroMin, int macroMax, signed char& macroRel);
void decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMax, bool hex=false);
String encodeKeyMap(std::map<int,int>& map);
void decodeKeyMap(std::map<int,int>& map, String source);
2022-01-28 08:17:35 +00:00
const char* getSystemName(DivSystem which);
2021-12-11 07:10:09 +00:00
public:
2022-02-06 04:48:56 +00:00
void showWarning(String what, FurnaceGUIWarnings type);
void showError(String what);
2021-12-13 07:03:36 +00:00
const char* noteName(short note, short octave);
2021-12-19 07:12:19 +00:00
bool decodeNote(const char* what, short& note, short& octave);
2021-12-11 07:10:09 +00:00
void bindEngine(DivEngine* eng);
2021-12-20 03:51:02 +00:00
void updateScroll(int amount);
void addScroll(int amount);
void setFileName(String name);
2022-03-21 19:11:28 +00:00
void runBackupThread();
int processEvent(SDL_Event* ev);
2021-12-11 08:11:40 +00:00
bool loop();
2021-12-19 21:01:24 +00:00
bool finish();
2021-12-11 08:11:40 +00:00
bool init();
2021-12-11 07:10:09 +00:00
FurnaceGUI();
2021-12-11 21:44:02 +00:00
};
2022-03-29 21:09:15 +00:00
#endif