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