1 #pragma once 2 3 #include <SDL2/SDL.h> 4 #include <stdint.h> 5 #include <stdbool.h> 6 #include <assert.h> 7 #ifdef _WIN32 8 #define WIN32_MEAN_AND_LEAN 9 #include <windows.h> // MAX_PATH 10 #else 11 #include <limits.h> // PATH_MAX 12 #endif 13 #include <stdint.h> 14 #include "pt2_unicode.h" 15 #include "pt2_palette.h" 16 17 #define PROG_VER_STR "1.37" 18 19 #ifdef _WIN32 20 #define DIR_DELIMITER '\\' 21 #define PATH_MAX MAX_PATH 22 #else 23 #define DIR_DELIMITER '/' 24 #define _stricmp strcasecmp 25 #define _strnicmp strncasecmp 26 #endif 27 28 #define SAMPLE_VIEW_HEIGHT 64 29 #define SAMPLE_AREA_WIDTH 314 30 31 #define SCREEN_W 320 32 #define SCREEN_H 255 33 34 /* "60Hz" ranges everywhere from 59..61Hz depending on the monitor, so with 35 ** no vsync we will get stuttering because the rate is not perfect... 36 */ 37 #define VBLANK_HZ 60 38 39 /* Scopes are clocked at 64Hz instead of 60Hz to prevent the small +/- Hz 40 ** interference from monitors not being exactly 60Hz (and unstable non-vsync mode). 41 ** Sadly, the scopes might midly flicker from this in some cases. 42 */ 43 #define SCOPE_HZ 64 44 45 #define FONT_CHAR_W 8 // actual data length is 7, includes right spacing (1px column) 46 #define FONT_CHAR_H 5 47 48 #define MOD_ROWS 64 49 #define MOD_SAMPLES 31 50 #define MOD_ORDERS 128 51 #define MAX_PATTERNS 100 52 53 #define MAX_SAMPLE_LEN 65534 54 55 // for NULL pointers 56 #define RESERVED_SAMPLE_OFFSET ((31+1) * MAX_SAMPLE_LEN) 57 58 #define AMIGA_VOICES 4 59 #define SCOPE_WIDTH 40 60 #define SCOPE_HEIGHT 33 61 #define SPECTRUM_BAR_NUM 23 62 #define SPECTRUM_BAR_HEIGHT 36 63 #define SPECTRUM_BAR_WIDTH 6 64 65 #define POSED_LIST_SIZE 12 66 67 // main crystal oscillator for PAL Amiga systems 68 #define AMIGA_PAL_XTAL_HZ 28375160 69 70 #define AMIGA_PAL_CCK_HZ (AMIGA_PAL_XTAL_HZ/8.0) 71 72 // nominal framerate in normal PAL videomodes (~49.92Hz) 73 #define AMIGA_PAL_VBLANK_HZ (AMIGA_PAL_CCK_HZ / (double)(313*227)) 74 75 #define PAULA_PAL_CLK AMIGA_PAL_CCK_HZ 76 #define CIA_PAL_CLK (AMIGA_PAL_CCK_HZ / 5.0) 77 78 #define PAL_PAULA_MIN_SAFE_PERIOD 124 79 #define PAL_PAULA_MAX_SAFE_HZ (PAULA_PAL_CLK / (double)PAL_PAULA_MIN_SAFE_PERIOD) 80 81 #define FILTERS_BASE_FREQ (PAULA_PAL_CLK / 214.0) 82 83 #define KEYB_REPEAT_DELAY 17 84 85 // .MOD types 86 enum 87 { 88 FORMAT_MK, // ProTracker or compatible 89 FORMAT_FLT, // Startrekker (4 channels) 90 FORMAT_FT2, // FT2 (or other trackers, multichannel) 91 FORMAT_STK, // The Ultimate SoundTracker (15 samples) 92 FORMAT_NT, // NoiseTracker 93 FORMAT_HMNT, // His Master's NoiseTracker (special one) 94 95 FORMAT_UNKNOWN // may be The Ultimate Soundtracker (set to FORMAT_STK later) 96 }; 97 98 enum 99 { 100 FLAG_NOTE = 1, 101 FLAG_SAMPLE = 2, 102 FLAG_NEWSAMPLE = 4, 103 104 TEMPFLAG_START = 1, 105 TEMPFLAG_DELAY = 2, 106 107 FILTERMODEL_A1200 = 0, 108 FILTERMODEL_A500 = 1, 109 FILTER_LED_ENABLED = 2, 110 111 NO_CARRY = 0, 112 DO_CARRY = 1, 113 114 INCREMENT_SLOW = 0, 115 INCREMENT_FAST = 1, 116 117 NO_SAMPLE_CUT = 0, 118 SAMPLE_CUT = 1, 119 120 EDIT_SPECIAL = 0, 121 EDIT_NORMAL = 1, 122 123 EDIT_TEXT_NO_UPDATE = 0, 124 EDIT_TEXT_UPDATE = 1, 125 126 TRANSPOSE_ALL = 1, 127 128 MOUSE_BUTTON_NOT_HELD = 0, 129 MOUSE_BUTTON_HELD = 1, 130 131 DONT_SET_ORDER = -1, 132 DONT_SET_PATTERN = -1, 133 DONT_SET_ROW = -1, 134 135 REMOVE_SAMPLE_MARKING = 0, 136 KEEP_SAMPLE_MARKING = 1, 137 138 MOD_NOT_MODIFIED = 0, 139 MOD_IS_MODIFIED = 1, 140 141 DONT_CHECK_IF_FILE_EXIST = 0, 142 CHECK_IF_FILE_EXIST = 1, 143 144 DONT_GIVE_NEW_FILENAME = 0, 145 GIVE_NEW_FILENAME = 1, 146 147 DONT_DOWNSAMPLE = 0, 148 DO_DOWNSAMPLE = 1, 149 150 SCREEN_ALL = 0, 151 SCREEN_MAINSCREEN = 1, 152 SCREEN_DISKOP = 2, 153 SCREEN_SAMPLER = 4, 154 SCREEN_QUIT = 8, 155 SCREEN_CLEAR = 16, 156 157 VISUAL_QUADRASCOPE = 0, 158 VISUAL_SPECTRUM = 1, 159 160 MODE_IDLE = 0, 161 MODE_EDIT = 1, 162 MODE_PLAY = 2, 163 MODE_RECORD = 3, 164 165 RECORD_PATT = 0, 166 RECORD_SONG = 1, 167 168 CURSOR_NOTE = 0, 169 CURSOR_SAMPLE1 = 1, 170 CURSOR_SAMPLE2 = 2, 171 CURSOR_CMD = 3, 172 CURSOR_PARAM1 = 4, 173 CURSOR_PARAM2 = 5, 174 175 PLAY_MODE_NORMAL = 0, 176 PLAY_MODE_PATTERN = 1, 177 178 OCTAVE_HIGH = 0, 179 OCTAVE_LOW = 1, 180 181 DISKOP_MODE_MOD = 0, 182 DISKOP_MODE_SMP = 1, 183 184 DISKOP_SMP_WAV = 0, 185 DISKOP_SMP_IFF = 1, 186 DISKOP_SMP_RAW = 2, 187 188 ASK_QUIT = 0, 189 ASK_SAVE_MODULE = 1, 190 ASK_SAVE_SONG = 2, 191 ASK_SAVE_SAMPLE = 3, 192 ASK_MOD2WAV = 4, 193 ASK_MOD2WAV_OVERWRITE = 5, 194 ASK_SAVEMOD_OVERWRITE = 6, 195 ASK_SAVESMP_OVERWRITE = 7, 196 ASK_LOAD_DOWNSAMPLE = 8, 197 ASK_RESAMPLE = 9, 198 ASK_KILL_SAMPLE = 10, 199 ASK_UPSAMPLE = 11, 200 ASK_DOWNSAMPLE = 12, 201 ASK_FILTER_ALL_SAMPLES = 13, 202 ASK_BOOST_ALL_SAMPLES = 14, 203 ASK_MAKE_CHORD = 15, 204 ASK_SAVE_ALL_SAMPLES = 16, 205 ASK_PAT2SMP = 17, 206 ASK_RESTORE_SAMPLE = 18, 207 ASK_DISCARD_SONG = 19, 208 ASK_DISCARD_SONG_DRAGNDROP = 20, 209 210 TEMPO_MODE_CIA = 0, 211 TEMPO_MODE_VBLANK = 1, 212 213 TEXT_EDIT_STRING = 0, 214 TEXT_EDIT_DECIMAL = 1, 215 TEXT_EDIT_HEX = 2 216 }; 217 218 int8_t *allocMemForAllSamples(void); // pt2_replayer.c 219 220 void restartSong(void); 221 void resetSong(void); 222 void incPatt(void); 223 void decPatt(void); 224 void modSetPos(int16_t order, int16_t row); 225 void modStop(void); 226 void doStopIt(bool resetPlayMode); 227 void playPattern(int8_t startRow); 228 void modPlay(int16_t patt, int16_t order, int8_t row); 229 void modSetSpeed(int32_t speed); 230 void modSetTempo(int32_t bpm, bool doLockAudio); 231 void modFree(void); 232 bool setupAudio(void); 233 void audioClose(void); 234 void clearSong(void); 235 void clearSamples(void); 236 void clearAll(void); 237 void modSetPattern(uint8_t pattern); 238