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