/*
kbd_display.h
-------------
*/

#ifndef kbd_display_h
#define kbd_display_h

#define NUM_OCTAVES 6  // keyboard window, number of octaves, starting at a 'C'
#define BOTTOM_KEY  C2 // bottom key of both keyboard window and ascii keyboard map
#define TOP_KEY     D8 // top key of ascii keyboard map

// KeyEntry msg values
#define LBUTTONDOWN 1
#define RBUTTONDOWN 2
#define LBUTTONUP   3
#define MOUSEMOVE   4


// midi out definition
typedef struct out_s
{
  unsigned char
    channel,       // 0..15  (displayed as 1..16)
    velocity,      // 0..127
    bank_hi,       // 0..127
    bank_lo,       // 0..127
    program;       // 0..127
}
out_t;

// channel structure
typedef struct chan_s
{
  unsigned char prg;
  unsigned char bank;
  unsigned char switches;
  unsigned short int volume;
  unsigned short int expression;
  unsigned short int pitch;
} chan_t;

// channel switches bits
enum
{
  SWT_HOLD_PEDAL,
  SWT_PORTAMENTO,
  SWT_SUSTENUTO_PEDAL,
  SWT_SOFT_PEDAL,
  SWT_LEGATO_PEDAL,
  SWT_HOLD_2_PEDAL,
  NUM_SWITCHES
};

// flags bits
#define KEY_TIMER      0 // set to enable key highlight timer
#define KBD_EDITOR     1 // set to drive editor from keyboard
#define MONITOR_CHAN   2 // enable monitor in, 1 bit for each channel
#define MON_CHAN_MASK (((1<<NUM_MIDI_CHANS)-1)<<MONITOR_CHAN) // bit mask

enum {WAS,CUR}; // 1st index to keys below

// main structure
typedef struct midi_s
{
  unsigned int flags;
  out_t out;               // midi message out
  chan_t chan[NUM_MIDI_CHANS];
  unsigned int keys[2][4];     // current and previous status of keyboard, max 128 notes
  int bottom_key;
  int shift;
  int menu_chan; // channel that applies to channel menu
} midi_t;

extern midi_t midi;

// screen (vdu) parameters
typedef struct
{
  int modeFlags;
  int Ncolour;
  int xeig;
  int yeig;
  int log2bpp;
  int width;      // pixels
  int height;
  char *start;    // top left address
  int eol;        // marker for end of vdu parameter list
  int xmag;       // frame x magnification, Q16
  int ymag;       // frame y magnification, Q16
}
  vdu_t;

extern vdu_t vdu;


int KeyEntry(int msg, int x, int y, int buttons);
int highlight_key(int key, int action, int chan);
void plot_frame(int *b);
void read_vdu_vars(void);
int init_kbd_display(void);
void key_highlight_timer(void);
void key_scan(int start);
void init_img(void);
void clear_kbd_display(void);
void highlight_midi_key(int pitch, int state, int channel);
void all_notes_off(int channel);
void set_bottom_key(void);


#endif
