/* * Midi channel definition for optional channel management. * * Copyright (C) 1999 Steve Ratcliffe
*/
#include <sound/seq_kernel.h>
/* * This structure is used to keep track of the current state on each * channel. All drivers for hardware that does not understand midi * directly will probably need to use this structure.
*/ struct snd_midi_channel { void *private; /* A back pointer to driver data */ int number; /* The channel number */ int client; /* The client associated with this channel */ int port; /* The port associated with this channel */
unsignedchar midi_aftertouch; /* Aftertouch (key pressure) */ unsignedchar midi_pressure; /* Channel pressure */ unsignedchar midi_program; /* Instrument number */ short midi_pitchbend; /* Pitch bend amount */
unsignedchar control[128]; /* Current value of all controls */ unsignedchar note[128]; /* Current status for all notes */
short gm_rpn_pitch_bend_range; /* Pitch bend range */ short gm_rpn_fine_tuning; /* Master fine tuning */ short gm_rpn_coarse_tuning; /* Master coarse tuning */
};
/* * A structure that represets a set of channels bound to a port. There * would usually be 16 channels per port. But fewer could be used for * particular cases. * The channel set consists of information describing the client and * port for this midi synth and an array of snd_midi_channel structures. * A driver that had no need for snd_midi_channel could still use the * channel set type if it wished with the channel array null.
*/ struct snd_midi_channel_set { void *private_data; /* Driver data */ int client; /* Client for this port */ int port; /* The port number */
int max_channels; /* Size of the channels array */ struct snd_midi_channel *channels;
struct snd_midi_op { void (*note_on)(void *private_data, int note, int vel, struct snd_midi_channel *chan); void (*note_off)(void *private_data,int note, int vel, struct snd_midi_channel *chan); /* release note */ void (*key_press)(void *private_data, int note, int vel, struct snd_midi_channel *chan); void (*note_terminate)(void *private_data, int note, struct snd_midi_channel *chan); /* terminate note immediately */ void (*control)(void *private_data, int type, struct snd_midi_channel *chan); void (*nrpn)(void *private_data, struct snd_midi_channel *chan, struct snd_midi_channel_set *chset); void (*sysex)(void *private_data, unsignedchar *buf, int len, int parsed, struct snd_midi_channel_set *chset);
};
/* * These defines are used so that pitchbend, aftertouch etc, can be * distinguished from controller values.
*/ /* 0-127 controller values */ #define MIDI_CTL_PITCHBEND 0x80 #define MIDI_CTL_AFTERTOUCH 0x81 #define MIDI_CTL_CHAN_PRESSURE 0x82
/* * These names exist to allow symbolic access to the controls array. * The usage is eg: chan->gm_bank_select. Another implementation would * be really have these members in the struct, and not the array.
*/ #define gm_bank_select control[0] #define gm_modulation control[1] #define gm_breath control[2] #define gm_foot_pedal control[4] #define gm_portamento_time control[5] #define gm_data_entry control[6] #define gm_volume control[7] #define gm_balance control[8] #define gm_pan control[10] #define gm_expression control[11] #define gm_effect_control1 control[12] #define gm_effect_control2 control[13] #define gm_slider1 control[16] #define gm_slider2 control[17] #define gm_slider3 control[18] #define gm_slider4 control[19]
/* * These macros give the complete value of the controls that consist * of coarse and fine pairs. Of course the fine controls are seldom used * but there is no harm in being complete.
*/ #define SNDRV_GM_BANK_SELECT(cp) (((cp)->control[0]<<7)|((cp)->control[32])) #define SNDRV_GM_MODULATION_WHEEL(cp) (((cp)->control[1]<<7)|((cp)->control[33])) #define SNDRV_GM_BREATH(cp) (((cp)->control[2]<<7)|((cp)->control[34])) #define SNDRV_GM_FOOT_PEDAL(cp) (((cp)->control[4]<<7)|((cp)->control[36])) #define SNDRV_GM_PORTAMENTO_TIME(cp) (((cp)->control[5]<<7)|((cp)->control[37])) #define SNDRV_GM_DATA_ENTRY(cp) (((cp)->control[6]<<7)|((cp)->control[38])) #define SNDRV_GM_VOLUME(cp) (((cp)->control[7]<<7)|((cp)->control[39])) #define SNDRV_GM_BALANCE(cp) (((cp)->control[8]<<7)|((cp)->control[40])) #define SNDRV_GM_PAN(cp) (((cp)->control[10]<<7)|((cp)->control[42])) #define SNDRV_GM_EXPRESSION(cp) (((cp)->control[11]<<7)|((cp)->control[43]))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.