1 /* 2 * internal_midi.h -- Midi Wavetable Processing library 3 * 4 * Copyright (C) WildMIDI Developers 2001-2016 5 * 6 * This file is part of WildMIDI. 7 * 8 * WildMIDI is free software: you can redistribute and/or modify the player 9 * under the terms of the GNU General Public License and you can redistribute 10 * and/or modify the library under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation, either version 3 of 12 * the licenses, or(at your option) any later version. 13 * 14 * WildMIDI is distributed in the hope that it will be useful, but WITHOUT 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License and 17 * the GNU Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License and the 20 * GNU Lesser General Public License along with WildMIDI. If not, see 21 * <http://www.gnu.org/licenses/>. 22 */ 23 24 #ifndef __INTERNAL_MIDI_H 25 #define __INTERNAL_MIDI_H 26 27 struct _channel { 28 uint8_t bank; 29 struct _patch *patch; 30 uint8_t hold; 31 uint8_t volume; 32 uint8_t pressure; 33 uint8_t expression; 34 int8_t balance; 35 int8_t pan; 36 int16_t left_adjust; 37 int16_t right_adjust; 38 int16_t pitch; 39 int16_t pitch_range; 40 int32_t pitch_adjust; 41 uint16_t reg_data; 42 uint8_t reg_non; 43 uint8_t isdrum; 44 }; 45 46 struct _event_data { 47 uint8_t channel; 48 union Data { 49 uint32_t value; 50 char * string; 51 } data; 52 }; 53 54 struct _note { 55 uint16_t noteid; 56 uint8_t velocity; 57 struct _patch *patch; 58 struct _sample *sample; 59 uint32_t sample_pos; 60 uint32_t sample_inc; 61 int32_t env_inc; 62 uint8_t env; 63 int32_t env_level; 64 uint8_t modes; 65 uint8_t hold; 66 uint8_t active; 67 struct _note *replay; 68 struct _note *next; 69 uint32_t left_mix_volume; 70 uint32_t right_mix_volume; 71 uint8_t is_off; 72 uint8_t ignore_chan_events; 73 }; 74 75 struct _mdi; 76 77 struct _event { 78 void (*do_event)(struct _mdi *mdi, struct _event_data *data); 79 struct _event_data event_data; 80 uint32_t samples_to_next; 81 uint32_t samples_to_next_fixed; 82 }; 83 84 struct _mdi { 85 int lock; 86 uint32_t samples_to_mix; 87 struct _event *events; 88 struct _event *current_event; 89 uint32_t event_count; 90 uint32_t events_size; /* try to stay optimally ahead to prevent reallocs */ 91 struct _WM_Info extra_info; 92 struct _WM_Info *tmp_info; 93 uint16_t midi_master_vol; 94 struct _channel channel[16]; 95 struct _note *note; 96 struct _note note_table[2][16][128]; 97 98 struct _patch **patches; 99 uint32_t patch_count; 100 int16_t amp; 101 102 int32_t *mix_buffer; 103 uint32_t mix_buffer_size; 104 105 struct _rvb *reverb; 106 107 int32_t dyn_vol_peak; 108 double dyn_vol_adjust; 109 double dyn_vol; 110 double dyn_vol_to_reach; 111 112 uint8_t is_type2; 113 114 char *lyric; 115 }; 116 117 118 extern int16_t _WM_lin_volume[]; 119 extern uint32_t _WM_freq_table[]; 120 121 /* ===================== */ 122 123 /* 124 * All "do" functions need to be "extern" for playback 125 */ 126 extern void _WM_do_midi_divisions(struct _mdi *mdi, struct _event_data *data); 127 extern void _WM_do_note_off(struct _mdi *mdi, struct _event_data *data); 128 extern void _WM_do_note_on(struct _mdi *mdi, struct _event_data *data); 129 extern void _WM_do_aftertouch(struct _mdi *mdi, struct _event_data *data); 130 extern void _WM_do_control_bank_select(struct _mdi *mdi, struct _event_data *data); 131 extern void _WM_do_control_data_entry_course(struct _mdi *mdi, struct _event_data *data); 132 extern void _WM_do_control_channel_volume(struct _mdi *mdi, struct _event_data *data); 133 extern void _WM_do_control_channel_balance(struct _mdi *mdi, struct _event_data *data); 134 extern void _WM_do_control_channel_pan(struct _mdi *mdi, struct _event_data *data); 135 extern void _WM_do_control_channel_expression(struct _mdi *mdi, struct _event_data *data); 136 extern void _WM_do_control_data_entry_fine(struct _mdi *mdi, struct _event_data *data); 137 extern void _WM_do_control_channel_hold(struct _mdi *mdi, struct _event_data *data); 138 extern void _WM_do_control_data_increment(struct _mdi *mdi, struct _event_data *data); 139 extern void _WM_do_control_data_decrement(struct _mdi *mdi, struct _event_data *data); 140 extern void _WM_do_control_non_registered_param_fine(struct _mdi *mdi, struct _event_data *data); 141 extern void _WM_do_control_non_registered_param_course(struct _mdi *mdi, struct _event_data *data); 142 extern void _WM_do_control_registered_param_fine(struct _mdi *mdi, struct _event_data *data); 143 extern void _WM_do_control_registered_param_course(struct _mdi *mdi, struct _event_data *data); 144 extern void _WM_do_control_channel_sound_off(struct _mdi *mdi, struct _event_data *data); 145 extern void _WM_do_control_channel_controllers_off(struct _mdi *mdi, struct _event_data *data); 146 extern void _WM_do_control_channel_notes_off(struct _mdi *mdi, struct _event_data *data); 147 extern void _WM_do_control_dummy(struct _mdi *mdi, struct _event_data *data); 148 extern void _WM_do_patch(struct _mdi *mdi, struct _event_data *data); 149 extern void _WM_do_channel_pressure(struct _mdi *mdi, struct _event_data *data); 150 extern void _WM_do_pitch(struct _mdi *mdi, struct _event_data *data); 151 extern void _WM_do_sysex_roland_drum_track(struct _mdi *mdi, struct _event_data *data); 152 extern void _WM_do_sysex_gm_reset(struct _mdi *mdi, struct _event_data *data); 153 extern void _WM_do_sysex_roland_reset(struct _mdi *mdi, struct _event_data *data); 154 extern void _WM_do_sysex_yamaha_reset(struct _mdi *mdi, struct _event_data *data); 155 extern void _WM_do_meta_endoftrack(struct _mdi *mdi, struct _event_data *data); 156 extern void _WM_do_meta_tempo(struct _mdi *mdi, struct _event_data *data); 157 extern void _WM_do_meta_timesignature(struct _mdi *mdi, struct _event_data *data); 158 extern void _WM_do_meta_keysignature(struct _mdi *mdi, struct _event_data *data); 159 extern void _WM_do_meta_sequenceno(struct _mdi *mdi, struct _event_data *data); 160 extern void _WM_do_meta_channelprefix(struct _mdi *mdi, struct _event_data *data); 161 extern void _WM_do_meta_portprefix(struct _mdi *mdi, struct _event_data *data); 162 extern void _WM_do_meta_smpteoffset(struct _mdi *mdi, struct _event_data *data); 163 extern void _WM_do_meta_text(struct _mdi *mdi, struct _event_data *data); 164 extern void _WM_do_meta_copyright(struct _mdi *mdi, struct _event_data *data); 165 extern void _WM_do_meta_trackname(struct _mdi *mdi, struct _event_data *data); 166 extern void _WM_do_meta_instrumentname(struct _mdi *mdi, struct _event_data *data); 167 extern void _WM_do_meta_lyric(struct _mdi *mdi, struct _event_data *data); 168 extern void _WM_do_meta_marker(struct _mdi *mdi, struct _event_data *data); 169 extern void _WM_do_meta_cuepoint(struct _mdi *mdi, struct _event_data *data); 170 171 /* 172 * We need to expose these fuctions for use on some or the parsers due to some 173 * formats not being able to trigger these events via _WM_Setup_Midi_Event. 174 */ 175 extern int _WM_midi_setup_noteoff(struct _mdi *mdi, uint8_t channel, uint8_t note, uint8_t velocity); 176 extern int _WM_midi_setup_endoftrack(struct _mdi *mdi); 177 extern int _WM_midi_setup_tempo(struct _mdi *mdi, uint32_t setting); 178 179 /* ===================== */ 180 181 /* 182 * Only non-standard midi event or non-track event setup functions need to be here 183 */ 184 extern int _WM_midi_setup_divisions(struct _mdi *mdi, uint32_t divisions); 185 186 /* ===================== */ 187 188 /* 189 * All other declarations 190 */ 191 192 extern struct _mdi * _WM_initMDI(void); 193 extern void _WM_freeMDI(struct _mdi *mdi); 194 extern uint32_t _WM_SetupMidiEvent(struct _mdi *mdi, uint8_t *event_data, uint32_t inlen, uint8_t running_event); 195 extern void _WM_ResetToStart(struct _mdi *mdi); 196 extern void _WM_do_pan_adjust(struct _mdi *mdi, uint8_t ch); 197 extern void _WM_do_note_off_extra(struct _note *nte); 198 /* extern void _WM_DynamicVolumeAdjust(struct _mdi *mdi, int32_t *tmp_buffer, uint32_t buffer_used);*/ 199 extern void _WM_AdjustChannelVolumes(struct _mdi *mdi, uint8_t ch); 200 extern float _WM_GetSamplesPerTick(uint32_t divisions, uint32_t tempo); 201 202 #endif /* __INTERNAL_MIDI_H */ 203 204