/*
  !MidiPlay   A MIDI synthesiser and file player.

  ro_main.h - main Riscos entry

  created  12/2021
*/

#ifndef ro_main_h
#define ro_main_h


// windows
enum { WIN_PLAYER,
       WIN_INFO,
       WIN_CONSOLE,
       WIN_SAVE,
       WIN_TEMPO,
       WIN_PITCH,
       WIN_EFFECTS,
       WIN_KBD,
       WIN_EDT,
       WIN_ED_WAVE1,
       WIN_ED_WAVE2,
       WIN_ED_FILTER,
       WIN_ED_NOISE,
       WIN_ED_GENERAL,
       WIN_CHANNELS,
       WIN_BANKS,
       WIN_KITS,
       NUM_WINDOWS };

// menus
enum { MENU_ICONBAR,
       MENU_PLAYER,
       MENU_CONSOLE,
       MENU_KEYBOARD,
       NUM_MENUS };

// slider control types
enum {
  // player window
  SLDR_POSN,
  SLDR_VOLUME,
  SLDR_BALANCE,
  SLDR_BASS,
  SLDR_TREBLE,
  // effects window
  SLDR_E_DELAY,
  SLDR_E_SGAIN,
  SLDR_E_CGAIN,
  SLDR_REVERB,
  SLDR_CHORUS,
  SLDR_FLANGE,
  // envelopes, wave1, wave2, filter, and noise panes
  SLDR_ENV_DY,
  SLDR_ENV_AR,
  SLDR_ENV_AT,
  SLDR_ENV_AH,
  SLDR_ENV_DR,
  SLDR_ENV_DT,
  SLDR_ENV_SR,
  SLDR_ENV_RR,
  // wave 1 and wave2 panes, additional sliders
  SLDR_GLIDE,
  // filter pane, additional sliders
  SLDR_RESONANCE,
  // noise pane, no additional sliders
  // general controls pane
  SLDR_FM,
  SLDR_DETUNE,
  SLDR_MOD_RATE,
  SLDR_MOD_DEPTH,
  SLDR_GEN_RETRIG,
  SLDR_GEN_GAIN,

  SLDR_METER,
  SLDR_CHN_VOL,

  NUM_SLIDERS };

// Main window icons
#define ICON_FILE_NAME      0
#define ICON_POSN_BACK      1
#define ICON_POSN_VALUE     2
#define ICON_START          3
#define ICON_PAUSE          4
#define ICON_STOP           5
#define ICON_FILE_POSN      6
#define ICON_FILE_DURATION  7
#define ICON_VOL_BACK       8
#define ICON_VOL_SLDR       9
#define ICON_BAL_BACK      10
#define ICON_BAL_SLDR      11
#define ICON_BAS_BACK      12
#define ICON_BAS_SLDR      13
#define ICON_TRB_BACK      14
#define ICON_TRB_SLDR      15
#define ICON_LEFT_BACK     16
#define ICON_LEFT_SLDR     17
#define ICON_RIGHT_BACK    18
#define ICON_RIGHT_SLDR    19


// Effect window icons
#define ICON_ECHO           0
#define ICON_E_DELAY_BACK   1
#define ICON_E_DELAY_SLDR   2
#define ICON_E_SGAIN_BACK   4
#define ICON_E_SGAIN_SLDR   5
#define ICON_E_CGAIN_BACK   7
#define ICON_E_CGAIN_SLDR   8
#define ICON_REVERB        10
#define ICON_REVERB_BACK   11
#define ICON_REVERB_SLDR   12
#define ICON_CHORUS        14
#define ICON_CHORUS_BACK   15
#define ICON_CHORUS_SLDR   16
#define ICON_FLANGE        18
#define ICON_FLANGE_BACK   19
#define ICON_FLANGE_SLDR   20

// Console icons
#define ICON_CMD            0
#define ICON_OUT            1 // times number of rows

// Menu dialogs icons
#define ICON_WAV_SPRITE     0
#define ICON_WAV_NAME       1
#define ICON_WAV_OK         2
#define ICON_TEMPO          0
#define ICON_PITCH          0
// Banks control icons
#define ICON_BANK_OVERRIDE  0
#define ICON_ALL_BANKS      2
// Drum kits control icons
#define ICON_KIT_OVERRIDE  0
#define ICON_ALL_KITS      2

// Editor icons
#define ICON_ED_WAVE1       0
#define ICON_ED_WAVE2       1
#define ICON_ED_FILTER      2
#define ICON_ED_NOISE       3
#define ICON_ED_GENERAL     4
#define ICON_ED_PATCH       8
#define ICON_ED_PATCH_DEC   9
#define ICON_ED_PATCH_INC  10
#define ICON_ED_INST_NAME  11
#define ICON_ED_BANK_NAME  12
#define ICON_ED_MESSAGE    13
#define ICON_ED_RELOAD     14
#define ICON_ED_CLEAR      15
#define ICON_ED_DELETE     16
#define ICON_ED_SWAP       17
#define ICON_ED_SAVE       18
#define ICON_ED_SAVE_NEW   19
#define ICON_ED_BACKUP     20
#define ICON_ED_PRG_NAME   21
#define ICON_ED_PRG_VAL    22
#define ICON_ED_BHI_NAME   23
#define ICON_ED_BHI_VAL    24
#define ICON_ED_BLO_NAME   25
#define ICON_ED_BLO_VAL    26
#define ICON_ED_SOUND_SET  27

// Envelope icons (Wave 1/2, Filter, and Noise Panes)
#define ICON_ENV_DY_BACK    3 // Delay
#define ICON_ENV_DY_SLDR    4
#define ICON_ENV_DY_VAL     5
#define ICON_ENV_AR_BACK    7 // Attack Rate
#define ICON_ENV_AR_SLDR    8
#define ICON_ENV_AR_VAL     9
#define ICON_ENV_AT_BACK   11 // Attack Target
#define ICON_ENV_AT_SLDR   12
#define ICON_ENV_AT_VAL    13
#define ICON_ENV_AH_BACK   15 // Attack Hold
#define ICON_ENV_AH_SLDR   16
#define ICON_ENV_AH_VAL    17
#define ICON_ENV_DR_BACK   19 // Decay Rate
#define ICON_ENV_DR_SLDR   20
#define ICON_ENV_DR_VAL    21
#define ICON_ENV_DT_BACK   23 // Decay Target
#define ICON_ENV_DT_SLDR   24
#define ICON_ENV_DT_VAL    25
#define ICON_ENV_SR_BACK   27 // Sustain Rate
#define ICON_ENV_SR_SLDR   28
#define ICON_ENV_SR_VAL    29
#define ICON_ENV_RR_BACK   31 // Release Rate
#define ICON_ENV_RR_SLDR   32
#define ICON_ENV_RR_VAL    33

// Wave 1/2 Pane icons
#define ICON_WAV_NUM_NAME  34 // Wave number and name
#define ICON_WAV_NUM_DEC   35
#define ICON_WAV_NUM_VAL   36
#define ICON_WAV_NUM_INC   37
#define ICON_WAV_IPO_DEC   39 // Initial Pitch Offset
#define ICON_WAV_IPO_VAL   40
#define ICON_WAV_IPO_INC   41
#define ICON_WAV_FPO_DEC   43 // Final Pitch Offset
#define ICON_WAV_FPO_VAL   44
#define ICON_WAV_FPO_INC   45
#define ICON_WAV_GT_BACK   47 // Glide Time
#define ICON_WAV_GT_SLDR   48
#define ICON_WAV_GT_VAL    49
#define ICON_WAV_PM        50 // Pitch Mod
#define ICON_WAV_AUM       51 // Amp Unsigned Mod
#define ICON_WAV_ASM       52 // Amp Signed Mod

// Filter Pane Icons
#define ICON_FLT_CF_DEC    35 // Cuttoff Frequency
#define ICON_FLT_CF_VAL    36
#define ICON_FLT_CF_INC    37
#define ICON_FLT_LOW_PASS  38 // Low Pass
#define ICON_FLT_BAND_PASS 39 // Band Pass
#define ICON_FLT_HIGH_PASS 40 // High Pass
#define ICON_FLT_RETRIG    41 // Retrigger
#define ICON_FLT_INVERT    42 // Invert Envelope
#define ICON_FLT_RES_BACK  44 // Resonance
#define ICON_FLT_RES_SLDR  45
#define ICON_FLT_RES_VAL   46
#define ICON_FLT_PM        47 // Pitch Mod
#define ICON_FLT_WF        48 // Wave Filter
#define ICON_FLT_PT        49 // Pitch Track
#define ICON_FLT_ET        50 // Envelope Track

// Noise Generator Pane icons
#define ICON_NOISE_AM      34 // Amplitude Modulation
#define ICON_NOISE_RETRIG  35 // Retrigger
#define ICON_NOISE_ET      36 // Envelope Track

// General Controls Pane icons
#define ICON_COM_PT         2 // Common Wave, Pitch Track
#define ICON_COM_ET         3 // Common Wave, Envelope Track
#define ICON_COM_RETRIG     4 // Common WAve, Retrigger
#define ICON_COM_W1_OUT     5 // Wave 1 Out
#define ICON_COM_W2_OUT     6 // Wave 2 Out
#define ICON_COM_WRM        7 // Wave Ring Mod
#define ICON_COM_FM_BACK    9 // FM Mod Depth
#define ICON_COM_FM_SLDR   10
#define ICON_COM_FM_VAL    11
#define ICON_COM_DT_BACK   13 // Wave 1/2 Detune
#define ICON_COM_DT_SLDR   14
#define ICON_COM_DT_VAL    15
#define ICON_MOD_NUM_NAME  18 // Modulator Wave number and name
#define ICON_MOD_NUM_DEC   19
#define ICON_MOD_NUM_VAL   20
#define ICON_MOD_NUM_INC   21
#define ICON_MOD_RATE_BACK 23 // Modulation rate
#define ICON_MOD_RATE_SLDR 24
#define ICON_MOD_RATE_VAL  25
#define ICON_MOD_DPTH_BACK 27 // Modulation Depth
#define ICON_MOD_DPTH_SLDR 28
#define ICON_MOD_DPTH_VAL  29
#define ICON_GEN_DLE       32 // Defined Length Envelopes
#define ICON_GEN_MONO      33 // Mono Instrument
#define ICON_GEN_ERT_BACK  35 // Envelope Retrigger Time
#define ICON_GEN_ERT_SLDR  36
#define ICON_GEN_ERT_VAL   37
#define ICON_GEN_GAIN_BACK 39 // Instrument Overall Gain
#define ICON_GEN_GAIN_SLDR 40
#define ICON_GEN_GAIN_VAL  41

// Channel window icons (+ 7 * channel_number[0..15])
#define ICON_CHN_VOL_BACK   4
#define ICON_CHN_VOL_SLDR   5
#define ICON_CHN_PRG_VAL    6
#define ICON_CHN_PRG_DEC    7
#define ICON_CHN_PRG_INC    8
#define ICON_CHN_PRG_NAME   9


#define METER_RANGE        41 // range of level meters in dB
/*
// controls menu
struct controls_s
{
  menu_block_t blk;
  menu_item_t loop;
  menu_item_t mono;
  menu_item_t swap;
  menu_item_t banks;
  menu_item_t tempo;
  menu_item_t pitch;
  menu_item_t reset;
};

// keyboard menu
struct keyboard_s
{
  menu_block_t blk;
  menu_item_t player;
  menu_item_t percussion;
};

// synth menu
struct synth_s
{
  menu_block_t blk;
  menu_item_t interface;
  menu_item_t buffer;
  menu_item_t rate;
};

// synth buffer size menu
*/
#define NUM_SIZES 6
/*
struct buffer_s
{
  menu_block_t blk;
  menu_item_t size[NUM_SIZES];
};

// synth sample rate menu
*/
#define NUM_RATES 5
/*
struct rates_s
{
  menu_block_t blk;
  menu_item_t rate[NUM_RATES];
};

// audio interface menu
struct interface_s
{
  menu_block_t blk;
  menu_item_t sharedsound;
  menu_item_t disksample;
};
*/
// audio interface
struct audio_if_s
{
  int(* init)(void);
  void(* term)(void);
  void(* fill)(void);
};

// slider definitions
struct slider_dfn_s
{
  int window; // currently selected slider window
  int icon;   // currently selected slider icon
  slider_t type[NUM_SLIDERS]; // slider type
};

// ro.flags bits
#define QUIT          0
#define MESSAGES_OPEN 1
#define TEMPLATES_OK  2
#define PLAYER_OK     3

// global variables
typedef struct ro_glbs_s
{
  int task_handle;
  int handle[NUM_WINDOWS];
  int cur_menu;
  int cur_pane;
  int flags;
  int sys_start; // start index for system sample rates menu
  int sleep_timer;
  int sleep_timeout;

  menu_t *controls;
  menu_t *synth;

  menu_t *buffer;
  int buffer_size[NUM_SIZES];

  menu_t *rates;
  int sample_rate[NUM_RATES];

  menu_t *interface;
  const struct audio_if_s *audio;

  struct slider_dfn_s slider;
} ro_glbs_t;

extern ro_glbs_t ro;

#define MAX_SYS_RATES 40 // maximum number of system sample rates supported

// ro_audio.c
extern const struct audio_if_s disksample;
extern const struct audio_if_s sharedsound;

// ro.display.c
int trb_to_param(int slider, int n);
int param_to_trb(int slider, int n);


#endif
