/*
  !MidiPlay   A MIDI synthesiser and file player.

  main.h - Common declarations and definitions

  created  19/01/10
  1.0      14/06/14
*/

#ifndef main_h
#define main_h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "midi_spec.h"
#include "wave_spec.h"
#include "instrument.h"

#ifndef FALSE
#define FALSE 0
#define TRUE !FALSE
#endif

#ifndef NULL
#define NULL 0
#endif

// General numeric constants
#define PI     3.1415926535897932384626433832795
#define LN2    0.69314718055994530941723212145818
#define LN10   2.3025850929940456840179914546844

// Saturates 'x' to 'min' or 'max'
// note. for the cortex-m4, if the limit is a power of 2, use the "ssat" or "usat" instructions.
#define LIMIT(lo,x,hi) \
  if((x) < (lo)) (x) = (lo); \
  else if((x) > (hi)) (x) = (hi)

typedef unsigned long long int Uint64;
typedef signed long long int Int64;

// Error return codes
// These must be negative where used i.e. -OUT_OF_RANGE
enum err_msg_e
{
  NO_ERROR_, // must be first
  OUT_OF_RANGE,
  PARAMETER_ERROR,
  UNRECOGNISED,
  INVALID_VOLUME,
  INVALID_SECTOR,
  INVALID_SIZE,
  INVALID_ADDRESS,
  INVALID_DATA,
  INVALID_GAIN,
  INVALID_DELAY,
  INVALID_RATE,
  INVALID_ROUTING,
  INVALID_VALUE,
  UNDEFINED,
  NO_SEQUENCE,
  NO_HEADER,
  INVALID_HEADER_LENGTH,
  UNSUPPORTED_FORMAT,
  INVALID_NUMBER_OF_TRACKS,
  FILE_TOO_LARGE,
  PROBLEM_READING_FILE,
  INCOMPLETE,
  PROBLEM_OPENING_FILE,
  MIDI_INIT_ERROR,
  MIDI_TERM_ERROR,
  NO_FILE_LOADED,
  NO_EXTENSION,
  NO_MATCH,
  NO_KIT,
  NO_BANK,
  NO_INSTRUMENT,
  TOO_MANY_INSTRUMENTS,
  TOO_MANY_BANKS,
  TOO_MANY_WAVES,
  UNKNOWN_HEADING,
  NOT_EDITABLE,
  INVALID_CRC,
  TOO_MANY_FILES,
  CANNOT_ALLOCATE_MEMORY,
  NOT_ACTIVE,
  INVALID_DEVICE,
  UNCONNECTED,
  TOO_MANY_PATCHES,
  UNSUPPORTED,

  NO_INSTRUMENT_NAME,
  INVALID_INSTRUMENT_NUMBER,
  INSTRUMENT_DELETED,
  WAVE_IN_USE,
  WAVE_OUT_OF_RANGE,
  NO_WAVEFORM,

  NUM_ERRORS // must be last
};

// Global Flags
// debug
#define DEBUG_MIDI     0 // (01) display midi messages
#define DEBUG_STACK    1 // (02) display generator stack order
#define DEBUG_MIDI2    2 // (04) display midi controller calculations
#define DEBUG_GLIDE    3 // (08) display midi and synth portamento control
#define DEBUG_CMDS     4 // (10) display received commands
#define DEBUG_KBD      5 // (20) display keyboard activity
#define DEBUG_LOG      6 // (40) log output to file in addition to console

typedef struct mp_global_s
{
//  char appname[16];
  unsigned int debug;
  FILE *choices;
  FILE *log;
} mp_global_t;

extern mp_global_t mpg; // midi_play.c
extern const char offon[2][4]; // command.c

int myprintf(const char *format, ...); // command.c

// ro_audio.c
int cmd_buffer(char *msg, int len);
int cmd_interface(char *msg, int len);

#ifdef __riscos__
#define APP_NAME      "MidiPlay"
#define APP_SPRITE    "midiplay"
#define APP_DIR       "<"APP_NAME"$Dir>"
#define RESOURCES_DIR "<"APP_NAME"Res$Dir>"
#endif

#endif
