11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds #ifndef __SOUND_SEQ_MIDI_EMUL_H 31da177e4SLinus Torvalds #define __SOUND_SEQ_MIDI_EMUL_H 41da177e4SLinus Torvalds 51da177e4SLinus Torvalds /* 61da177e4SLinus Torvalds * Midi channel definition for optional channel management. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Copyright (C) 1999 Steve Ratcliffe 91da177e4SLinus Torvalds */ 101da177e4SLinus Torvalds 11a1ce3928SDavid Howells #include <sound/seq_kernel.h> 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds /* 141da177e4SLinus Torvalds * This structure is used to keep track of the current state on each 151da177e4SLinus Torvalds * channel. All drivers for hardware that does not understand midi 161da177e4SLinus Torvalds * directly will probably need to use this structure. 171da177e4SLinus Torvalds */ 18c7e0b5bfSTakashi Iwai struct snd_midi_channel { 191da177e4SLinus Torvalds void *private; /* A back pointer to driver data */ 201da177e4SLinus Torvalds int number; /* The channel number */ 211da177e4SLinus Torvalds int client; /* The client associated with this channel */ 221da177e4SLinus Torvalds int port; /* The port associated with this channel */ 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds unsigned char midi_mode; /* GM, GS, XG etc */ 251da177e4SLinus Torvalds unsigned int 261da177e4SLinus Torvalds drum_channel:1, /* Drum channel */ 271da177e4SLinus Torvalds param_type:1 /* RPN/NRPN */ 281da177e4SLinus Torvalds ; 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds unsigned char midi_aftertouch; /* Aftertouch (key pressure) */ 311da177e4SLinus Torvalds unsigned char midi_pressure; /* Channel pressure */ 321da177e4SLinus Torvalds unsigned char midi_program; /* Instrument number */ 331da177e4SLinus Torvalds short midi_pitchbend; /* Pitch bend amount */ 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds unsigned char control[128]; /* Current value of all controls */ 361da177e4SLinus Torvalds unsigned char note[128]; /* Current status for all notes */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds short gm_rpn_pitch_bend_range; /* Pitch bend range */ 391da177e4SLinus Torvalds short gm_rpn_fine_tuning; /* Master fine tuning */ 401da177e4SLinus Torvalds short gm_rpn_coarse_tuning; /* Master coarse tuning */ 411da177e4SLinus Torvalds 42c7e0b5bfSTakashi Iwai }; 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds /* 451da177e4SLinus Torvalds * A structure that represets a set of channels bound to a port. There 461da177e4SLinus Torvalds * would usually be 16 channels per port. But fewer could be used for 471da177e4SLinus Torvalds * particular cases. 481da177e4SLinus Torvalds * The channel set consists of information describing the client and 49c7e0b5bfSTakashi Iwai * port for this midi synth and an array of snd_midi_channel structures. 50c7e0b5bfSTakashi Iwai * A driver that had no need for snd_midi_channel could still use the 511da177e4SLinus Torvalds * channel set type if it wished with the channel array null. 521da177e4SLinus Torvalds */ 53c7e0b5bfSTakashi Iwai struct snd_midi_channel_set { 541da177e4SLinus Torvalds void *private_data; /* Driver data */ 551da177e4SLinus Torvalds int client; /* Client for this port */ 561da177e4SLinus Torvalds int port; /* The port number */ 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds int max_channels; /* Size of the channels array */ 59c7e0b5bfSTakashi Iwai struct snd_midi_channel *channels; 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds unsigned char midi_mode; /* MIDI operating mode */ 621da177e4SLinus Torvalds unsigned char gs_master_volume; /* SYSEX master volume: 0-127 */ 631da177e4SLinus Torvalds unsigned char gs_chorus_mode; 641da177e4SLinus Torvalds unsigned char gs_reverb_mode; 651da177e4SLinus Torvalds 66c7e0b5bfSTakashi Iwai }; 671da177e4SLinus Torvalds 68c7e0b5bfSTakashi Iwai struct snd_midi_op { 69c7e0b5bfSTakashi Iwai void (*note_on)(void *private_data, int note, int vel, struct snd_midi_channel *chan); 70c7e0b5bfSTakashi Iwai void (*note_off)(void *private_data,int note, int vel, struct snd_midi_channel *chan); /* release note */ 71c7e0b5bfSTakashi Iwai void (*key_press)(void *private_data, int note, int vel, struct snd_midi_channel *chan); 72c7e0b5bfSTakashi Iwai void (*note_terminate)(void *private_data, int note, struct snd_midi_channel *chan); /* terminate note immediately */ 73c7e0b5bfSTakashi Iwai void (*control)(void *private_data, int type, struct snd_midi_channel *chan); 74c7e0b5bfSTakashi Iwai void (*nrpn)(void *private_data, struct snd_midi_channel *chan, 75c7e0b5bfSTakashi Iwai struct snd_midi_channel_set *chset); 76c7e0b5bfSTakashi Iwai void (*sysex)(void *private_data, unsigned char *buf, int len, int parsed, 77c7e0b5bfSTakashi Iwai struct snd_midi_channel_set *chset); 78c7e0b5bfSTakashi Iwai }; 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds /* 811da177e4SLinus Torvalds * These defines are used so that pitchbend, aftertouch etc, can be 821da177e4SLinus Torvalds * distinguished from controller values. 831da177e4SLinus Torvalds */ 841da177e4SLinus Torvalds /* 0-127 controller values */ 851da177e4SLinus Torvalds #define MIDI_CTL_PITCHBEND 0x80 861da177e4SLinus Torvalds #define MIDI_CTL_AFTERTOUCH 0x81 871da177e4SLinus Torvalds #define MIDI_CTL_CHAN_PRESSURE 0x82 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds /* 901da177e4SLinus Torvalds * These names exist to allow symbolic access to the controls array. 911da177e4SLinus Torvalds * The usage is eg: chan->gm_bank_select. Another implementation would 921da177e4SLinus Torvalds * be really have these members in the struct, and not the array. 931da177e4SLinus Torvalds */ 941da177e4SLinus Torvalds #define gm_bank_select control[0] 951da177e4SLinus Torvalds #define gm_modulation control[1] 961da177e4SLinus Torvalds #define gm_breath control[2] 971da177e4SLinus Torvalds #define gm_foot_pedal control[4] 981da177e4SLinus Torvalds #define gm_portamento_time control[5] 991da177e4SLinus Torvalds #define gm_data_entry control[6] 1001da177e4SLinus Torvalds #define gm_volume control[7] 1011da177e4SLinus Torvalds #define gm_balance control[8] 1021da177e4SLinus Torvalds #define gm_pan control[10] 1031da177e4SLinus Torvalds #define gm_expression control[11] 1041da177e4SLinus Torvalds #define gm_effect_control1 control[12] 1051da177e4SLinus Torvalds #define gm_effect_control2 control[13] 1061da177e4SLinus Torvalds #define gm_slider1 control[16] 1071da177e4SLinus Torvalds #define gm_slider2 control[17] 1081da177e4SLinus Torvalds #define gm_slider3 control[18] 1091da177e4SLinus Torvalds #define gm_slider4 control[19] 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds #define gm_bank_select_lsb control[32] 1121da177e4SLinus Torvalds #define gm_modulation_wheel_lsb control[33] 1131da177e4SLinus Torvalds #define gm_breath_lsb control[34] 1141da177e4SLinus Torvalds #define gm_foot_pedal_lsb control[36] 1151da177e4SLinus Torvalds #define gm_portamento_time_lsb control[37] 1161da177e4SLinus Torvalds #define gm_data_entry_lsb control[38] 1171da177e4SLinus Torvalds #define gm_volume_lsb control[39] 1181da177e4SLinus Torvalds #define gm_balance_lsb control[40] 1191da177e4SLinus Torvalds #define gm_pan_lsb control[42] 1201da177e4SLinus Torvalds #define gm_expression_lsb control[43] 1211da177e4SLinus Torvalds #define gm_effect_control1_lsb control[44] 1221da177e4SLinus Torvalds #define gm_effect_control2_lsb control[45] 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds #define gm_sustain control[MIDI_CTL_SUSTAIN] 1251da177e4SLinus Torvalds #define gm_hold gm_sustain 1261da177e4SLinus Torvalds #define gm_portamento control[MIDI_CTL_PORTAMENTO] 1271da177e4SLinus Torvalds #define gm_sostenuto control[MIDI_CTL_SOSTENUTO] 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvalds /* 1301da177e4SLinus Torvalds * These macros give the complete value of the controls that consist 1311da177e4SLinus Torvalds * of coarse and fine pairs. Of course the fine controls are seldom used 1321da177e4SLinus Torvalds * but there is no harm in being complete. 1331da177e4SLinus Torvalds */ 1341da177e4SLinus Torvalds #define SNDRV_GM_BANK_SELECT(cp) (((cp)->control[0]<<7)|((cp)->control[32])) 1351da177e4SLinus Torvalds #define SNDRV_GM_MODULATION_WHEEL(cp) (((cp)->control[1]<<7)|((cp)->control[33])) 1361da177e4SLinus Torvalds #define SNDRV_GM_BREATH(cp) (((cp)->control[2]<<7)|((cp)->control[34])) 1371da177e4SLinus Torvalds #define SNDRV_GM_FOOT_PEDAL(cp) (((cp)->control[4]<<7)|((cp)->control[36])) 1381da177e4SLinus Torvalds #define SNDRV_GM_PORTAMENTO_TIME(cp) (((cp)->control[5]<<7)|((cp)->control[37])) 1391da177e4SLinus Torvalds #define SNDRV_GM_DATA_ENTRY(cp) (((cp)->control[6]<<7)|((cp)->control[38])) 1401da177e4SLinus Torvalds #define SNDRV_GM_VOLUME(cp) (((cp)->control[7]<<7)|((cp)->control[39])) 1411da177e4SLinus Torvalds #define SNDRV_GM_BALANCE(cp) (((cp)->control[8]<<7)|((cp)->control[40])) 1421da177e4SLinus Torvalds #define SNDRV_GM_PAN(cp) (((cp)->control[10]<<7)|((cp)->control[42])) 1431da177e4SLinus Torvalds #define SNDRV_GM_EXPRESSION(cp) (((cp)->control[11]<<7)|((cp)->control[43])) 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds 1461da177e4SLinus Torvalds /* MIDI mode */ 1471da177e4SLinus Torvalds #define SNDRV_MIDI_MODE_NONE 0 /* Generic midi */ 1481da177e4SLinus Torvalds #define SNDRV_MIDI_MODE_GM 1 1491da177e4SLinus Torvalds #define SNDRV_MIDI_MODE_GS 2 1501da177e4SLinus Torvalds #define SNDRV_MIDI_MODE_XG 3 1511da177e4SLinus Torvalds #define SNDRV_MIDI_MODE_MT32 4 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds /* MIDI note state */ 1541da177e4SLinus Torvalds #define SNDRV_MIDI_NOTE_OFF 0x00 1551da177e4SLinus Torvalds #define SNDRV_MIDI_NOTE_ON 0x01 1561da177e4SLinus Torvalds #define SNDRV_MIDI_NOTE_RELEASED 0x02 1571da177e4SLinus Torvalds #define SNDRV_MIDI_NOTE_SOSTENUTO 0x04 1581da177e4SLinus Torvalds 1591da177e4SLinus Torvalds #define SNDRV_MIDI_PARAM_TYPE_REGISTERED 0 1601da177e4SLinus Torvalds #define SNDRV_MIDI_PARAM_TYPE_NONREGISTERED 1 1611da177e4SLinus Torvalds 1621da177e4SLinus Torvalds /* SYSEX parse flag */ 1631da177e4SLinus Torvalds enum { 1641da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_NOT_PARSED = 0, 1651da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GM_ON, 1661da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_ON, 1671da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_RESET, 1681da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_CHORUS_MODE, 1691da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_REVERB_MODE, 1701da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_MASTER_VOLUME, 1711da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_PROGRAM, 1721da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_GS_DRUM_CHANNEL, 1731da177e4SLinus Torvalds SNDRV_MIDI_SYSEX_XG_ON, 1741da177e4SLinus Torvalds }; 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds /* Prototypes for midi_process.c */ 177*aad7ebb5STakashi Iwai void snd_midi_process_event(const struct snd_midi_op *ops, 178*aad7ebb5STakashi Iwai struct snd_seq_event *ev, 179c7e0b5bfSTakashi Iwai struct snd_midi_channel_set *chanset); 180c7e0b5bfSTakashi Iwai void snd_midi_channel_set_clear(struct snd_midi_channel_set *chset); 181c7e0b5bfSTakashi Iwai struct snd_midi_channel_set *snd_midi_channel_alloc_set(int n); 182c7e0b5bfSTakashi Iwai void snd_midi_channel_free_set(struct snd_midi_channel_set *chset); 1831da177e4SLinus Torvalds 1841da177e4SLinus Torvalds #endif /* __SOUND_SEQ_MIDI_EMUL_H */ 185