1a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
2a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
3a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
4a4cd9b30SMilanka Ringwald //-----------H----H--X----X-----CCCCC----22222----0000-----0000------11----------//
5a4cd9b30SMilanka Ringwald //----------H----H----X-X-----C--------------2---0----0---0----0--1--1-----------//
6a4cd9b30SMilanka Ringwald //---------HHHHHH-----X------C----------22222---0----0---0----0-----1------------//
7a4cd9b30SMilanka Ringwald //--------H----H----X--X----C----------2-------0----0---0----0-----1-------------//
8a4cd9b30SMilanka Ringwald //-------H----H---X-----X---CCCCC-----222222----0000-----0000----1111------------//
9a4cd9b30SMilanka Ringwald //-------------------------------------------------------------------------------//
10a4cd9b30SMilanka Ringwald //----------------------------------------------------- http://hxc2001.free.fr --//
11a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
12a4cd9b30SMilanka Ringwald // File : hxcmod.c
13a4cd9b30SMilanka Ringwald // Contains: a tiny mod player
14a4cd9b30SMilanka Ringwald //
15d38efbbaSMatthias Ringwald // Written by: Jean Francois DEL NERO
16a4cd9b30SMilanka Ringwald //
17a4cd9b30SMilanka Ringwald // You are free to do what you want with this code.
18a4cd9b30SMilanka Ringwald // A credit is always appreciated if you include it into your prod :)
19a4cd9b30SMilanka Ringwald //
20a4cd9b30SMilanka Ringwald // This file include some parts of the Noisetracker/Soundtracker/Protracker
21a4cd9b30SMilanka Ringwald // Module Format documentation written by Andrew Scott (Adrenalin Software)
22a4cd9b30SMilanka Ringwald // (modformat.txt)
23a4cd9b30SMilanka Ringwald //
24a4cd9b30SMilanka Ringwald // The core (hxcmod.c/hxcmod.h) is designed to have the least external dependency.
25a4cd9b30SMilanka Ringwald // So it should be usable on almost all OS and systems.
26a4cd9b30SMilanka Ringwald // Please also note that no dynamic allocation is done into the HxCMOD core.
27a4cd9b30SMilanka Ringwald //
28a4cd9b30SMilanka Ringwald // Change History (most recent first):
29a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
30a4cd9b30SMilanka Ringwald // HxCMOD Core API:
31a4cd9b30SMilanka Ringwald // -------------------------------------------
32a4cd9b30SMilanka Ringwald // int hxcmod_init(modcontext * modctx)
33a4cd9b30SMilanka Ringwald //
34a4cd9b30SMilanka Ringwald // - Initialize the modcontext buffer. Must be called before doing anything else.
35a4cd9b30SMilanka Ringwald // Return 1 if success. 0 in case of error.
36a4cd9b30SMilanka Ringwald // -------------------------------------------
37a4cd9b30SMilanka Ringwald // int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
38a4cd9b30SMilanka Ringwald //
39a4cd9b30SMilanka Ringwald // - "Load" a MOD from memory (from "mod_data" with size "mod_data_size").
40a4cd9b30SMilanka Ringwald // Return 1 if success. 0 in case of error.
41a4cd9b30SMilanka Ringwald // -------------------------------------------
428201da88SMatthias Ringwald // void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf )
43a4cd9b30SMilanka Ringwald //
44a4cd9b30SMilanka Ringwald // - Generate and return the next samples chunk to outbuffer.
45a4cd9b30SMilanka Ringwald // nbsample specify the number of stereo 16bits samples you want.
46a4cd9b30SMilanka Ringwald // The output format is signed 44100Hz 16-bit Stereo PCM samples.
47a4cd9b30SMilanka Ringwald // The output buffer size in byte must be equal to ( nbsample * 2 * 2 ).
48a4cd9b30SMilanka Ringwald // The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused.
49a4cd9b30SMilanka Ringwald // -------------------------------------------
50a4cd9b30SMilanka Ringwald // void hxcmod_unload( modcontext * modctx )
51a4cd9b30SMilanka Ringwald // - "Unload" / clear the player status.
52a4cd9b30SMilanka Ringwald // -------------------------------------------
53a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
54a4cd9b30SMilanka Ringwald
55a4cd9b30SMilanka Ringwald #include "hxcmod.h"
56a4cd9b30SMilanka Ringwald
578201da88SMatthias Ringwald // BK4BSTACK_CHANGE START
588201da88SMatthias Ringwald
598201da88SMatthias Ringwald // MODs ar either in ROM (MCUs) or in .text segment
608201da88SMatthias Ringwald #define HXCMOD_MOD_FILE_IN_ROM
618201da88SMatthias Ringwald
628201da88SMatthias Ringwald #ifdef __GNUC__
638201da88SMatthias Ringwald #ifndef __clang__
648201da88SMatthias Ringwald #pragma GCC diagnostic push
658201da88SMatthias Ringwald // -Wstringop-overflow unknown to Clang 16.0.0
668201da88SMatthias Ringwald #pragma GCC diagnostic ignored "-Wstringop-overflow"
678201da88SMatthias Ringwald #endif
688201da88SMatthias Ringwald #endif
698201da88SMatthias Ringwald
708201da88SMatthias Ringwald // BK4BSTACK_CHANGE END
718201da88SMatthias Ringwald
72a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
73a4cd9b30SMilanka Ringwald
74a4cd9b30SMilanka Ringwald // Effects list
75a4cd9b30SMilanka Ringwald #define EFFECT_ARPEGGIO 0x0 // Supported
76a4cd9b30SMilanka Ringwald #define EFFECT_PORTAMENTO_UP 0x1 // Supported
77a4cd9b30SMilanka Ringwald #define EFFECT_PORTAMENTO_DOWN 0x2 // Supported
78a4cd9b30SMilanka Ringwald #define EFFECT_TONE_PORTAMENTO 0x3 // Supported
79a4cd9b30SMilanka Ringwald #define EFFECT_VIBRATO 0x4 // Supported
80a4cd9b30SMilanka Ringwald #define EFFECT_VOLSLIDE_TONEPORTA 0x5 // Supported
81a4cd9b30SMilanka Ringwald #define EFFECT_VOLSLIDE_VIBRATO 0x6 // Supported
82a4cd9b30SMilanka Ringwald #define EFFECT_VOLSLIDE_TREMOLO 0x7 // - TO BE DONE -
83a4cd9b30SMilanka Ringwald #define EFFECT_SET_PANNING 0x8 // - TO BE DONE -
84a4cd9b30SMilanka Ringwald #define EFFECT_SET_OFFSET 0x9 // Supported
85a4cd9b30SMilanka Ringwald #define EFFECT_VOLUME_SLIDE 0xA // Supported
86a4cd9b30SMilanka Ringwald #define EFFECT_JUMP_POSITION 0xB // Supported
87a4cd9b30SMilanka Ringwald #define EFFECT_SET_VOLUME 0xC // Supported
88a4cd9b30SMilanka Ringwald #define EFFECT_PATTERN_BREAK 0xD // Supported
89a4cd9b30SMilanka Ringwald
90a4cd9b30SMilanka Ringwald #define EFFECT_EXTENDED 0xE
91a4cd9b30SMilanka Ringwald #define EFFECT_E_FINE_PORTA_UP 0x1 // Supported
92a4cd9b30SMilanka Ringwald #define EFFECT_E_FINE_PORTA_DOWN 0x2 // Supported
93a4cd9b30SMilanka Ringwald #define EFFECT_E_GLISSANDO_CTRL 0x3 // - TO BE DONE -
94a4cd9b30SMilanka Ringwald #define EFFECT_E_VIBRATO_WAVEFORM 0x4 // - TO BE DONE -
958201da88SMatthias Ringwald #define EFFECT_E_SET_FINETUNE 0x5 // Supported
96a4cd9b30SMilanka Ringwald #define EFFECT_E_PATTERN_LOOP 0x6 // Supported
97a4cd9b30SMilanka Ringwald #define EFFECT_E_TREMOLO_WAVEFORM 0x7 // - TO BE DONE -
98a4cd9b30SMilanka Ringwald #define EFFECT_E_SET_PANNING_2 0x8 // - TO BE DONE -
998201da88SMatthias Ringwald #define EFFECT_E_RETRIGGER_NOTE 0x9 // Supported
100a4cd9b30SMilanka Ringwald #define EFFECT_E_FINE_VOLSLIDE_UP 0xA // Supported
101a4cd9b30SMilanka Ringwald #define EFFECT_E_FINE_VOLSLIDE_DOWN 0xB // Supported
102a4cd9b30SMilanka Ringwald #define EFFECT_E_NOTE_CUT 0xC // Supported
1038201da88SMatthias Ringwald #define EFFECT_E_NOTE_DELAY 0xD // Supported
104a4cd9b30SMilanka Ringwald #define EFFECT_E_PATTERN_DELAY 0xE // Supported
1058201da88SMatthias Ringwald #define EFFECT_E_INVERT_LOOP 0xF // Supported (W.I.P)
106a4cd9b30SMilanka Ringwald #define EFFECT_SET_SPEED 0xF0 // Supported
107a4cd9b30SMilanka Ringwald #define EFFECT_SET_TEMPO 0xF2 // Supported
108a4cd9b30SMilanka Ringwald
109a4cd9b30SMilanka Ringwald #define PERIOD_TABLE_LENGTH MAXNOTES
110a4cd9b30SMilanka Ringwald
1118201da88SMatthias Ringwald
1128201da88SMatthias Ringwald //
1138201da88SMatthias Ringwald // Finetuning periods -> Amiga period * 2^(-finetune/12/8)
1148201da88SMatthias Ringwald //
115b0920f25SMilanka Ringwald
116a4cd9b30SMilanka Ringwald static const short periodtable[]=
117a4cd9b30SMilanka Ringwald {
1188201da88SMatthias Ringwald // Finetune 0 (* 1.000000), Offset 0x0000
119a4cd9b30SMilanka Ringwald 27392, 25856, 24384, 23040, 21696, 20480, 19328, 18240, 17216, 16256, 15360, 14496,
120a4cd9b30SMilanka Ringwald 13696, 12928, 12192, 11520, 10848, 10240, 9664, 9120, 8606, 8128, 7680, 7248,
121a4cd9b30SMilanka Ringwald 6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
122a4cd9b30SMilanka Ringwald 3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
123a4cd9b30SMilanka Ringwald 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, 906,
124a4cd9b30SMilanka Ringwald 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453,
125a4cd9b30SMilanka Ringwald 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226,
126a4cd9b30SMilanka Ringwald 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113,
127a4cd9b30SMilanka Ringwald 107, 101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56,
128a4cd9b30SMilanka Ringwald 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
129a4cd9b30SMilanka Ringwald 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
1308201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
1318201da88SMatthias Ringwald
1328201da88SMatthias Ringwald // Finetune 1 (* 0.992806), Offset 0x0120
1338201da88SMatthias Ringwald 27195, 25670, 24209, 22874, 21540, 20333, 19189, 18109, 17092, 16139, 15249, 14392,
1348201da88SMatthias Ringwald 13597, 12835, 12104, 11437, 10770, 10166, 9594, 9054, 8544, 8070, 7625, 7196,
1358201da88SMatthias Ringwald 6799, 6417, 6052, 5719, 5385, 5083, 4797, 4527, 4273, 4035, 3812, 3598,
1368201da88SMatthias Ringwald 3399, 3209, 3026, 2859, 2692, 2542, 2399, 2264, 2137, 2017, 1906, 1799,
1378201da88SMatthias Ringwald 1700, 1604, 1513, 1430, 1346, 1271, 1199, 1132, 1068, 1009, 953, 899,
1388201da88SMatthias Ringwald 850, 802, 757, 715, 673, 635, 600, 566, 534, 504, 477, 450,
1398201da88SMatthias Ringwald 425, 401, 378, 357, 337, 318, 300, 283, 267, 252, 238, 224,
1408201da88SMatthias Ringwald 212, 201, 189, 179, 169, 159, 150, 142, 134, 126, 119, 112,
1418201da88SMatthias Ringwald 106, 100, 94, 89, 84, 79, 74, 70, 67, 63, 60, 56,
1428201da88SMatthias Ringwald 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
1438201da88SMatthias Ringwald 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
1448201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
1458201da88SMatthias Ringwald
1468201da88SMatthias Ringwald // Finetune 2 (* 0.985663), Offset 0x0240
1478201da88SMatthias Ringwald 26999, 25485, 24034, 22710, 21385, 20186, 19051, 17978, 16969, 16023, 15140, 14288,
1488201da88SMatthias Ringwald 13500, 12743, 12017, 11355, 10692, 10093, 9525, 8989, 8483, 8011, 7570, 7144,
1498201da88SMatthias Ringwald 6750, 6371, 6009, 5677, 5346, 5047, 4763, 4495, 4242, 4006, 3785, 3572,
1508201da88SMatthias Ringwald 3375, 3186, 3004, 2839, 2673, 2523, 2381, 2247, 2121, 2003, 1892, 1786,
1518201da88SMatthias Ringwald 1687, 1593, 1502, 1419, 1337, 1262, 1191, 1124, 1061, 1001, 946, 893,
1528201da88SMatthias Ringwald 844, 796, 751, 710, 668, 631, 595, 562, 530, 501, 473, 447,
1538201da88SMatthias Ringwald 422, 398, 376, 355, 334, 315, 298, 281, 265, 250, 237, 223,
1548201da88SMatthias Ringwald 211, 199, 187, 177, 168, 158, 149, 141, 133, 125, 118, 111,
1558201da88SMatthias Ringwald 105, 100, 94, 89, 84, 79, 74, 70, 66, 62, 59, 55,
1568201da88SMatthias Ringwald 52, 49, 46, 44, 41, 39, 36, 34, 33, 31, 30, 28,
1578201da88SMatthias Ringwald 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
1588201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
1598201da88SMatthias Ringwald
1608201da88SMatthias Ringwald // Finetune 3 (* 0.978572), Offset 0x0360
1618201da88SMatthias Ringwald 26805, 25302, 23862, 22546, 21231, 20041, 18914, 17849, 16847, 15908, 15031, 14185,
1628201da88SMatthias Ringwald 13403, 12651, 11931, 11273, 10616, 10021, 9457, 8925, 8422, 7954, 7515, 7093,
1638201da88SMatthias Ringwald 6701, 6325, 5965, 5637, 5308, 5010, 4728, 4462, 4212, 3977, 3758, 3546,
1648201da88SMatthias Ringwald 3351, 3163, 2983, 2818, 2654, 2505, 2364, 2231, 2106, 1988, 1879, 1773,
1658201da88SMatthias Ringwald 1675, 1581, 1491, 1409, 1327, 1253, 1182, 1116, 1053, 994, 939, 887,
1668201da88SMatthias Ringwald 838, 791, 746, 705, 663, 626, 591, 558, 526, 497, 470, 443,
1678201da88SMatthias Ringwald 419, 395, 373, 352, 332, 313, 296, 279, 263, 249, 235, 221,
1688201da88SMatthias Ringwald 209, 198, 186, 176, 166, 157, 148, 140, 132, 124, 117, 111,
1698201da88SMatthias Ringwald 105, 99, 93, 88, 83, 78, 73, 69, 66, 62, 59, 55,
1708201da88SMatthias Ringwald 52, 49, 46, 44, 41, 39, 36, 34, 32, 30, 29, 27,
1718201da88SMatthias Ringwald 26, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14,
1728201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
1738201da88SMatthias Ringwald
1748201da88SMatthias Ringwald // Finetune 4 (* 0.971532), Offset 0x0480
1758201da88SMatthias Ringwald 26612, 25120, 23690, 22384, 21078, 19897, 18778, 17721, 16726, 15793, 14923, 14083,
1768201da88SMatthias Ringwald 13306, 12560, 11845, 11192, 10539, 9948, 9389, 8860, 8361, 7897, 7461, 7042,
1778201da88SMatthias Ringwald 6653, 6280, 5922, 5596, 5270, 4974, 4694, 4430, 4181, 3948, 3731, 3521,
1788201da88SMatthias Ringwald 3327, 3140, 2961, 2798, 2635, 2487, 2347, 2215, 2091, 1974, 1865, 1760,
1798201da88SMatthias Ringwald 1663, 1570, 1481, 1399, 1317, 1244, 1174, 1108, 1045, 987, 933, 880,
1808201da88SMatthias Ringwald 832, 785, 740, 700, 659, 622, 587, 554, 523, 494, 466, 440,
1818201da88SMatthias Ringwald 416, 392, 370, 350, 329, 311, 293, 277, 261, 247, 233, 220,
1828201da88SMatthias Ringwald 208, 196, 185, 175, 165, 155, 147, 139, 131, 123, 117, 110,
1838201da88SMatthias Ringwald 104, 98, 92, 87, 83, 78, 73, 69, 65, 61, 58, 54,
1848201da88SMatthias Ringwald 51, 49, 46, 44, 41, 39, 36, 34, 32, 30, 29, 27,
1858201da88SMatthias Ringwald 26, 24, 23, 21, 20, 19, 18, 17, 17, 16, 15, 14,
1868201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
1878201da88SMatthias Ringwald
1888201da88SMatthias Ringwald // Finetune 5 (* 0.964542), Offset 0x05a0
1898201da88SMatthias Ringwald 26421, 24939, 23519, 22223, 20927, 19754, 18643, 17593, 16606, 15680, 14815, 13982,
1908201da88SMatthias Ringwald 13210, 12470, 11760, 11112, 10463, 9877, 9321, 8797, 8301, 7840, 7408, 6991,
1918201da88SMatthias Ringwald 6605, 6235, 5880, 5556, 5232, 4938, 4661, 4398, 4151, 3920, 3704, 3496,
1928201da88SMatthias Ringwald 3303, 3117, 2940, 2778, 2616, 2469, 2330, 2199, 2076, 1960, 1852, 1748,
1938201da88SMatthias Ringwald 1651, 1559, 1470, 1389, 1308, 1235, 1165, 1100, 1038, 980, 926, 874,
1948201da88SMatthias Ringwald 826, 779, 735, 694, 654, 617, 583, 550, 519, 490, 463, 437,
1958201da88SMatthias Ringwald 413, 390, 367, 347, 327, 309, 291, 275, 259, 245, 231, 218,
1968201da88SMatthias Ringwald 206, 195, 183, 174, 164, 154, 146, 138, 130, 122, 116, 109,
1978201da88SMatthias Ringwald 103, 97, 92, 87, 82, 77, 72, 68, 65, 61, 58, 54,
1988201da88SMatthias Ringwald 51, 48, 45, 43, 41, 39, 36, 34, 32, 30, 29, 27,
1998201da88SMatthias Ringwald 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 14,
2008201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
2018201da88SMatthias Ringwald
2028201da88SMatthias Ringwald // Finetune 6 (* 0.957603), Offset 0x06c0
2038201da88SMatthias Ringwald 26231, 24760, 23350, 22063, 20776, 19612, 18509, 17467, 16486, 15567, 14709, 13881,
2048201da88SMatthias Ringwald 13115, 12380, 11675, 11032, 10388, 9806, 9254, 8733, 8241, 7783, 7354, 6941,
2058201da88SMatthias Ringwald 6558, 6190, 5838, 5516, 5194, 4903, 4627, 4367, 4122, 3892, 3677, 3470,
2068201da88SMatthias Ringwald 3279, 3095, 2919, 2758, 2597, 2451, 2314, 2183, 2061, 1946, 1839, 1735,
2078201da88SMatthias Ringwald 1639, 1547, 1459, 1379, 1299, 1226, 1157, 1092, 1030, 973, 919, 868,
2088201da88SMatthias Ringwald 820, 774, 730, 689, 649, 613, 578, 546, 515, 486, 460, 434,
2098201da88SMatthias Ringwald 410, 387, 365, 345, 325, 306, 289, 273, 258, 243, 230, 216,
2108201da88SMatthias Ringwald 205, 193, 182, 172, 163, 153, 145, 137, 129, 122, 115, 108,
2118201da88SMatthias Ringwald 102, 97, 91, 86, 81, 77, 72, 68, 64, 60, 57, 54,
2128201da88SMatthias Ringwald 51, 48, 45, 43, 40, 38, 35, 34, 32, 30, 29, 27,
2138201da88SMatthias Ringwald 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
2148201da88SMatthias Ringwald 12, 12, 11, 11, 11, 10, 9, 9, 8, 8, 7, 7,
2158201da88SMatthias Ringwald
2168201da88SMatthias Ringwald // Finetune 7 (* 0.950714), Offset 0x07e0
2178201da88SMatthias Ringwald 26042, 24582, 23182, 21904, 20627, 19471, 18375, 17341, 16367, 15455, 14603, 13782,
2188201da88SMatthias Ringwald 13021, 12291, 11591, 10952, 10313, 9735, 9188, 8671, 8182, 7727, 7301, 6891,
2198201da88SMatthias Ringwald 6510, 6145, 5796, 5476, 5157, 4868, 4594, 4335, 4092, 3864, 3651, 3445,
2208201da88SMatthias Ringwald 3255, 3073, 2898, 2738, 2578, 2434, 2297, 2168, 2046, 1932, 1825, 1723,
2218201da88SMatthias Ringwald 1628, 1536, 1449, 1369, 1289, 1217, 1148, 1084, 1023, 966, 913, 861,
2228201da88SMatthias Ringwald 814, 768, 724, 685, 645, 608, 574, 542, 511, 483, 456, 431,
2238201da88SMatthias Ringwald 407, 384, 362, 342, 322, 304, 287, 271, 256, 241, 228, 215,
2248201da88SMatthias Ringwald 203, 192, 181, 171, 162, 152, 144, 136, 128, 121, 114, 107,
2258201da88SMatthias Ringwald 102, 96, 90, 86, 81, 76, 71, 68, 64, 60, 57, 53,
2268201da88SMatthias Ringwald 50, 48, 45, 43, 40, 38, 35, 33, 31, 29, 29, 27,
2278201da88SMatthias Ringwald 26, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
2288201da88SMatthias Ringwald 12, 12, 11, 10, 10, 10, 9, 9, 8, 8, 7, 7,
2298201da88SMatthias Ringwald
2308201da88SMatthias Ringwald // Finetune -8 (* 1.059463), Offset 0x0900
2318201da88SMatthias Ringwald 29021, 27393, 25834, 24410, 22986, 21698, 20477, 19325, 18240, 17223, 16273, 15358,
2328201da88SMatthias Ringwald 14510, 13697, 12917, 12205, 11493, 10849, 10239, 9662, 9118, 8611, 8137, 7679,
2338201da88SMatthias Ringwald 7255, 6848, 6458, 6103, 5747, 5424, 5119, 4831, 4560, 4306, 4068, 3839,
2348201da88SMatthias Ringwald 3628, 3424, 3229, 3051, 2873, 2712, 2560, 2416, 2280, 2153, 2034, 1920,
2358201da88SMatthias Ringwald 1814, 1712, 1615, 1526, 1437, 1356, 1280, 1208, 1140, 1076, 1017, 960,
2368201da88SMatthias Ringwald 907, 856, 807, 763, 718, 678, 640, 604, 570, 538, 509, 480,
2378201da88SMatthias Ringwald 453, 428, 404, 381, 359, 339, 320, 302, 285, 269, 254, 239,
2388201da88SMatthias Ringwald 227, 214, 201, 191, 180, 170, 160, 152, 143, 135, 127, 120,
2398201da88SMatthias Ringwald 113, 107, 101, 95, 90, 85, 79, 75, 71, 67, 64, 59,
2408201da88SMatthias Ringwald 56, 53, 50, 48, 44, 42, 39, 37, 35, 33, 32, 30,
2418201da88SMatthias Ringwald 29, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
2428201da88SMatthias Ringwald 14, 14, 13, 12, 12, 11, 10, 10, 8, 8, 7, 7,
2438201da88SMatthias Ringwald
2448201da88SMatthias Ringwald // Finetune -7 (* 1.051841), Offset 0x0a20
2458201da88SMatthias Ringwald 28812, 27196, 25648, 24234, 22821, 21542, 20330, 19186, 18108, 17099, 16156, 15247,
2468201da88SMatthias Ringwald 14406, 13598, 12824, 12117, 11410, 10771, 10165, 9593, 9052, 8549, 8078, 7624,
2478201da88SMatthias Ringwald 7203, 6799, 6412, 6059, 5705, 5385, 5082, 4796, 4527, 4275, 4039, 3812,
2488201da88SMatthias Ringwald 3602, 3400, 3206, 3029, 2853, 2693, 2541, 2398, 2264, 2137, 2020, 1906,
2498201da88SMatthias Ringwald 1801, 1700, 1603, 1515, 1426, 1346, 1271, 1199, 1132, 1069, 1010, 953,
2508201da88SMatthias Ringwald 900, 850, 802, 757, 713, 673, 635, 600, 566, 534, 505, 476,
2518201da88SMatthias Ringwald 450, 425, 401, 379, 357, 337, 318, 300, 283, 267, 252, 238,
2528201da88SMatthias Ringwald 225, 212, 200, 189, 179, 168, 159, 150, 142, 134, 126, 119,
2538201da88SMatthias Ringwald 113, 106, 100, 95, 89, 84, 79, 75, 70, 66, 63, 59,
2548201da88SMatthias Ringwald 56, 53, 49, 47, 44, 42, 39, 37, 35, 33, 32, 29,
2558201da88SMatthias Ringwald 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
2568201da88SMatthias Ringwald 14, 14, 13, 12, 12, 11, 9, 9, 8, 8, 7, 7,
2578201da88SMatthias Ringwald
2588201da88SMatthias Ringwald // Finetune -6 (* 1.044274), Offset 0x0b40
2598201da88SMatthias Ringwald 28605, 27001, 25464, 24060, 22657, 21387, 20184, 19048, 17978, 16976, 16040, 15138,
2608201da88SMatthias Ringwald 14302, 13500, 12732, 12030, 11328, 10693, 10092, 9524, 8987, 8488, 8020, 7569,
2618201da88SMatthias Ringwald 7151, 6750, 6366, 6015, 5664, 5347, 5046, 4762, 4495, 4244, 4010, 3784,
2628201da88SMatthias Ringwald 3576, 3375, 3183, 3008, 2832, 2673, 2523, 2381, 2247, 2122, 2005, 1892,
2638201da88SMatthias Ringwald 1788, 1688, 1591, 1504, 1416, 1337, 1261, 1190, 1124, 1061, 1003, 946,
2648201da88SMatthias Ringwald 894, 844, 796, 752, 708, 668, 631, 595, 562, 530, 501, 473,
2658201da88SMatthias Ringwald 447, 422, 398, 376, 354, 334, 315, 298, 281, 265, 251, 236,
2668201da88SMatthias Ringwald 223, 211, 198, 188, 178, 167, 158, 149, 141, 133, 125, 118,
2678201da88SMatthias Ringwald 112, 105, 99, 94, 89, 84, 78, 74, 70, 66, 63, 58,
2688201da88SMatthias Ringwald 55, 52, 49, 47, 44, 42, 39, 37, 34, 32, 31, 29,
2698201da88SMatthias Ringwald 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
2708201da88SMatthias Ringwald 14, 14, 13, 11, 11, 10, 9, 9, 8, 8, 7, 7,
2718201da88SMatthias Ringwald
2728201da88SMatthias Ringwald // Finetune -5 (* 1.036761), Offset 0x0c60
2738201da88SMatthias Ringwald 28399, 26806, 25280, 23887, 22494, 21233, 20039, 18911, 17849, 16854, 15925, 15029,
2748201da88SMatthias Ringwald 14199, 13403, 12640, 11943, 11247, 10616, 10019, 9455, 8922, 8427, 7962, 7514,
2758201da88SMatthias Ringwald 7100, 6702, 6320, 5972, 5623, 5308, 5010, 4728, 4462, 4213, 3981, 3757,
2768201da88SMatthias Ringwald 3550, 3351, 3160, 2986, 2812, 2654, 2505, 2364, 2231, 2107, 1991, 1879,
2778201da88SMatthias Ringwald 1775, 1675, 1580, 1493, 1406, 1327, 1252, 1182, 1116, 1053, 995, 939,
2788201da88SMatthias Ringwald 887, 838, 790, 746, 703, 664, 626, 591, 558, 527, 498, 470,
2798201da88SMatthias Ringwald 444, 419, 395, 373, 351, 332, 313, 295, 279, 263, 249, 234,
2808201da88SMatthias Ringwald 222, 209, 197, 187, 176, 166, 157, 148, 140, 132, 124, 117,
2818201da88SMatthias Ringwald 111, 105, 98, 93, 88, 83, 78, 74, 69, 65, 62, 58,
2828201da88SMatthias Ringwald 55, 52, 49, 47, 44, 41, 38, 36, 34, 32, 31, 29,
2838201da88SMatthias Ringwald 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 15,
2848201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
2858201da88SMatthias Ringwald
2868201da88SMatthias Ringwald // Finetune -4 (* 1.029302), Offset 0x0d80
2878201da88SMatthias Ringwald 28195, 26614, 25099, 23715, 22332, 21080, 19894, 18774, 17720, 16732, 15810, 14921,
2888201da88SMatthias Ringwald 14097, 13307, 12549, 11858, 11166, 10540, 9947, 9387, 8858, 8366, 7905, 7460,
2898201da88SMatthias Ringwald 7049, 6653, 6275, 5929, 5583, 5270, 4974, 4694, 4430, 4183, 3953, 3730,
2908201da88SMatthias Ringwald 3524, 3327, 3137, 2964, 2791, 2635, 2487, 2347, 2215, 2092, 1976, 1865,
2918201da88SMatthias Ringwald 1762, 1663, 1569, 1482, 1396, 1318, 1243, 1173, 1108, 1046, 988, 933,
2928201da88SMatthias Ringwald 881, 832, 784, 741, 698, 659, 622, 587, 554, 523, 494, 466,
2938201da88SMatthias Ringwald 441, 416, 392, 371, 349, 329, 311, 293, 277, 261, 247, 233,
2948201da88SMatthias Ringwald 220, 208, 196, 185, 175, 165, 155, 147, 139, 131, 124, 116,
2958201da88SMatthias Ringwald 110, 104, 98, 93, 87, 82, 77, 73, 69, 65, 62, 58,
2968201da88SMatthias Ringwald 55, 51, 48, 46, 43, 41, 38, 36, 34, 32, 31, 29,
2978201da88SMatthias Ringwald 28, 26, 25, 23, 22, 21, 20, 19, 17, 16, 15, 14,
2988201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
2998201da88SMatthias Ringwald
3008201da88SMatthias Ringwald // Finetune -3 (* 1.021897), Offset 0x0ea0
3018201da88SMatthias Ringwald 27992, 26422, 24918, 23545, 22171, 20928, 19751, 18639, 17593, 16612, 15696, 14813,
3028201da88SMatthias Ringwald 13996, 13211, 12459, 11772, 11086, 10464, 9876, 9320, 8794, 8306, 7848, 7407,
3038201da88SMatthias Ringwald 6998, 6606, 6229, 5886, 5543, 5232, 4938, 4660, 4398, 4153, 3924, 3703,
3048201da88SMatthias Ringwald 3499, 3303, 3115, 2943, 2771, 2616, 2469, 2330, 2199, 2076, 1962, 1852,
3058201da88SMatthias Ringwald 1749, 1651, 1557, 1472, 1386, 1308, 1234, 1165, 1100, 1038, 981, 926,
3068201da88SMatthias Ringwald 875, 826, 779, 736, 693, 654, 617, 582, 550, 519, 491, 463,
3078201da88SMatthias Ringwald 437, 413, 389, 368, 346, 327, 309, 291, 275, 260, 245, 231,
3088201da88SMatthias Ringwald 219, 206, 194, 184, 174, 164, 154, 146, 138, 130, 123, 115,
3098201da88SMatthias Ringwald 109, 103, 97, 92, 87, 82, 77, 73, 68, 64, 61, 57,
3108201da88SMatthias Ringwald 54, 51, 48, 46, 43, 41, 38, 36, 34, 32, 31, 29,
3118201da88SMatthias Ringwald 28, 26, 25, 22, 21, 20, 19, 18, 17, 16, 15, 14,
3128201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
3138201da88SMatthias Ringwald
3148201da88SMatthias Ringwald // Finetune -2 (* 1.014545), Offset 0x0fc0
3158201da88SMatthias Ringwald 27790, 26232, 24739, 23375, 22012, 20778, 19609, 18505, 17466, 16492, 15583, 14707,
3168201da88SMatthias Ringwald 13895, 13116, 12369, 11688, 11006, 10389, 9805, 9253, 8731, 8246, 7792, 7353,
3178201da88SMatthias Ringwald 6948, 6558, 6185, 5844, 5503, 5194, 4902, 4626, 4367, 4123, 3896, 3677,
3188201da88SMatthias Ringwald 3474, 3279, 3092, 2922, 2751, 2597, 2451, 2313, 2183, 2062, 1948, 1838,
3198201da88SMatthias Ringwald 1737, 1640, 1546, 1461, 1376, 1299, 1226, 1157, 1092, 1031, 974, 919,
3208201da88SMatthias Ringwald 868, 820, 773, 730, 688, 649, 613, 578, 546, 515, 487, 460,
3218201da88SMatthias Ringwald 434, 410, 387, 365, 344, 325, 306, 289, 273, 258, 243, 229,
3228201da88SMatthias Ringwald 217, 205, 193, 183, 172, 162, 153, 145, 137, 129, 122, 115,
3238201da88SMatthias Ringwald 109, 102, 96, 91, 86, 81, 76, 72, 68, 64, 61, 57,
3248201da88SMatthias Ringwald 54, 51, 48, 46, 43, 41, 38, 36, 33, 31, 30, 28,
3258201da88SMatthias Ringwald 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
3268201da88SMatthias Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7,
3278201da88SMatthias Ringwald
3288201da88SMatthias Ringwald // Finetune -1 (* 1.007246), Offset 0x10e0
3298201da88SMatthias Ringwald 27590, 26043, 24561, 23207, 21853, 20628, 19468, 18372, 17341, 16374, 15471, 14601,
3308201da88SMatthias Ringwald 13795, 13022, 12280, 11603, 10927, 10314, 9734, 9186, 8668, 8187, 7736, 7301,
3318201da88SMatthias Ringwald 6898, 6511, 6140, 5802, 5463, 5157, 4867, 4593, 4335, 4093, 3868, 3650,
3328201da88SMatthias Ringwald 3449, 3255, 3070, 2901, 2732, 2579, 2434, 2297, 2168, 2047, 1934, 1825,
3338201da88SMatthias Ringwald 1724, 1628, 1535, 1450, 1366, 1289, 1217, 1148, 1084, 1023, 967, 913,
3348201da88SMatthias Ringwald 862, 814, 768, 725, 683, 645, 608, 574, 542, 512, 483, 456,
3358201da88SMatthias Ringwald 431, 407, 384, 363, 341, 322, 304, 287, 271, 256, 242, 228,
3368201da88SMatthias Ringwald 216, 203, 191, 181, 171, 161, 152, 144, 136, 128, 121, 114,
3378201da88SMatthias Ringwald 108, 102, 96, 91, 86, 81, 76, 72, 67, 63, 60, 56,
3388201da88SMatthias Ringwald 53, 50, 47, 45, 42, 40, 37, 35, 33, 31, 30, 28,
3398201da88SMatthias Ringwald 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14,
340a4cd9b30SMilanka Ringwald 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7
341a4cd9b30SMilanka Ringwald };
342a4cd9b30SMilanka Ringwald
3438201da88SMatthias Ringwald static const short * periodtable_finetune_ptr[]=
3448201da88SMatthias Ringwald {
3458201da88SMatthias Ringwald &periodtable[0x0000], &periodtable[0x0090], &periodtable[0x0120], &periodtable[0x01B0],
3468201da88SMatthias Ringwald &periodtable[0x0240], &periodtable[0x02D0], &periodtable[0x0360], &periodtable[0x03F0],
3478201da88SMatthias Ringwald &periodtable[0x0480], &periodtable[0x0510], &periodtable[0x05A0], &periodtable[0x0630],
3488201da88SMatthias Ringwald &periodtable[0x06C0], &periodtable[0x0750], &periodtable[0x07E0], &periodtable[0x0870]
3498201da88SMatthias Ringwald };
3508201da88SMatthias Ringwald
351a4cd9b30SMilanka Ringwald static const short sintable[]={
352a4cd9b30SMilanka Ringwald 0, 24, 49, 74, 97, 120, 141, 161,
353a4cd9b30SMilanka Ringwald 180, 197, 212, 224, 235, 244, 250, 253,
354a4cd9b30SMilanka Ringwald 255, 253, 250, 244, 235, 224, 212, 197,
355a4cd9b30SMilanka Ringwald 180, 161, 141, 120, 97, 74, 49, 24
356a4cd9b30SMilanka Ringwald };
357a4cd9b30SMilanka Ringwald
3588201da88SMatthias Ringwald static const muchar InvertLoopTable[]={
3598201da88SMatthias Ringwald 0, 5, 6, 7, 8, 10, 11, 13,
3608201da88SMatthias Ringwald 16, 19, 22, 26, 32, 43, 64, 128
3618201da88SMatthias Ringwald };
3628201da88SMatthias Ringwald
363a4cd9b30SMilanka Ringwald typedef struct modtype_
364a4cd9b30SMilanka Ringwald {
365a4cd9b30SMilanka Ringwald unsigned char signature[5];
366a4cd9b30SMilanka Ringwald int numberofchannels;
367a4cd9b30SMilanka Ringwald }modtype;
368a4cd9b30SMilanka Ringwald
3698201da88SMatthias Ringwald static modtype modlist[]=
370a4cd9b30SMilanka Ringwald {
371a4cd9b30SMilanka Ringwald { "M!K!",4},
372a4cd9b30SMilanka Ringwald { "M.K.",4},
3738201da88SMatthias Ringwald { "M&K!",4},
3748201da88SMatthias Ringwald { "PATT",4},
3758201da88SMatthias Ringwald { "NSMS",4},
3768201da88SMatthias Ringwald { "LARD",4},
3778201da88SMatthias Ringwald { "FEST",4},
3788201da88SMatthias Ringwald { "FIST",4},
3798201da88SMatthias Ringwald { "N.T.",4},
3808201da88SMatthias Ringwald { "OKTA",8},
3818201da88SMatthias Ringwald { "OCTA",8},
3828201da88SMatthias Ringwald { "$CHN",-1},
3838201da88SMatthias Ringwald { "$$CH",-1},
3848201da88SMatthias Ringwald { "$$CN",-1},
3858201da88SMatthias Ringwald { "$$$C",-1},
3868201da88SMatthias Ringwald { "FLT$",-1},
3878201da88SMatthias Ringwald { "EXO$",-1},
3888201da88SMatthias Ringwald { "CD$1",-1},
3898201da88SMatthias Ringwald { "TDZ$",-1},
3908201da88SMatthias Ringwald { "FA0$",-1},
391a4cd9b30SMilanka Ringwald { "",0}
392a4cd9b30SMilanka Ringwald };
393a4cd9b30SMilanka Ringwald
3948201da88SMatthias Ringwald #ifdef HXCMOD_BIGENDIAN_MACHINE
3958201da88SMatthias Ringwald
3968201da88SMatthias Ringwald #define GET_BGI_W( big_endian_word ) ( big_endian_word )
3978201da88SMatthias Ringwald
3988201da88SMatthias Ringwald #else
3998201da88SMatthias Ringwald
4008201da88SMatthias Ringwald #define GET_BGI_W( big_endian_word ) ( (big_endian_word >> 8) | ((big_endian_word&0xFF) << 8) )
4018201da88SMatthias Ringwald
4028201da88SMatthias Ringwald #endif
4038201da88SMatthias Ringwald
4048201da88SMatthias Ringwald
405a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
406a4cd9b30SMilanka Ringwald
memcopy(void * dest,void * source,unsigned long size)407a4cd9b30SMilanka Ringwald static void memcopy( void * dest, void *source, unsigned long size )
408a4cd9b30SMilanka Ringwald {
409a4cd9b30SMilanka Ringwald unsigned long i;
410a4cd9b30SMilanka Ringwald unsigned char * d,*s;
411a4cd9b30SMilanka Ringwald
412a4cd9b30SMilanka Ringwald d=(unsigned char*)dest;
413a4cd9b30SMilanka Ringwald s=(unsigned char*)source;
414a4cd9b30SMilanka Ringwald for(i=0;i<size;i++)
415a4cd9b30SMilanka Ringwald {
416a4cd9b30SMilanka Ringwald d[i]=s[i];
417a4cd9b30SMilanka Ringwald }
418a4cd9b30SMilanka Ringwald }
419a4cd9b30SMilanka Ringwald
memclear(void * dest,unsigned char value,unsigned long size)420a4cd9b30SMilanka Ringwald static void memclear( void * dest, unsigned char value, unsigned long size )
421a4cd9b30SMilanka Ringwald {
422a4cd9b30SMilanka Ringwald unsigned long i;
423a4cd9b30SMilanka Ringwald unsigned char * d;
424a4cd9b30SMilanka Ringwald
425a4cd9b30SMilanka Ringwald d = (unsigned char*)dest;
426a4cd9b30SMilanka Ringwald for(i=0;i<size;i++)
427a4cd9b30SMilanka Ringwald {
428a4cd9b30SMilanka Ringwald d[i]=value;
429a4cd9b30SMilanka Ringwald }
430a4cd9b30SMilanka Ringwald }
431a4cd9b30SMilanka Ringwald
getnote(modcontext * mod,unsigned short period)4328201da88SMatthias Ringwald static int getnote( modcontext * mod, unsigned short period )
433a4cd9b30SMilanka Ringwald {
4344aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE START
4354aa7d471SMatthias Ringwald (void) mod;
4364aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE END
4374aa7d471SMatthias Ringwald
438a4cd9b30SMilanka Ringwald int i;
4398201da88SMatthias Ringwald const short * ptr;
440a4cd9b30SMilanka Ringwald
4418201da88SMatthias Ringwald ptr = periodtable_finetune_ptr[0];
4428201da88SMatthias Ringwald
4438201da88SMatthias Ringwald for(i = 0; i < MAXNOTES; i++)
444a4cd9b30SMilanka Ringwald {
4458201da88SMatthias Ringwald if(period >= ptr[i])
446a4cd9b30SMilanka Ringwald {
447a4cd9b30SMilanka Ringwald return i;
448a4cd9b30SMilanka Ringwald }
449a4cd9b30SMilanka Ringwald }
450a4cd9b30SMilanka Ringwald
451a4cd9b30SMilanka Ringwald return MAXNOTES;
452a4cd9b30SMilanka Ringwald }
453a4cd9b30SMilanka Ringwald
doFunk(hxcmod_channel_t * cptr)454*b7454a87SMatthias Ringwald static void doFunk(hxcmod_channel_t * cptr)
455a4cd9b30SMilanka Ringwald {
4568201da88SMatthias Ringwald if(cptr->funkspeed)
4578201da88SMatthias Ringwald {
4588201da88SMatthias Ringwald cptr->funkoffset += InvertLoopTable[cptr->funkspeed];
4598201da88SMatthias Ringwald if( cptr->funkoffset > 128 )
4608201da88SMatthias Ringwald {
4618201da88SMatthias Ringwald cptr->funkoffset = 0;
4628201da88SMatthias Ringwald if( cptr->sampdata && cptr->length && (cptr->replen > 1) )
4638201da88SMatthias Ringwald {
4648201da88SMatthias Ringwald if( ( (cptr->samppos) >> 11 ) >= (unsigned long)(cptr->replen+cptr->reppnt) )
4658201da88SMatthias Ringwald {
4668201da88SMatthias Ringwald cptr->samppos = ((unsigned long)(cptr->reppnt)<<11) + (cptr->samppos % ((unsigned long)(cptr->replen+cptr->reppnt)<<11));
4678201da88SMatthias Ringwald }
468a4cd9b30SMilanka Ringwald
4698201da88SMatthias Ringwald #ifndef HXCMOD_MOD_FILE_IN_ROM
4708201da88SMatthias Ringwald // Note : Directly modify the sample in the mod buffer...
4718201da88SMatthias Ringwald // The current Invert Loop effect implementation can't be played from ROM.
4728201da88SMatthias Ringwald cptr->sampdata[cptr->samppos >> 10] = -1 - cptr->sampdata[cptr->samppos >> 10];
4738201da88SMatthias Ringwald #endif
4748201da88SMatthias Ringwald }
4758201da88SMatthias Ringwald }
4768201da88SMatthias Ringwald }
4778201da88SMatthias Ringwald }
4788201da88SMatthias Ringwald
worknote(note * nptr,hxcmod_channel_t * cptr,char t,modcontext * mod)479*b7454a87SMatthias Ringwald static void worknote( note * nptr, hxcmod_channel_t * cptr,char t,modcontext * mod )
4808201da88SMatthias Ringwald {
4814aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE START
4824aa7d471SMatthias Ringwald (void) t;
4831f030017SMatthias Ringwald // we rename sample into a_sample to avoid shadowing typedef struct { .. } sample; from hxcmod.h
4844aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE END
4854aa7d471SMatthias Ringwald
4861f030017SMatthias Ringwald muint a_sample, period, effect, operiod;
4878201da88SMatthias Ringwald muint curnote, arpnote;
4888201da88SMatthias Ringwald muchar effect_op;
4898201da88SMatthias Ringwald muchar effect_param,effect_param_l,effect_param_h;
4908201da88SMatthias Ringwald muint enable_nxt_smp;
4918201da88SMatthias Ringwald const short * period_table_ptr;
4928201da88SMatthias Ringwald
4931f030017SMatthias Ringwald a_sample = (nptr->sampperiod & 0xF0) | (nptr->sampeffect >> 4);
494a4cd9b30SMilanka Ringwald period = ((nptr->sampperiod & 0xF) << 8) | nptr->period;
495a4cd9b30SMilanka Ringwald effect = ((nptr->sampeffect & 0xF) << 8) | nptr->effect;
4968201da88SMatthias Ringwald effect_op = nptr->sampeffect & 0xF;
4978201da88SMatthias Ringwald effect_param = nptr->effect;
4988201da88SMatthias Ringwald effect_param_l = effect_param & 0x0F;
4998201da88SMatthias Ringwald effect_param_h = effect_param >> 4;
5008201da88SMatthias Ringwald
5018201da88SMatthias Ringwald enable_nxt_smp = 0;
502a4cd9b30SMilanka Ringwald
503a4cd9b30SMilanka Ringwald operiod = cptr->period;
504a4cd9b30SMilanka Ringwald
5051f030017SMatthias Ringwald if ( period || a_sample )
506a4cd9b30SMilanka Ringwald {
5071f030017SMatthias Ringwald if( a_sample && ( a_sample < 32 ) )
508a4cd9b30SMilanka Ringwald {
5091f030017SMatthias Ringwald cptr->sampnum = a_sample - 1;
510a4cd9b30SMilanka Ringwald }
511a4cd9b30SMilanka Ringwald
5121f030017SMatthias Ringwald if( period || a_sample )
513a4cd9b30SMilanka Ringwald {
5148201da88SMatthias Ringwald if( period )
5158201da88SMatthias Ringwald {
5168201da88SMatthias Ringwald if( ( effect_op != EFFECT_TONE_PORTAMENTO ) || ( ( effect_op == EFFECT_TONE_PORTAMENTO ) && !cptr->sampdata ) )
5178201da88SMatthias Ringwald {
5188201da88SMatthias Ringwald // Not a Tone Partamento effect or no sound currently played :
5198201da88SMatthias Ringwald 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 ) )
5208201da88SMatthias Ringwald {
5218201da88SMatthias Ringwald // Immediately (re)trigger the new note
522afc6fe18SMatthias Ringwald cptr->sampdata = mod->sampledata[cptr->sampnum];
5238201da88SMatthias Ringwald cptr->length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
5248201da88SMatthias Ringwald cptr->reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
5258201da88SMatthias Ringwald cptr->replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
5268201da88SMatthias Ringwald
5278201da88SMatthias Ringwald cptr->lst_sampdata = cptr->sampdata;
5288201da88SMatthias Ringwald cptr->lst_length = cptr->length;
5298201da88SMatthias Ringwald cptr->lst_reppnt = cptr->reppnt;
5308201da88SMatthias Ringwald cptr->lst_replen = cptr->replen;
5318201da88SMatthias Ringwald }
5328201da88SMatthias Ringwald else
5338201da88SMatthias Ringwald {
5348201da88SMatthias Ringwald cptr->dly_sampdata = mod->sampledata[cptr->sampnum];
5358201da88SMatthias Ringwald cptr->dly_length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
5368201da88SMatthias Ringwald cptr->dly_reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
5378201da88SMatthias Ringwald cptr->dly_replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
5388201da88SMatthias Ringwald cptr->note_delay = effect_param_l;
5398201da88SMatthias Ringwald }
5408201da88SMatthias Ringwald // Cancel any delayed note...
5418201da88SMatthias Ringwald cptr->update_nxt_repeat = 0;
5428201da88SMatthias Ringwald }
5438201da88SMatthias Ringwald else
5448201da88SMatthias Ringwald {
5458201da88SMatthias Ringwald // Partamento effect - Play the new note after the current sample.
5468201da88SMatthias Ringwald if( effect_op == EFFECT_TONE_PORTAMENTO )
5478201da88SMatthias Ringwald enable_nxt_smp = 1;
5488201da88SMatthias Ringwald }
5498201da88SMatthias Ringwald }
5508201da88SMatthias Ringwald else // Note without period : Trigger it after the current sample.
5518201da88SMatthias Ringwald enable_nxt_smp = 1;
5528201da88SMatthias Ringwald
5538201da88SMatthias Ringwald if ( enable_nxt_smp )
5548201da88SMatthias Ringwald {
5558201da88SMatthias Ringwald // Prepare the next sample retrigger after the current one
5568201da88SMatthias Ringwald cptr->nxt_sampdata = mod->sampledata[cptr->sampnum];
5578201da88SMatthias Ringwald cptr->nxt_length = GET_BGI_W( mod->song.samples[cptr->sampnum].length );
5588201da88SMatthias Ringwald cptr->nxt_reppnt = GET_BGI_W( mod->song.samples[cptr->sampnum].reppnt );
5598201da88SMatthias Ringwald cptr->nxt_replen = GET_BGI_W( mod->song.samples[cptr->sampnum].replen );
5608201da88SMatthias Ringwald
5618201da88SMatthias Ringwald if(cptr->nxt_replen < 2) // Protracker : don't play the sample if not looped...
5628201da88SMatthias Ringwald cptr->nxt_sampdata = 0;
5638201da88SMatthias Ringwald
5648201da88SMatthias Ringwald cptr->update_nxt_repeat = 1;
5658201da88SMatthias Ringwald }
566a4cd9b30SMilanka Ringwald
567a4cd9b30SMilanka Ringwald cptr->finetune = (mod->song.samples[cptr->sampnum].finetune) & 0xF;
568a4cd9b30SMilanka Ringwald
5698201da88SMatthias Ringwald if( effect_op != EFFECT_VIBRATO && effect_op != EFFECT_VOLSLIDE_VIBRATO )
570a4cd9b30SMilanka Ringwald {
571a4cd9b30SMilanka Ringwald cptr->vibraperiod = 0;
572a4cd9b30SMilanka Ringwald cptr->vibrapointeur = 0;
573a4cd9b30SMilanka Ringwald }
574a4cd9b30SMilanka Ringwald }
575a4cd9b30SMilanka Ringwald
5761f030017SMatthias Ringwald if( (a_sample != 0) && ( effect_op != EFFECT_VOLSLIDE_TONEPORTA ) )
577a4cd9b30SMilanka Ringwald {
578a4cd9b30SMilanka Ringwald cptr->volume = mod->song.samples[cptr->sampnum].volume;
579a4cd9b30SMilanka Ringwald cptr->volumeslide = 0;
5808201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
5818201da88SMatthias Ringwald cptr->volume_table = mod->volume_selection_table[cptr->volume];
5828201da88SMatthias Ringwald #endif
583a4cd9b30SMilanka Ringwald }
584a4cd9b30SMilanka Ringwald
5858201da88SMatthias Ringwald if( ( effect_op != EFFECT_TONE_PORTAMENTO ) && ( effect_op != EFFECT_VOLSLIDE_TONEPORTA ) )
586a4cd9b30SMilanka Ringwald {
587a4cd9b30SMilanka Ringwald if ( period != 0 )
588a4cd9b30SMilanka Ringwald cptr->samppos = 0;
589a4cd9b30SMilanka Ringwald }
590a4cd9b30SMilanka Ringwald
591a4cd9b30SMilanka Ringwald cptr->decalperiod = 0;
592a4cd9b30SMilanka Ringwald if( period )
593a4cd9b30SMilanka Ringwald {
594a4cd9b30SMilanka Ringwald if( cptr->finetune )
595a4cd9b30SMilanka Ringwald {
5968201da88SMatthias Ringwald period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
5978201da88SMatthias Ringwald period = period_table_ptr[getnote(mod,period)];
598a4cd9b30SMilanka Ringwald }
599a4cd9b30SMilanka Ringwald
600a4cd9b30SMilanka Ringwald cptr->period = period;
601a4cd9b30SMilanka Ringwald }
602a4cd9b30SMilanka Ringwald }
603a4cd9b30SMilanka Ringwald
604a4cd9b30SMilanka Ringwald cptr->effect = 0;
605a4cd9b30SMilanka Ringwald cptr->parameffect = 0;
606a4cd9b30SMilanka Ringwald cptr->effect_code = effect;
607a4cd9b30SMilanka Ringwald
6088201da88SMatthias Ringwald #ifdef EFFECTS_USAGE_STATE
6098201da88SMatthias Ringwald if(effect_op || ((effect_op==EFFECT_ARPEGGIO) && effect_param))
6108201da88SMatthias Ringwald {
6118201da88SMatthias Ringwald mod->effects_event_counts[ effect_op ]++;
6128201da88SMatthias Ringwald }
6138201da88SMatthias Ringwald
6148201da88SMatthias Ringwald if(effect_op == 0xE)
6158201da88SMatthias Ringwald mod->effects_event_counts[ 0x10 + effect_param_h ]++;
6168201da88SMatthias Ringwald #endif
6178201da88SMatthias Ringwald
6188201da88SMatthias Ringwald switch ( effect_op )
619a4cd9b30SMilanka Ringwald {
620a4cd9b30SMilanka Ringwald case EFFECT_ARPEGGIO:
621a4cd9b30SMilanka Ringwald /*
622a4cd9b30SMilanka Ringwald [0]: Arpeggio
623a4cd9b30SMilanka Ringwald Where [0][x][y] means "play note, note+x semitones, note+y
624a4cd9b30SMilanka Ringwald semitones, then return to original note". The fluctuations are
625a4cd9b30SMilanka Ringwald carried out evenly spaced in one pattern division. They are usually
626a4cd9b30SMilanka Ringwald used to simulate chords, but this doesn't work too well. They are
627a4cd9b30SMilanka Ringwald also used to produce heavy vibrato. A major chord is when x=4, y=7.
628a4cd9b30SMilanka Ringwald A minor chord is when x=3, y=7.
629a4cd9b30SMilanka Ringwald */
630a4cd9b30SMilanka Ringwald
6318201da88SMatthias Ringwald if( effect_param )
632a4cd9b30SMilanka Ringwald {
633a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_ARPEGGIO;
6348201da88SMatthias Ringwald cptr->parameffect = effect_param;
635a4cd9b30SMilanka Ringwald
636a4cd9b30SMilanka Ringwald cptr->ArpIndex = 0;
637a4cd9b30SMilanka Ringwald
6388201da88SMatthias Ringwald curnote = getnote(mod,cptr->period);
639a4cd9b30SMilanka Ringwald
640a4cd9b30SMilanka Ringwald cptr->Arpperiods[0] = cptr->period;
641a4cd9b30SMilanka Ringwald
6428201da88SMatthias Ringwald period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
643a4cd9b30SMilanka Ringwald
6448201da88SMatthias Ringwald arpnote = curnote + (((cptr->parameffect>>4)&0xF));
6458201da88SMatthias Ringwald if( arpnote >= MAXNOTES )
6468201da88SMatthias Ringwald arpnote = (MAXNOTES) - 1;
647a4cd9b30SMilanka Ringwald
6488201da88SMatthias Ringwald cptr->Arpperiods[1] = period_table_ptr[arpnote];
649a4cd9b30SMilanka Ringwald
6508201da88SMatthias Ringwald arpnote = curnote + (((cptr->parameffect)&0xF));
6518201da88SMatthias Ringwald if( arpnote >= MAXNOTES )
6528201da88SMatthias Ringwald arpnote = (MAXNOTES) - 1;
6538201da88SMatthias Ringwald
6548201da88SMatthias Ringwald cptr->Arpperiods[2] = period_table_ptr[arpnote];
655a4cd9b30SMilanka Ringwald }
656a4cd9b30SMilanka Ringwald break;
657a4cd9b30SMilanka Ringwald
658a4cd9b30SMilanka Ringwald case EFFECT_PORTAMENTO_UP:
659a4cd9b30SMilanka Ringwald /*
660a4cd9b30SMilanka Ringwald [1]: Slide up
661a4cd9b30SMilanka Ringwald Where [1][x][y] means "smoothly decrease the period of current
662a4cd9b30SMilanka Ringwald sample by x*16+y after each tick in the division". The
663a4cd9b30SMilanka Ringwald ticks/division are set with the 'set speed' effect (see below). If
664a4cd9b30SMilanka Ringwald the period of the note being played is z, then the final period
665a4cd9b30SMilanka Ringwald will be z - (x*16 + y)*(ticks - 1). As the slide rate depends on
666a4cd9b30SMilanka Ringwald the speed, changing the speed will change the slide. You cannot
667a4cd9b30SMilanka Ringwald slide beyond the note B3 (period 113).
668a4cd9b30SMilanka Ringwald */
669a4cd9b30SMilanka Ringwald
670a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_PORTAMENTO_UP;
6718201da88SMatthias Ringwald cptr->parameffect = effect_param;
672a4cd9b30SMilanka Ringwald break;
673a4cd9b30SMilanka Ringwald
674a4cd9b30SMilanka Ringwald case EFFECT_PORTAMENTO_DOWN:
675a4cd9b30SMilanka Ringwald /*
676a4cd9b30SMilanka Ringwald [2]: Slide down
677a4cd9b30SMilanka Ringwald Where [2][x][y] means "smoothly increase the period of current
678a4cd9b30SMilanka Ringwald sample by x*16+y after each tick in the division". Similar to [1],
679a4cd9b30SMilanka Ringwald but lowers the pitch. You cannot slide beyond the note C1 (period
680a4cd9b30SMilanka Ringwald 856).
681a4cd9b30SMilanka Ringwald */
682a4cd9b30SMilanka Ringwald
683a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_PORTAMENTO_DOWN;
6848201da88SMatthias Ringwald cptr->parameffect = effect_param;
685a4cd9b30SMilanka Ringwald break;
686a4cd9b30SMilanka Ringwald
687a4cd9b30SMilanka Ringwald case EFFECT_TONE_PORTAMENTO:
688a4cd9b30SMilanka Ringwald /*
689a4cd9b30SMilanka Ringwald [3]: Slide to note
690a4cd9b30SMilanka Ringwald Where [3][x][y] means "smoothly change the period of current sample
691a4cd9b30SMilanka Ringwald by x*16+y after each tick in the division, never sliding beyond
692a4cd9b30SMilanka Ringwald current period". The period-length in this channel's division is a
693a4cd9b30SMilanka Ringwald parameter to this effect, and hence is not played. Sliding to a
694a4cd9b30SMilanka Ringwald note is similar to effects [1] and [2], but the slide will not go
695a4cd9b30SMilanka Ringwald beyond the given period, and the direction is implied by that
696a4cd9b30SMilanka Ringwald period. If x and y are both 0, then the old slide will continue.
697a4cd9b30SMilanka Ringwald */
698a4cd9b30SMilanka Ringwald
699a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_TONE_PORTAMENTO;
7008201da88SMatthias Ringwald if( effect_param != 0 )
701a4cd9b30SMilanka Ringwald {
7028201da88SMatthias Ringwald cptr->portaspeed = (short)( effect_param );
703a4cd9b30SMilanka Ringwald }
704a4cd9b30SMilanka Ringwald
705a4cd9b30SMilanka Ringwald if(period!=0)
706a4cd9b30SMilanka Ringwald {
707a4cd9b30SMilanka Ringwald cptr->portaperiod = period;
708a4cd9b30SMilanka Ringwald cptr->period = operiod;
709a4cd9b30SMilanka Ringwald }
710a4cd9b30SMilanka Ringwald break;
711a4cd9b30SMilanka Ringwald
712a4cd9b30SMilanka Ringwald case EFFECT_VIBRATO:
713a4cd9b30SMilanka Ringwald /*
714a4cd9b30SMilanka Ringwald [4]: Vibrato
715a4cd9b30SMilanka Ringwald Where [4][x][y] means "oscillate the sample pitch using a
716a4cd9b30SMilanka Ringwald particular waveform with amplitude y/16 semitones, such that (x *
717a4cd9b30SMilanka Ringwald ticks)/64 cycles occur in the division". The waveform is set using
718a4cd9b30SMilanka Ringwald effect [14][4]. By placing vibrato effects on consecutive
719a4cd9b30SMilanka Ringwald divisions, the vibrato effect can be maintained. If either x or y
720a4cd9b30SMilanka Ringwald are 0, then the old vibrato values will be used.
721a4cd9b30SMilanka Ringwald */
722a4cd9b30SMilanka Ringwald
723a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_VIBRATO;
7248201da88SMatthias Ringwald if( effect_param_l != 0 ) // Depth continue or change ?
7258201da88SMatthias Ringwald cptr->vibraparam = ( cptr->vibraparam & 0xF0 ) | effect_param_l;
7268201da88SMatthias Ringwald if( effect_param_h != 0 ) // Speed continue or change ?
7278201da88SMatthias Ringwald cptr->vibraparam = ( cptr->vibraparam & 0x0F ) | ( effect_param_h << 4 );
728a4cd9b30SMilanka Ringwald
729a4cd9b30SMilanka Ringwald break;
730a4cd9b30SMilanka Ringwald
731a4cd9b30SMilanka Ringwald case EFFECT_VOLSLIDE_TONEPORTA:
732a4cd9b30SMilanka Ringwald /*
733a4cd9b30SMilanka Ringwald [5]: Continue 'Slide to note', but also do Volume slide
734a4cd9b30SMilanka Ringwald Where [5][x][y] means "either slide the volume up x*(ticks - 1) or
735a4cd9b30SMilanka Ringwald slide the volume down y*(ticks - 1), at the same time as continuing
736a4cd9b30SMilanka Ringwald the last 'Slide to note'". It is illegal for both x and y to be
737a4cd9b30SMilanka Ringwald non-zero. You cannot slide outside the volume range 0..64. The
738a4cd9b30SMilanka Ringwald period-length in this channel's division is a parameter to this
739a4cd9b30SMilanka Ringwald effect, and hence is not played.
740a4cd9b30SMilanka Ringwald */
741a4cd9b30SMilanka Ringwald
742a4cd9b30SMilanka Ringwald if( period != 0 )
743a4cd9b30SMilanka Ringwald {
744a4cd9b30SMilanka Ringwald cptr->portaperiod = period;
745a4cd9b30SMilanka Ringwald cptr->period = operiod;
746a4cd9b30SMilanka Ringwald }
747a4cd9b30SMilanka Ringwald
748a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_VOLSLIDE_TONEPORTA;
7498201da88SMatthias Ringwald if( effect_param != 0 )
7508201da88SMatthias Ringwald cptr->volumeslide = effect_param;
751a4cd9b30SMilanka Ringwald
752a4cd9b30SMilanka Ringwald break;
753a4cd9b30SMilanka Ringwald
754a4cd9b30SMilanka Ringwald case EFFECT_VOLSLIDE_VIBRATO:
755a4cd9b30SMilanka Ringwald /*
756a4cd9b30SMilanka Ringwald [6]: Continue 'Vibrato', but also do Volume slide
757a4cd9b30SMilanka Ringwald Where [6][x][y] means "either slide the volume up x*(ticks - 1) or
758a4cd9b30SMilanka Ringwald slide the volume down y*(ticks - 1), at the same time as continuing
759a4cd9b30SMilanka Ringwald the last 'Vibrato'". It is illegal for both x and y to be non-zero.
760a4cd9b30SMilanka Ringwald You cannot slide outside the volume range 0..64.
761a4cd9b30SMilanka Ringwald */
762a4cd9b30SMilanka Ringwald
763a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_VOLSLIDE_VIBRATO;
7648201da88SMatthias Ringwald if( effect_param != 0 )
7658201da88SMatthias Ringwald cptr->volumeslide = effect_param;
766a4cd9b30SMilanka Ringwald break;
767a4cd9b30SMilanka Ringwald
768a4cd9b30SMilanka Ringwald case EFFECT_SET_OFFSET:
769a4cd9b30SMilanka Ringwald /*
770a4cd9b30SMilanka Ringwald [9]: Set sample offset
771a4cd9b30SMilanka Ringwald Where [9][x][y] means "play the sample from offset x*4096 + y*256".
772a4cd9b30SMilanka Ringwald The offset is measured in words. If no sample is given, yet one is
773a4cd9b30SMilanka Ringwald still playing on this channel, it should be retriggered to the new
774a4cd9b30SMilanka Ringwald offset using the current volume.
7758201da88SMatthias Ringwald If xy is 00, the previous value is used.
776a4cd9b30SMilanka Ringwald */
777a4cd9b30SMilanka Ringwald
7788201da88SMatthias Ringwald cptr->samppos = ( ( ((muint)effect_param_h) << 12) + ( (((muint)effect_param_l) << 8) ) ) << 10;
779a4cd9b30SMilanka Ringwald
7808201da88SMatthias Ringwald if(!cptr->samppos)
7818201da88SMatthias Ringwald cptr->samppos = cptr->last_set_offset;
7828201da88SMatthias Ringwald
7838201da88SMatthias Ringwald cptr->last_set_offset = cptr->samppos;
784a4cd9b30SMilanka Ringwald break;
785a4cd9b30SMilanka Ringwald
786a4cd9b30SMilanka Ringwald case EFFECT_VOLUME_SLIDE:
787a4cd9b30SMilanka Ringwald /*
788a4cd9b30SMilanka Ringwald [10]: Volume slide
789a4cd9b30SMilanka Ringwald Where [10][x][y] means "either slide the volume up x*(ticks - 1) or
790a4cd9b30SMilanka Ringwald slide the volume down y*(ticks - 1)". If both x and y are non-zero,
791a4cd9b30SMilanka Ringwald then the y value is ignored (assumed to be 0). You cannot slide
792a4cd9b30SMilanka Ringwald outside the volume range 0..64.
793a4cd9b30SMilanka Ringwald */
794a4cd9b30SMilanka Ringwald
795a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_VOLUME_SLIDE;
7968201da88SMatthias Ringwald cptr->volumeslide = effect_param;
797a4cd9b30SMilanka Ringwald break;
798a4cd9b30SMilanka Ringwald
799a4cd9b30SMilanka Ringwald case EFFECT_JUMP_POSITION:
800a4cd9b30SMilanka Ringwald /*
801a4cd9b30SMilanka Ringwald [11]: Position Jump
802a4cd9b30SMilanka Ringwald Where [11][x][y] means "stop the pattern after this division, and
803a4cd9b30SMilanka Ringwald continue the song at song-position x*16+y". This shifts the
804a4cd9b30SMilanka Ringwald 'pattern-cursor' in the pattern table (see above). Legal values for
805a4cd9b30SMilanka Ringwald x*16+y are from 0 to 127.
806a4cd9b30SMilanka Ringwald */
807a4cd9b30SMilanka Ringwald
8088201da88SMatthias Ringwald mod->tablepos = effect_param;
809a4cd9b30SMilanka Ringwald if(mod->tablepos >= mod->song.length)
810a4cd9b30SMilanka Ringwald mod->tablepos = 0;
811a4cd9b30SMilanka Ringwald mod->patternpos = 0;
812a4cd9b30SMilanka Ringwald mod->jump_loop_effect = 1;
813a4cd9b30SMilanka Ringwald
814a4cd9b30SMilanka Ringwald break;
815a4cd9b30SMilanka Ringwald
816a4cd9b30SMilanka Ringwald case EFFECT_SET_VOLUME:
817a4cd9b30SMilanka Ringwald /*
818a4cd9b30SMilanka Ringwald [12]: Set volume
819a4cd9b30SMilanka Ringwald Where [12][x][y] means "set current sample's volume to x*16+y".
820a4cd9b30SMilanka Ringwald Legal volumes are 0..64.
821a4cd9b30SMilanka Ringwald */
822a4cd9b30SMilanka Ringwald
8238201da88SMatthias Ringwald cptr->volume = effect_param;
8248201da88SMatthias Ringwald
8258201da88SMatthias Ringwald if(cptr->volume > 64)
8268201da88SMatthias Ringwald cptr->volume = 64;
8278201da88SMatthias Ringwald
8288201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
8298201da88SMatthias Ringwald cptr->volume_table = mod->volume_selection_table[cptr->volume];
8308201da88SMatthias Ringwald #endif
831a4cd9b30SMilanka Ringwald break;
832a4cd9b30SMilanka Ringwald
833a4cd9b30SMilanka Ringwald case EFFECT_PATTERN_BREAK:
834a4cd9b30SMilanka Ringwald /*
835a4cd9b30SMilanka Ringwald [13]: Pattern Break
836a4cd9b30SMilanka Ringwald Where [13][x][y] means "stop the pattern after this division, and
837a4cd9b30SMilanka Ringwald continue the song at the next pattern at division x*10+y" (the 10
838a4cd9b30SMilanka Ringwald is not a typo). Legal divisions are from 0 to 63 (note Protracker
839a4cd9b30SMilanka Ringwald exception above).
840a4cd9b30SMilanka Ringwald */
841a4cd9b30SMilanka Ringwald
8428201da88SMatthias Ringwald mod->patternpos = ( ((muint)(effect_param_h) * 10) + effect_param_l );
8438201da88SMatthias Ringwald
8448201da88SMatthias Ringwald if(mod->patternpos >= 64)
8458201da88SMatthias Ringwald mod->patternpos = 63;
8468201da88SMatthias Ringwald
8478201da88SMatthias Ringwald mod->patternpos *= mod->number_of_channels;
8488201da88SMatthias Ringwald
8498201da88SMatthias Ringwald if(!mod->jump_loop_effect)
8508201da88SMatthias Ringwald {
851a4cd9b30SMilanka Ringwald mod->tablepos++;
852a4cd9b30SMilanka Ringwald if(mod->tablepos >= mod->song.length)
853a4cd9b30SMilanka Ringwald mod->tablepos = 0;
8548201da88SMatthias Ringwald }
855a4cd9b30SMilanka Ringwald
8568201da88SMatthias Ringwald mod->jump_loop_effect = 1;
857a4cd9b30SMilanka Ringwald break;
858a4cd9b30SMilanka Ringwald
859a4cd9b30SMilanka Ringwald case EFFECT_EXTENDED:
8608201da88SMatthias Ringwald switch( effect_param_h )
861a4cd9b30SMilanka Ringwald {
862a4cd9b30SMilanka Ringwald case EFFECT_E_FINE_PORTA_UP:
863a4cd9b30SMilanka Ringwald /*
864a4cd9b30SMilanka Ringwald [14][1]: Fineslide up
865a4cd9b30SMilanka Ringwald Where [14][1][x] means "decrement the period of the current sample
866a4cd9b30SMilanka Ringwald by x". The incrementing takes place at the beginning of the
867a4cd9b30SMilanka Ringwald division, and hence there is no actual sliding. You cannot slide
868a4cd9b30SMilanka Ringwald beyond the note B3 (period 113).
869a4cd9b30SMilanka Ringwald */
870a4cd9b30SMilanka Ringwald
8718201da88SMatthias Ringwald cptr->period -= effect_param_l;
872a4cd9b30SMilanka Ringwald if( cptr->period < 113 )
873a4cd9b30SMilanka Ringwald cptr->period = 113;
874a4cd9b30SMilanka Ringwald break;
875a4cd9b30SMilanka Ringwald
876a4cd9b30SMilanka Ringwald case EFFECT_E_FINE_PORTA_DOWN:
877a4cd9b30SMilanka Ringwald /*
878a4cd9b30SMilanka Ringwald [14][2]: Fineslide down
879a4cd9b30SMilanka Ringwald Where [14][2][x] means "increment the period of the current sample
880a4cd9b30SMilanka Ringwald by x". Similar to [14][1] but shifts the pitch down. You cannot
881a4cd9b30SMilanka Ringwald slide beyond the note C1 (period 856).
882a4cd9b30SMilanka Ringwald */
883a4cd9b30SMilanka Ringwald
8848201da88SMatthias Ringwald cptr->period += effect_param_l;
885a4cd9b30SMilanka Ringwald if( cptr->period > 856 )
886a4cd9b30SMilanka Ringwald cptr->period = 856;
887a4cd9b30SMilanka Ringwald break;
888a4cd9b30SMilanka Ringwald
8898201da88SMatthias Ringwald case EFFECT_E_GLISSANDO_CTRL:
8908201da88SMatthias Ringwald /*
8918201da88SMatthias Ringwald [14][3]: Set glissando on/off
8928201da88SMatthias Ringwald Where [14][3][x] means "set glissando ON if x is 1, OFF if x is 0".
8938201da88SMatthias Ringwald Used in conjunction with [3] ('Slide to note'). If glissando is on,
8948201da88SMatthias Ringwald then 'Slide to note' will slide in semitones, otherwise will
8958201da88SMatthias Ringwald perform the default smooth slide.
8968201da88SMatthias Ringwald */
8978201da88SMatthias Ringwald
8988201da88SMatthias Ringwald cptr->glissando = effect_param_l;
8998201da88SMatthias Ringwald break;
9008201da88SMatthias Ringwald
901a4cd9b30SMilanka Ringwald case EFFECT_E_FINE_VOLSLIDE_UP:
902a4cd9b30SMilanka Ringwald /*
903a4cd9b30SMilanka Ringwald [14][10]: Fine volume slide up
904a4cd9b30SMilanka Ringwald Where [14][10][x] means "increment the volume of the current sample
905a4cd9b30SMilanka Ringwald by x". The incrementing takes place at the beginning of the
906a4cd9b30SMilanka Ringwald division, and hence there is no sliding. You cannot slide beyond
907a4cd9b30SMilanka Ringwald volume 64.
908a4cd9b30SMilanka Ringwald */
909a4cd9b30SMilanka Ringwald
9108201da88SMatthias Ringwald cptr->volume += effect_param_l;
911a4cd9b30SMilanka Ringwald if( cptr->volume > 64 )
912a4cd9b30SMilanka Ringwald cptr->volume = 64;
9138201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
9148201da88SMatthias Ringwald cptr->volume_table = mod->volume_selection_table[cptr->volume];
9158201da88SMatthias Ringwald #endif
916a4cd9b30SMilanka Ringwald break;
917a4cd9b30SMilanka Ringwald
918a4cd9b30SMilanka Ringwald case EFFECT_E_FINE_VOLSLIDE_DOWN:
919a4cd9b30SMilanka Ringwald /*
920a4cd9b30SMilanka Ringwald [14][11]: Fine volume slide down
921a4cd9b30SMilanka Ringwald Where [14][11][x] means "decrement the volume of the current sample
922a4cd9b30SMilanka Ringwald by x". Similar to [14][10] but lowers volume. You cannot slide
923a4cd9b30SMilanka Ringwald beyond volume 0.
924a4cd9b30SMilanka Ringwald */
925a4cd9b30SMilanka Ringwald
9268201da88SMatthias Ringwald cptr->volume -= effect_param_l;
927a4cd9b30SMilanka Ringwald if( cptr->volume > 200 )
928a4cd9b30SMilanka Ringwald cptr->volume = 0;
9298201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
9308201da88SMatthias Ringwald cptr->volume_table = mod->volume_selection_table[cptr->volume];
9318201da88SMatthias Ringwald #endif
9328201da88SMatthias Ringwald break;
9338201da88SMatthias Ringwald
9348201da88SMatthias Ringwald case EFFECT_E_SET_FINETUNE:
9358201da88SMatthias Ringwald /*
9368201da88SMatthias Ringwald [14][5]: Set finetune value
9378201da88SMatthias Ringwald Where [14][5][x] means "sets the finetune value of the current
9388201da88SMatthias Ringwald sample to the signed nibble x". x has legal values of 0..15,
9398201da88SMatthias Ringwald corresponding to signed nibbles 0..7,-8..-1 (see start of text for
9408201da88SMatthias Ringwald more info on finetune values).
9418201da88SMatthias Ringwald */
9428201da88SMatthias Ringwald
9438201da88SMatthias Ringwald cptr->finetune = effect_param_l;
9448201da88SMatthias Ringwald
9458201da88SMatthias Ringwald if( period )
9468201da88SMatthias Ringwald {
9478201da88SMatthias Ringwald period_table_ptr = periodtable_finetune_ptr[cptr->finetune&0xF];
9488201da88SMatthias Ringwald period = period_table_ptr[getnote(mod,period)];
9498201da88SMatthias Ringwald cptr->period = period;
9508201da88SMatthias Ringwald }
9518201da88SMatthias Ringwald
952a4cd9b30SMilanka Ringwald break;
953a4cd9b30SMilanka Ringwald
954a4cd9b30SMilanka Ringwald case EFFECT_E_PATTERN_LOOP:
955a4cd9b30SMilanka Ringwald /*
956a4cd9b30SMilanka Ringwald [14][6]: Loop pattern
957a4cd9b30SMilanka Ringwald Where [14][6][x] means "set the start of a loop to this division if
958a4cd9b30SMilanka Ringwald x is 0, otherwise after this division, jump back to the start of a
959a4cd9b30SMilanka Ringwald loop and play it another x times before continuing". If the start
960a4cd9b30SMilanka Ringwald of the loop was not set, it will default to the start of the
961a4cd9b30SMilanka Ringwald current pattern. Hence 'loop pattern' cannot be performed across
962a4cd9b30SMilanka Ringwald multiple patterns. Note that loops do not support nesting, and you
963a4cd9b30SMilanka Ringwald may generate an infinite loop if you try to nest 'loop pattern's.
964a4cd9b30SMilanka Ringwald */
965a4cd9b30SMilanka Ringwald
9668201da88SMatthias Ringwald if( effect_param_l )
967a4cd9b30SMilanka Ringwald {
968a4cd9b30SMilanka Ringwald if( cptr->patternloopcnt )
969a4cd9b30SMilanka Ringwald {
970a4cd9b30SMilanka Ringwald cptr->patternloopcnt--;
971a4cd9b30SMilanka Ringwald if( cptr->patternloopcnt )
972a4cd9b30SMilanka Ringwald {
973a4cd9b30SMilanka Ringwald mod->patternpos = cptr->patternloopstartpoint;
974a4cd9b30SMilanka Ringwald mod->jump_loop_effect = 1;
975a4cd9b30SMilanka Ringwald }
976a4cd9b30SMilanka Ringwald else
977a4cd9b30SMilanka Ringwald {
978a4cd9b30SMilanka Ringwald cptr->patternloopstartpoint = mod->patternpos ;
979a4cd9b30SMilanka Ringwald }
980a4cd9b30SMilanka Ringwald }
981a4cd9b30SMilanka Ringwald else
982a4cd9b30SMilanka Ringwald {
9838201da88SMatthias Ringwald cptr->patternloopcnt = effect_param_l;
984a4cd9b30SMilanka Ringwald mod->patternpos = cptr->patternloopstartpoint;
985a4cd9b30SMilanka Ringwald mod->jump_loop_effect = 1;
986a4cd9b30SMilanka Ringwald }
987a4cd9b30SMilanka Ringwald }
988a4cd9b30SMilanka Ringwald else // Start point
989a4cd9b30SMilanka Ringwald {
990a4cd9b30SMilanka Ringwald cptr->patternloopstartpoint = mod->patternpos;
991a4cd9b30SMilanka Ringwald }
992a4cd9b30SMilanka Ringwald
993a4cd9b30SMilanka Ringwald break;
994a4cd9b30SMilanka Ringwald
995a4cd9b30SMilanka Ringwald case EFFECT_E_PATTERN_DELAY:
996a4cd9b30SMilanka Ringwald /*
997a4cd9b30SMilanka Ringwald [14][14]: Delay pattern
998a4cd9b30SMilanka Ringwald Where [14][14][x] means "after this division there will be a delay
999a4cd9b30SMilanka Ringwald equivalent to the time taken to play x divisions after which the
1000a4cd9b30SMilanka Ringwald pattern will be resumed". The delay only relates to the
1001a4cd9b30SMilanka Ringwald interpreting of new divisions, and all effects and previous notes
1002a4cd9b30SMilanka Ringwald continue during delay.
1003a4cd9b30SMilanka Ringwald */
1004a4cd9b30SMilanka Ringwald
10058201da88SMatthias Ringwald mod->patterndelay = effect_param_l;
10068201da88SMatthias Ringwald break;
10078201da88SMatthias Ringwald
10088201da88SMatthias Ringwald case EFFECT_E_RETRIGGER_NOTE:
10098201da88SMatthias Ringwald /*
10108201da88SMatthias Ringwald [14][9]: Retrigger sample
10118201da88SMatthias Ringwald Where [14][9][x] means "trigger current sample every x ticks in
10128201da88SMatthias Ringwald this division". If x is 0, then no retriggering is done (acts as if
10138201da88SMatthias Ringwald no effect was chosen), otherwise the retriggering begins on the
10148201da88SMatthias Ringwald first tick and then x ticks after that, etc.
10158201da88SMatthias Ringwald */
10168201da88SMatthias Ringwald
10178201da88SMatthias Ringwald if( effect_param_l )
10188201da88SMatthias Ringwald {
10198201da88SMatthias Ringwald cptr->effect = EFFECT_EXTENDED;
10208201da88SMatthias Ringwald cptr->parameffect = (EFFECT_E_RETRIGGER_NOTE<<4);
10218201da88SMatthias Ringwald cptr->retrig_param = effect_param_l;
10228201da88SMatthias Ringwald cptr->retrig_cnt = 0;
10238201da88SMatthias Ringwald }
1024a4cd9b30SMilanka Ringwald break;
1025a4cd9b30SMilanka Ringwald
1026a4cd9b30SMilanka Ringwald case EFFECT_E_NOTE_CUT:
1027a4cd9b30SMilanka Ringwald /*
1028a4cd9b30SMilanka Ringwald [14][12]: Cut sample
1029a4cd9b30SMilanka Ringwald Where [14][12][x] means "after the current sample has been played
1030a4cd9b30SMilanka Ringwald for x ticks in this division, its volume will be set to 0". This
1031a4cd9b30SMilanka Ringwald implies that if x is 0, then you will not hear any of the sample.
1032a4cd9b30SMilanka Ringwald If you wish to insert "silence" in a pattern, it is better to use a
1033a4cd9b30SMilanka Ringwald "silence"-sample (see above) due to the lack of proper support for
1034a4cd9b30SMilanka Ringwald this effect.
1035a4cd9b30SMilanka Ringwald */
10368201da88SMatthias Ringwald
1037a4cd9b30SMilanka Ringwald cptr->effect = EFFECT_E_NOTE_CUT;
10388201da88SMatthias Ringwald cptr->cut_param = effect_param_l;
1039a4cd9b30SMilanka Ringwald if( !cptr->cut_param )
10408201da88SMatthias Ringwald {
1041a4cd9b30SMilanka Ringwald cptr->volume = 0;
10428201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
10438201da88SMatthias Ringwald cptr->volume_table = mod->volume_selection_table[cptr->volume];
10448201da88SMatthias Ringwald #endif
10458201da88SMatthias Ringwald }
10468201da88SMatthias Ringwald break;
10478201da88SMatthias Ringwald
10488201da88SMatthias Ringwald case EFFECT_E_NOTE_DELAY:
10498201da88SMatthias Ringwald /*
10508201da88SMatthias Ringwald Where [14][13][x] means "do not start this division's sample for
10518201da88SMatthias Ringwald the first x ticks in this division, play the sample after this".
10528201da88SMatthias Ringwald This implies that if x is 0, then you will hear no delay, but
10538201da88SMatthias Ringwald actually there will be a VERY small delay. Note that this effect
10548201da88SMatthias Ringwald only influences a sample if it was started in this division.
10558201da88SMatthias Ringwald */
10568201da88SMatthias Ringwald
10578201da88SMatthias Ringwald cptr->effect = EFFECT_EXTENDED;
10588201da88SMatthias Ringwald cptr->parameffect = (EFFECT_E_NOTE_DELAY<<4);
10598201da88SMatthias Ringwald break;
10608201da88SMatthias Ringwald
10618201da88SMatthias Ringwald case EFFECT_E_INVERT_LOOP:
10628201da88SMatthias Ringwald /*
10638201da88SMatthias Ringwald Where [14][15][x] means "if x is greater than 0, then play the
10648201da88SMatthias Ringwald current sample's loop upside down at speed x". Each byte in the
10658201da88SMatthias Ringwald sample's loop will have its sign changed (negated). It will only
10668201da88SMatthias Ringwald work if the sample's loop (defined previously) is not too big. The
10678201da88SMatthias Ringwald speed is based on an internal table.
10688201da88SMatthias Ringwald */
10698201da88SMatthias Ringwald
10708201da88SMatthias Ringwald cptr->funkspeed = effect_param_l;
10718201da88SMatthias Ringwald
10728201da88SMatthias Ringwald doFunk(cptr);
10738201da88SMatthias Ringwald
1074a4cd9b30SMilanka Ringwald break;
1075a4cd9b30SMilanka Ringwald
1076a4cd9b30SMilanka Ringwald default:
1077a4cd9b30SMilanka Ringwald
1078a4cd9b30SMilanka Ringwald break;
1079a4cd9b30SMilanka Ringwald }
1080a4cd9b30SMilanka Ringwald break;
1081a4cd9b30SMilanka Ringwald
1082a4cd9b30SMilanka Ringwald case 0xF:
1083a4cd9b30SMilanka Ringwald /*
1084a4cd9b30SMilanka Ringwald [15]: Set speed
1085a4cd9b30SMilanka Ringwald Where [15][x][y] means "set speed to x*16+y". Though it is nowhere
1086a4cd9b30SMilanka Ringwald near that simple. Let z = x*16+y. Depending on what values z takes,
1087a4cd9b30SMilanka Ringwald different units of speed are set, there being two: ticks/division
1088a4cd9b30SMilanka Ringwald and beats/minute (though this one is only a label and not strictly
1089a4cd9b30SMilanka Ringwald true). If z=0, then what should technically happen is that the
1090a4cd9b30SMilanka Ringwald module stops, but in practice it is treated as if z=1, because
1091a4cd9b30SMilanka Ringwald there is already a method for stopping the module (running out of
1092a4cd9b30SMilanka Ringwald patterns). If z<=32, then it means "set ticks/division to z"
1093a4cd9b30SMilanka Ringwald otherwise it means "set beats/minute to z" (convention says that
1094a4cd9b30SMilanka Ringwald this should read "If z<32.." but there are some composers out there
1095a4cd9b30SMilanka Ringwald that defy conventions). Default values are 6 ticks/division, and
1096a4cd9b30SMilanka Ringwald 125 beats/minute (4 divisions = 1 beat). The beats/minute tag is
1097a4cd9b30SMilanka Ringwald only meaningful for 6 ticks/division. To get a more accurate view
1098a4cd9b30SMilanka Ringwald of how things work, use the following formula:
1099a4cd9b30SMilanka Ringwald 24 * beats/minute
1100a4cd9b30SMilanka Ringwald divisions/minute = -----------------
1101a4cd9b30SMilanka Ringwald ticks/division
1102a4cd9b30SMilanka Ringwald Hence divisions/minute range from 24.75 to 6120, eg. to get a value
1103a4cd9b30SMilanka Ringwald of 2000 divisions/minute use 3 ticks/division and 250 beats/minute.
1104a4cd9b30SMilanka Ringwald If multiple "set speed" effects are performed in a single division,
1105a4cd9b30SMilanka Ringwald the ones on higher-numbered channels take precedence over the ones
1106a4cd9b30SMilanka Ringwald on lower-numbered channels. This effect has a large number of
1107a4cd9b30SMilanka Ringwald different implementations, but the one described here has the
1108a4cd9b30SMilanka Ringwald widest usage.
1109a4cd9b30SMilanka Ringwald */
1110a4cd9b30SMilanka Ringwald
11118201da88SMatthias Ringwald
11128201da88SMatthias Ringwald if( effect_param )
1113a4cd9b30SMilanka Ringwald {
11148201da88SMatthias Ringwald
11158201da88SMatthias Ringwald if( effect_param < 0x20 )
1116a4cd9b30SMilanka Ringwald {
11178201da88SMatthias Ringwald mod->song.speed = effect_param;
1118a4cd9b30SMilanka Ringwald }
11198201da88SMatthias Ringwald else
11208201da88SMatthias Ringwald { // effect_param >= 0x20
11218201da88SMatthias Ringwald /// HZ = 2 * BPM / 5
11228201da88SMatthias Ringwald mod->bpm = effect_param;
1123a4cd9b30SMilanka Ringwald }
1124a4cd9b30SMilanka Ringwald
11258201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
11268201da88SMatthias Ringwald // song.speed = 1 <> 31
11278201da88SMatthias Ringwald // playrate = 8000 <> 22050
11288201da88SMatthias Ringwald // bpm = 32 <> 255
11298201da88SMatthias Ringwald
11308201da88SMatthias Ringwald mod->patternticksem = (muint)( ( (mulong)mod->playrate * 5 ) / ( (muint)mod->bpm * 2 ) );
11318201da88SMatthias Ringwald #else
11328201da88SMatthias Ringwald // song.speed = 1 <> 31
11338201da88SMatthias Ringwald // playrate = 8000 <> 96000
11348201da88SMatthias Ringwald // bpm = 32 <> 255
11358201da88SMatthias Ringwald
11368201da88SMatthias Ringwald mod->patternticksem = ( ( mod->playrate * 5 ) / ( (mulong)mod->bpm * 2 ) );
11378201da88SMatthias Ringwald #endif
11388201da88SMatthias Ringwald mod->patternticksaim = mod->song.speed * mod->patternticksem;
1139a4cd9b30SMilanka Ringwald }
1140a4cd9b30SMilanka Ringwald
1141a4cd9b30SMilanka Ringwald break;
1142a4cd9b30SMilanka Ringwald
1143a4cd9b30SMilanka Ringwald default:
1144a4cd9b30SMilanka Ringwald // Unsupported effect
1145a4cd9b30SMilanka Ringwald break;
1146a4cd9b30SMilanka Ringwald
1147a4cd9b30SMilanka Ringwald }
1148a4cd9b30SMilanka Ringwald
1149a4cd9b30SMilanka Ringwald }
1150a4cd9b30SMilanka Ringwald
workeffect(modcontext * modctx,note * nptr,hxcmod_channel_t * cptr)1151*b7454a87SMatthias Ringwald static void workeffect( modcontext * modctx, note * nptr, hxcmod_channel_t * cptr )
1152a4cd9b30SMilanka Ringwald {
11534aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE START
11544aa7d471SMatthias Ringwald (void) nptr;
11554aa7d471SMatthias Ringwald // BK4BSTACK_CHANGE END
11564aa7d471SMatthias Ringwald
11578201da88SMatthias Ringwald doFunk(cptr);
1158c5456c21SMilanka Ringwald
1159a4cd9b30SMilanka Ringwald switch(cptr->effect)
1160a4cd9b30SMilanka Ringwald {
1161a4cd9b30SMilanka Ringwald case EFFECT_ARPEGGIO:
1162a4cd9b30SMilanka Ringwald
1163a4cd9b30SMilanka Ringwald if( cptr->parameffect )
1164a4cd9b30SMilanka Ringwald {
1165a4cd9b30SMilanka Ringwald cptr->decalperiod = cptr->period - cptr->Arpperiods[cptr->ArpIndex];
1166a4cd9b30SMilanka Ringwald
1167a4cd9b30SMilanka Ringwald cptr->ArpIndex++;
1168a4cd9b30SMilanka Ringwald if( cptr->ArpIndex>2 )
1169a4cd9b30SMilanka Ringwald cptr->ArpIndex = 0;
1170a4cd9b30SMilanka Ringwald }
1171a4cd9b30SMilanka Ringwald break;
1172a4cd9b30SMilanka Ringwald
1173a4cd9b30SMilanka Ringwald case EFFECT_PORTAMENTO_UP:
1174a4cd9b30SMilanka Ringwald
1175a4cd9b30SMilanka Ringwald if( cptr->period )
1176a4cd9b30SMilanka Ringwald {
1177a4cd9b30SMilanka Ringwald cptr->period -= cptr->parameffect;
1178a4cd9b30SMilanka Ringwald
1179a4cd9b30SMilanka Ringwald if( cptr->period < 113 || cptr->period > 20000 )
1180a4cd9b30SMilanka Ringwald cptr->period = 113;
1181a4cd9b30SMilanka Ringwald }
1182a4cd9b30SMilanka Ringwald
1183a4cd9b30SMilanka Ringwald break;
1184a4cd9b30SMilanka Ringwald
1185a4cd9b30SMilanka Ringwald case EFFECT_PORTAMENTO_DOWN:
1186a4cd9b30SMilanka Ringwald
1187a4cd9b30SMilanka Ringwald if( cptr->period )
1188a4cd9b30SMilanka Ringwald {
1189a4cd9b30SMilanka Ringwald cptr->period += cptr->parameffect;
1190a4cd9b30SMilanka Ringwald
1191a4cd9b30SMilanka Ringwald if( cptr->period > 20000 )
1192a4cd9b30SMilanka Ringwald cptr->period = 20000;
1193a4cd9b30SMilanka Ringwald }
1194a4cd9b30SMilanka Ringwald
1195a4cd9b30SMilanka Ringwald break;
1196a4cd9b30SMilanka Ringwald
1197a4cd9b30SMilanka Ringwald case EFFECT_VOLSLIDE_TONEPORTA:
1198a4cd9b30SMilanka Ringwald case EFFECT_TONE_PORTAMENTO:
1199a4cd9b30SMilanka Ringwald
1200a4cd9b30SMilanka Ringwald if( cptr->period && ( cptr->period != cptr->portaperiod ) && cptr->portaperiod )
1201a4cd9b30SMilanka Ringwald {
1202a4cd9b30SMilanka Ringwald if( cptr->period > cptr->portaperiod )
1203a4cd9b30SMilanka Ringwald {
1204a4cd9b30SMilanka Ringwald if( cptr->period - cptr->portaperiod >= cptr->portaspeed )
1205a4cd9b30SMilanka Ringwald {
1206a4cd9b30SMilanka Ringwald cptr->period -= cptr->portaspeed;
1207a4cd9b30SMilanka Ringwald }
1208a4cd9b30SMilanka Ringwald else
1209a4cd9b30SMilanka Ringwald {
1210a4cd9b30SMilanka Ringwald cptr->period = cptr->portaperiod;
1211a4cd9b30SMilanka Ringwald }
1212a4cd9b30SMilanka Ringwald }
1213a4cd9b30SMilanka Ringwald else
1214a4cd9b30SMilanka Ringwald {
1215a4cd9b30SMilanka Ringwald if( cptr->portaperiod - cptr->period >= cptr->portaspeed )
1216a4cd9b30SMilanka Ringwald {
1217a4cd9b30SMilanka Ringwald cptr->period += cptr->portaspeed;
1218a4cd9b30SMilanka Ringwald }
1219a4cd9b30SMilanka Ringwald else
1220a4cd9b30SMilanka Ringwald {
1221a4cd9b30SMilanka Ringwald cptr->period = cptr->portaperiod;
1222a4cd9b30SMilanka Ringwald }
1223a4cd9b30SMilanka Ringwald }
1224a4cd9b30SMilanka Ringwald
1225a4cd9b30SMilanka Ringwald if( cptr->period == cptr->portaperiod )
1226a4cd9b30SMilanka Ringwald {
1227a4cd9b30SMilanka Ringwald // If the slide is over, don't let it to be retriggered.
1228a4cd9b30SMilanka Ringwald cptr->portaperiod = 0;
1229a4cd9b30SMilanka Ringwald }
1230a4cd9b30SMilanka Ringwald }
1231a4cd9b30SMilanka Ringwald
12328201da88SMatthias Ringwald if( cptr->glissando )
12338201da88SMatthias Ringwald {
12348201da88SMatthias Ringwald // TODO : Glissando effect.
12358201da88SMatthias Ringwald }
12368201da88SMatthias Ringwald
1237a4cd9b30SMilanka Ringwald if( cptr->effect == EFFECT_VOLSLIDE_TONEPORTA )
1238a4cd9b30SMilanka Ringwald {
12398201da88SMatthias Ringwald if( cptr->volumeslide & 0xF0 )
1240a4cd9b30SMilanka Ringwald {
12418201da88SMatthias Ringwald cptr->volume += ( cptr->volumeslide >> 4 );
1242a4cd9b30SMilanka Ringwald
1243a4cd9b30SMilanka Ringwald if( cptr->volume > 63 )
1244a4cd9b30SMilanka Ringwald cptr->volume = 63;
1245a4cd9b30SMilanka Ringwald }
1246a4cd9b30SMilanka Ringwald else
1247a4cd9b30SMilanka Ringwald {
12488201da88SMatthias Ringwald cptr->volume -= ( cptr->volumeslide & 0x0F );
1249a4cd9b30SMilanka Ringwald
1250a4cd9b30SMilanka Ringwald if( cptr->volume > 63 )
1251a4cd9b30SMilanka Ringwald cptr->volume = 0;
1252a4cd9b30SMilanka Ringwald }
12538201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
12548201da88SMatthias Ringwald cptr->volume_table = modctx->volume_selection_table[cptr->volume];
12558201da88SMatthias Ringwald #endif
1256a4cd9b30SMilanka Ringwald }
1257a4cd9b30SMilanka Ringwald break;
1258a4cd9b30SMilanka Ringwald
1259a4cd9b30SMilanka Ringwald case EFFECT_VOLSLIDE_VIBRATO:
1260a4cd9b30SMilanka Ringwald case EFFECT_VIBRATO:
1261a4cd9b30SMilanka Ringwald
1262a4cd9b30SMilanka Ringwald cptr->vibraperiod = ( (cptr->vibraparam&0xF) * sintable[cptr->vibrapointeur&0x1F] )>>7;
1263a4cd9b30SMilanka Ringwald
1264a4cd9b30SMilanka Ringwald if( cptr->vibrapointeur > 31 )
1265a4cd9b30SMilanka Ringwald cptr->vibraperiod = -cptr->vibraperiod;
1266a4cd9b30SMilanka Ringwald
12678201da88SMatthias Ringwald cptr->vibrapointeur = ( cptr->vibrapointeur + ( ( cptr->vibraparam>>4 ) & 0x0F) ) & 0x3F;
1268a4cd9b30SMilanka Ringwald
1269a4cd9b30SMilanka Ringwald if( cptr->effect == EFFECT_VOLSLIDE_VIBRATO )
1270a4cd9b30SMilanka Ringwald {
12718201da88SMatthias Ringwald if( cptr->volumeslide & 0xF0 )
1272a4cd9b30SMilanka Ringwald {
1273a4cd9b30SMilanka Ringwald cptr->volume += ( cptr->volumeslide >> 4 );
1274a4cd9b30SMilanka Ringwald
1275a4cd9b30SMilanka Ringwald if( cptr->volume > 64 )
1276a4cd9b30SMilanka Ringwald cptr->volume = 64;
1277a4cd9b30SMilanka Ringwald }
1278a4cd9b30SMilanka Ringwald else
1279a4cd9b30SMilanka Ringwald {
12808201da88SMatthias Ringwald cptr->volume -= cptr->volumeslide;
1281a4cd9b30SMilanka Ringwald
1282a4cd9b30SMilanka Ringwald if( cptr->volume > 64 )
1283a4cd9b30SMilanka Ringwald cptr->volume = 0;
1284a4cd9b30SMilanka Ringwald }
12858201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
12868201da88SMatthias Ringwald cptr->volume_table = modctx->volume_selection_table[cptr->volume];
12878201da88SMatthias Ringwald #endif
12888201da88SMatthias Ringwald }
12898201da88SMatthias Ringwald
1290a4cd9b30SMilanka Ringwald break;
1291a4cd9b30SMilanka Ringwald
12928201da88SMatthias Ringwald case EFFECT_VOLUME_SLIDE:
12938201da88SMatthias Ringwald
12948201da88SMatthias Ringwald if( cptr->volumeslide & 0xF0 )
12958201da88SMatthias Ringwald {
12968201da88SMatthias Ringwald cptr->volume += ( cptr->volumeslide >> 4 );
12978201da88SMatthias Ringwald
12988201da88SMatthias Ringwald if( cptr->volume > 64 )
12998201da88SMatthias Ringwald cptr->volume = 64;
13008201da88SMatthias Ringwald }
13018201da88SMatthias Ringwald else
13028201da88SMatthias Ringwald {
13038201da88SMatthias Ringwald cptr->volume -= cptr->volumeslide;
13048201da88SMatthias Ringwald
13058201da88SMatthias Ringwald if( cptr->volume > 64 )
13068201da88SMatthias Ringwald cptr->volume = 0;
13078201da88SMatthias Ringwald }
13088201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
13098201da88SMatthias Ringwald cptr->volume_table = modctx->volume_selection_table[cptr->volume];
13108201da88SMatthias Ringwald #endif
13118201da88SMatthias Ringwald break;
13128201da88SMatthias Ringwald
13138201da88SMatthias Ringwald case EFFECT_EXTENDED:
13148201da88SMatthias Ringwald switch( cptr->parameffect >> 4 )
13158201da88SMatthias Ringwald {
13168201da88SMatthias Ringwald
1317a4cd9b30SMilanka Ringwald case EFFECT_E_NOTE_CUT:
1318a4cd9b30SMilanka Ringwald if( cptr->cut_param )
1319a4cd9b30SMilanka Ringwald cptr->cut_param--;
1320a4cd9b30SMilanka Ringwald
1321a4cd9b30SMilanka Ringwald if( !cptr->cut_param )
13228201da88SMatthias Ringwald {
1323a4cd9b30SMilanka Ringwald cptr->volume = 0;
13248201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
13258201da88SMatthias Ringwald cptr->volume_table = modctx->volume_selection_table[cptr->volume];
13268201da88SMatthias Ringwald #endif
13278201da88SMatthias Ringwald }
13288201da88SMatthias Ringwald break;
13298201da88SMatthias Ringwald
13308201da88SMatthias Ringwald case EFFECT_E_RETRIGGER_NOTE:
13318201da88SMatthias Ringwald cptr->retrig_cnt++;
13328201da88SMatthias Ringwald if( cptr->retrig_cnt >= cptr->retrig_param )
13338201da88SMatthias Ringwald {
13348201da88SMatthias Ringwald cptr->retrig_cnt = 0;
13358201da88SMatthias Ringwald
13368201da88SMatthias Ringwald cptr->sampdata = cptr->lst_sampdata;
13378201da88SMatthias Ringwald cptr->length = cptr->lst_length;
13388201da88SMatthias Ringwald cptr->reppnt = cptr->lst_reppnt;
13398201da88SMatthias Ringwald cptr->replen = cptr->lst_replen;
13408201da88SMatthias Ringwald cptr->samppos = 0;
13418201da88SMatthias Ringwald }
13428201da88SMatthias Ringwald break;
13438201da88SMatthias Ringwald
13448201da88SMatthias Ringwald case EFFECT_E_NOTE_DELAY:
13458201da88SMatthias Ringwald if( cptr->note_delay )
13468201da88SMatthias Ringwald {
13478201da88SMatthias Ringwald if( (unsigned char)( cptr->note_delay - 1 ) == modctx->tick_cnt )
13488201da88SMatthias Ringwald {
13498201da88SMatthias Ringwald cptr->sampdata = cptr->dly_sampdata;
13508201da88SMatthias Ringwald cptr->length = cptr->dly_length;
13518201da88SMatthias Ringwald cptr->reppnt = cptr->dly_reppnt;
13528201da88SMatthias Ringwald cptr->replen = cptr->dly_replen;
13538201da88SMatthias Ringwald
13548201da88SMatthias Ringwald cptr->lst_sampdata = cptr->sampdata;
13558201da88SMatthias Ringwald cptr->lst_length = cptr->length;
13568201da88SMatthias Ringwald cptr->lst_reppnt = cptr->reppnt;
13578201da88SMatthias Ringwald cptr->lst_replen = cptr->replen;
13588201da88SMatthias Ringwald cptr->note_delay = 0;
13598201da88SMatthias Ringwald }
13608201da88SMatthias Ringwald }
13618201da88SMatthias Ringwald break;
13628201da88SMatthias Ringwald default:
13638201da88SMatthias Ringwald break;
13648201da88SMatthias Ringwald }
1365a4cd9b30SMilanka Ringwald break;
1366a4cd9b30SMilanka Ringwald
1367a4cd9b30SMilanka Ringwald default:
1368a4cd9b30SMilanka Ringwald break;
1369a4cd9b30SMilanka Ringwald
1370a4cd9b30SMilanka Ringwald }
1371a4cd9b30SMilanka Ringwald
1372a4cd9b30SMilanka Ringwald }
1373a4cd9b30SMilanka Ringwald
1374a4cd9b30SMilanka Ringwald ///////////////////////////////////////////////////////////////////////////////////
hxcmod_init(modcontext * modctx)1375a4cd9b30SMilanka Ringwald int hxcmod_init(modcontext * modctx)
1376a4cd9b30SMilanka Ringwald {
13778201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
13788201da88SMatthias Ringwald muint c;
13798201da88SMatthias Ringwald mint i,j;
13808201da88SMatthias Ringwald #endif
1381a4cd9b30SMilanka Ringwald if( modctx )
1382a4cd9b30SMilanka Ringwald {
1383a4cd9b30SMilanka Ringwald memclear(modctx,0,sizeof(modcontext));
1384a4cd9b30SMilanka Ringwald modctx->playrate = 44100;
1385a4cd9b30SMilanka Ringwald modctx->stereo = 1;
1386a4cd9b30SMilanka Ringwald modctx->stereo_separation = 1;
1387a4cd9b30SMilanka Ringwald modctx->bits = 16;
1388a4cd9b30SMilanka Ringwald modctx->filter = 1;
1389a4cd9b30SMilanka Ringwald
13908201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
13918201da88SMatthias Ringwald c = 0;
13928201da88SMatthias Ringwald for(i=0;i<65;i++)
1393a4cd9b30SMilanka Ringwald {
13948201da88SMatthias Ringwald for(j=-128;j<128;j++)
1395a4cd9b30SMilanka Ringwald {
13968201da88SMatthias Ringwald modctx->precalc_volume_array[c] = i * j;
13978201da88SMatthias Ringwald c++;
1398a4cd9b30SMilanka Ringwald }
13998201da88SMatthias Ringwald
14008201da88SMatthias Ringwald modctx->volume_selection_table[i] = &modctx->precalc_volume_array[(i*256) + 128];
1401a4cd9b30SMilanka Ringwald }
14028201da88SMatthias Ringwald #endif
1403a4cd9b30SMilanka Ringwald
1404a4cd9b30SMilanka Ringwald return 1;
1405a4cd9b30SMilanka Ringwald }
1406a4cd9b30SMilanka Ringwald
1407a4cd9b30SMilanka Ringwald return 0;
1408a4cd9b30SMilanka Ringwald }
1409a4cd9b30SMilanka Ringwald
hxcmod_setcfg(modcontext * modctx,int samplerate,int stereo_separation,int filter)14108201da88SMatthias Ringwald int hxcmod_setcfg(modcontext * modctx, int samplerate, int stereo_separation, int filter)
1411a4cd9b30SMilanka Ringwald {
1412a4cd9b30SMilanka Ringwald if( modctx )
1413a4cd9b30SMilanka Ringwald {
1414a4cd9b30SMilanka Ringwald modctx->playrate = samplerate;
1415a4cd9b30SMilanka Ringwald
1416a4cd9b30SMilanka Ringwald if(stereo_separation < 4)
1417a4cd9b30SMilanka Ringwald {
1418a4cd9b30SMilanka Ringwald modctx->stereo_separation = stereo_separation;
1419a4cd9b30SMilanka Ringwald }
1420a4cd9b30SMilanka Ringwald
1421a4cd9b30SMilanka Ringwald if( filter )
1422a4cd9b30SMilanka Ringwald modctx->filter = 1;
1423a4cd9b30SMilanka Ringwald else
1424a4cd9b30SMilanka Ringwald modctx->filter = 0;
1425a4cd9b30SMilanka Ringwald
1426a4cd9b30SMilanka Ringwald return 1;
1427a4cd9b30SMilanka Ringwald }
1428a4cd9b30SMilanka Ringwald
1429a4cd9b30SMilanka Ringwald return 0;
1430a4cd9b30SMilanka Ringwald }
1431a4cd9b30SMilanka Ringwald
hxcmod_load(modcontext * modctx,void * mod_data,int mod_data_size)1432a4cd9b30SMilanka Ringwald int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
1433a4cd9b30SMilanka Ringwald {
14348201da88SMatthias Ringwald muint i, j, max, digitfactor;
1435a4cd9b30SMilanka Ringwald sample *sptr;
1436a4cd9b30SMilanka Ringwald unsigned char * modmemory,* endmodmemory;
1437a4cd9b30SMilanka Ringwald
1438a4cd9b30SMilanka Ringwald modmemory = (unsigned char *)mod_data;
1439a4cd9b30SMilanka Ringwald endmodmemory = modmemory + mod_data_size;
1440a4cd9b30SMilanka Ringwald
1441a4cd9b30SMilanka Ringwald if( modmemory )
1442a4cd9b30SMilanka Ringwald {
1443a4cd9b30SMilanka Ringwald if( modctx )
1444a4cd9b30SMilanka Ringwald {
14458201da88SMatthias Ringwald #ifdef FULL_STATE
14468201da88SMatthias Ringwald memclear(&(modctx->effects_event_counts),0,sizeof(modctx->effects_event_counts));
14478201da88SMatthias Ringwald #endif
14488201da88SMatthias Ringwald memcopy(&(modctx->song),modmemory,1084);
1449a4cd9b30SMilanka Ringwald
1450a4cd9b30SMilanka Ringwald i = 0;
1451a4cd9b30SMilanka Ringwald modctx->number_of_channels = 0;
14528201da88SMatthias Ringwald while(modlist[i].numberofchannels && !modctx->number_of_channels)
1453a4cd9b30SMilanka Ringwald {
14548201da88SMatthias Ringwald digitfactor = 0;
14558201da88SMatthias Ringwald
14568201da88SMatthias Ringwald j = 0;
14578201da88SMatthias Ringwald while( j < 4 )
1458a4cd9b30SMilanka Ringwald {
14598201da88SMatthias Ringwald if( modlist[i].signature[j] == '$' )
14608201da88SMatthias Ringwald {
14618201da88SMatthias Ringwald if(digitfactor)
14628201da88SMatthias Ringwald digitfactor *= 10;
14638201da88SMatthias Ringwald else
14648201da88SMatthias Ringwald digitfactor = 1;
14658201da88SMatthias Ringwald }
14668201da88SMatthias Ringwald j++;
14678201da88SMatthias Ringwald }
14688201da88SMatthias Ringwald
14698201da88SMatthias Ringwald modctx->number_of_channels = 0;
14708201da88SMatthias Ringwald
14718201da88SMatthias Ringwald j = 0;
14728201da88SMatthias Ringwald while( j < 4 )
14738201da88SMatthias Ringwald {
14748201da88SMatthias Ringwald if( (modlist[i].signature[j] == modctx->song.signature[j]) || modlist[i].signature[j] == '$' )
14758201da88SMatthias Ringwald {
14768201da88SMatthias Ringwald if( modlist[i].signature[j] == '$' )
14778201da88SMatthias Ringwald {
14788201da88SMatthias Ringwald if(modctx->song.signature[j] >= '0' && modctx->song.signature[j] <= '9')
14798201da88SMatthias Ringwald {
14808201da88SMatthias Ringwald modctx->number_of_channels += (modctx->song.signature[j] - '0') * digitfactor;
14818201da88SMatthias Ringwald digitfactor /= 10;
14828201da88SMatthias Ringwald }
14838201da88SMatthias Ringwald else
14848201da88SMatthias Ringwald {
14858201da88SMatthias Ringwald modctx->number_of_channels = 0;
14868201da88SMatthias Ringwald break;
14878201da88SMatthias Ringwald }
14888201da88SMatthias Ringwald }
14898201da88SMatthias Ringwald j++;
14908201da88SMatthias Ringwald }
14918201da88SMatthias Ringwald else
14928201da88SMatthias Ringwald {
14938201da88SMatthias Ringwald modctx->number_of_channels = 0;
14948201da88SMatthias Ringwald break;
14958201da88SMatthias Ringwald }
14968201da88SMatthias Ringwald }
14978201da88SMatthias Ringwald
14988201da88SMatthias Ringwald if( j == 4 )
14998201da88SMatthias Ringwald {
15008201da88SMatthias Ringwald if(!modctx->number_of_channels)
1501a4cd9b30SMilanka Ringwald modctx->number_of_channels = modlist[i].numberofchannels;
1502a4cd9b30SMilanka Ringwald }
1503a4cd9b30SMilanka Ringwald
1504a4cd9b30SMilanka Ringwald i++;
1505a4cd9b30SMilanka Ringwald }
1506a4cd9b30SMilanka Ringwald
1507a4cd9b30SMilanka Ringwald if( !modctx->number_of_channels )
1508a4cd9b30SMilanka Ringwald {
1509a4cd9b30SMilanka Ringwald // 15 Samples modules support
1510a4cd9b30SMilanka Ringwald // Shift the whole datas to make it look likes a standard 4 channels mod.
15118201da88SMatthias Ringwald memcopy(&(modctx->song.signature), "M.K.", 4);
1512a4cd9b30SMilanka Ringwald memcopy(&(modctx->song.length), &(modctx->song.samples[15]), 130);
1513a4cd9b30SMilanka Ringwald memclear(&(modctx->song.samples[15]), 0, 480);
1514a4cd9b30SMilanka Ringwald modmemory += 600;
1515a4cd9b30SMilanka Ringwald modctx->number_of_channels = 4;
1516a4cd9b30SMilanka Ringwald }
1517a4cd9b30SMilanka Ringwald else
1518a4cd9b30SMilanka Ringwald {
1519a4cd9b30SMilanka Ringwald modmemory += 1084;
1520a4cd9b30SMilanka Ringwald }
1521a4cd9b30SMilanka Ringwald
15228201da88SMatthias Ringwald if( modctx->number_of_channels > NUMMAXCHANNELS )
15238201da88SMatthias Ringwald return 0; // Too much channels ! - Increase/define HXCMOD_MAXCHANNELS !
15248201da88SMatthias Ringwald
1525a4cd9b30SMilanka Ringwald if( modmemory >= endmodmemory )
1526a4cd9b30SMilanka Ringwald return 0; // End passed ? - Probably a bad file !
1527a4cd9b30SMilanka Ringwald
1528a4cd9b30SMilanka Ringwald // Patterns loading
1529a4cd9b30SMilanka Ringwald for (i = max = 0; i < 128; i++)
1530a4cd9b30SMilanka Ringwald {
1531a4cd9b30SMilanka Ringwald while (max <= modctx->song.patterntable[i])
1532a4cd9b30SMilanka Ringwald {
1533a4cd9b30SMilanka Ringwald modctx->patterndata[max] = (note*)modmemory;
1534a4cd9b30SMilanka Ringwald modmemory += (256*modctx->number_of_channels);
1535a4cd9b30SMilanka Ringwald max++;
1536a4cd9b30SMilanka Ringwald
1537a4cd9b30SMilanka Ringwald if( modmemory >= endmodmemory )
1538a4cd9b30SMilanka Ringwald return 0; // End passed ? - Probably a bad file !
1539a4cd9b30SMilanka Ringwald }
1540a4cd9b30SMilanka Ringwald }
1541a4cd9b30SMilanka Ringwald
1542a4cd9b30SMilanka Ringwald for (i = 0; i < 31; i++)
1543a4cd9b30SMilanka Ringwald modctx->sampledata[i]=0;
1544a4cd9b30SMilanka Ringwald
1545a4cd9b30SMilanka Ringwald // Samples loading
1546a4cd9b30SMilanka Ringwald for (i = 0, sptr = modctx->song.samples; i <31; i++, sptr++)
1547a4cd9b30SMilanka Ringwald {
1548a4cd9b30SMilanka Ringwald if (sptr->length == 0) continue;
1549a4cd9b30SMilanka Ringwald
1550afc6fe18SMatthias Ringwald modctx->sampledata[i] = (mchar*)modmemory;
15518201da88SMatthias Ringwald modmemory += (GET_BGI_W(sptr->length)*2);
1552a4cd9b30SMilanka Ringwald
15538201da88SMatthias Ringwald if (GET_BGI_W(sptr->replen) + GET_BGI_W(sptr->reppnt) > GET_BGI_W(sptr->length))
15548201da88SMatthias Ringwald sptr->replen = GET_BGI_W((GET_BGI_W(sptr->length) - GET_BGI_W(sptr->reppnt)));
1555a4cd9b30SMilanka Ringwald
1556a4cd9b30SMilanka Ringwald if( modmemory > endmodmemory )
1557a4cd9b30SMilanka Ringwald return 0; // End passed ? - Probably a bad file !
1558a4cd9b30SMilanka Ringwald }
1559a4cd9b30SMilanka Ringwald
1560a4cd9b30SMilanka Ringwald // States init
1561a4cd9b30SMilanka Ringwald
1562a4cd9b30SMilanka Ringwald modctx->tablepos = 0;
1563a4cd9b30SMilanka Ringwald modctx->patternpos = 0;
1564a4cd9b30SMilanka Ringwald modctx->song.speed = 6;
1565a4cd9b30SMilanka Ringwald modctx->bpm = 125;
1566a4cd9b30SMilanka Ringwald
15678201da88SMatthias Ringwald #ifdef HXCMOD_16BITS_TARGET
15688201da88SMatthias Ringwald // song.speed = 1 <> 31
15698201da88SMatthias Ringwald // playrate = 8000 <> 22050
15708201da88SMatthias Ringwald // bpm = 32 <> 255
1571a4cd9b30SMilanka Ringwald
15728201da88SMatthias Ringwald modctx->patternticksem = (muint)( ( (mulong)modctx->playrate * 5 ) / ( (muint)modctx->bpm * 2 ) );
15738201da88SMatthias Ringwald #else
15748201da88SMatthias Ringwald // song.speed = 1 <> 31
15758201da88SMatthias Ringwald // playrate = 8000 <> 96000
15768201da88SMatthias Ringwald // bpm = 32 <> 255
15778201da88SMatthias Ringwald
15788201da88SMatthias Ringwald modctx->patternticksem = ( ( modctx->playrate * 5 ) / ( (mulong)modctx->bpm * 2 ) );
15798201da88SMatthias Ringwald #endif
15808201da88SMatthias Ringwald modctx->patternticksaim = modctx->song.speed * modctx->patternticksem;
15818201da88SMatthias Ringwald
15828201da88SMatthias Ringwald modctx->patternticks = modctx->patternticksaim + 1;
15838201da88SMatthias Ringwald
15848201da88SMatthias Ringwald modctx->sampleticksconst = ((3546894UL * 16) / modctx->playrate) << 6; //8448*428/playrate;
1585a4cd9b30SMilanka Ringwald
1586a4cd9b30SMilanka Ringwald for(i=0; i < modctx->number_of_channels; i++)
1587a4cd9b30SMilanka Ringwald {
1588a4cd9b30SMilanka Ringwald modctx->channels[i].volume = 0;
1589a4cd9b30SMilanka Ringwald modctx->channels[i].period = 0;
15908201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
15918201da88SMatthias Ringwald modctx->channels[i].volume_table = modctx->volume_selection_table[0];
15928201da88SMatthias Ringwald #endif
1593a4cd9b30SMilanka Ringwald }
1594a4cd9b30SMilanka Ringwald
1595a4cd9b30SMilanka Ringwald modctx->mod_loaded = 1;
1596a4cd9b30SMilanka Ringwald
1597a4cd9b30SMilanka Ringwald return 1;
1598a4cd9b30SMilanka Ringwald }
1599a4cd9b30SMilanka Ringwald }
1600a4cd9b30SMilanka Ringwald
1601a4cd9b30SMilanka Ringwald return 0;
1602a4cd9b30SMilanka Ringwald }
1603a4cd9b30SMilanka Ringwald
hxcmod_fillbuffer(modcontext * modctx,msample * outbuffer,mssize nbsample,tracker_buffer_state * trkbuf)16048201da88SMatthias Ringwald void hxcmod_fillbuffer(modcontext * modctx, msample * outbuffer, mssize nbsample, tracker_buffer_state * trkbuf)
1605a4cd9b30SMilanka Ringwald {
16068201da88SMatthias Ringwald mssize i;
16078201da88SMatthias Ringwald muint j;
16088201da88SMatthias Ringwald muint c;
16098201da88SMatthias Ringwald
1610a4cd9b30SMilanka Ringwald unsigned long k;
1611a4cd9b30SMilanka Ringwald unsigned int state_remaining_steps;
16128201da88SMatthias Ringwald
16138201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
16148201da88SMatthias Ringwald #ifndef HXCMOD_MONO_OUTPUT
16158201da88SMatthias Ringwald int ll,tl;
16168201da88SMatthias Ringwald #endif
16178201da88SMatthias Ringwald int lr,tr;
16188201da88SMatthias Ringwald #endif
16198201da88SMatthias Ringwald
16208201da88SMatthias Ringwald #ifndef HXCMOD_MONO_OUTPUT
16218201da88SMatthias Ringwald int l;
16228201da88SMatthias Ringwald #endif
16238201da88SMatthias Ringwald int r;
16248201da88SMatthias Ringwald
1625a4cd9b30SMilanka Ringwald short finalperiod;
1626a4cd9b30SMilanka Ringwald note *nptr;
1627*b7454a87SMatthias Ringwald hxcmod_channel_t *cptr;
1628a4cd9b30SMilanka Ringwald
1629a4cd9b30SMilanka Ringwald if( modctx && outbuffer )
1630a4cd9b30SMilanka Ringwald {
1631a4cd9b30SMilanka Ringwald if(modctx->mod_loaded)
1632a4cd9b30SMilanka Ringwald {
1633a4cd9b30SMilanka Ringwald state_remaining_steps = 0;
1634a4cd9b30SMilanka Ringwald
16358201da88SMatthias Ringwald #ifdef HXCMOD_STATE_REPORT_SUPPORT
1636a4cd9b30SMilanka Ringwald if( trkbuf )
1637a4cd9b30SMilanka Ringwald {
1638a4cd9b30SMilanka Ringwald trkbuf->cur_rd_index = 0;
1639a4cd9b30SMilanka Ringwald
1640a4cd9b30SMilanka Ringwald memcopy(trkbuf->name,modctx->song.title,sizeof(modctx->song.title));
1641a4cd9b30SMilanka Ringwald
1642a4cd9b30SMilanka Ringwald for(i=0;i<31;i++)
1643a4cd9b30SMilanka Ringwald {
1644a4cd9b30SMilanka Ringwald memcopy(trkbuf->instruments[i].name,modctx->song.samples[i].name,sizeof(trkbuf->instruments[i].name));
1645a4cd9b30SMilanka Ringwald }
1646a4cd9b30SMilanka Ringwald }
16478201da88SMatthias Ringwald #endif
1648a4cd9b30SMilanka Ringwald
16498201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
16508201da88SMatthias Ringwald #ifndef HXCMOD_MONO_OUTPUT
1651a4cd9b30SMilanka Ringwald ll = modctx->last_l_sample;
16528201da88SMatthias Ringwald #endif
1653a4cd9b30SMilanka Ringwald lr = modctx->last_r_sample;
16548201da88SMatthias Ringwald #endif
1655a4cd9b30SMilanka Ringwald
1656a4cd9b30SMilanka Ringwald for (i = 0; i < nbsample; i++)
1657a4cd9b30SMilanka Ringwald {
1658a4cd9b30SMilanka Ringwald //---------------------------------------
1659a4cd9b30SMilanka Ringwald if( modctx->patternticks++ > modctx->patternticksaim )
1660a4cd9b30SMilanka Ringwald {
1661a4cd9b30SMilanka Ringwald if( !modctx->patterndelay )
1662a4cd9b30SMilanka Ringwald {
1663a4cd9b30SMilanka Ringwald nptr = modctx->patterndata[modctx->song.patterntable[modctx->tablepos]];
1664a4cd9b30SMilanka Ringwald nptr = nptr + modctx->patternpos;
1665a4cd9b30SMilanka Ringwald cptr = modctx->channels;
1666a4cd9b30SMilanka Ringwald
16678201da88SMatthias Ringwald modctx->tick_cnt = 0;
16688201da88SMatthias Ringwald
1669a4cd9b30SMilanka Ringwald modctx->patternticks = 0;
1670a4cd9b30SMilanka Ringwald modctx->patterntickse = 0;
1671a4cd9b30SMilanka Ringwald
1672a4cd9b30SMilanka Ringwald for(c=0;c<modctx->number_of_channels;c++)
1673a4cd9b30SMilanka Ringwald {
1674*b7454a87SMatthias Ringwald worknote((note*)(nptr), (hxcmod_channel_t*)(cptr),(char)(c+1),modctx);
16758201da88SMatthias Ringwald
16768201da88SMatthias Ringwald if (cptr->period != 0)
16778201da88SMatthias Ringwald {
16788201da88SMatthias Ringwald finalperiod = cptr->period - cptr->decalperiod - cptr->vibraperiod;
16798201da88SMatthias Ringwald if (finalperiod)
16808201da88SMatthias Ringwald {
16818201da88SMatthias Ringwald cptr->sampinc = ((modctx->sampleticksconst) / finalperiod);
16828201da88SMatthias Ringwald }
16838201da88SMatthias Ringwald else
16848201da88SMatthias Ringwald {
16858201da88SMatthias Ringwald cptr->sampinc = 0;
16868201da88SMatthias Ringwald }
16878201da88SMatthias Ringwald }
16888201da88SMatthias Ringwald else
16898201da88SMatthias Ringwald cptr->sampinc = 0;
16908201da88SMatthias Ringwald
16918201da88SMatthias Ringwald nptr++;
16928201da88SMatthias Ringwald cptr++;
1693a4cd9b30SMilanka Ringwald }
1694a4cd9b30SMilanka Ringwald
1695a4cd9b30SMilanka Ringwald if( !modctx->jump_loop_effect )
1696a4cd9b30SMilanka Ringwald modctx->patternpos += modctx->number_of_channels;
1697a4cd9b30SMilanka Ringwald else
1698a4cd9b30SMilanka Ringwald modctx->jump_loop_effect = 0;
1699a4cd9b30SMilanka Ringwald
1700a4cd9b30SMilanka Ringwald if( modctx->patternpos == 64*modctx->number_of_channels )
1701a4cd9b30SMilanka Ringwald {
1702a4cd9b30SMilanka Ringwald modctx->tablepos++;
1703a4cd9b30SMilanka Ringwald modctx->patternpos = 0;
1704a4cd9b30SMilanka Ringwald if(modctx->tablepos >= modctx->song.length)
1705a4cd9b30SMilanka Ringwald modctx->tablepos = 0;
1706a4cd9b30SMilanka Ringwald }
1707a4cd9b30SMilanka Ringwald }
1708a4cd9b30SMilanka Ringwald else
1709a4cd9b30SMilanka Ringwald {
1710a4cd9b30SMilanka Ringwald modctx->patterndelay--;
1711a4cd9b30SMilanka Ringwald modctx->patternticks = 0;
1712a4cd9b30SMilanka Ringwald modctx->patterntickse = 0;
17138201da88SMatthias Ringwald modctx->tick_cnt = 0;
1714a4cd9b30SMilanka Ringwald }
1715a4cd9b30SMilanka Ringwald
1716a4cd9b30SMilanka Ringwald }
1717a4cd9b30SMilanka Ringwald
17188201da88SMatthias Ringwald if (modctx->patterntickse++ > modctx->patternticksem)
1719a4cd9b30SMilanka Ringwald {
1720a4cd9b30SMilanka Ringwald nptr = modctx->patterndata[modctx->song.patterntable[modctx->tablepos]];
1721a4cd9b30SMilanka Ringwald nptr = nptr + modctx->patternpos;
1722a4cd9b30SMilanka Ringwald cptr = modctx->channels;
1723a4cd9b30SMilanka Ringwald
1724a4cd9b30SMilanka Ringwald for(c=0;c<modctx->number_of_channels;c++)
1725a4cd9b30SMilanka Ringwald {
17268201da88SMatthias Ringwald workeffect( modctx, nptr, cptr );
17278201da88SMatthias Ringwald
17288201da88SMatthias Ringwald if (cptr->period != 0)
17298201da88SMatthias Ringwald {
17308201da88SMatthias Ringwald finalperiod = cptr->period - cptr->decalperiod - cptr->vibraperiod;
17318201da88SMatthias Ringwald if (finalperiod)
17328201da88SMatthias Ringwald {
17338201da88SMatthias Ringwald cptr->sampinc = ((modctx->sampleticksconst) / finalperiod);
17348201da88SMatthias Ringwald }
17358201da88SMatthias Ringwald else
17368201da88SMatthias Ringwald {
17378201da88SMatthias Ringwald cptr->sampinc = 0;
17388201da88SMatthias Ringwald }
17398201da88SMatthias Ringwald }
17408201da88SMatthias Ringwald else
17418201da88SMatthias Ringwald cptr->sampinc = 0;
17428201da88SMatthias Ringwald
17438201da88SMatthias Ringwald nptr++;
17448201da88SMatthias Ringwald cptr++;
1745a4cd9b30SMilanka Ringwald }
1746a4cd9b30SMilanka Ringwald
17478201da88SMatthias Ringwald modctx->tick_cnt++;
1748a4cd9b30SMilanka Ringwald modctx->patterntickse = 0;
1749a4cd9b30SMilanka Ringwald }
1750a4cd9b30SMilanka Ringwald
1751a4cd9b30SMilanka Ringwald //---------------------------------------
1752a4cd9b30SMilanka Ringwald
17538201da88SMatthias Ringwald #ifdef HXCMOD_STATE_REPORT_SUPPORT
1754a4cd9b30SMilanka Ringwald if( trkbuf && !state_remaining_steps )
1755a4cd9b30SMilanka Ringwald {
1756a4cd9b30SMilanka Ringwald if( trkbuf->nb_of_state < trkbuf->nb_max_of_state )
1757a4cd9b30SMilanka Ringwald {
1758a4cd9b30SMilanka Ringwald memclear(&trkbuf->track_state_buf[trkbuf->nb_of_state],0,sizeof(tracker_state));
1759a4cd9b30SMilanka Ringwald }
1760a4cd9b30SMilanka Ringwald }
17618201da88SMatthias Ringwald #endif
1762a4cd9b30SMilanka Ringwald
17638201da88SMatthias Ringwald #ifndef HXCMOD_MONO_OUTPUT
1764a4cd9b30SMilanka Ringwald l=0;
17658201da88SMatthias Ringwald #endif
1766a4cd9b30SMilanka Ringwald r=0;
1767a4cd9b30SMilanka Ringwald
1768a4cd9b30SMilanka Ringwald for( j = 0, cptr = modctx->channels; j < modctx->number_of_channels ; j++, cptr++)
1769a4cd9b30SMilanka Ringwald {
1770a4cd9b30SMilanka Ringwald if( cptr->period != 0 )
1771a4cd9b30SMilanka Ringwald {
17728201da88SMatthias Ringwald cptr->samppos += cptr->sampinc;
1773a4cd9b30SMilanka Ringwald
17748201da88SMatthias Ringwald if( cptr->replen < 2 )
1775a4cd9b30SMilanka Ringwald {
17768201da88SMatthias Ringwald if( ( cptr->samppos >> 11) >= cptr->length )
1777a4cd9b30SMilanka Ringwald {
1778a4cd9b30SMilanka Ringwald cptr->length = 0;
1779a4cd9b30SMilanka Ringwald cptr->reppnt = 0;
1780a4cd9b30SMilanka Ringwald
17818201da88SMatthias Ringwald if(cptr->update_nxt_repeat)
17828201da88SMatthias Ringwald {
17838201da88SMatthias Ringwald cptr->replen = cptr->nxt_replen;
17848201da88SMatthias Ringwald cptr->reppnt = cptr->nxt_reppnt;
17858201da88SMatthias Ringwald cptr->sampdata = cptr->nxt_sampdata;
17868201da88SMatthias Ringwald cptr->length = cptr->nxt_length;
17878201da88SMatthias Ringwald
17888201da88SMatthias Ringwald cptr->lst_sampdata = cptr->sampdata;
17898201da88SMatthias Ringwald cptr->lst_length = cptr->length;
17908201da88SMatthias Ringwald cptr->lst_reppnt = cptr->reppnt;
17918201da88SMatthias Ringwald cptr->lst_replen = cptr->replen;
17928201da88SMatthias Ringwald
17938201da88SMatthias Ringwald cptr->update_nxt_repeat = 0;
17948201da88SMatthias Ringwald }
17958201da88SMatthias Ringwald
1796a4cd9b30SMilanka Ringwald if( cptr->length )
17978201da88SMatthias Ringwald cptr->samppos = cptr->samppos % (((unsigned long)cptr->length)<<11);
1798a4cd9b30SMilanka Ringwald else
1799a4cd9b30SMilanka Ringwald cptr->samppos = 0;
1800a4cd9b30SMilanka Ringwald }
1801a4cd9b30SMilanka Ringwald }
1802a4cd9b30SMilanka Ringwald else
1803a4cd9b30SMilanka Ringwald {
18048201da88SMatthias Ringwald if( ( cptr->samppos >> 11 ) >= (unsigned long)(cptr->replen+cptr->reppnt) )
1805a4cd9b30SMilanka Ringwald {
18068201da88SMatthias Ringwald if( cptr->update_nxt_repeat )
18078201da88SMatthias Ringwald {
18088201da88SMatthias Ringwald cptr->replen = cptr->nxt_replen;
18098201da88SMatthias Ringwald cptr->reppnt = cptr->nxt_reppnt;
18108201da88SMatthias Ringwald cptr->sampdata = cptr->nxt_sampdata;
18118201da88SMatthias Ringwald cptr->length = cptr->nxt_length;
18128201da88SMatthias Ringwald
18138201da88SMatthias Ringwald cptr->lst_sampdata = cptr->sampdata;
18148201da88SMatthias Ringwald cptr->lst_length = cptr->length;
18158201da88SMatthias Ringwald cptr->lst_reppnt = cptr->reppnt;
18168201da88SMatthias Ringwald cptr->lst_replen = cptr->replen;
18178201da88SMatthias Ringwald
18188201da88SMatthias Ringwald cptr->update_nxt_repeat = 0;
18198201da88SMatthias Ringwald }
18208201da88SMatthias Ringwald
18218201da88SMatthias Ringwald if( cptr->sampdata )
18228201da88SMatthias Ringwald {
18238201da88SMatthias Ringwald cptr->samppos = ((unsigned long)(cptr->reppnt)<<11) + (cptr->samppos % ((unsigned long)(cptr->replen+cptr->reppnt)<<11));
18248201da88SMatthias Ringwald }
1825a4cd9b30SMilanka Ringwald }
1826a4cd9b30SMilanka Ringwald }
1827a4cd9b30SMilanka Ringwald
1828a4cd9b30SMilanka Ringwald k = cptr->samppos >> 10;
1829a4cd9b30SMilanka Ringwald
18308201da88SMatthias Ringwald #ifdef HXCMOD_MONO_OUTPUT
18318201da88SMatthias Ringwald if( cptr->sampdata!=0 )
1832a4cd9b30SMilanka Ringwald {
18338201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
18348201da88SMatthias Ringwald r += cptr->volume_table[cptr->sampdata[k]];
18358201da88SMatthias Ringwald #else
1836a4cd9b30SMilanka Ringwald r += ( cptr->sampdata[k] * cptr->volume );
18378201da88SMatthias Ringwald #endif
1838a4cd9b30SMilanka Ringwald }
18398201da88SMatthias Ringwald #else
18408201da88SMatthias Ringwald if (cptr->sampdata != 0)
1841a4cd9b30SMilanka Ringwald {
18428201da88SMatthias Ringwald if ( !(j & 3) || ((j & 3) == 3) )
18438201da88SMatthias Ringwald {
18448201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
18458201da88SMatthias Ringwald l += cptr->volume_table[cptr->sampdata[k]];
18468201da88SMatthias Ringwald #else
1847a4cd9b30SMilanka Ringwald l += (cptr->sampdata[k] * cptr->volume);
18488201da88SMatthias Ringwald #endif
1849a4cd9b30SMilanka Ringwald }
18508201da88SMatthias Ringwald else
18518201da88SMatthias Ringwald {
18528201da88SMatthias Ringwald #ifdef HXCMOD_USE_PRECALC_VOLUME_TABLE
18538201da88SMatthias Ringwald r += cptr->volume_table[cptr->sampdata[k]];
18548201da88SMatthias Ringwald #else
18558201da88SMatthias Ringwald r += (cptr->sampdata[k] * cptr->volume);
18568201da88SMatthias Ringwald #endif
18578201da88SMatthias Ringwald }
18588201da88SMatthias Ringwald }
18598201da88SMatthias Ringwald #endif
1860a4cd9b30SMilanka Ringwald
18618201da88SMatthias Ringwald #ifdef HXCMOD_STATE_REPORT_SUPPORT
1862a4cd9b30SMilanka Ringwald if( trkbuf && !state_remaining_steps )
1863a4cd9b30SMilanka Ringwald {
1864a4cd9b30SMilanka Ringwald if( trkbuf->nb_of_state < trkbuf->nb_max_of_state )
1865a4cd9b30SMilanka Ringwald {
1866a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].number_of_tracks = modctx->number_of_channels;
1867a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].buf_index = i;
1868a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern = modctx->song.patterntable[modctx->tablepos];
1869a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern_pos = modctx->patternpos / modctx->number_of_channels;
1870a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].cur_pattern_table_pos = modctx->tablepos;
1871a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].bpm = modctx->bpm;
1872a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].speed = modctx->song.speed;
1873a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_effect = cptr->effect_code;
1874a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_parameffect = cptr->parameffect;
18758201da88SMatthias Ringwald if(cptr->sampinc)
18768201da88SMatthias Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_period = (muint)(modctx->sampleticksconst / cptr->sampinc);
18778201da88SMatthias Ringwald else
18788201da88SMatthias Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_period = 0;
1879a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].cur_volume = cptr->volume;
1880a4cd9b30SMilanka Ringwald trkbuf->track_state_buf[trkbuf->nb_of_state].tracks[j].instrument_number = (unsigned char)cptr->sampnum;
1881a4cd9b30SMilanka Ringwald }
1882a4cd9b30SMilanka Ringwald }
18838201da88SMatthias Ringwald #endif
1884a4cd9b30SMilanka Ringwald }
1885a4cd9b30SMilanka Ringwald }
1886a4cd9b30SMilanka Ringwald
18878201da88SMatthias Ringwald #ifdef HXCMOD_STATE_REPORT_SUPPORT
1888a4cd9b30SMilanka Ringwald if( trkbuf && !state_remaining_steps )
1889a4cd9b30SMilanka Ringwald {
1890a4cd9b30SMilanka Ringwald state_remaining_steps = trkbuf->sample_step;
1891a4cd9b30SMilanka Ringwald
1892a4cd9b30SMilanka Ringwald if(trkbuf->nb_of_state < trkbuf->nb_max_of_state)
1893a4cd9b30SMilanka Ringwald trkbuf->nb_of_state++;
1894a4cd9b30SMilanka Ringwald }
1895a4cd9b30SMilanka Ringwald else
18968201da88SMatthias Ringwald #endif
1897a4cd9b30SMilanka Ringwald {
1898a4cd9b30SMilanka Ringwald state_remaining_steps--;
1899a4cd9b30SMilanka Ringwald }
1900a4cd9b30SMilanka Ringwald
19018201da88SMatthias Ringwald #ifdef HXCMOD_MONO_OUTPUT
19028201da88SMatthias Ringwald
19038201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
19048201da88SMatthias Ringwald tr = (short)r;
19058201da88SMatthias Ringwald
19068201da88SMatthias Ringwald if ( modctx->filter )
19078201da88SMatthias Ringwald {
19088201da88SMatthias Ringwald // Filter
19098201da88SMatthias Ringwald r = (r+lr)>>1;
19108201da88SMatthias Ringwald }
19118201da88SMatthias Ringwald #endif
19128201da88SMatthias Ringwald
19138201da88SMatthias Ringwald #ifdef HXCMOD_CLIPPING_CHECK
19148201da88SMatthias Ringwald // Level limitation
19158201da88SMatthias Ringwald if( r > 32767 ) r = 32767;
19168201da88SMatthias Ringwald if( r < -32768 ) r = -32768;
19178201da88SMatthias Ringwald #endif
19188201da88SMatthias Ringwald // Store the final sample.
19198201da88SMatthias Ringwald #ifdef HXCMOD_8BITS_OUTPUT
19208201da88SMatthias Ringwald
19218201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT
19228201da88SMatthias Ringwald *outbuffer++ = (r >> 8) + 127;
19238201da88SMatthias Ringwald #else
19248201da88SMatthias Ringwald *outbuffer++ = r >> 8;
19258201da88SMatthias Ringwald #endif
19268201da88SMatthias Ringwald
19278201da88SMatthias Ringwald #else
19288201da88SMatthias Ringwald
19298201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT
19308201da88SMatthias Ringwald *outbuffer++ = r + 32767;
19318201da88SMatthias Ringwald #else
19328201da88SMatthias Ringwald *outbuffer++ = r;
19338201da88SMatthias Ringwald #endif
19348201da88SMatthias Ringwald
19358201da88SMatthias Ringwald #endif
19368201da88SMatthias Ringwald
19378201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
19388201da88SMatthias Ringwald lr = tr;
19398201da88SMatthias Ringwald #endif
19408201da88SMatthias Ringwald
19418201da88SMatthias Ringwald #else
19428201da88SMatthias Ringwald
19438201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
1944a4cd9b30SMilanka Ringwald tl = (short)l;
1945a4cd9b30SMilanka Ringwald tr = (short)r;
1946a4cd9b30SMilanka Ringwald
1947a4cd9b30SMilanka Ringwald if ( modctx->filter )
1948a4cd9b30SMilanka Ringwald {
1949a4cd9b30SMilanka Ringwald // Filter
1950a4cd9b30SMilanka Ringwald l = (l+ll)>>1;
1951a4cd9b30SMilanka Ringwald r = (r+lr)>>1;
1952a4cd9b30SMilanka Ringwald }
19538201da88SMatthias Ringwald #endif
1954a4cd9b30SMilanka Ringwald
19558201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_STEREO_MIX
1956a4cd9b30SMilanka Ringwald if ( modctx->stereo_separation == 1 )
1957a4cd9b30SMilanka Ringwald {
1958a4cd9b30SMilanka Ringwald // Left & Right Stereo panning
1959a4cd9b30SMilanka Ringwald l = (l+(r>>1));
1960a4cd9b30SMilanka Ringwald r = (r+(l>>1));
1961a4cd9b30SMilanka Ringwald }
19628201da88SMatthias Ringwald #endif
1963a4cd9b30SMilanka Ringwald
19648201da88SMatthias Ringwald #ifdef HXCMOD_CLIPPING_CHECK
1965a4cd9b30SMilanka Ringwald // Level limitation
1966a4cd9b30SMilanka Ringwald if( l > 32767 ) l = 32767;
1967a4cd9b30SMilanka Ringwald if( l < -32768 ) l = -32768;
1968a4cd9b30SMilanka Ringwald if( r > 32767 ) r = 32767;
1969a4cd9b30SMilanka Ringwald if( r < -32768 ) r = -32768;
19708201da88SMatthias Ringwald #endif
1971a4cd9b30SMilanka Ringwald // Store the final sample.
1972a4cd9b30SMilanka Ringwald
19738201da88SMatthias Ringwald
19748201da88SMatthias Ringwald #ifdef HXCMOD_8BITS_OUTPUT
19758201da88SMatthias Ringwald
19768201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT
19778201da88SMatthias Ringwald *outbuffer++ = ( l >> 8 ) + 127;
19788201da88SMatthias Ringwald *outbuffer++ = ( r >> 8 ) + 127;
19798201da88SMatthias Ringwald #else
19808201da88SMatthias Ringwald *outbuffer++ = l >> 8;
19818201da88SMatthias Ringwald *outbuffer++ = r >> 8;
19828201da88SMatthias Ringwald #endif
19838201da88SMatthias Ringwald
19848201da88SMatthias Ringwald #else
19858201da88SMatthias Ringwald
19868201da88SMatthias Ringwald #ifdef HXCMOD_UNSIGNED_OUTPUT
19878201da88SMatthias Ringwald *outbuffer++ = l + 32767;
19888201da88SMatthias Ringwald *outbuffer++ = r + 32767;
19898201da88SMatthias Ringwald #else
19908201da88SMatthias Ringwald *outbuffer++ = l;
19918201da88SMatthias Ringwald *outbuffer++ = r;
19928201da88SMatthias Ringwald #endif
19938201da88SMatthias Ringwald
19948201da88SMatthias Ringwald #endif
19958201da88SMatthias Ringwald
19968201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
1997a4cd9b30SMilanka Ringwald ll = tl;
1998a4cd9b30SMilanka Ringwald lr = tr;
19998201da88SMatthias Ringwald #endif
20008201da88SMatthias Ringwald
20018201da88SMatthias Ringwald #endif // HXCMOD_MONO_OUTPUT
2002a4cd9b30SMilanka Ringwald
2003a4cd9b30SMilanka Ringwald }
2004a4cd9b30SMilanka Ringwald
20058201da88SMatthias Ringwald #ifdef HXCMOD_OUTPUT_FILTER
20068201da88SMatthias Ringwald #ifndef HXCMOD_MONO_OUTPUT
2007a4cd9b30SMilanka Ringwald modctx->last_l_sample = ll;
20088201da88SMatthias Ringwald #endif
2009a4cd9b30SMilanka Ringwald modctx->last_r_sample = lr;
20108201da88SMatthias Ringwald #endif
2011a4cd9b30SMilanka Ringwald }
2012a4cd9b30SMilanka Ringwald else
2013a4cd9b30SMilanka Ringwald {
2014a4cd9b30SMilanka Ringwald for (i = 0; i < nbsample; i++)
2015a4cd9b30SMilanka Ringwald {
2016a4cd9b30SMilanka Ringwald // Mod not loaded. Return blank buffer.
20178201da88SMatthias Ringwald #ifdef HXCMOD_MONO_OUTPUT
20188201da88SMatthias Ringwald outbuffer[i] = 0;
20198201da88SMatthias Ringwald #else
20208201da88SMatthias Ringwald *outbuffer++ = 0;
20218201da88SMatthias Ringwald *outbuffer++ = 0;
20228201da88SMatthias Ringwald #endif
2023a4cd9b30SMilanka Ringwald }
2024a4cd9b30SMilanka Ringwald
20258201da88SMatthias Ringwald #ifdef HXCMOD_STATE_REPORT_SUPPORT
2026a4cd9b30SMilanka Ringwald if(trkbuf)
2027a4cd9b30SMilanka Ringwald {
2028a4cd9b30SMilanka Ringwald trkbuf->nb_of_state = 0;
2029a4cd9b30SMilanka Ringwald trkbuf->cur_rd_index = 0;
2030a4cd9b30SMilanka Ringwald trkbuf->name[0] = 0;
2031a4cd9b30SMilanka Ringwald memclear(trkbuf->track_state_buf,0,sizeof(tracker_state) * trkbuf->nb_max_of_state);
2032a4cd9b30SMilanka Ringwald memclear(trkbuf->instruments,0,sizeof(trkbuf->instruments));
2033a4cd9b30SMilanka Ringwald }
20348201da88SMatthias Ringwald #endif
2035a4cd9b30SMilanka Ringwald }
2036a4cd9b30SMilanka Ringwald }
2037a4cd9b30SMilanka Ringwald }
2038a4cd9b30SMilanka Ringwald
hxcmod_unload(modcontext * modctx)2039a4cd9b30SMilanka Ringwald void hxcmod_unload( modcontext * modctx )
2040a4cd9b30SMilanka Ringwald {
2041a4cd9b30SMilanka Ringwald if(modctx)
2042a4cd9b30SMilanka Ringwald {
2043a4cd9b30SMilanka Ringwald memclear(&modctx->song,0,sizeof(modctx->song));
2044a4cd9b30SMilanka Ringwald memclear(&modctx->sampledata,0,sizeof(modctx->sampledata));
2045a4cd9b30SMilanka Ringwald memclear(&modctx->patterndata,0,sizeof(modctx->patterndata));
2046a4cd9b30SMilanka Ringwald modctx->tablepos = 0;
2047a4cd9b30SMilanka Ringwald modctx->patternpos = 0;
2048a4cd9b30SMilanka Ringwald modctx->patterndelay = 0;
2049a4cd9b30SMilanka Ringwald modctx->jump_loop_effect = 0;
2050a4cd9b30SMilanka Ringwald modctx->bpm = 0;
2051a4cd9b30SMilanka Ringwald modctx->patternticks = 0;
2052a4cd9b30SMilanka Ringwald modctx->patterntickse = 0;
2053a4cd9b30SMilanka Ringwald modctx->patternticksaim = 0;
2054a4cd9b30SMilanka Ringwald modctx->sampleticksconst = 0;
2055a4cd9b30SMilanka Ringwald
2056a4cd9b30SMilanka Ringwald memclear(modctx->channels,0,sizeof(modctx->channels));
2057a4cd9b30SMilanka Ringwald
2058a4cd9b30SMilanka Ringwald modctx->number_of_channels = 0;
2059a4cd9b30SMilanka Ringwald
2060a4cd9b30SMilanka Ringwald modctx->mod_loaded = 0;
2061a4cd9b30SMilanka Ringwald
2062a4cd9b30SMilanka Ringwald modctx->last_r_sample = 0;
2063a4cd9b30SMilanka Ringwald modctx->last_l_sample = 0;
2064a4cd9b30SMilanka Ringwald }
2065a4cd9b30SMilanka Ringwald }
2066