Logo Search packages:      
Sourcecode: alsa-driver version File versions  Download package

ultra_todo.h

/*
 *  section for direct support of synthesizer - /dev/ultra
 */

#define ULTRA_SYNTH_VERSION   0x00010000
      /* current version of protocol - 1.00; main mask is 0x7fff0000 */
      /* changes in low 8 bites -> protocols are backwards compatible */
      /* high 8. bites -> protocols are totaly uncompatible */

/* some typedef's */

typedef struct ULTRA_SYNTH_RESET ultra_synth_reset_t;
typedef struct ULTRA_SYNTH_INFO ultra_synth_info_t;
typedef struct ULTRA_SYNTH_STATE ultra_synth_state_t;
typedef struct ULTRA_SYNTH_ULTRACLICK ultra_synth_ultraclick_t;
typedef struct ULTRA_MEMORY_BLOCK ultra_memory_block_t;
typedef struct ULTRA_MEMORY_LIST ultra_memory_list_t;
typedef struct ULTRA_MEMORY_DUMP ultra_memory_dump_t;
typedef struct ULTRA_INSTRUMENT_WAVE ultra_synth_wave_t;
typedef struct ULTRA_INSTRUMENT_LAYER ultra_synth_layer_t;
typedef struct ULTRA_INSTRUMENT ultra_instrument_t;
typedef struct ULTRA_INSTRUMENT_INFO ultra_instrument_info_t;
typedef struct ULTRA_DSP_EFFECT ultra_dsp_effect_t;
typedef struct ULTRA_MIDI_DEVICES ultra_midi_devices_t;
typedef struct ULTRA_MIDI_DEVICE_INFO ultra_midi_device_info_t;
typedef struct ULTRA_MIDI_THRU ultra_midi_thru_t;

/* control */ 
#define ULTRA_SYNTH_IOCTL_VERSION   _IOR ( 'U', 0x00, int )
#define ULTRA_SYNTH_IOCTL_RESET0    _IOR ( 'U', 0x01, ultra_synth_reset_t )
#define ULTRA_SYNTH_IOCTL_RESET           _IOWR( 'U', 0x01, ultra_synth_reset_t )
#define ULTRA_SYNTH_IOCTL_INFO            _IOR ( 'U', 0x02, ultra_synth_info_t )
#define ULTRA_SYNTH_IOCTL_STATE           _IOR ( 'U', 0x03, ultra_synth_state_t )
/* setup */
#define ULTRA_SYNTH_GET_ULTRACLICK  _IOR ( 'U', 0x20, ultra_synth_ultraclick_t )
#define ULTRA_SYNTH_SET_ULTRACLICK  _IOW ( 'U', 0x20, ultra_synth_ultraclick_t )
#define ULTRA_SYNTH_GET_MIDI_EMUL   _IOR ( 'U', 0x21, int )
#define ULTRA_SYNTH_SET_MIDI_EMUL   _IOW ( 'U', 0x21, int )
#define ULTRA_SYNTH_EFFECT_RESET    _IO  ( 'U', 0x22 )
#define ULTRA_SYNTH_EFFECT_SETUP    _IOW ( 'U', 0x22, ultra_dsp_effect_t )
/* timer */
#define ULTRA_SYNTH_TIMER_START           _IO  ( 'U', 0x40 )
#define ULTRA_SYNTH_TIMER_STOP            _IO  ( 'U', 0x41 )
#define ULTRA_SYNTH_TIMER_CONTINUE  _IO  ( 'U', 0x42 )
#define ULTRA_SYNTH_TIMER_BASE            _IOW ( 'U', 0x43, int )
#define ULTRA_SYNTH_TIMER_TEMPO           _IOW ( 'U', 0x44, int )
#define ULTRA_SYNTH_TIMER_MASTER    _IO  ( 'U', 0x45 )
#define ULTRA_SYNTH_TIMER_SLAVE           _IOW ( 'U', 0x46, int )
/* memory */
#define ULTRA_SYNTH_MEMORY_RESET    _IOW ( 'U', 0x60, int )
#define ULTRA_SYNTH_MEMORY_TEST           _IOW ( 'U', 0x61, ultra_instrument_t )
#define ULTRA_SYNTH_MEMORY_ALLOC    _IOW ( 'U', 0x62, ultra_instrument_t )
#define ULTRA_SYNTH_MEMORY_FREE           _IOW ( 'U', 0x63, ultra_instrument_t )
#define ULTRA_SYNTH_MEMORY_PACK           _IO  ( 'U', 0x64 )
#define ULTRA_SYNTH_MEMORY_BALLOC   _IOW ( 'U', 0x65, ultra_memory_block_t )
#define ULTRA_SYNTH_MEMORY_BFREE    _IOW ( 'U', 0x66, ultra_memory_block_t )
#define ULTRA_SYNTH_MEMORY_INFO           _IOR ( 'U', 0x67, ultra_instrument_info_t )
#define ULTRA_SYNTH_MEMORY_LIST           _IOWR( 'U', 0x67, ultra_memory_list_t )
#define ULTRA_SYNTH_MEMORY_DUMP           _IOW ( 'U', 0x70, ultra_memory_dump_t )
/* command queue */
#define ULTRA_SYNTH_WQUEUE_SET_SIZE _IOW ( 'U', 0x80, int )
#define ULTRA_SYNTH_WQUEUE_GET_SIZE       _IOR ( 'U', 0x80, int )
#define ULTRA_SYNTH_WQUEUE_FREE           _IOR ( 'U', 0x81, int )
#define ULTRA_SYNTH_WQUEUE_THRESHOLD      _IOW ( 'U', 0x82, int )
#define ULTRA_SYNTH_RQUEUE_SET_SIZE       _IOW ( 'U', 0x88, int )
#define ULTRA_SYNTH_RQUEUE_GET_SIZE       _IOR ( 'U', 0x88, int )
#define ULTRA_SYNTH_RQUEUE_USED           _IOR ( 'U', 0x89, int )
#define ULTRA_SYNTH_FLUSH           _IO  ( 'U', 0x90 )
#define ULTRA_SYNTH_ABORT           _IO  ( 'U', 0x91 )
#define ULTRA_SYNTH_QABORT          _IO  ( 'U', 0x92 )
#define ULTRA_SYNTH_STOP            _IO  ( 'U', 0x93 )
#define ULTRA_SYNTH_CONTINUE        _IO  ( 'U', 0x94 )

/* MIDI emulation */

#define ULTRA_MIDI_EMUL_GM    0x0000
#define ULTRA_MIDI_EMUL_GS    0x0001
#define ULTRA_MIDI_EMUL_MT32  0x0002
#define ULTRA_MIDI_EMUL_AUTO  0x00ff

/*
 *  commands in read/write queues
 *
 *  format of queue (one record have 8 bytes):
 *
 *    0. byte           command           see ULTRA_CMD_XXXX constants
 *    1. byte           voice or channel #
 *    2.-7. byte  arguments 
 */

/*
 *  first level - simple voice commands for MOD players
 */

/* voice stop controllers */
#define ULTRA_STOP_NOW        0x00
#define ULTRA_STOP_LOOP       0x01
#define ULTRA_STOP_ENVELOPE   0x02
/* frequency controllers */
#define ULTRA_FREQ_HZ         0x00000000
#define ULTRA_FREQ_NOTE       0x40000000
#define ULTRA_FREQ_PITCHBEND  0x80000000
#define ULTRA_FREQ_OSSNOTE    0xc0000000
#define ULTRA_FREQ_MASK       0xc0000000
#define ULTRA_FREQ_DATA       (unsigned int)(~ULTRA_FREQ_MASK)
/* volume controllers */
#define ULTRA_VOLUME_LINEAR   0x0000
#define ULTRA_VOLUME_MIDI     0x4000
#define ULTRA_VOLUME_EXP      0x8000
#define ULTRA_VOLUME_MASK     0xc000
#define ULTRA_VOLUME_DATA     (unsigned short)(~ULTRA_VOLUME_MASK)
/* pan controllers */
#define ULTRA_PAN_LINEAR      0x0000
#define ULTRA_PAN_MASK        0xc000
#define ULTRA_PAN_DATA        (unsigned short)(~ULTRA_PAN_MASK)
/* lfo commands */
#define ULTRA_LFO_SETUP       0x00
#define ULTRA_LFO_FREQ        0x01
#define ULTRA_LFO_DEPTH       0x02
#define ULTRA_LFO_ENABLE      0x03
#define ULTRA_LFO_DISABLE     0x04
#define ULTRA_LFO_SHUTDOWN    0x05
/* private1 subcommands */
#define ULTRA_PRIV1_IW_EFFECT 0x00

#define ULTRA_CMD_VOICE_PROGRAM           0x00  /* change voice program */
#define ULTRA_CMD_VOICE_START       0x01  /* voice start */
#define ULTRA_CMD_VOICE_STOP        0x02  /* voice stop */
#define ULTRA_CMD_VOICE_CONTROL           0x03  /* voice control */
#define ULTRA_CMD_VOICE_FREQ        0x04  /* voice frequency */
#define ULTRA_CMD_VOICE_VOLUME            0x05  /* voice volume */
#define ULTRA_CMD_VOICE_SLOOP       0x06  /* voice loop start in bytes * 16 */
#define ULTRA_CMD_VOICE_ELOOP       0x07  /* voice loop end in bytes * 16 */
#define ULTRA_CMD_VOICE_RAMP        0x08  /* voice ramp range & control */
#define ULTRA_CMD_VOICE_POS         0x09  /* voice position in bytes * 16 (lowest 4 bits - fraction) */
#define ULTRA_CMD_VOICE_PAN         0x0a  /* voice pan (balance) */
#define ULTRA_CMD_VOICE_LFO         0x0b  /* voice lfo setup */
#define ULTRA_CMD_VOICE_PRIVATE1    0x20  /* voice private1 command */

/*
 *  second level - channel commands
 */

#define ULTRA_CMD_CHN_PROGRAM       0x40  /* change program */
#define ULTRA_CMD_CHN_NOTE_ON       0x41  /* note on */
#define ULTRA_CMD_CHN_NOTE_OFF            0x42  /* note off */
#define ULTRA_CMD_CHN_PITCHBEND           0x43  /* pitch bend change */
#define ULTRA_CMD_CHN_BALANCE       0x45  /* change balance */
#define ULTRA_CMD_CHN_CONTROL       0x46  /* channel control */
#define ULTRA_CMD_CHN_NOTE_PRESSURE 0x47  /* note pressure */
#define ULTRA_CMD_CHN_PRESSURE            0x48  /* channel pressure */

/*
 *  common level - timing/misc
 */

/* 0x80-0xff - second byte is extended argument, not voice */

#define ULTRA_CMD_WAIT              0x80  /* wait x us (uint) 1-(uint max) */
#define ULTRA_CMD_STOP              0x81  /* see ULTRA_IOCTL_ABORT ioctl */
#define ULTRA_CMD_TEMPO             0x82  /* set tempo */

/* 0xf0-0xff - input commands */

#define ULTRA_CMD_ECHO              0xf0  /* this will be send to file input - read() function */
#define ULTRA_CMD_VOICES_CHANGE           0xf1  /* active voices were changed */

/* structures */

00171 struct ULTRA_SYNTH_RESET {
  unsigned int voices;        /* active voices */
  unsigned int channel_voices;      /* bitmap of voices used for channel commands (dynamicaly allocated) */
  unsigned char reserved[32];
};

#define ULTRA_SYNTH_INFO_F_PCM            0x00000001  /* GF1 PCM during SYNTH enabled */
#define ULTRA_SYNTH_INFO_F_ENHANCED 0x00000002  /* InterWave - enhanced mode */
#define ULTRA_SYNTH_INFO_F_SERVER   0x00000004  /* instrument server is present */

00181 struct ULTRA_SYNTH_INFO {
  unsigned char id[ 32 ];       /* id of synthesizer */
  unsigned char info[ 80 ];     /* info about synthesizer */
  unsigned int version;         /* see to ULTRA_CARD_VERSION_XXXX constants */

  unsigned int flags;           /* some info flags - see to ULTRA_STRU_INFO_F_XXXX */

  unsigned int voices;          /* max # of voices */
  struct {
    unsigned int size;          /* size of this bank in bytes */
    unsigned int address;       /* start address of this bank */
  } memory_banks[16];
  struct {
    unsigned int size;          /* size of this bank in bytes */
    unsigned int address;       /* start address of this bank */
  } memory_rom_banks[16];
  unsigned char reserved[128];        /* all zeroes */
};

00200 struct ULTRA_SYNTH_STATE {
  unsigned int mixing_freq;     /* mixing frequency in Hz */

  unsigned int memory_size;     /* in bytes */
  unsigned int memory_free;     /* in bytes */
  unsigned int memory_block_8;        /* largest free 8-bit block in memory */
  unsigned int memory_block_16;       /* largest free 16-bit block in memory */

  unsigned char reserved[128];        /* reserved for future use */
};

00211 struct ULTRA_STRU_ULTRACLICK {
  unsigned int smooth_pan: 1,     /* 1 = enable, 0 = disable */
             full_range_pan: 1, /* 1 = enable, 0 = disable */
             volume_ramp: 8;    /* 0 = disable, 1-255 */

  unsigned char reserved[16];   /* reserved for future use */
};

/*
 *  Abstract instrument interface
 */

/* ultra_instrument_t/ultra_instrument_layer_t/ultra_instrument_wave_t -> mode */

#define ULTRA_INSTR_FM              0x00000000  /* FM / OPL3 instrument */
#define ULTRA_INSTR_SIMPLE          0x00000001  /* simple format - for MOD players */
#define ULTRA_INSTR_PATCH           0x00000002  /* old GF1 patch format */
#define ULTRA_INSTR_INTERWAVE       0x00000003  /* new InterWave format */
#define ULTRA_INSTR_COUNT           4

/* ultra_instrument_t -> flags */

#define ULTRA_INSTR_F_NORMAL        0x0000      /* normal mode */
#define ULTRA_INSTR_F_NOT_FOUND           0x0001      /* instrument cann't be loaded */
#define ULTRA_INSTR_F_ALIAS         0x0002      /* alias */
#define ULTRA_INSTR_F_NOT_LOADED    0x00ff      /* instrument not loaded (not found) */

/* ultra_instrument_t -> exclusion */

#define ULTRA_INSTR_E_NONE          0x0000      /* exclusion mode - none */
#define ULTRA_INSTR_E_SINGLE        0x0001      /* exclude single - single note from instrument group */
#define ULTRA_INSTR_E_MULTIPLE            0x0002      /* exclude multiple - stop only same note from this instrument */

/* ultra_instrument_t -> layer */

#define ULTRA_INSTR_L_NONE          0x0000      /* not layered */
#define ULTRA_INSTR_L_ON            0x0001      /* layered */
#define ULTRA_INSTR_L_VELOCITY            0x0002      /* layered by velocity */
#define ULTRA_INSTR_L_FREQUENCY           0x0003      /* layered by frequency */

/* ultra_instrument_t - data.effects[] */

#define ULTRA_INSTR_IE_NONE         0
#define ULTRA_INSTR_IE_REVERB       1
#define ULTRA_INSTR_IE_CHORUS       2
#define ULTRA_INSTR_IE_ECHO         3

00258 struct ULTRA_INSTRUMENT_WAVE {
  unsigned int share_id1;           /* share id (part 1) - 0 = no sharing enabled */
  unsigned int share_id2;           /* share id (part 2) - 0 = no sharing enabled */

  unsigned int mode;                /* see to ULTRA_INSTR_XXXX constants */
  unsigned int format;              /* depends on mode variable */

  struct {
    unsigned int number;            /* some other ID for this instrument */
    unsigned int memory;            /* begin of waveform in onboard memory */
    unsigned char *ptr;             /* pointer to waveform in system memory */
  } address;
  
  char reserved[16];                /* reserved for future use */
  void *private;              /* private data for wave */
  struct ULTRA_STRU_WAVE *next;
};

00276 struct ULTRA_INSTRUMENT_LAYER {
  unsigned int mode;                /* see to ULTRA_INSTR_XXXX constants */
  void *private_data;               /* private data */
  char reserved[16];                /* reserved for future use */
  struct ULTRA_STRU_WAVE *wave;
  struct ULTRA_STRU_LAYER *next;
};

00284 struct ULTRA_INSTRUMENT {
  union {
    struct {
#ifdef ULTRA_LITTLE_ENDIAN
      unsigned short prog;
      unsigned short bank;
#else
      unsigned short bank;
      unsigned short prog;
#endif
    } midi;
    unsigned int instrument;        /* instrument number */
  } number;

  char *name;                       /* name of this instrument or NULL */

  unsigned int mode;                /* see to ULTRA_INSTR_XXXX */
  unsigned int flags;               /* see to ULTRA_INSTR_F_XXXX */
  unsigned short exclusion;         /* see to ULTRA_INSTR_E_XXXX */
  unsigned short layer;             /* see to ULTRA_INSTR_L_XXXX */
  unsigned short exclusion_group;   /* 0 - none, 1-65535 */

  unsigned char effects[ 4 ];       /* use global effect if available */
  unsigned char effects_depth[ 4 ]; /* 0-127 */

  union {
    struct {
    } iw;
    struct {
      unsigned char effect1 : 4,    /* use global effect if available */
                      effect2 : 4;  /* use global effect if available */
      unsigned char effect1_depth;  /* 0-127 */
      unsigned char effect2_depth;  /* 0-127 */
    } patch;
  } data;

  unsigned char reserved[ 32 ];           /* reserved for future use */

  union {
    struct ULTRA_STRU_LAYER *layer; /* first layer */
    struct {
#ifdef ULTRA_LITTLE_ENDIAN
      unsigned short prog;
      unsigned short bank;
#else
      unsigned short bank;
      unsigned short prog;
#endif
    } midi_alias;
    unsigned int alias;             /* pointer to instrument */
  } info;

  void *private_data;               /* pointer to private data */       

  ultra_instrument_t *left;         /* used by driver or user application for search speedup */
  ultra_instrument_t *right;        /* used by driver or user application for search speedup */

  ultra_instrument_t *next;         /* next instrument */
};

/*
 *  FM instrument
 */
 
00348 struct ULTRA_INSTRUMENT_WAVE_FM {
  union {
    unsigned char data[32];         /* register settings for operator cells (.SBI format) */
  } data;
};
 
/*
 *  Simple wave-based instrument
 */

/* bits for wave-based instruments for format variable in ultra_instrument_wave_t */

#define ULTRA_WAVE_16BIT            0x0001      /* 16-bit wave */
#define ULTRA_WAVE_UNSIGNED         0x0002      /* unsigned wave */
#define ULTRA_WAVE_INVERT           0x0002      /* same as unsigned wave */
#define ULTRA_WAVE_BACKWARD         0x0004      /* backward mode (maybe used for reverb or ping-ping loop) */
#define ULTRA_WAVE_LOOP             0x0008      /* loop mode */
#define ULTRA_WAVE_BIDIR            0x0010      /* bidirectional mode */
#define ULTRA_WAVE_ULAW             0x0020      /* uLaw compressed wave */
#define ULTRA_WAVE_RAM              0x0040      /* wave is _preloaded_ in RAM (it is used for ROM simulation) */
#define ULTRA_WAVE_ROM              0x0080      /* wave is in ROM */

00370 struct ULTRA_INSTRUMENT_WAVE_SIMPLE {
  unsigned int size;                /* size of waveform in bytes */
  unsigned int start;               /* start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_start;          /* bits loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_end;            /* loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned short loop_repeat;       /* loop repeat - 0 = forever */
};

/*
 *  UltraSound GF1 patch instrument
 */

#define ULTRA_WAVE_PATCH_ENVELOPE   0x0001      /* envelopes on */
#define ULTRA_WAVE_PATCH_SUSTAIN    0x0002      /* sustain mode */

00385 struct ULTRA_INSTRUMENT_WAVE_PATCH {
  unsigned int size;                /* size of waveform in bytes */
  unsigned int start;               /* start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_start;          /* bits loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_end;            /* loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned short loop_repeat;       /* loop repeat - 0 = forever */
  unsigned short flags;
  unsigned int sample_rate;
  unsigned int low_frequency; /* low frequency range for this waveform */
  unsigned int high_frequency;      /* high frequency range for this waveform */
  unsigned int root_frequency;      /* root frequency for this waveform */
  signed short tune;
  unsigned char balance;
  unsigned char envelope_rate[ 6 ];
  unsigned char envelope_offset[ 6 ];
  unsigned char tremolo_sweep;
  unsigned char tremolo_rate;
  unsigned char tremolo_depth;
  unsigned char vibrato_sweep;
  unsigned char vibrato_rate;
  unsigned char vibrato_depth;
  unsigned short scale_frequency;
  unsigned short scale_factor;      /* 0-2048 or 0-2 */
};

/*
 *  InterWave instrument
 */

00414 struct ULTRA_INSTRUMENT_WAVE_INTERWAVE {
  unsigned int size;                /* size of waveform in bytes */
  unsigned int start;               /* start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_start;          /* bits loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned int loop_end;            /* loop start offset in bytes * 16 (lowest 4 bits - fraction) */
  unsigned short loop_repeat;       /* loop repeat - 0 = forever */
  unsigned int sample_ratio;        /* sample ratio (44100 * 1024 / rate) */
  unsigned char attenuation;        /* 0 - 127 (no corresponding midi controller) */
  unsigned char low_note;           /* lower frequency range for this waveform */
  unsigned char high_note;          /* higher frequency range for this waveform */
};

#define ULTRA_IW_LFO_SHAPE_TRIANGLE 0
#define ULTRA_IW_LFO_SHAPE_POSTRIANGLE    1

00429 struct ULTRA_IW_LFO {
  unsigned short freq;        /* (0-2047) 0.01Hz - 21.5Hz */
  signed short depth;         /* volume +- (0-255) 0.48675dB/step */
  signed short sweep;         /* 0 - 950 deciseconds */
  unsigned char shape;        /* see to ULTRA_IW_LFO_SHAPE_XXXX */
  unsigned char delay;        /* 0 - 255 deciseconds */
};

/* struct ULTRA_IW_ENV - flags */

#define ULTRA_IW_ENV_F_RETRIGGER    0x0001      /* flags - retrigger */

#define ULTRA_IW_ENV_M_ONE_SHOT           0x0001      /* mode - one shot */
#define ULTRA_IW_ENV_M_SUSTAIN            0x0002      /* mode - sustain */
#define ULTRA_IW_ENV_M_NO_SUSTAIN   0x0003      /* mode - no sustain */

#define ULTRA_IW_ENV_I_VELOCITY           0x0001      /* index - velocity */
#define ULTRA_IW_ENV_I_FREQUENCY    0x0002      /* index - frequency */

00448 struct ULTRA_IW_ENV_RECORD {
  unsigned short nattack;
  unsigned short nrelease;
  unsigned short sustain_offset;
  unsigned short sustain_rate;
  unsigned short release_rate;
  unsigned char hirange;
  struct {
    unsigned short offset;
    unsigned short rate;
  } *points;                  /* count of points = nattack + nrelease */
  struct ULTRA_IW_ENV_RECORD *next;
};

00462 struct ULTRA_IW_ENV {
  unsigned char flags: 8,
            mode: 4,
            index: 4;
  struct ULTRA_IW_ENV_RECORD *record;
};

#define ULTRA_LAYER_IW_F_RETRIGGER  0x0001      /* retrigger */

#define ULTRA_LAYER_IW_V_VEL_TIME   0x0000      /* velocity mode = time */
#define ULTRA_LAYER_IW_V_VEL_RATE   0x0001      /* velocity mode = rate */

#define ULTRA_LAYER_IW_E_KUP        0x0000      /* layer event - key up */
#define ULTRA_LAYER_IW_E_KDOWN            0x0001      /* layer event - key down */
#define ULTRA_LAYER_IW_E_RETRIG           0x0002      /* layer event - retrigger */
#define ULTRA_LAYER_IW_E_LEGATO           0x0003      /* layer event - legato */

00479 struct ULTRA_INSTRUMENT_LAYER_INTERWAVE {
  unsigned short flags: 8,          /* see to ULTRA_LAYER_IW_F_XXXX */
                   velocity_mode: 4,      /* see to ULTRA_LAYER_IW_V_XXXX */
                   layer_event: 4;  /* see to ULTRA_LAYER_IW_E_XXXX */
  unsigned char low_range;          /* range for layer based */
  unsigned char high_range;         /* on either velocity or frequency */
  unsigned char pan;                /* pan offset from CC1 (0 left - 127 right) */
  unsigned char pan_freq_scale;           /* position based on frequency (0-127) */
  struct ULTRA_IW_LFO tremolo;            /* tremolo effect */
  struct ULTRA_IW_LFO vibrato;            /* vibrato effect */
  unsigned char attenuation;        /* 0-127 (no corresponding midi controller) */
  unsigned short freq_scale;        /* 0-2048, 1024 is equal to semitone scaling */
  unsigned char freq_center;        /* center for keyboard frequency scaling */
  struct ULTRA_IW_ENV penv;         /* pitch envelope */
  struct ULTRA_IW_ENV venv;         /* volume envelope */
};

/*
 *
 */

00500 struct ULTRA_INSTRUMENT_NAME {
  union {
    struct {
#ifdef ULTRA_LITTLE_ENDIAN
      unsigned short prog;
      unsigned short bank;
#else
      unsigned short bank;
      unsigned short prog;
#endif
    } midi;
    unsigned int instrument;        /* instrument number */
  } number;
  char name[ 64 ];                  /* name of this instrument */
  unsigned int mode;                /* see to ULTRA_INSTR_XXXX */
  unsigned int flags;               /* see to ULTRA_INSTR_F_XXXX */
  unsigned char reserved[32];
};

/*
 *
 */

00523 struct ULTRA_MEMORY_LIST {
  unsigned int count;               /* count of instruments */
  union {
    unsigned int *instruments;
    struct {
#ifdef ULTRA_LITTLE_ENDIAN
      unsigned short prog;
      unsigned short bank;
#else
      unsigned short bank;
      unsigned short prog;
#endif
    } *midi;
  } info;
  unsigned char reserved[64];
};

#define ULTRA_MEMORY_DUMP_RAM       0x0001
#define ULTRA_MEMORY_DUMP_ROM       0x0002
#define ULTRA_MEMORY_DUMP_WRITE           0x0004      /* if RAM - write block to RAM */
#define ULTRA_MEMORY_DUMP_INVERT    0x0008
#define ULTRA_MEMORY_DUMP_UNSIGNED  0x0008
#define ULTRA_MEMORY_DUMP_16BIT           0x0010      /* 16-bit wave */

00547 struct ULTRA_MEMORY_DUMP {
  unsigned int flags;           /* see to ULTRA_MEMORY_DUMP_XXXX constants */
  unsigned int address;         /* linear address to GUS's memory */
  unsigned int size;            /* size of transferred block */
  unsigned char *dump;          /* pointer to destonation memory block */
  unsigned char reserved[16];   /* reserved for future use */
};

#define ULTRA_MEMORY_BLOCK_LOCKED   0x0001      /* lock memory (don't free this by close()) */
#define ULTRA_MEMORY_BLOCK_16BIT    0x0002      /* for old GF1 chip (256k boundaries) */
#define ULTRA_MEMORY_BLOCK_ALREADY 0x0004 /* block is already allocated */

00559 struct ULTRA_MEMORY_BLOCK {
  unsigned short flags;           /* see to ULTRA_MEMORY_BLOCK_XXXX constants */
  unsigned int address;         /* linear address in GUS's memory - if alloc - filled by driver */
  unsigned int size;            /* size of this block */
  unsigned char id[ 256 ];      /* identification (for lock) */
};

/* this structure is for InterWave only */

#define ULTRA_EFFECT_CHIP_INTERWAVE 0x0001

#define ULTRA_EFFECT_F_IW_USED            0x0001      /* is this voice used? */
#define ULTRA_EFFECT_F_IW_ALTERNATE 0x0002      /* enable alternate path for this effect processor */

00573 struct ULTRA_EFFECT_INTERWAVE {
  unsigned short flags;             /* see to ULTRA_EFFECT_F_IW_???? */
  unsigned short number;            /* effect number */

  unsigned int buffer_addr;         /* used by driver */
  unsigned int buffer_size;         /* write buffer size */
  unsigned int buffer_pos;          /* initial write position in buffer */
  unsigned short volume;            /* volume - 0-4095 */
  unsigned short effect_volume;     /* effect volume - 0-4095 */
  unsigned short l_offset;          /* left offset - 0-4095 */
  unsigned short r_offset;          /* right offset - 0-4095 */

  unsigned short vibrato_control;   /* control bits + freq */
  unsigned short vibrato_depth;           /* 0-8191 */
  unsigned short tremolo_control;   /* control bits + freq */
  unsigned short tremolo_depth;           /* 0-8191 */

  unsigned char write_mask;         /* write mask for accumulators */
};

00593 struct ULTRA_STRU_EFFECT {
  unsigned short chip_type;         /* see to ULTRA_EFFECT_CHIP_???? */
  union {
    struct {
      unsigned char voice_output[ 8 ];    /* voice accumulator bitmap */
      /* eight effects processors should be enough */
      struct ULTRA_EFFECT_INTERWAVE voices[ 8 ];
    } interwave;
  } chip;
  unsigned char reserved[1024];
};

/*
 *
 *  MIDI interface
 *
 */

#define ULTRA_MIDI_DEV_COUNT        14    /* max midi devices per card */
#define ULTRA_MIDI_DEV_COMMON       0xff  /* common (control) device */

#define ULTRA_MCMD_NOTE_OFF             0x80
#define ULTRA_MCMD_NOTE_ON              0x90
#define ULTRA_MCMD_NOTE_PRESSURE        0xa0
#define ULTRA_MCMD_CONTROL              0xb0
#define ULTRA_MCMD_PGM_CHANGE           0xc0
#define ULTRA_MCMD_CHANNEL_PRESSURE     0xd0
#define ULTRA_MCMD_BENDER               0xe0

#define ULTRA_MCMD_COMMON_SYSEX         0xf0
#define ULTRA_MCMD_COMMON_MTC_QUARTER     0xf1
#define ULTRA_MCMD_COMMON_SONG_POS  0xf2
#define ULTRA_MCMD_COMMON_SONG_SELECT     0xf3
#define ULTRA_MCMD_COMMON_TUNE_REQUEST    0xf6
#define ULTRA_MCMD_COMMON_SYSEX_END     0xf7
#define ULTRA_MCMD_COMMON_CLOCK           0xf8  /* ignored - not passed to/from MIDI output/input queue */
#define ULTRA_MCMD_COMMON_START           0xfa
#define ULTRA_MCMD_COMMON_CONTINUE  0xfb
#define ULTRA_MCMD_COMMON_STOP            0xfc
#define ULTRA_MCMD_COMMON_SENSING   0xfe  /* ignored - not passed to/from MIDI output/input queue */
#define ULTRA_MCMD_COMMON_RESET           0xff  /* ignored - not passed to/from MIDI output/input queue */

#define ULTRA_MIDI_IOCTL_DEVICE_OPEN      _IOW ( 'U', 0x00, struct ULTRA_MIDI_OPEN )
#define ULTRA_MIDI_IOCTL_DEVICE_CLOSE     _IO  ( 'U', 0x00 )
#define ULTRA_MIDI_IOCTL_TIMER_BASE _IOW ( 'U', 0x02, int )
#define ULTRA_MIDI_IOCTL_TIMER_TEMPO      _IOW ( 'U', 0x03, int )
#define ULTRA_MIDI_IOCTL_TIMER_START      _IO  ( 'U', 0x04 )
#define ULTRA_MIDI_IOCTL_TIMER_STOP _IO  ( 'U', 0x05 )
#define ULTRA_MIDI_IOCTL_TIMER_CONTINUE   _IO  ( 'U', 0x06 )
#define ULTRA_MIDI_IOCTL_THRESHOLD  _IOW ( 'U', 0x07, int )
#define ULTRA_MIDI_IOCTL_FLUSH            _IO  ( 'U', 0x08 )
#define ULTRA_MIDI_IOCTL_REALTIME   _IOW ( 'U', 0x08, struct ULTRA_MIDI_REALTIME )
#define ULTRA_MIDI_IOCTL_ABORT            _IO  ( 'U', 0x09 )
#define ULTRA_MIDI_IOCTL_SET_THRU   _IOW ( 'U', 0x0a, struct ULTRA_MIDI_THRU )
#define ULTRA_MIDI_IOCTL_GET_THRU   _IOR ( 'U', 0x0a, struct ULTRA_MIDI_THRU )

#define ULTRA_MIDI_IOCTL_PRELOAD_BANK     _IOW ( 'U', 0x10, struct ULTRA_MIDI_PRELOAD_BANK )
#define ULTRA_MIDI_IOCTL_PRELOAD_INSTRUMENT _IOW ( 'U', 0x11, struct ULTRA_MIDI_PRELOAD_INSTRUMENTS )
#define ULTRA_MIDI_IOCTL_GET_EMULATION    _IOR ( 'U', 0x12, struct ULTRA_MIDI_EMULATION )
#define ULTRA_MIDI_IOCTL_SET_EMULATION    _IOW ( 'U', 0x12, struct ULTRA_MIDI_EMULATION )

#define ULTRA_MIDI_IOCTL_MEMORY_RESET     _IOW ( 'U', 0x13, struct ULTRA_MIDI_MEMORY_RESET )
#define ULTRA_MIDI_IOCTL_MEMORY_TEST      _IOW ( 'U', 0x14, struct ULTRA_MIDI_INSTRUMENT )
#define ULTRA_MIDI_IOCTL_MEMORY_ALLOC     _IOW ( 'U', 0x15, struct ULTRA_MIDI_INSTRUMENT )
#define ULTRA_MIDI_IOCTL_MEMORY_FREE      _IOW ( 'U', 0x16, struct ULTRA_MIDI_INSTRUMENT )
#define ULTRA_MIDI_IOCTL_MEMORY_PACK      _IOW ( 'U', 0x17, struct ULTRA_MIDI_MEMORY_PACK )
#define ULTRA_MIDI_IOCTL_MEMORY_BALLOC    _IOW ( 'U', 0x18, struct ULTRA_MIDI_MEMORY_BLOCK )
#define ULTRA_MIDI_IOCTL_MEMORY_BFREE     _IOW ( 'U', 0x19, struct ULTRA_MIDI_MEMORY_BLOCK )
#define ULTRA_MIDI_IOCTL_MEMORY_GET_NAME _IOR ( 'U', 0x1a, struct ULTRA_MIDI_INSTRUMENT_NAME )
#define ULTRA_MIDI_IOCTL_MEMORY_DUMP      _IOW ( 'U', 0x1b, struct ULTRA_MIDI_MEMORY_DUMP )
#define ULTRA_MIDI_IOCTL_MEMORY_LIST      _IOWR( 'U', 0x1c, struct ULTRA_MIDI_MEMORY_LIST )

#define ULTRA_MIDI_IOCTL_CARD_INFO  _IOR ( 'U', 0x1d, struct ULTRA_MIDI_CARD_INFO )

#define ULTRA_MIDI_IOCTL_EFFECT_RESET     _IOW ( 'U', 0x1e, struct ULTRA_MIDI_EFFECT_RESET )
#define ULTRA_MIDI_IOCTL_EFFECT_SETUP           _IOW ( 'U', 0x1f, struct ULTRA_MIDI_EFFECT )

#define ULTRA_MIDI_IOCTL_DEVICES    _IOR ( 'U', 0x20, struct ULTRA_MIDI_DEVICES )
#define ULTRA_MIDI_IOCTL_DEVICE_INFO      _IOWR( 'U', 0x21, struct ULTRA_MIDI_DEVICE_INFO )

/* common commands */

#define ULTRA_MCMD_WAIT             0x00  /* wait n-ticks (unsigned int) */
#define ULTRA_MCMD_TEMPO            0x01  /* set tempo (unsigned short) */
#define ULTRA_MCMD_TBASE            0x02  /* set time base (unsigned short) */
#define ULTRA_MCMD_ECHO             0x80  /* echo command */

#define ULTRA_MIDI_OPEN_MODE_READ   0x01
#define ULTRA_MIDI_OPEN_MODE_WRITE  0x02
#define ULTRA_MIDI_OPEN_MODE_DUPLEX 0x03

00684 struct ULTRA_MIDI_OPEN {
  unsigned short devices_used;
  struct {
    unsigned char device;
    unsigned char mode; 
  } devices[ ULTRA_MIDI_DEV_COUNT * ULTRA_CARDS ];
  unsigned char reserved[ 32 ];
};

00693 struct ULTRA_MIDI_THRU {
  unsigned short device;            /* device which will generate MIDI THRU */
  struct {
    unsigned char device;           /* card + device - 0xff - not used */
    unsigned char channel;          /* destonation channel */
    unsigned char velocity;         /* destonation velocity - 0xff - no change */
  } routing[ 16 ][ ULTRA_MIDI_DEV_COUNT ]; /* 16 midi channels and X midi devices */
  unsigned char reserved[ 64 ];
};

00703 struct ULTRA_STRU_MIDI_PRELOAD_BANK {
  unsigned short device;
  char name[ 64 ];
  unsigned char reserved[ 64 ];
};

00709 struct ULTRA_MIDI_PRELOAD_INSTRUMENTS {
  unsigned short device;
  unsigned short instruments_used;
  unsigned int instruments[ 256 ];
  unsigned char reserved[ 64 ];
};

00716 struct ULTRA_MIDI_EMULATION {
  unsigned short device;
  unsigned short emulation;
  unsigned char reserved[ 64 ];
};

00722 struct ULTRA_MIDI_MEMORY_RESET {
  unsigned short device;
  unsigned char reserved[ 32 ];
};

00727 struct ULTRA_MIDI_INSTRUMENT {
  unsigned short device;
  ultra_instrument_t *instrument;
  unsigned char reserved[ 32 ];
};

00733 struct ULTRA_MIDI_MEMORY_PACK {
  unsigned short device;
  unsigned char reserved[ 32 ];
};

00738 struct ULTRA_MIDI_MEMORY_BLOCK {
  unsigned short device;
  struct ULTRA_STRU_MEMORY_BLOCK *block;
  unsigned char reserved[ 32 ];
};

00744 struct ULTRA_MIDI_INSTRUMENT_NAME {
  unsigned short device;
  ultra_instrument_info_t *name;
  unsigned char reserved[ 32 ];
};

00750 struct ULTRA_MIDI_MEMORY_DUMP {
  unsigned short device;
  ultra_memory_dump_t *dump;
  unsigned char reserved[ 32 ];
};

00756 struct ULTRA_MIDI_MEMORY_LIST {
  unsigned short device;
  ultra_memory_list_t *list;
  unsigned char reserved[ 32 ];
};

00762 struct ULTRA_MIDI_CARD_INFO {
  unsigned short device;
  ultra_synth_info_t *info;
};

00767 struct ULTRA_MIDI_EFFECT_RESET {
  unsigned short device;
  unsigned char reserved[ 32 ];
};

00772 struct ULTRA_MIDI_EFFECT {
  unsigned short device;
  struct ULTRA_STRU_EFFECT *effect;
};

00777 struct ULTRA_MIDI_DEVICES {
  int count;
  unsigned char devices[ 256 ];
  unsigned char modes[ 256 ];
  unsigned char reserved[ 128 ];
};

#define ULTRA_MIDI_CAP_INPUT  0x00000001  /* input possible */
#define ULTRA_MIDI_CAP_OUTPUT 0x00000002  /* output possible */
#define ULTRA_MIDI_CAP_SYNTH  0x00000004  /* emulated MIDI */
#define ULTRA_MIDI_CAP_MEMORY 0x00000008  /* memory routines can be used */

00789 struct ULTRA_MIDI_DEVICE_INFO {
  unsigned short device;
  unsigned char name[ 64 ];
  unsigned int cap;
  unsigned char reserved[ 128 ];
};

00796 struct ULTRA_MIDI_REALTIME {
  unsigned char *buffer;
  unsigned int size;
  unsigned char reserved[ 32 ];
};

/*
 *  Instrument server interface
 */

#define ULTRA_DAEMON_MSG_REQUEST    0x0000      /* request to daemon */
#define ULTRA_DAEMON_MSG_REPLY            0x0001      /* reply from daemon */

#define ULTRA_DAEMON_MSG_END_OF_REQUEST 0x0000  /* end of request */
#define ULTRA_DAEMON_MSG_PRELOAD    0x0001      /* preload specified bank */
#define ULTRA_DAEMON_MSG_DOWNLOAD   0x0002      /* instrument download request */
#define ULTRA_DAEMON_MSG_EMUL       0x0003      /* emulation change */
#define ULTRA_DAEMON_MSG_BFREE            0x0004      /* block free */
#define ULTRA_DAEMON_MSG_IWEFF            0x0005      /* interwave effects */

00816 struct ULTRA_STRU_DAEMON_MESSAGE {
  unsigned short direction;
  unsigned short command;
  union {
    unsigned short emul;            /* emulation */
    unsigned char bank_name[ 64 ]; 
    unsigned int instruments[ 64 ]; /* instrument numbers */
    int iw_effect[ 2 ];             /* interwave effect numbers */
    ultra_instrument_t *instrument;
    struct ULTRA_STRU_EFFECT *effect;     /* effect */
  } info; 
};

#define ULTRA_IOCTL_DMN_INFO        _IOR  ( 'U', 0x00, struct ULTRA_STRU_INFO )
#define ULTRA_IOCTL_DMN_INSTRUMENT  _IOWR ( 'U', 0x01, int )
#define ULTRA_IOCTL_DMN_FREE        _IOR  ( 'U', 0x02, int )
#define ULTRA_IOCTL_DMN_MEMORY_DUMP _IOW  ( 'U', 0x03, struct ULTRA_STRU_MEMORY_DUMP )
#define ULTRA_IOCTL_DMN_MEMORY_BALLOC     _IOW  ( 'U', 0x04, struct ULTRA_STRU_MEMORY_BLOCK )
#define ULTRA_IOCTL_DMN_MEMORY_BFREE      _IOW  ( 'U', 0x05, struct ULTRA_STRU_MEMORY_BLOCK )
#define ULTRA_IOCTL_DMN_LOCK        _IO   ( 'U', 0x06 )
#define ULTRA_IOCTL_DMN_UNLOCK            _IO   ( 'U', 0x07 )
#define ULTRA_IOCTL_DMN_GET_EMULATION     _IOR  ( 'U', 0x08, int )

Generated by  Doxygen 1.6.0   Back to index