/*
  !MidiPlay   A MIDI synthesiser and file player.

  midisyn.h - Interface

  created  21/12/21
*/

#ifndef midisyn_h
#define midisyn_h

// provided functions (exports)
// ----------------------------
void midiPlayer_new(void);             // initialises the player, synth, sound set, and audio effects
void midiPlayer_term(void);            // terminates the player, synth, sound set, and audio effects
unsigned int *midiPlayer_sample(void); // returns the next audio sample
void midiPlayer_recording(void);       // stores the next 1 second of samples as fast as possible

// midiPlayer_status return values (add combinations)
#define MP_LOADED      1 // bit 0, set if midi file loaded
#define MP_PLAYING     2 // bit 1, set if playing or recording
#define MP_RECORDING   4 // bit 2, set if recording
#define MP_LOOPING     8 // bit 3, set if looping (repeating)
#define MP_PAUSED     16 // bit 4, set if paused
#define MP_KIT        32 // bit 5, set if current instrument is a percussion kit
#define MP_SAMPLE_RATE 8 // bit number, not value, bits 31..8 sample rate
int midiPlayer_status(void); // returns the player status

void midiPlayer_cmd_in(int c); // command stream input, a character at a time
void midiPlayer_cmds(const char *cmds, ...); // interprets commands (use it like printf)

// required functions (imports)
// ----------------------------
int midiPlayer_vprintf(const char *format, va_list arg); // provides a destination for stdout (text)

// display item numbers
#define ITEM_LOOP      0 // data[0] = state, 0 or 1
#define ITEM_CHORUS    1 // data[0] = state, 0 or 1, data[1] = rate, 0 to 1000
#define ITEM_REVERB    2 // data[0] = state, 0 or 1, data[1] = gain, 0 to 500
#define ITEM_FLANGER   3 // data[0] = state, 0 or 1, data[1] = rate, 0 to 1023
#define ITEM_ECHO      4 // data[0] = state, 0 or 1. data[1] = delay, 200 to 16384,
                         // data[1] = straight gain, data[2] = cross gain, both 0 to 1023
#define ITEM_TEMPO     5 // data[0] = tempo, 10 to 1000, percent
#define ITEM_PITCH     6 // data[0] = pitch, -12 to +12, semitones
#define ITEM_VOLUME    7 // data[0] = volume, 0 to 1023
#define ITEM_BALANCE   8 // data[0] = balance -20 to +20
#define ITEM_BASS      9 // data[0] = bass, -15 to +15, dB
#define ITEM_TREBLE   10 // data[0] = treble, -15 to +15, dB
#define ITEM_POSN     11 // data[0] = position, data[1] = song length, both in seconds
#define ITEM_LEN      12 // data[0] = (char*)song length, mm:ss
#define ITEM_NAME     13 // data[0] = (char*)song name
#define ITEM_VERSION  14 // data[0] = (char*)version string
#define ITEM_START    15 // data[0] = state, 0 or 1
#define ITEM_PAUSE    16 // data[0] = state, 0 or 1
#define ITEM_STOP     17 // data[0] = state, 0 or 1
#define ITEM_RECORD   18 // data[0] = state, 0 or 1
#define ITEM_MONO     19 // data[0] = state, 0 or 1 (0 = stereo, 1 = mono)
#define ITEM_SWAP     20 // data[0] = state, 0 or 1 (0 = normal, 1 = left/right swapped)
#define ITEM_BANKS    21 // data[0] = state, 0 or 1 (0 = disable, 1 = enable variation banks)
#define ITEM_KITS     22 // data[0] = state, 0 or 1 (0 = disable, 1 = enable variation drum kits)
#define ITEM_BANK_OVERRIDE 23 // data[0] = bank override, 0 = disable
#define ITEM_KIT_OVERRIDE 24 // data[0] = drum kit override, 0 = disable
#define ITEM_USER     25 // data[0] = instrument number, data[1] = pointer to bank name,
                         // data[2] = pointer to instrument definition
                         // data[3] = program, data[4] = bank hi, data[5] = bank lo
#define ITEM_BUFFER   26 // data[0] = buffer size in samples
#define ITEM_RATE     27 // data[0] = synth sample rate
#define ITEM_INTERFACE 28 // data[0] = audio interface, 0 = SharedSound, 1 = DiskSample
#define ITEM_CHN_VOL  29 // data[0] = channel, data[1] = volume
#define ITEM_CHN_PRG  30 // data[0] = channel, data[1] = program, data[2] = &name
void midiPlayer_display(int item, int *data); // displays/updates the above items

#ifdef __riscos__
#define WAVE       0xfb1
#define MIDI       0xfd4
void set_filetype(char *filename, int filetype); // sets the riscos filetype
//int init_audio(void); // reinitialise the audio if the sample rate is changed
//int init_ss(void);
#endif

#endif
