1 ///////////////////////////////////////////////////////////////////////////////////
2 //-------------------------------------------------------------------------------//
3 //-------------------------------------------------------------------------------//
4 //-----------H----H--X----X-----CCCCC----22222----0000-----0000------11----------//
5 //----------H----H----X-X-----C--------------2---0----0---0----0--1--1-----------//
6 //---------HHHHHH-----X------C----------22222---0----0---0----0-----1------------//
7 //--------H----H----X--X----C----------2-------0----0---0----0-----1-------------//
8 //-------H----H---X-----X---CCCCC-----222222----0000-----0000----1111------------//
9 //-------------------------------------------------------------------------------//
10 //----------------------------------------------------- http://hxc2001.free.fr --//
11 ///////////////////////////////////////////////////////////////////////////////////
12 // File : hxcmod.c
13 // Contains: a tiny mod player
14 //
15 // Written by: Jean Francois DEL NERO
16 //
17 // You are free to do what you want with this code.
18 // A credit is always appreciated if you include it into your prod :)
19 //
20 // This file include some parts of the Noisetracker/Soundtracker/Protracker
21 // Module Format documentation written by Andrew Scott (Adrenalin Software)
22 // (modformat.txt)
23 //
24 // The core (hxcmod.c/hxcmod.h) is designed to have the least external dependency.
25 // So it should be usable on almost all OS and systems.
26 // Please also note that no dynamic allocation is done into the HxCMOD core.
27 //
28 // Change History (most recent first):
29 ///////////////////////////////////////////////////////////////////////////////////
30 // HxCMOD Core API:
31 // -------------------------------------------
32 // int hxcmod_init(modcontext * modctx)
33 //
34 // - Initialize the modcontext buffer. Must be called before doing anything else.
35 // Return 1 if success. 0 in case of error.
36 // -------------------------------------------
37 // int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
38 //
39 // - "Load" a MOD from memory (from "mod_data" with size "mod_data_size").
40 // Return 1 if success. 0 in case of error.
41 // -------------------------------------------
42 // void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf )
43 //
44 // - Generate and return the next samples chunk to outbuffer.
45 // nbsample specify the number of stereo 16bits samples you want.
46 // The output format is signed 44100Hz 16-bit Stereo PCM samples.
47 // The output buffer size in byte must be equal to ( nbsample * 2 * 2 ).
48 // The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused.
49 // -------------------------------------------
50 // void hxcmod_unload( modcontext * modctx )
51 // - "Unload" / clear the player status.
52 // -------------------------------------------
53 ///////////////////////////////////////////////////////////////////////////////////
54
55 #include "hxcmod.h"
56
57 // BK4BSTACK_CHANGE START
58
59 // MODs ar either in ROM (MCUs) or in .text segment
60 #define HXCMOD_MOD_FILE_IN_ROM
61
62 #ifdef __GNUC__
63 #ifndef __clang__
64 #pragma GCC diagnostic push
65 // -Wstringop-overflow unknown to Clang 16.0.0
66 #pragma GCC diagnostic ignored "-Wstringop-overflow"
67 #endif
68 #endif
69
70 // BK4BSTACK_CHANGE END
71
72 ///////////////////////////////////////////////////////////////////////////////////
73
74 // Effects list
75 #define EFFECT_ARPEGGIO 0x0 // Supported
76 #define EFFECT_PORTAMENTO_UP 0x1 // Supported
77 #define EFFECT_PORTAMENTO_DOWN 0x2 // Supported
78 #define EFFECT_TONE_PORTAMENTO 0x3 // Supported
79 #define EFFECT_VIBRATO 0x4 // Supported
80 #define EFFECT_VOLSLIDE_TONEPORTA 0x5 // Supported
81 #define EFFECT_VOLSLIDE_VIBRATO 0x6 // Supported
82 #define EFFECT_VOLSLIDE_TREMOLO 0x7 // - TO BE DONE -
83 #define EFFECT_SET_PANNING 0x8 // - TO BE DONE -
84 #define EFFECT_SET_OFFSET 0x9 // Supported
85 #define EFFECT_VOLUME_SLIDE 0xA // Supported
86 #define EFFECT_JUMP_POSITION 0xB // Supported
87 #define EFFECT_SET_VOLUME 0xC // Supported
88 #define EFFECT_PATTERN_BREAK 0xD // Supported
89
90 #define EFFECT_EXTENDED 0xE
91 #define EFFECT_E_FINE_PORTA_UP 0x1 // Supported
92 #define EFFECT_E_FINE_PORTA_DOWN 0x2 // Supported
93 #define EFFECT_E_GLISSANDO_CTRL 0x3 // - TO BE DONE -
94 #define EFFECT_E_VIBRATO_WAVEFORM 0x4 // - TO BE DONE -
95 #define EFFECT_E_SET_FINETUNE 0x5 // Supported
96 #define EFFECT_E_PATTERN_LOOP 0x6 // Supported
97 #define EFFECT_E_TREMOLO_WAVEFORM 0x7 // - TO BE DONE -
98 #define EFFECT_E_SET_PANNING_2 0x8 // - TO BE DONE -
99 #define EFFECT_E_RETRIGGER_NOTE 0x9 // Supported
100 #define EFFECT_E_FINE_VOLSLIDE_UP 0xA // Supported
101 #define EFFECT_E_FINE_VOLSLIDE_DOWN 0xB // Supported
102 #define EFFECT_E_NOTE_CUT 0xC // Supported
103 #define EFFECT_E_NOTE_DELAY 0xD // Supported
104 #define EFFECT_E_PATTERN_DELAY 0xE // Supported
105 #define EFFECT_E_INVERT_LOOP 0xF // Supported (W.I.P)
106 #define EFFECT_SET_SPEED 0xF0 // Supported
107 #define EFFECT_SET_TEMPO 0xF2 // Supported
108
109 #define PERIOD_TABLE_LENGTH MAXNOTES
110
111
112 //
113 // Finetuning periods -> Amiga period * 2^(-finetune/12/8)
114 //
115
116 static const short periodtable[]=
117 {
118 // Finetune 0 (* 1.000000), Offset 0x0000
119 27392, 25856, 24384, 23040, 21696, 20480, 19328, 18240, 17216, 16256, 15360, 14496,
120 13696, 12928, 12192, 11520, 10848, 10240, 9664, 9120, 8606, 8128, 7680, 7248,
121 6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
122 3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
123 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, 906,
124 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453,
125 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226,
126 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113,
127 107, 101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56,
128 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
129 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
130 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
131
132 // Finetune 1 (* 0.992806), Offset 0x0120
133 27195, 25670, 24209, 22874, 21540, 20333, 19189, 18109, 17092, 16139, 15249, 14392,
134 13597, 12835, 12104, 11437, 10770, 10166, 9594, 9054, 8544, 8070, 7625, 7196,
135 6799, 6417, 6052, 5719, 5385, 5083, 4797, 4527, 4273, 4035, 3812, 3598,
136 3399, 3209, 3026, 2859, 2692, 2542, 2399, 2264, 2137, 2017, 1906, 1799,
137 1700, 1604, 1513, 1430, 1346, 1271, 1199, 1132, 1068, 1009, 953, 899,
138 850, 802, 757, 715, 673, 635, 600, 566, 534, 504, 477, 450,
139 425, 401, 378, 357, 337, 318, 300, 283, 267, 252, 238, 224,
140 212, 201, 189, 179, 169, 159, 150, 142, 134, 126, 119, 112,
141 106, 100, 94, 89, 84, 79, 74, 70, 67, 63, 60, 56,
142 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
143 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
144 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
145
146 // Finetune 2 (* 0.985663), Offset 0x0240
147 26999, 25485, 24034, 22710, 21385, 20186, 19051, 17978, 16969, 16023, 15140, 14288,
148 13500, 12743, 12017, 11355, 10692, 10093, 9525, 8989, 8483, 8011, 7570, 7144,
149 6750, 6371, 6009, 5677, 5346, 5047, 4763, 4495, 4242, 4006, 3785, 3572,
150 3375, 3186, 3004, 2839, 2673, 2523, 2381, 2247, 2121, 2003, 1892, 1786,
151 1687, 1593, 1502, 1419, 1337, 1262, 1191, 1124, 1061, 1001, 946, 893,
152 844, 796, 751, 710, 668, 631, 595, 562, 530, 501, 473, 447,
153 422, 398, 376, 355, 334, 315, 298, 281, 265, 250, 237, 223,
154 211, 199, 187, 177, 168, 158, 149, 141, 133, 125, 118, 111,
155 105, 100, 94, 89, 84, 79, 74, 70, 66, 62, 59, 55,
156 52, 49, 46, 44, 41, 39, 36, 34, 33, 31, 30, 28,
157 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
158 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
159
160 // Finetune 3 (* 0.978572), Offset 0x0360
161 26805, 25302, 23862, 22546, 21231, 20041, 18914, 17849, 16847, 15908, 15031, 14185,
162 13403, 12651, 11931, 11273, 10616, 10021, 9457, 8925, 8422, 7954, 7515, 7093,
163 6701, 6325, 5965, 5637, 5308, 5010, 4728, 4462, 4212, 3977, 3758, 3546,
164 3351, 3163, 2983, 2818, 2654, 2505, 2364, 2231, 2106, 1988, 1879, 1773,
165 1675, 1581, 1491, 1409, 1327, 1253, 1182, 1116, 1053, 994, 939, 887,
166 838, 791, 746, 705, 663, 626, 591, 558, 526, 497, 470, 443,
167 419, 395, 373, 352, 332, 313, 296, 279, 263, 249, 235, 221,
168 209, 198, 186, 176, 166, 157, 148, 140, 132, 124, 117, 111,
169 105, 99, 93, 88, 83, 78, 73, 69, 66, 62, 59, 55,
170 52, 49, 46, 44, 41, 39, 36, 34, 32, 30, 29, 27,
171 26, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14,
172 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
173
174 // Finetune 4 (* 0.971532), Offset 0x0480
175 26612, 25120, 23690, 22384, 21078, 19897, 18778, 17721, 16726, 15793, 14923, 14083,
176 13306, 12560, 11845, 11192, 10539, 9948, 9389, 8860, 8361, 7897, 7461, 7042,
177 6653, 6280, 5922, 5596, 5270, 4974, 4694, 4430, 4181, 3948, 3731, 3521,
178 3327, 3140, 2961, 2798, 2635, 2487, 2347, 2215, 2091, 1974, 1865, 1760,
179 1663, 1570, 1481, 1399, 1317, 1244, 1174, 1108, 1045, 987, 933, 880,
180 832, 785, 740, 700, 659, 622, 587, 554, 523, 494, 466, 440,
181 416, 392, 370, 350, 329, 311, 293, 277, 261, 247, 233, 220,
182 208, 196, 185, 175, 165, 155, 147, 139, 131, 123, 117, 110,
183 104, 98, 92, 87, 83, 78, 73, 69, 65, 61, 58, 54,
184 51, 49, 46, 44, 41, 39, 36, 34, 32, 30, 29, 27,
185 26, 24, 23, 21, 20, 19, 18, 17, 17, 16, 15, 14,
186 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
187
188 // Finetune 5 (* 0.964542), Offset 0x05a0
189 26421, 24939, 23519, 22223, 20927, 19754, 18643, 17593, 16606, 15680, 14815, 13982,
190 13210, 12470, 11760, 11112, 10463, 9877, 9321, 8797, 8301, 7840, 7408, 6991,
191 6605, 6235, 5880, 5556, 5232, 4938, 4661, 4398, 4151, 3920, 3704, 3496,
192 3303, 3117, 2940, 2778, 2616, 2469, 2330, 2199, 2076, 1960, 1852, 1748,
193 1651, 1559, 1470, 1389, 1308, 1235, 1165, 1100, 1038, 980, 926, 874,
194 826, 779, 735, 694, 654, 617, 583, 550, 519, 490, 463, 437,
195 413, 390, 367, 347, 327, 309, 291, 275, 259, 245, 231, 218,
196 206, 195, 183, 174, 164, 154, 146, 138, 130, 122, 116, 109,
197 103, 97, 92, 87, 82, 77, 72, 68, 65, 61, 58, 54,
198 51, 48, 45, 43, 41, 39, 36, 34, 32, 30, 29, 27,
199 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 14,
200 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
201
202 // Finetune 6 (* 0.957603), Offset 0x06c0
203 26231, 24760, 23350, 22063, 20776, 19612, 18509, 17467, 16486, 15567, 14709, 13881,
204 13115, 12380, 11675, 11032, 10388, 9806, 9254, 8733, 8241, 7783, 7354, 6941,
205 6558, 6190, 5838, 5516, 5194, 4903, 4627, 4367, 4122, 3892, 3677, 3470,
206 3279, 3095, 2919, 2758, 2597, 2451, 2314, 2183, 2061, 1946, 1839, 1735,
207 1639, 1547, 1459, 1379, 1299, 1226, 1157, 1092, 1030, 973, 919, 868,
208 820, 774, 730, 689, 649, 613, 578, 546, 515, 486, 460, 434,
209 410, 387, 365, 345, 325, 306, 289, 273, 258, 243, 230, 216,
210 205, 193, 182, 172, 163, 153, 145, 137, 129, 122, 115, 108,
211 102, 97, 91, 86, 81, 77, 72, 68, 64, 60, 57, 54,
212 51, 48, 45, 43, 40, 38, 35, 34, 32, 30, 29, 27,
213 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
214 12, 12, 11, 11, 11, 10, 9, 9, 8, 8, 7, 7,
215
216 // Finetune 7 (* 0.950714), Offset 0x07e0
217 26042, 24582, 23182, 21904, 20627, 19471, 18375, 17341, 16367, 15455, 14603, 13782,
218 13021, 12291, 11591, 10952, 10313, 9735, 9188, 8671, 8182, 7727, 7301, 6891,
219 6510, 6145, 5796, 5476, 5157, 4868, 4594, 4335, 4092, 3864, 3651, 3445,
220 3255, 3073, 2898, 2738, 2578, 2434, 2297, 2168, 2046, 1932, 1825, 1723,
221 1628, 1536, 1449, 1369, 1289, 1217, 1148, 1084, 1023, 966, 913, 861,
222 814, 768, 724, 685, 645, 608, 574, 542, 511, 483, 456, 431,
223 407, 384, 362, 342, 322, 304, 287, 271, 256, 241, 228, 215,
224 203, 192, 181, 171, 162, 152, 144, 136, 128, 121, 114, 107,
225 102, 96, 90, 86, 81, 76, 71, 68, 64, 60, 57, 53,
226 50, 48, 45, 43, 40, 38, 35, 33, 31, 29, 29, 27,
227 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
228 12, 12, 11, 10, 10, 10, 9, 9, 8, 8, 7, 7,
229
230 // Finetune -8 (* 1.059463), Offset 0x0900
231 29021, 27393, 25834, 24410, 22986, 21698, 20477, 19325, 18240, 17223, 16273, 15358,
232 14510, 13697, 12917, 12205, 11493, 10849, 10239, 9662, 9118, 8611, 8137, 7679,
233 7255, 6848, 6458, 6103, 5747, 5424, 5119, 4831, 4560, 4306, 4068, 3839,
234 3628, 3424, 3229, 3051, 2873, 2712, 2560, 2416, 2280, 2153, 2034, 1920,
235 1814, 1712, 1615, 1526, 1437, 1356, 1280, 1208, 1140, 1076, 1017, 960,
236 907, 856, 807, 763, 718, 678, 640, 604, 570, 538, 509, 480,
237 453, 428, 404, 381, 359, 339, 320, 302, 285, 269, 254, 239,
238 227, 214, 201, 191, 180, 170, 160, 152, 143, 135, 127, 120,
239 113, 107, 101, 95, 90, 85, 79, 75, 71, 67, 64, 59,
240 56, 53, 50, 48, 44, 42, 39, 37, 35, 33, 32, 30,
241 29, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
242 14, 14, 13, 12, 12, 11, 10, 10, 8, 8, 7, 7,
243
244 // Finetune -7 (* 1.051841), Offset 0x0a20
245 28812, 27196, 25648, 24234, 22821, 21542, 20330, 19186, 18108, 17099, 16156, 15247,
246 14406, 13598, 12824, 12117, 11410, 10771, 10165, 9593, 9052, 8549, 8078, 7624,
247 7203, 6799, 6412, 6059, 5705, 5385, 5082, 4796, 4527, 4275, 4039, 3812,
248 3602, 3400, 3206, 3029, 2853, 2693, 2541, 2398, 2264, 2137, 2020, 1906,
249 1801, 1700, 1603, 1515, 1426, 1346, 1271, 1199, 1132, 1069, 1010, 953,
250 900, 850, 802, 757, 713, 673, 635, 600, 566, 534, 505, 476,
251 450, 425, 401, 379, 357, 337, 318, 300, 283, 267, 252, 238,
252 225, 212, 200, 189, 179, 168, 159, 150, 142, 134, 126, 119,
253 113, 106, 100, 95, 89, 84, 79, 75, 70, 66, 63, 59,
254 56, 53, 49, 47, 44, 42, 39, 37, 35, 33, 32, 29,
255 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
256 14, 14, 13, 12, 12, 11, 9, 9, 8, 8, 7, 7,
257
258 // Finetune -6 (* 1.044274), Offset 0x0b40
259 28605, 27001, 25464, 24060, 22657, 21387, 20184, 19048, 17978, 16976, 16040, 15138,
260 14302, 13500, 12732, 12030, 11328, 10693, 10092, 9524, 8987, 8488, 8020, 7569,
261 7151, 6750, 6366, 6015, 5664, 5347, 5046, 4762, 4495, 4244, 4010, 3784,
262 3576, 3375, 3183, 3008, 2832, 2673, 2523, 2381, 2247, 2122, 2005, 1892,
263 1788, 1688, 1591, 1504, 1416, 1337, 1261, 1190, 1124, 1061, 1003, 946,
264 894, 844, 796, 752, 708, 668, 631, 595, 562, 530, 501, 473,
265 447, 422, 398, 376, 354, 334, 315, 298, 281, 265, 251, 236,
266 223, 211, 198, 188, 178, 167, 158, 149, 141, 133, 125, 118,
267 112, 105, 99, 94, 89, 84, 78, 74, 70, 66, 63, 58,
268 55, 52, 49, 47, 44, 42, 39, 37, 34, 32, 31, 29,
269 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
270 14, 14, 13, 11, 11, 10, 9, 9, 8, 8, 7, 7,
271
272 // Finetune -5 (* 1.036761), Offset 0x0c60
273 28399, 26806, 25280, 23887, 22494, 21233, 20039, 18911, 17849, 16854, 15925, 15029,
274 14199, 13403, 12640, 11943, 11247, 10616, 10019, 9455, 8922, 8427, 7962, 7514,
275 7100, 6702, 6320, 5972, 5623, 5308, 5010, 4728, 4462, 4213, 3981, 3757,
276 3550, 3351, 3160, 2986, 2812, 2654, 2505, 2364, 2231, 2107, 1991, 1879,
277 1775, 1675, 1580, 1493, 1406, 1327, 1252, 1182, 1116, 1053, 995, 939,
278 887, 838, 790, 746, 703, 664, 626, 591, 558, 527, 498, 470,
279 444, 419, 395, 373, 351, 332, 313, 295, 279, 263, 249, 234,
280 222, 209, 197, 187, 176, 166, 157, 148, 140, 132, 124, 117,
281 111, 105, 98, 93, 88, 83, 78, 74, 69, 65, 62, 58,
282 55, 52, 49, 47, 44, 41, 38, 36, 34, 32, 31, 29,
283 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
284 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
285
286 // Finetune -4 (* 1.029302), Offset 0x0d80
287 28195, 26614, 25099, 23715, 22332, 21080, 19894, 18774, 17720, 16732, 15810, 14921,
288 14097, 13307, 12549, 11858, 11166, 10540, 9947, 9387, 8858, 8366, 7905, 7460,
289 7049, 6653, 6275, 5929, 5583, 5270, 4974, 4694, 4430, 4183, 3953, 3730,
290 3524, 3327, 3137, 2964, 2791, 2635, 2487, 2347, 2215, 2092, 1976, 1865,
291 1762, 1663, 1569, 1482, 1396, 1318, 1243, 1173, 1108, 1046, 988, 933,
292 881, 832, 784, 741, 698, 659, 622, 587, 554, 523, 494, 466,
293 441, 416, 392, 371, 349, 329, 311, 293, 277, 261, 247, 233,
294 220, 208, 196, 185, 175, 165, 155, 147, 139, 131, 124, 116,
295 110, 104, 98, 93, 87, 82, 77, 73, 69, 65, 62, 58,
296 55, 51, 48, 46, 43, 41, 38, 36, 34, 32, 31, 29,
297 28, 26, 25, 23, 22, 21, 20, 19, 17, 16, 15, 14,
298 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
299
300 // Finetune -3 (* 1.021897), Offset 0x0ea0
301 27992, 26422, 24918, 23545, 22171, 20928, 19751, 18639, 17593, 16612, 15696, 14813,
302 13996, 13211, 12459, 11772, 11086, 10464, 9876, 9320, 8794, 8306, 7848, 7407,
303 6998, 6606, 6229, 5886, 5543, 5232, 4938, 4660, 4398, 4153, 3924, 3703,
304 3499, 3303, 3115, 2943, 2771, 2616, 2469, 2330, 2199, 2076, 1962, 1852,
305 1749, 1651, 1557, 1472, 1386, 1308, 1234, 1165, 1100, 1038, 981, 926,
306 875, 826, 779, 736, 693, 654, 617, 582, 550, 519, 491, 463,
307 437, 413, 389, 368, 346, 327, 309, 291, 275, 260, 245, 231,
308 219, 206, 194, 184, 174, 164, 154, 146, 138, 130, 123, 115,
309 109, 103, 97, 92, 87, 82, 77, 73, 68, 64, 61, 57,
310 54, 51, 48, 46, 43, 41, 38, 36, 34, 32, 31, 29,
311 28, 26, 25, 22, 21, 20, 19, 18, 17, 16, 15, 14,
312 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
313
314 // Finetune -2 (* 1.014545), Offset 0x0fc0
315 27790, 26232, 24739, 23375, 22012, 20778, 19609, 18505, 17466, 16492, 15583, 14707,
316 13895, 13116, 12369, 11688, 11006, 10389, 9805, 9253, 8731, 8246, 7792, 7353,
317 6948, 6558, 6185, 5844, 5503, 5194, 4902, 4626, 4367, 4123, 3896, 3677,
318 3474, 3279, 3092, 2922, 2751, 2597, 2451, 2313, 2183, 2062, 1948, 1838,
319 1737, 1640, 1546, 1461, 1376, 1299, 1226, 1157, 1092, 1031, 974, 919,
320 868, 820, 773, 730, 688, 649, 613, 578, 546, 515, 487, 460,
321 434, 410, 387, 365, 344, 325, 306, 289, 273, 258, 243, 229,
322 217, 205, 193, 183, 172, 162, 153, 145, 137, 129, 122, 115,
323 109, 102, 96, 91, 86, 81, 76, 72, 68, 64, 61, 57,
324 54, 51, 48, 46, 43, 41, 38, 36, 33, 31, 30, 28,
325 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
326 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
327
328 // Finetune -1 (* 1.007246), Offset 0x10e0
329 27590, 26043, 24561, 23207, 21853, 20628, 19468, 18372, 17341, 16374, 15471, 14601,
330 13795, 13022, 12280, 11603, 10927, 10314, 9734, 9186, 8668, 8187, 7736, 7301,
331 6898, 6511, 6140, 5802, 5463, 5157, 4867, 4593, 4335, 4093, 3868, 3650,
332 3449, 3255, 3070, 2901, 2732, 2579, 2434, 2297, 2168, 2047, 1934, 1825,
333 1724, 1628, 1535, 1450, 1366, 1289, 1217, 1148, 1084, 1023, 967, 913,
334 862, 814, 768, 725, 683, 645, 608, 574, 542, 512, 483, 456,
335 431, 407, 384, 363, 341, 322, 304, 287, 271, 256, 242, 228,
336 216, 203, 191, 181, 171, 161, 152, 144, 136, 128, 121, 114,
337 108, 102, 96, 91, 86, 81, 76, 72, 67, 63, 60, 56,
338 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
339 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
340 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7
341 };
342
343 static const short * periodtable_finetune_ptr[]=
344 {
345 &periodtable[0x0000], &periodtable[0x0090], &periodtable[0x0120], &periodtable[0x01B0],
346 &periodtable[0x0240], &periodtable[0x02D0], &periodtable[0x0360], &periodtable[0x03F0],
347 &periodtable[0x0480], &periodtable[0x0510], &periodtable[0x05A0], &periodtable[0x0630],
348 &periodtable[0x06C0], &periodtable[0x0750], &periodtable[0x07E0], &periodtable[0x0870]
349 };
350
351 static const short sintable[]={
352 0, 24, 49, 74, 97, 120, 141, 161,
353 180, 197, 212, 224, 235, 244, 250, 253,
354 255, 253, 250, 244, 235, 224, 212, 197,
355 180, 161, 141, 120, 97, 74, 49, 24
356 };
357
358 static const muchar InvertLoopTable[]={
359 0, 5, 6, 7, 8, 10, 11, 13,
360 16, 19, 22, 26, 32, 43, 64, 128
361 };
362
363 typedef struct modtype_
364 {
365 unsigned char signature[5];
366 int numberofchannels;
367 }modtype;
368
369 static modtype modlist[]=
370 {
371 { "M!K!",4},
372 { "M.K.",4},
373 { "M&K!",4},
374 { "PATT",4},
375 { "NSMS",4},
376 { "LARD",4},
377 { "FEST",4},
378 { "FIST",4},
379 { "N.T.",4},
380 { "OKTA",8},
381 { "OCTA",8},
382 { "$CHN",-1},
383 { "$$CH",-1},
384 { "$$CN",-1},
385 { "$$$C",-1},
386 { "FLT$",-1},
387 { "EXO$",-1},
388 { "CD$1",-1},
389 { "TDZ$",-1},
390 { "FA0$",-1},
391 { "",0}
392 };
393
394 #ifdef HXCMOD_BIGENDIAN_MACHINE
395
396 #define GET_BGI_W( big_endian_word ) ( big_endian_word )
397
398 #else
399
400 #define GET_BGI_W( big_endian_word ) ( (big_endian_word >> 8) | ((big_endian_word&0xFF) << 8) )
401
402 #endif
403
404
405 ///////////////////////////////////////////////////////////////////////////////////
406
memcopy(void * dest,void * source,unsigned long size)407 static void memcopy( void * dest, void *source, unsigned long size )
408 {
409 unsigned long i;
410 unsigned char * d,*s;
411
412 d=(unsigned char*)dest;
413 s=(unsigned char*)source;
414 for(i=0;i<size;i++)
415 {
416 d[i]=s[i];
417 }
418 }
419
memclear(void * dest,unsigned char value,unsigned long size)420 static void memclear( void * dest, unsigned char value, unsigned long size )
421 {
422 unsigned long i;
423 unsigned char * d;
424
425 d = (unsigned char*)dest;
426 for(i=0;i<size;i++)
427 {
428 d[i]=value;
429 }
430 }
431
getnote(modcontext * mod,unsigned short period)432 static int getnote( modcontext * mod, unsigned short period )
433 {
434 // BK4BSTACK_CHANGE START
435 (void) mod;
436 // BK4BSTACK_CHANGE END
437
438 int i;
439 const short * ptr;
440
441 ptr = periodtable_finetune_ptr[0];
442
443 for(i = 0; i < MAXNOTES; i++)
444 {
445 if(period >= ptr[i])
446 {
447 return i;
448 }
449 }
450
451 return MAXNOTES;
452 }
453
doFunk(hxcmod_channel_t * cptr)454 static void doFunk(hxcmod_channel_t * cptr)
455 {
456 if(cptr->funkspeed)
457 {
458 cptr->funkoffset += InvertLoopTable[cptr->funkspeed];
459 if( cptr->funkoffset > 128 )
460 {
461 cptr->funkoffset = 0;
462 if( cptr->sampdata && cptr->length && (cptr->replen > 1) )
463 {
464 if( ( (cptr->samppos) >> 11 ) >= (unsigned long)(cptr->replen+cptr->reppnt) )
465 {
466 cptr->samppos = ((unsigned long)(cptr->reppnt)<<11) + (cptr->samppos % ((unsigned long)(cptr->replen+cptr->reppnt)<<11));
467 }
468
469 #ifndef HXCMOD_MOD_FILE_IN_ROM
470 // Note : Directly modify the sample in the mod buffer...
471 // The current Invert Loop effect implementation can't be played from ROM.
472 cptr->sampdata[cptr->samppos >> 10] = -1 - cptr->sampdata[cptr->samppos >> 10];
473 #endif
474 }
475 }
476 }
477 }
478
worknote(note * nptr,hxcmod_channel_t * cptr,char t,modcontext * mod)479 static void worknote( note * nptr, hxcmod_channel_t * cptr,char t,modcontext * mod )
480 {
481 // BK4BSTACK_CHANGE START
482 (void) t;
483 // we rename sample into a_sample to avoid shadowing typedef struct { .. } sample; from hxcmod.h
484 // BK4BSTACK_CHANGE END
485
486 muint a_sample, period, effect, operiod;
487 muint curnote, arpnote;
488 muchar effect_op;
489 muchar effect_param,effect_param_l,effect_param_h;
490 muint enable_nxt_smp;
491 const short * period_table_ptr;
492
493 a_sample = (nptr->sampperiod & 0xF0) | (nptr->sampeffect >> 4);
494 period = ((nptr->sampperiod & 0xF) << 8) | nptr->period;
495 effect = ((nptr->sampeffect & 0xF) << 8) | nptr->effect;
496 effect_op = nptr->sampeffect & 0xF;
497 effect_param = nptr->effect;
498 effect_param_l = effect_param & 0x0F;
499 effect_param_h = effect_param >> 4;
500
501 enable_nxt_smp = 0;
502
503 operiod = cptr->period;
504
505 if ( period || a_sample )
506 {
507 if( a_sample && ( a_sample < 32 ) )
508 {
509 cptr->sampnum = a_sample - 1;
510 }
511
512 if( period || a_sample )
513 {
514 if( period )
515 {
516 if( ( effect_op != EFFECT_TONE_PORTAMENTO ) || ( ( effect_op == EFFECT_TONE_PORTAMENTO ) && !cptr->sampdata ) )
517 {
518 // Not a Tone Partamento effect or no sound currently played :
519 if ( ( effect_op != EFFECT_EXTENDED || effect_param_h != EFFECT_E_NOTE_DELAY ) || ( ( effect_op == EFFECT_EXTENDED && effect_param_h == EFFECT_E_NOTE_DELAY ) && !effect_param_l ) )
520 {
521 // Immediately (re)trigger the new note
522 cptr->sampdata = mod->sampledata[cptr->sampnum];
523 cptr->length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
524 cptr->reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
525 cptr->replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
526
527 cptr->lst_sampdata = cptr->sampdata;
528 cptr->lst_length = cptr->length;
529 cptr->lst_reppnt = cptr->reppnt;
530 cptr->lst_replen = cptr->replen;
531 }
532 else
533 {
534 cptr->dly_sampdata = mod->sampledata[cptr->sampnum];
535 cptr->dly_length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
536 cptr->dly_reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
537 cptr->dly_replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
538 cptr->note_delay = effect_param_l;
539 }
540 // Cancel any delayed note...
541 cptr->update_nxt_repeat = 0;
542 }
543 else
544 {
545 // Partamento effect - Play the new note after the current sample.
546 if( effect_op == EFFECT_TONE_PORTAMENTO )
547 enable_nxt_smp = 1;
548 }
549 }
550 else // Note without period : Trigger it after the current sample.
551 enable_nxt_smp = 1;
552
553 if ( enable_nxt_smp )
554 {
555 // Prepare the next sample retrigger after the current one
556 cptr->nxt_sampdata = mod->sampledata[cptr->sampnum];
557 cptr->nxt_length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
558 cptr->nxt_reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
559 cptr->nxt_replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
560
561 if(cptr->nxt_replen < 2) // Protracker : don't play the sample if not looped...
562 cptr->nxt_sampdata = 0;
563
564 cptr->update_nxt_repeat = 1;
565 }
566
567 cptr->finetune = (mod->song.samples[cptr->sampnum].finetune) & 0xF;
568
569 if( effect_op != EFFECT_VIBRATO && effect_op != EFFECT_VOLSLIDE_VIBRATO )
570 {
571 cptr->vibraperiod = 0;
572 cptr->vibrapointeur = 0;
573 }
574 }
575
576 if( (a_sample != 0) && ( effect_op != EFFECT_VOLSLIDE_TONEPORTA ) )
577 {
578 cptr->volume = mod->song.samples[cptr->sampnum].volume;
579 cptr->volumeslide = 0;
580 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
581 cptr->volume_table = mod->volume_selection_table[cptr->volume];
582 #endif
583 }
584
585 if( ( effect_op != EFFECT_TONE_PORTAMENTO ) && ( effect_op != EFFECT_VOLSLIDE_TONEPORTA ) )
586 {
587 if ( period != 0 )
588 cptr->samppos = 0;
589 }
590
591 cptr->decalperiod = 0;
592 if( period )
593 {
594 if( cptr->finetune )
595 {
596 period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
597 period = period_table_ptr[getnote(mod,period)];
598 }
599
600 cptr->period = period;
601 }
602 }
603
604 cptr->effect = 0;
605 cptr->parameffect = 0;
606 cptr->effect_code = effect;
607
608 #ifdef EFFECTS_USAGE_STATE
609 if(effect_op || ((effect_op==EFFECT_ARPEGGIO) && effect_param))
610 {
611 mod->effects_event_counts[ effect_op ]++;
612 }
613
614 if(effect_op == 0xE)
615 mod->effects_event_counts[ 0x10 + effect_param_h ]++;
616 #endif
617
618 switch ( effect_op )
619 {
620 case EFFECT_ARPEGGIO:
621 /*
622 [0]: Arpeggio
623 Where [0][x][y] means "play note, note+x semitones, note+y
624 semitones, then return to original note". The fluctuations are
625 carried out evenly spaced in one pattern division. They are usually
626 used to simulate chords, but this doesn't work too well. They are
627 also used to produce heavy vibrato. A major chord is when x=4, y=7.
628 A minor chord is when x=3, y=7.
629 */
630
631 if( effect_param )
632 {
633 cptr->effect = EFFECT_ARPEGGIO;
634 cptr->parameffect = effect_param;
635
636 cptr->ArpIndex = 0;
637
638 curnote = getnote(mod,cptr->period);
639
640 cptr->Arpperiods[0] = cptr->period;
641
642 period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
643
644 arpnote = curnote + (((cptr->parameffect>>4)&0xF));
645 if( arpnote >= MAXNOTES )
646 arpnote = (MAXNOTES) - 1;
647
648 cptr->Arpperiods[1] = period_table_ptr[arpnote];
649
650 arpnote = curnote + (((cptr->parameffect)&0xF));
651 if( arpnote >= MAXNOTES )
652 arpnote = (MAXNOTES) - 1;
653
654 cptr->Arpperiods[2] = period_table_ptr[arpnote];
655 }
656 break;
657
658 case EFFECT_PORTAMENTO_UP:
659 /*
660 [1]: Slide up
661 Where [1][x][y] means "smoothly decrease the period of current
662 sample by x*16+y after each tick in the division". The
663 ticks/division are set with the 'set speed' effect (see below). If
664 the period of the note being played is z, then the final period
665 will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on
666 the speed, changing the speed will change the slide. You cannot
667 slide beyond the note B3 (period 113).
668 */
669
670 cptr->effect = EFFECT_PORTAMENTO_UP;
671 cptr->parameffect = effect_param;
672 break;
673
674 case EFFECT_PORTAMENTO_DOWN:
675 /*
676 [2]: Slide down
677 Where [2][x][y] means "smoothly increase the period of current
678 sample by x*16+y after each tick in the division". Similar to [1],
679 but lowers the pitch. You cannot slide beyond the note C1 (period
680 856).
681 */
682
683 cptr->effect = EFFECT_PORTAMENTO_DOWN;
684 cptr->parameffect = effect_param;
685 break;
686
687 case EFFECT_TONE_PORTAMENTO:
688 /*
689 [3]: Slide to note
690 Where [3][x][y] means "smoothly change the period of current sample
691 by x*16+y after each tick in the division, never sliding beyond
692 current period". The period-length in this channel's division is a
693 parameter to this effect, and hence is not played. Sliding to a
694 note is similar to effects [1] and [2], but the slide will not go
695 beyond the given period, and the direction is implied by that
696 period. If x and y are both 0, then the old slide will continue.
697 */
698
699 cptr->effect = EFFECT_TONE_PORTAMENTO;
700 if( effect_param != 0 )
701 {
702 cptr->portaspeed = (short)( effect_param );
703 }
704
705 if(period!=0)
706 {
707 cptr->portaperiod = period;
708 cptr->period = operiod;
709 }
710 break;
711
712 case EFFECT_VIBRATO:
713 /*
714 [4]: Vibrato
715 Where [4][x][y] means "oscillate the sample pitch using a
716 particular waveform with amplitude y/16 semitones, such that (x *
717 ticks)/64 cycles occur in the division". The waveform is set using
718 effect [14][4]. By placing vibrato effects on consecutive
719 divisions, the vibrato effect can be maintained. If either x or y
720 are 0, then the old vibrato values will be used.
721 */
722
723 cptr->effect = EFFECT_VIBRATO;
724 if( effect_param_l != 0 ) // Depth continue or change ?
725 cptr->vibraparam = ( cptr->vibraparam & 0xF0 ) | effect_param_l;
726 if( effect_param_h != 0 ) // Speed continue or change ?
727 cptr->vibraparam = ( cptr->vibraparam & 0x0F ) | ( effect_param_h << 4 );
728
729 break;
730
731 case EFFECT_VOLSLIDE_TONEPORTA:
732 /*
733 [5]: Continue 'Slide to note', but also do Volume slide
734 Where [5][x][y] means "either slide the volume up x*(ticks - 1) or
735 slide the volume down y*(ticks - 1), at the same time as continuing
736 the last 'Slide to note'". It is illegal for both x and y to be
737 non-zero. You cannot slide outside the volume range 0..64. The
738 period-length in this channel's division is a parameter to this
739 effect, and hence is not played.
740 */
741
742 if( period != 0 )
743 {
744 cptr->portaperiod = period;
745 cptr->period = operiod;
746 }
747
748 cptr->effect = EFFECT_VOLSLIDE_TONEPORTA;
749 if( effect_param != 0 )
750 cptr->volumeslide = effect_param;
751
752 break;
753
754 case EFFECT_VOLSLIDE_VIBRATO:
755 /*
756 [6]: Continue 'Vibrato', but also do Volume slide
757 Where [6][x][y] means "either slide the volume up x*(ticks - 1) or
758 slide the volume down y*(ticks - 1), at the same time as continuing
759 the last 'Vibrato'". It is illegal for both x and y to be non-zero.
760 You cannot slide outside the volume range 0..64.
761 */
762
763 cptr->effect = EFFECT_VOLSLIDE_VIBRATO;
764 if( effect_param != 0 )
765 cptr->volumeslide = effect_param;
766 break;
767
768 case EFFECT_SET_OFFSET:
769 /*
770 [9]: Set sample offset
771 Where [9][x][y] means "play the sample from offset x*4096 + y*256".
772 The offset is measured in words. If no sample is given, yet one is
773 still playing on this channel, it should be retriggered to the new
774 offset using the current volume.
775 If xy is 00, the previous value is used.
776 */
777
778 cptr->samppos = ( ( ((muint)effect_param_h) << 12) + ( (((muint)effect_param_l) << 8) ) ) << 10;
779
780 if(!cptr->samppos)
781 cptr->samppos = cptr->last_set_offset;
782
783 cptr->last_set_offset = cptr->samppos;
784 break;
785
786 case EFFECT_VOLUME_SLIDE:
787 /*
788 [10]: Volume slide
789 Where [10][x][y] means "either slide the volume up x*(ticks - 1) or
790 slide the volume down y*(ticks - 1)". If both x and y are non-zero,
791 then the y value is ignored (assumed to be 0). You cannot slide
792 outside the volume range 0..64.
793 */
794
795 cptr->effect = EFFECT_VOLUME_SLIDE;
796 cptr->volumeslide = effect_param;
797 break;
798
799 case EFFECT_JUMP_POSITION:
800 /*
801 [11]: Position Jump
802 Where [11][x][y] means "stop the pattern after this division, and
803 continue the song at song-position x*16+y". This shifts the
804 'pattern-cursor' in the pattern table (see above). Legal values for
805 x*16+y are from 0 to 127.
806 */
807
808 mod->tablepos = effect_param;
809 if(mod->tablepos >= mod->song.length)
810 mod->tablepos = 0;
811 mod->patternpos = 0;
812 mod->jump_loop_effect = 1;
813
814 break;
815
816 case EFFECT_SET_VOLUME:
817 /*
818 [12]: Set volume
819 Where [12][x][y] means "set current sample's volume to x*16+y".
820 Legal volumes are 0..64.
821 */
822
823 cptr->volume = effect_param;
824
825 if(cptr->volume > 64)
826 cptr->volume = 64;
827
828 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
829 cptr->volume_table = mod->volume_selection_table[cptr->volume];
830 #endif
831 break;
832
833 case EFFECT_PATTERN_BREAK:
834 /*
835 [13]: Pattern Break
836 Where [13][x][y] means "stop the pattern after this division, and
837 continue the song at the next pattern at division x*10+y" (the 10
838 is not a typo). Legal divisions are from 0 to 63 (note Protracker
839 exception above).
840 */
841
842 mod->patternpos = ( ((muint)(effect_param_h) * 10) + effect_param_l );
843
844 if(mod->patternpos >= 64)
845 mod->patternpos = 63;
846
847 mod->patternpos *= mod->number_of_channels;
848
849 if(!mod->jump_loop_effect)
850 {
851 mod->tablepos++;
852 if(mod->tablepos >= mod->song.length)
853 mod->tablepos = 0;
854 }
855
856 mod->jump_loop_effect = 1;
857 break;
858
859 case EFFECT_EXTENDED:
860 switch( effect_param_h )
861 {
862 case EFFECT_E_FINE_PORTA_UP:
863 /*
864 [14][1]: Fineslide up
865 Where [14][1][x] means "decrement the period of the current sample
866 by x". The incrementing takes place at the beginning of the
867 division, and hence there is no actual sliding. You cannot slide
868 beyond the note B3 (period 113).
869 */
870
871 cptr->period -= effect_param_l;
872 if( cptr->period < 113 )
873 cptr->period = 113;
874 break;
875
876 case EFFECT_E_FINE_PORTA_DOWN:
877 /*
878 [14][2]: Fineslide down
879 Where [14][2][x] means "increment the period of the current sample
880 by x". Similar to [14][1] but shifts the pitch down. You cannot
881 slide beyond the note C1 (period 856).
882 */
883
884 cptr->period += effect_param_l;
885 if( cptr->period > 856 )
886 cptr->period = 856;
887 break;
888
889 case EFFECT_E_GLISSANDO_CTRL:
890 /*
891 [14][3]: Set glissando on/off
892 Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0".
893 Used in conjunction with [3] ('Slide to note'). If glissando is on,
894 then 'Slide to note' will slide in semitones, otherwise will
895 perform the default smooth slide.
896 */
897
898 cptr->glissando = effect_param_l;
899 break;
900
901 case EFFECT_E_FINE_VOLSLIDE_UP:
902 /*
903 [14][10]: Fine volume slide up
904 Where [14][10][x] means "increment the volume of the current sample
905 by x". The incrementing takes place at the beginning of the
906 division, and hence there is no sliding. You cannot slide beyond
907 volume 64.
908 */
909
910 cptr->volume += effect_param_l;
911 if( cptr->volume > 64 )
912 cptr->volume = 64;
913 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
914 cptr->volume_table = mod->volume_selection_table[cptr->volume];
915 #endif
916 break;
917
918 case EFFECT_E_FINE_VOLSLIDE_DOWN:
919 /*
920 [14][11]: Fine volume slide down
921 Where [14][11][x] means "decrement the volume of the current sample
922 by x". Similar to [14][10] but lowers volume. You cannot slide
923 beyond volume 0.
924 */
925
926 cptr->volume -= effect_param_l;
927 if( cptr->volume > 200 )
928 cptr->volume = 0;
929 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
930 cptr->volume_table = mod->volume_selection_table[cptr->volume];
931 #endif
932 break;
933
934 case EFFECT_E_SET_FINETUNE:
935 /*
936 [14][5]: Set finetune value
937 Where [14][5][x] means "sets the finetune value of the current
938 sample to the signed nibble x". x has legal values of 0..15,
939 corresponding to signed nibbles 0..7,-8..-1 (see start of text for
940 more info on finetune values).
941 */
942
943 cptr->finetune = effect_param_l;
944
945 if( period )
946 {
947 period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
948 period = period_table_ptr[getnote(mod,period)];
949 cptr->period = period;
950 }
951
952 break;
953
954 case EFFECT_E_PATTERN_LOOP:
955 /*
956 [14][6]: Loop pattern
957 Where [14][6][x] means "set the start of a loop to this division if
958 x is 0, otherwise after this division, jump back to the start of a
959 loop and play it another x times before continuing". If the start
960 of the loop was not set, it will default to the start of the
961 current pattern. Hence 'loop pattern' cannot be performed across
962 multiple patterns. Note that loops do not support nesting, and you
963 may generate an infinite loop if you try to nest 'loop pattern's.
964 */
965
966 if( effect_param_l )
967 {
968 if( cptr->patternloopcnt )
969 {
970 cptr->patternloopcnt--;
971 if( cptr->patternloopcnt )
972 {
973 mod->patternpos = cptr->patternloopstartpoint;
974 mod->jump_loop_effect = 1;
975 }
976 else
977 {
978 cptr->patternloopstartpoint = mod->patternpos ;
979 }
980 }
981 else
982 {
983 cptr->patternloopcnt = effect_param_l;
984 mod->patternpos = cptr->patternloopstartpoint;
985 mod->jump_loop_effect = 1;
986 }
987 }
988 else // Start point
989 {
990 cptr->patternloopstartpoint = mod->patternpos;
991 }
992
993 break;
994
995 case EFFECT_E_PATTERN_DELAY:
996 /*
997 [14][14]: Delay pattern
998 Where [14][14][x] means "after this division there will be a delay
999 equivalent to the time taken to play x divisions after which the
1000 pattern will be resumed". The delay only relates to the
1001 interpreting of new divisions, and all effects and previous notes
1002 continue during delay.
1003 */
1004
1005 mod->patterndelay = effect_param_l;
1006 break;
1007
1008 case EFFECT_E_RETRIGGER_NOTE:
1009 /*
1010 [14][9]: Retrigger sample
1011 Where [14][9][x] means "trigger current sample every x ticks in
1012 this division". If x is 0, then no retriggering is done (acts as if
1013 no effect was chosen), otherwise the retriggering begins on the
1014 first tick and then x ticks after that, etc.
1015 */
1016
1017 if( effect_param_l )
1018 {
1019 cptr->effect = EFFECT_EXTENDED;
1020 cptr->parameffect = (EFFECT_E_RETRIGGER_NOTE<<4);
1021 cptr->retrig_param = effect_param_l;
1022 cptr->retrig_cnt = 0;
1023 }
1024 break;
1025
1026 case EFFECT_E_NOTE_CUT:
1027 /*
1028 [14][12]: Cut sample
1029 Where [14][12][x] means "after the current sample has been played
1030 for x ticks in this division, its volume will be set to 0". This
1031 implies that if x is 0, then you will not hear any of the sample.
1032 If you wish to insert "silence" in a pattern, it is better to use a
1033 "silence"-sample (see above) due to the lack of proper support for
1034 this effect.
1035 */
1036
1037 cptr->effect = EFFECT_E_NOTE_CUT;
1038 cptr->cut_param = effect_param_l;
1039 if( !cptr->cut_param )
1040 {
1041 cptr->volume = 0;
1042 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1043 cptr->volume_table = mod->volume_selection_table[cptr->volume];
1044 #endif
1045 }
1046 break;
1047
1048 case EFFECT_E_NOTE_DELAY:
1049 /*
1050 Where [14][13][x] means "do not start this division's sample for
1051 the first x ticks in this division, play the sample after this".
1052 This implies that if x is 0, then you will hear no delay, but
1053 actually there will be a VERY small delay. Note that this effect
1054 only influences a sample if it was started in this division.
1055 */
1056
1057 cptr->effect = EFFECT_EXTENDED;
1058 cptr->parameffect = (EFFECT_E_NOTE_DELAY<<4);
1059 break;
1060
1061 case EFFECT_E_INVERT_LOOP:
1062 /*
1063 Where [14][15][x] means "if x is greater than 0, then play the
1064 current sample's loop upside down at speed x". Each byte in the
1065 sample's loop will have its sign changed (negated). It will only
1066 work if the sample's loop (defined previously) is not too big. The
1067 speed is based on an internal table.
1068 */
1069
1070 cptr->funkspeed = effect_param_l;
1071
1072 doFunk(cptr);
1073
1074 break;
1075
1076 default:
1077
1078 break;
1079 }
1080 break;
1081
1082 case 0xF:
1083 /*
1084 [15]: Set speed
1085 Where [15][x][y] means "set speed to x*16+y". Though it is nowhere
1086 near that simple. Let z = x*16+y. Depending on what values z takes,
1087 different units of speed are set, there being two: ticks/division
1088 and beats/minute (though this one is only a label and not strictly
1089 true). If z=0, then what should technically happen is that the
1090 module stops, but in practice it is treated as if z=1, because
1091 there is already a method for stopping the module (running out of
1092 patterns). If z<=32, then it means "set ticks/division to z"
1093 otherwise it means "set beats/minute to z" (convention says that
1094 this should read "If z<32.." but there are some composers out there
1095 that defy conventions). Default values are 6 ticks/division, and
1096 125 beats/minute (4 divisions = 1 beat). The beats/minute tag is
1097 only meaningful for 6 ticks/division. To get a more accurate view
1098 of how things work, use the following formula:
1099 24 * beats/minute
1100 divisions/minute = -----------------
1101 ticks/division
1102 Hence divisions/minute range from 24.75 to 6120, eg. to get a value
1103 of 2000 divisions/minute use 3 ticks/division and 250 beats/minute.
1104 If multiple "set speed" effects are performed in a single division,
1105 the ones on higher-numbered channels take precedence over the ones
1106 on lower-numbered channels. This effect has a large number of
1107 different implementations, but the one described here has the
1108 widest usage.
1109 */
1110
1111
1112 if( effect_param )
1113 {
1114
1115 if( effect_param < 0x20 )
1116 {
1117 mod->song.speed = effect_param;
1118 }
1119 else
1120 { // effect_param >= 0x20
1121 /// HZ = 2 * BPM / 5
1122 mod->bpm = effect_param;
1123 }
1124
1125 #ifdef HXCMOD_16BITS_TARGET
1126 // song.speed = 1 <> 31
1127 // playrate = 8000 <> 22050
1128 // bpm = 32 <> 255
1129
1130 mod->patternticksem = (muint)( ( (mulong)mod->playrate * 5 ) / ( (muint)mod->bpm * 2 ) );
1131 #else
1132 // song.speed = 1 <> 31
1133 // playrate = 8000 <> 96000
1134 // bpm = 32 <> 255
1135
1136 mod->patternticksem = ( ( mod->playrate * 5 ) / ( (mulong)mod->bpm * 2 ) );
1137 #endif
1138 mod->patternticksaim = mod->song.speed * mod->patternticksem;
1139 }
1140
1141 break;
1142
1143 default:
1144 // Unsupported effect
1145 break;
1146
1147 }
1148
1149 }
1150
workeffect(modcontext * modctx,note * nptr,hxcmod_channel_t * cptr)1151 static void workeffect( modcontext * modctx, note * nptr, hxcmod_channel_t * cptr )
1152 {
1153 // BK4BSTACK_CHANGE START
1154 (void) nptr;
1155 // BK4BSTACK_CHANGE END
1156
1157 doFunk(cptr);
1158
1159 switch(cptr->effect)
1160 {
1161 case EFFECT_ARPEGGIO:
1162
1163 if( cptr->parameffect )
1164 {
1165 cptr->decalperiod = cptr->period - cptr->Arpperiods[cptr->ArpIndex];
1166
1167 cptr->ArpIndex++;
1168 if( cptr->ArpIndex>2 )
1169 cptr->ArpIndex = 0;
1170 }
1171 break;
1172
1173 case EFFECT_PORTAMENTO_UP:
1174
1175 if( cptr->period )
1176 {
1177 cptr->period -= cptr->parameffect;
1178
1179 if( cptr->period < 113 || cptr->period > 20000 )
1180 cptr->period = 113;
1181 }
1182
1183 break;
1184
1185 case EFFECT_PORTAMENTO_DOWN:
1186
1187 if( cptr->period )
1188 {
1189 cptr->period += cptr->parameffect;
1190
1191 if( cptr->period > 20000 )
1192 cptr->period = 20000;
1193 }
1194
1195 break;
1196
1197 case EFFECT_VOLSLIDE_TONEPORTA:
1198 case EFFECT_TONE_PORTAMENTO:
1199
1200 if( cptr->period && ( cptr->period != cptr->portaperiod ) && cptr->portaperiod )
1201 {
1202 if( cptr->period > cptr->portaperiod )
1203 {
1204 if( cptr->period - cptr->portaperiod >= cptr->portaspeed )
1205 {
1206 cptr->period -= cptr->portaspeed;
1207 }
1208 else
1209 {
1210 cptr->period = cptr->portaperiod;
1211 }
1212 }
1213 else
1214 {
1215 if( cptr->portaperiod - cptr->period >= cptr->portaspeed )
1216 {
1217 cptr->period += cptr->portaspeed;
1218 }
1219 else
1220 {
1221 cptr->period = cptr->portaperiod;
1222 }
1223 }
1224
1225 if( cptr->period == cptr->portaperiod )
1226 {
1227 // If the slide is over, don't let it to be retriggered.
1228 cptr->portaperiod = 0;
1229 }
1230 }
1231
1232 if( cptr->glissando )
1233 {
1234 // TODO : Glissando effect.
1235 }
1236
1237 if( cptr->effect == EFFECT_VOLSLIDE_TONEPORTA )
1238 {
1239 if( cptr->volumeslide & 0xF0 )
1240 {
1241 cptr->volume += ( cptr->volumeslide >> 4 );
1242
1243 if( cptr->volume > 63 )
1244 cptr->volume = 63;
1245 }
1246 else
1247 {
1248 cptr->volume -= ( cptr->volumeslide & 0x0F );
1249
1250 if( cptr->volume > 63 )
1251 cptr->volume = 0;
1252 }
1253 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1254 cptr->volume_table = modctx->volume_selection_table[cptr->volume];
1255 #endif
1256 }
1257 break;
1258
1259 case EFFECT_VOLSLIDE_VIBRATO:
1260 case EFFECT_VIBRATO:
1261
1262 cptr->vibraperiod = ( (cptr->vibraparam&0xF) * sintable[cptr->vibrapointeur&0x1F] )>>7;
1263
1264 if( cptr->vibrapointeur > 31 )
1265 cptr->vibraperiod = -cptr->vibraperiod;
1266
1267 cptr->vibrapointeur = ( cptr->vibrapointeur + ( ( cptr->vibraparam>>4 ) & 0x0F) ) & 0x3F;
1268
1269 if( cptr->effect == EFFECT_VOLSLIDE_VIBRATO )
1270 {
1271 if( cptr->volumeslide & 0xF0 )
1272 {
1273 cptr->volume += ( cptr->volumeslide >> 4 );
1274
1275 if( cptr->volume > 64 )
1276 cptr->volume = 64;
1277 }
1278 else
1279 {
1280 cptr->volume -= cptr->volumeslide;
1281
1282 if( cptr->volume > 64 )
1283 cptr->volume = 0;
1284 }
1285 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1286 cptr->volume_table = modctx->volume_selection_table[cptr->volume];
1287 #endif
1288 }
1289
1290 break;
1291
1292 case EFFECT_VOLUME_SLIDE:
1293
1294 if( cptr->volumeslide & 0xF0 )
1295 {
1296 cptr->volume += ( cptr->volumeslide >> 4 );
1297
1298 if( cptr->volume > 64 )
1299 cptr->volume = 64;
1300 }
1301 else
1302 {
1303 cptr->volume -= cptr->volumeslide;
1304
1305 if( cptr->volume > 64 )
1306 cptr->volume = 0;
1307 }
1308 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1309 cptr->volume_table = modctx->volume_selection_table[cptr->volume];
1310 #endif
1311 break;
1312
1313 case EFFECT_EXTENDED:
1314 switch( cptr->parameffect >> 4 )
1315 {
1316
1317 case EFFECT_E_NOTE_CUT:
1318 if( cptr->cut_param )
1319 cptr->cut_param--;
1320
1321 if( !cptr->cut_param )
1322 {
1323 cptr->volume = 0;
1324 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1325 cptr->volume_table = modctx->volume_selection_table[cptr->volume];
1326 #endif
1327 }
1328 break;
1329
1330 case EFFECT_E_RETRIGGER_NOTE:
1331 cptr->retrig_cnt++;
1332 if( cptr->retrig_cnt >= cptr->retrig_param )
1333 {
1334 cptr->retrig_cnt = 0;
1335
1336 cptr->sampdata = cptr->lst_sampdata;
1337 cptr->length = cptr->lst_length;
1338 cptr->reppnt = cptr->lst_reppnt;
1339 cptr->replen = cptr->lst_replen;
1340 cptr->samppos = 0;
1341 }
1342 break;
1343
1344 case EFFECT_E_NOTE_DELAY:
1345 if( cptr->note_delay )
1346 {
1347 if( (unsigned char)( cptr->note_delay - 1 ) == modctx->tick_cnt )
1348 {
1349 cptr->sampdata = cptr->dly_sampdata;
1350 cptr->length = cptr->dly_length;
1351 cptr->reppnt = cptr->dly_reppnt;
1352 cptr->replen = cptr->dly_replen;
1353
1354 cptr->lst_sampdata = cptr->sampdata;
1355 cptr->lst_length = cptr->length;
1356 cptr->lst_reppnt = cptr->reppnt;
1357 cptr->lst_replen = cptr->replen;
1358 cptr->note_delay = 0;
1359 }
1360 }
1361 break;
1362 default:
1363 break;
1364 }
1365 break;
1366
1367 default:
1368 break;
1369
1370 }
1371
1372 }
1373
1374 ///////////////////////////////////////////////////////////////////////////////////
hxcmod_init(modcontext * modctx)1375 int hxcmod_init(modcontext * modctx)
1376 {
1377 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1378 muint c;
1379 mint i,j;
1380 #endif
1381 if( modctx )
1382 {
1383 memclear(modctx,0,sizeof(modcontext));
1384 modctx->playrate = 44100;
1385 modctx->stereo = 1;
1386 modctx->stereo_separation = 1;
1387 modctx->bits = 16;
1388 modctx->filter = 1;
1389
1390 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1391 c = 0;
1392 for(i=0;i<65;i++)
1393 {
1394 for(j=-128;j<128;j++)
1395 {
1396 modctx->precalc_volume_array[c] = i * j;
1397 c++;
1398 }
1399
1400 modctx->volume_selection_table[i] = &modctx->precalc_volume_array[(i*256) + 128];
1401 }
1402 #endif
1403
1404 return 1;
1405 }
1406
1407 return 0;
1408 }
1409
hxcmod_setcfg(modcontext * modctx,int samplerate,int stereo_separation,int filter)1410 int hxcmod_setcfg(modcontext * modctx, int samplerate, int stereo_separation, int filter)
1411 {
1412 if( modctx )
1413 {
1414 modctx->playrate = samplerate;
1415
1416 if(stereo_separation < 4)
1417 {
1418 modctx->stereo_separation = stereo_separation;
1419 }
1420
1421 if( filter )
1422 modctx->filter = 1;
1423 else
1424 modctx->filter = 0;
1425
1426 return 1;
1427 }
1428
1429 return 0;
1430 }
1431
hxcmod_load(modcontext * modctx,void * mod_data,int mod_data_size)1432 int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
1433 {
1434 muint i, j, max, digitfactor;
1435 sample *sptr;
1436 unsigned char * modmemory,* endmodmemory;
1437
1438 modmemory = (unsigned char *)mod_data;
1439 endmodmemory = modmemory + mod_data_size;
1440
1441 if( modmemory )
1442 {
1443 if( modctx )
1444 {
1445 #ifdef FULL_STATE
1446 memclear(&(modctx->effects_event_counts),0,sizeof(modctx->effects_event_counts));
1447 #endif
1448 memcopy(&(modctx->song),modmemory,1084);
1449
1450 i = 0;
1451 modctx->number_of_channels = 0;
1452 while(modlist[i].numberofchannels && !modctx->number_of_channels)
1453 {
1454 digitfactor = 0;
1455
1456 j = 0;
1457 while( j < 4 )
1458 {
1459 if( modlist[i].signature[j] == '$' )
1460 {
1461 if(digitfactor)
1462 digitfactor *= 10;
1463 else
1464 digitfactor = 1;
1465 }
1466 j++;
1467 }
1468
1469 modctx->number_of_channels = 0;
1470
1471 j = 0;
1472 while( j < 4 )
1473 {
1474 if( (modlist[i].signature[j] == modctx->song.signature[j]) || modlist[i].signature[j] == '$' )
1475 {
1476 if( modlist[i].signature[j] == '$' )
1477 {
1478 if(modctx->song.signature[j] >= '0' && modctx->song.signature[j] <= '9')
1479 {
1480 modctx->number_of_channels += (modctx->song.signature[j] - '0') * digitfactor;
1481 digitfactor /= 10;
1482 }
1483 else
1484 {
1485 modctx->number_of_channels = 0;
1486 break;
1487 }
1488 }
1489 j++;
1490 }
1491 else
1492 {
1493 modctx->number_of_channels = 0;
1494 break;
1495 }
1496 }
1497
1498 if( j == 4 )
1499 {
1500 if(!modctx->number_of_channels)
1501 modctx->number_of_channels = modlist[i].numberofchannels;
1502 }
1503
1504 i++;
1505 }
1506
1507 if( !modctx->number_of_channels )
1508 {
1509 // 15 Samples modules support
1510 // Shift the whole datas to make it look likes a standard 4 channels mod.
1511 memcopy(&(modctx->song.signature), "M.K.", 4);
1512 memcopy(&(modctx->song.length), &(modctx->song.samples[15]), 130);
1513 memclear(&(modctx->song.samples[15]), 0, 480);
1514 modmemory += 600;
1515 modctx->number_of_channels = 4;
1516 }
1517 else
1518 {
1519 modmemory += 1084;
1520 }
1521
1522 if( modctx->number_of_channels > NUMMAXCHANNELS )
1523 return 0; // Too much channels ! - Increase/define HXCMOD_MAXCHANNELS !
1524
1525 if( modmemory >= endmodmemory )
1526 return 0; // End passed ? - Probably a bad file !
1527
1528 // Patterns loading
1529 for (i = max = 0; i < 128; i++)
1530 {
1531 while (max <= modctx->song.patterntable[i])
1532 {
1533 modctx->patterndata[max] = (note*)modmemory;
1534 modmemory += (256*modctx->number_of_channels);
1535 max++;
1536
1537 if( modmemory >= endmodmemory )
1538 return 0; // End passed ? - Probably a bad file !
1539 }
1540 }
1541
1542 for (i = 0; i < 31; i++)
1543 modctx->sampledata[i]=0;
1544
1545 // Samples loading
1546 for (i = 0, sptr = modctx->song.samples; i <31; i++, sptr++)
1547 {
1548 if (sptr->length == 0) continue;
1549
1550 modctx->sampledata[i] = (mchar*)modmemory;
1551 modmemory += (GET_BGI_W(sptr->length)*2);
1552
1553 if (GET_BGI_W(sptr->replen) + GET_BGI_W(sptr->reppnt) > GET_BGI_W(sptr->length))
1554 sptr->replen = GET_BGI_W((GET_BGI_W(sptr->length) - GET_BGI_W(sptr->reppnt)));
1555
1556 if( modmemory > endmodmemory )
1557 return 0; // End passed ? - Probably a bad file !
1558 }
1559
1560 // States init
1561
1562 modctx->tablepos = 0;
1563 modctx->patternpos = 0;
1564 modctx->song.speed = 6;
1565 modctx->bpm = 125;
1566
1567 #ifdef HXCMOD_16BITS_TARGET
1568 // song.speed = 1 <> 31
1569 // playrate = 8000 <> 22050
1570 // bpm = 32 <> 255
1571
1572 modctx->patternticksem = (muint)( ( (mulong)modctx->playrate * 5 ) / ( (muint)modctx->bpm * 2 ) );
1573 #else
1574 // song.speed = 1 <> 31
1575 // playrate = 8000 <> 96000
1576 // bpm = 32 <> 255
1577
1578 modctx->patternticksem = ( ( modctx->playrate * 5 ) / ( (mulong)modctx->bpm * 2 ) );
1579 #endif
1580 modctx->patternticksaim = modctx->song.speed * modctx->patternticksem;
1581
1582 modctx->patternticks = modctx->patternticksaim + 1;
1583
1584 modctx->sampleticksconst = ((3546894UL * 16) / modctx->playrate) << 6; //8448*428/playrate;
1585
1586 for(i=0; i < modctx->number_of_channels; i++)
1587 {
1588 modctx->channels[i].volume = 0;
1589 modctx->channels[i].period = 0;
1590 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1591 modctx->channels[i].volume_table = modctx->volume_selection_table[0];
1592 #endif
1593 }
1594
1595 modctx->mod_loaded = 1;
1596
1597 return 1;
1598 }
1599 }
1600
1601 return 0;
1602 }
1603
hxcmod_fillbuffer(modcontext * modctx,msample * outbuffer,mssize nbsample,tracker_buffer_state * trkbuf)1604 void hxcmod_fillbuffer(modcontext * modctx, msample * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf)
1605 {
1606 mssize i;
1607 muint j;
1608 muint c;
1609
1610 unsigned long k;
1611 unsigned int state_remaining_steps;
1612
1613 #ifdef HXCMOD_OUTPUT_FILTER
1614 #ifndef HXCMOD_MONO_OUTPUT
1615 int ll,tl;
1616 #endif
1617 int lr,tr;
1618 #endif
1619
1620 #ifndef HXCMOD_MONO_OUTPUT
1621 int l;
1622 #endif
1623 int r;
1624
1625 short finalperiod;
1626 note *nptr;
1627 hxcmod_channel_t *cptr;
1628
1629 if( modctx && outbuffer )
1630 {
1631 if(modctx->mod_loaded)
1632 {
1633 state_remaining_steps = 0;
1634
1635 #ifdef HXCMOD_STATE_REPORT_SUPPORT
1636 if( trkbuf )
1637 {
1638 trkbuf->cur_rd_index = 0;
1639
1640 memcopy(trkbuf->name,modctx->song.title,sizeof(modctx->song.title));
1641
1642 for(i=0;i<31;i++)
1643 {
1644 memcopy(trkbuf->instruments[i].name,modctx->song.samples[i].name,sizeof(trkbuf->instruments[i].name));
1645 }
1646 }
1647 #endif
1648
1649 #ifdef HXCMOD_OUTPUT_FILTER
1650 #ifndef HXCMOD_MONO_OUTPUT
1651 ll = modctx->last_l_sample;
1652 #endif
1653 lr = modctx->last_r_sample;
1654 #endif
1655
1656 for (i = 0; i < nbsample; i++)
1657 {
1658 //---------------------------------------
1659 if( modctx->patternticks++ > modctx->patternticksaim )
1660 {
1661 if( !modctx->patterndelay )
1662 {
1663 nptr = modctx->patterndata[modctx->song.patterntable[modctx->tablepos]];
1664 nptr = nptr + modctx->patternpos;
1665 cptr = modctx->channels;
1666
1667 modctx->tick_cnt = 0;
1668
1669 modctx->patternticks = 0;
1670 modctx->patterntickse = 0;
1671
1672 for(c=0;c<modctx->number_of_channels;c++)
1673 {
1674 worknote((note*)(nptr), (hxcmod_channel_t*)(cptr),(char)(c+1),modctx);
1675
1676 if (cptr->period != 0)
1677 {
1678 finalperiod = cptr->period - cptr->decalperiod - cptr->vibraperiod;
1679 if (finalperiod)
1680 {
1681 cptr->sampinc = ((modctx->sampleticksconst) / finalperiod);
1682 }
1683 else
1684 {
1685 cptr->sampinc = 0;
1686 }
1687 }
1688 else
1689 cptr->sampinc = 0;
1690
1691 nptr++;
1692 cptr++;
1693 }
1694
1695 if( !modctx->jump_loop_effect )
1696 modctx->patternpos += modctx->number_of_channels;
1697 else
1698 modctx->jump_loop_effect = 0;
1699
1700 if( modctx->patternpos == 64*modctx->number_of_channels )
1701 {
1702 modctx->tablepos++;
1703 modctx->patternpos = 0;
1704 if(modctx->tablepos >= modctx->song.length)
1705 modctx->tablepos = 0;
1706 }
1707 }
1708 else
1709 {
1710 modctx->patterndelay--;
1711 modctx->patternticks = 0;
1712 modctx->patterntickse = 0;
1713 modctx->tick_cnt = 0;
1714 }
1715
1716 }
1717
1718 if (modctx->patterntickse++ > modctx->patternticksem)
1719 {
1720 nptr = modctx->patterndata[modctx->song.patterntable[modctx->tablepos]];
1721 nptr = nptr + modctx->patternpos;
1722 cptr = modctx->channels;
1723
1724 for(c=0;c<modctx->number_of_channels;c++)
1725 {
1726 workeffect( modctx, nptr, cptr );
1727
1728 if (cptr->period != 0)
1729 {
1730 finalperiod = cptr->period - cptr->decalperiod - cptr->vibraperiod;
1731 if (finalperiod)
1732 {
1733 cptr->sampinc = ((modctx->sampleticksconst) / finalperiod);
1734 }
1735 else
1736 {
1737 cptr->sampinc = 0;
1738 }
1739 }
1740 else
1741 cptr->sampinc = 0;
1742
1743 nptr++;
1744 cptr++;
1745 }
1746
1747 modctx->tick_cnt++;
1748 modctx->patterntickse = 0;
1749 }
1750
1751 //---------------------------------------
1752
1753 #ifdef HXCMOD_STATE_REPORT_SUPPORT
1754 if( trkbuf && !state_remaining_steps )
1755 {
1756 if( trkbuf->nb_of_state < trkbuf->nb_max_of_state )
1757 {
1758 memclear(&trkbuf->track_state_buf[trkbuf->nb_of_state],0,sizeof(tracker_state));
1759 }
1760 }
1761 #endif
1762
1763 #ifndef HXCMOD_MONO_OUTPUT
1764 l=0;
1765 #endif
1766 r=0;
1767
1768 for( j = 0, cptr = modctx->channels; j < modctx->number_of_channels ; j++, cptr++)
1769 {
1770 if( cptr->period != 0 )
1771 {
1772 cptr->samppos += cptr->sampinc;
1773
1774 if( cptr->replen < 2 )
1775 {
1776 if( ( cptr->samppos >> 11) >= cptr->length )
1777 {
1778 cptr->length = 0;
1779 cptr->reppnt = 0;
1780
1781 if(cptr->update_nxt_repeat)
1782 {
1783 cptr->replen = cptr->nxt_replen;
1784 cptr->reppnt = cptr->nxt_reppnt;
1785 cptr->sampdata = cptr->nxt_sampdata;
1786 cptr->length = cptr->nxt_length;
1787
1788 cptr->lst_sampdata = cptr->sampdata;
1789 cptr->lst_length = cptr->length;
1790 cptr->lst_reppnt = cptr->reppnt;
1791 cptr->lst_replen = cptr->replen;
1792
1793 cptr->update_nxt_repeat = 0;
1794 }
1795
1796 if( cptr->length )
1797 cptr->samppos = cptr->samppos % (((unsigned long)cptr->length)<<11);
1798 else
1799 cptr->samppos = 0;
1800 }
1801 }
1802 else
1803 {
1804 if( ( cptr->samppos >> 11 ) >= (unsigned long)(cptr->replen+cptr->reppnt) )
1805 {
1806 if( cptr->update_nxt_repeat )
1807 {
1808 cptr->replen = cptr->nxt_replen;
1809 cptr->reppnt = cptr->nxt_reppnt;
1810 cptr->sampdata = cptr->nxt_sampdata;
1811 cptr->length = cptr->nxt_length;
1812
1813 cptr->lst_sampdata = cptr->sampdata;
1814 cptr->lst_length = cptr->length;
1815 cptr->lst_reppnt = cptr->reppnt;
1816 cptr->lst_replen = cptr->replen;
1817
1818 cptr->update_nxt_repeat = 0;
1819 }
1820
1821 if( cptr->sampdata )
1822 {
1823 cptr->samppos = ((unsigned long)(cptr->reppnt)<<11) + (cptr->samppos % ((unsigned long)(cptr->replen+cptr->reppnt)<<11));
1824 }
1825 }
1826 }
1827
1828 k = cptr->samppos >> 10;
1829
1830 #ifdef HXCMOD_MONO_OUTPUT
1831 if( cptr->sampdata!=0 )
1832 {
1833 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1834 r += cptr->volume_table[cptr->sampdata[k]];
1835 #else
1836 r += ( cptr->sampdata[k] * cptr->volume );
1837 #endif
1838 }
1839 #else
1840 if (cptr->sampdata != 0)
1841 {
1842 if ( !(j & 3) || ((j & 3) == 3) )
1843 {
1844 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1845 l += cptr->volume_table[cptr->sampdata[k]];
1846 #else
1847 l += (cptr->sampdata[k] * cptr->volume);
1848 #endif
1849 }
1850 else
1851 {
1852 #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
1853 r += cptr->volume_table[cptr->sampdata[k]];
1854 #else
1855 r += (cptr->sampdata[k] * cptr->volume);
1856 #endif
1857 }
1858 }
1859 #endif
1860
1861 #ifdef HXCMOD_STATE_REPORT_SUPPORT
1862 if( trkbuf && !state_remaining_steps )
1863 {
1864 if( trkbuf->nb_of_state < trkbuf->nb_max_of_state )
1865 {
1866 trkbuf->track_state_buf[trkbuf->nb_of_state].number_of_tracks = modctx->number_of_channels;
1867 trkbuf->track_state_buf[trkbuf->nb_of_state].buf_index = i;
1868 trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern = modctx->song.patterntable[modctx->tablepos];
1869 trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern_pos = modctx->patternpos / modctx->number_of_channels;
1870 trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern_table_pos = modctx->tablepos;
1871 trkbuf->track_state_buf[trkbuf->nb_of_state].bpm = modctx->bpm;
1872 trkbuf->track_state_buf[trkbuf->nb_of_state].speed = modctx->song.speed;
1873 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_effect = cptr->effect_code;
1874 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_parameffect = cptr->parameffect;
1875 if(cptr->sampinc)
1876 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_period = (muint)(modctx->sampleticksconst / cptr->sampinc);
1877 else
1878 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_period = 0;
1879 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_volume = cptr->volume;
1880 trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].instrument_number = (unsigned char)cptr->sampnum;
1881 }
1882 }
1883 #endif
1884 }
1885 }
1886
1887 #ifdef HXCMOD_STATE_REPORT_SUPPORT
1888 if( trkbuf && !state_remaining_steps )
1889 {
1890 state_remaining_steps = trkbuf->sample_step;
1891
1892 if(trkbuf->nb_of_state < trkbuf->nb_max_of_state)
1893 trkbuf->nb_of_state++;
1894 }
1895 else
1896 #endif
1897 {
1898 state_remaining_steps--;
1899 }
1900
1901 #ifdef HXCMOD_MONO_OUTPUT
1902
1903 #ifdef HXCMOD_OUTPUT_FILTER
1904 tr = (short)r;
1905
1906 if ( modctx->filter )
1907 {
1908 // Filter
1909 r = (r+lr)>>1;
1910 }
1911 #endif
1912
1913 #ifdef HXCMOD_CLIPPING_CHECK
1914 // Level limitation
1915 if( r > 32767 ) r = 32767;
1916 if( r < -32768 ) r = -32768;
1917 #endif
1918 // Store the final sample.
1919 #ifdef HXCMOD_8BITS_OUTPUT
1920
1921 #ifdef HXCMOD_UNSIGNED_OUTPUT
1922 *outbuffer++ = (r >> 8) + 127;
1923 #else
1924 *outbuffer++ = r >> 8;
1925 #endif
1926
1927 #else
1928
1929 #ifdef HXCMOD_UNSIGNED_OUTPUT
1930 *outbuffer++ = r + 32767;
1931 #else
1932 *outbuffer++ = r;
1933 #endif
1934
1935 #endif
1936
1937 #ifdef HXCMOD_OUTPUT_FILTER
1938 lr = tr;
1939 #endif
1940
1941 #else
1942
1943 #ifdef HXCMOD_OUTPUT_FILTER
1944 tl = (short)l;
1945 tr = (short)r;
1946
1947 if ( modctx->filter )
1948 {
1949 // Filter
1950 l = (l+ll)>>1;
1951 r = (r+lr)>>1;
1952 }
1953 #endif
1954
1955 #ifdef HXCMOD_OUTPUT_STEREO_MIX
1956 if ( modctx->stereo_separation == 1 )
1957 {
1958 // Left & Right Stereo panning
1959 l = (l+(r>>1));
1960 r = (r+(l>>1));
1961 }
1962 #endif
1963
1964 #ifdef HXCMOD_CLIPPING_CHECK
1965 // Level limitation
1966 if( l > 32767 ) l = 32767;
1967 if( l < -32768 ) l = -32768;
1968 if( r > 32767 ) r = 32767;
1969 if( r < -32768 ) r = -32768;
1970 #endif
1971 // Store the final sample.
1972
1973
1974 #ifdef HXCMOD_8BITS_OUTPUT
1975
1976 #ifdef HXCMOD_UNSIGNED_OUTPUT
1977 *outbuffer++ = ( l >> 8 ) + 127;
1978 *outbuffer++ = ( r >> 8 ) + 127;
1979 #else
1980 *outbuffer++ = l >> 8;
1981 *outbuffer++ = r >> 8;
1982 #endif
1983
1984 #else
1985
1986 #ifdef HXCMOD_UNSIGNED_OUTPUT
1987 *outbuffer++ = l + 32767;
1988 *outbuffer++ = r + 32767;
1989 #else
1990 *outbuffer++ = l;
1991 *outbuffer++ = r;
1992 #endif
1993
1994 #endif
1995
1996 #ifdef HXCMOD_OUTPUT_FILTER
1997 ll = tl;
1998 lr = tr;
1999 #endif
2000
2001 #endif // HXCMOD_MONO_OUTPUT
2002
2003 }
2004
2005 #ifdef HXCMOD_OUTPUT_FILTER
2006 #ifndef HXCMOD_MONO_OUTPUT
2007 modctx->last_l_sample = ll;
2008 #endif
2009 modctx->last_r_sample = lr;
2010 #endif
2011 }
2012 else
2013 {
2014 for (i = 0; i < nbsample; i++)
2015 {
2016 // Mod not loaded. Return blank buffer.
2017 #ifdef HXCMOD_MONO_OUTPUT
2018 outbuffer[i] = 0;
2019 #else
2020 *outbuffer++ = 0;
2021 *outbuffer++ = 0;
2022 #endif
2023 }
2024
2025 #ifdef HXCMOD_STATE_REPORT_SUPPORT
2026 if(trkbuf)
2027 {
2028 trkbuf->nb_of_state = 0;
2029 trkbuf->cur_rd_index = 0;
2030 trkbuf->name[0] = 0;
2031 memclear(trkbuf->track_state_buf,0,sizeof(tracker_state) * trkbuf->nb_max_of_state);
2032 memclear(trkbuf->instruments,0,sizeof(trkbuf->instruments));
2033 }
2034 #endif
2035 }
2036 }
2037 }
2038
hxcmod_unload(modcontext * modctx)2039 void hxcmod_unload( modcontext * modctx )
2040 {
2041 if(modctx)
2042 {
2043 memclear(&modctx->song,0,sizeof(modctx->song));
2044 memclear(&modctx->sampledata,0,sizeof(modctx->sampledata));
2045 memclear(&modctx->patterndata,0,sizeof(modctx->patterndata));
2046 modctx->tablepos = 0;
2047 modctx->patternpos = 0;
2048 modctx->patterndelay = 0;
2049 modctx->jump_loop_effect = 0;
2050 modctx->bpm = 0;
2051 modctx->patternticks = 0;
2052 modctx->patterntickse = 0;
2053 modctx->patternticksaim = 0;
2054 modctx->sampleticksconst = 0;
2055
2056 memclear(modctx->channels,0,sizeof(modctx->channels));
2057
2058 modctx->number_of_channels = 0;
2059
2060 modctx->mod_loaded = 0;
2061
2062 modctx->last_r_sample = 0;
2063 modctx->last_l_sample = 0;
2064 }
2065 }
2066