1 /*
2 * Schism Tracker - a cross-platform Impulse Tracker clone
3 * copyright (c) 2003-2005 Storlek <storlek@rigelseven.com>
4 * copyright (c) 2005-2008 Mrs. Brisby <mrs.brisby@nimh.org>
5 * copyright (c) 2009 Storlek & Mrs. Brisby
6 * copyright (c) 2010-2012 Storlek
7 * URL: http://schismtracker.org/
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24 #include "headers.h"
25
26 #include "it.h"
27 #include "song.h"
28 #include "page.h"
29
30 #include "sdlmain.h"
31
32 /* --------------------------------------------------------------------- */
33 /* static variables */
34
35 static struct widget widgets_vars[18];
36 static const int group_control[] = { 8, 9, -1 };
37 static const int group_playback[] = { 10, 11, -1 };
38 static const int group_slides[] = { 12, 13, -1 };
39 static char Amiga[6] = "Amiga";
40
41 /* --------------------------------------------------------------------- */
42
update_song_title(void)43 static void update_song_title(void)
44 {
45 status.flags |= NEED_UPDATE | SONG_NEEDS_SAVE;
46 }
47
48 /* --------------------------------------------------------------------- */
49
song_vars_draw_const(void)50 static void song_vars_draw_const(void)
51 {
52 int n;
53
54 draw_box(16, 15, 43, 17, BOX_THIN | BOX_INNER | BOX_INSET);
55 draw_box(16, 18, 50, 21, BOX_THIN | BOX_INNER | BOX_INSET);
56 draw_box(16, 22, 34, 28, BOX_THIN | BOX_INNER | BOX_INSET);
57 draw_box(12, 41, 78, 45, BOX_THICK | BOX_INNER | BOX_INSET);
58
59 draw_fill_chars(20, 26, 33, 27, 0);
60
61 draw_text("Song Variables", 33, 13, 3, 2);
62 draw_text("Song Name", 7, 16, 0, 2);
63 draw_text("Initial Tempo", 3, 19, 0, 2);
64 draw_text("Initial Speed", 3, 20, 0, 2);
65 draw_text("Global Volume", 3, 23, 0, 2);
66 draw_text("Mixing Volume", 3, 24, 0, 2);
67 draw_text("Separation", 6, 25, 0, 2);
68 draw_text("Old Effects", 5, 26, 0, 2);
69 draw_text("Compatible Gxx", 2, 27, 0, 2);
70 draw_text("Control", 9, 30, 0, 2);
71 draw_text("Playback", 8, 33, 0, 2);
72 draw_text("Pitch Slides", 4, 36, 0, 2);
73 draw_text("Directories", 34, 40, 3, 2);
74 draw_text("Module", 6, 42, 0, 2);
75 draw_text("Sample", 6, 43, 0, 2);
76 draw_text("Instrument", 2, 44, 0, 2);
77
78 for (n = 1; n < 79; n++)
79 draw_char(129, n, 39, 1, 2);
80 }
81
82 /* --------------------------------------------------------------------- */
83
song_vars_sync_stereo(void)84 void song_vars_sync_stereo(void)
85 {
86 // copy from the song to the page
87 if (song_is_stereo())
88 togglebutton_set(widgets_vars, 10, 0);
89 else
90 togglebutton_set(widgets_vars, 11, 0);
91 }
92
update_values_in_song(void)93 static void update_values_in_song(void)
94 {
95 song_set_initial_tempo(widgets_vars[1].d.thumbbar.value);
96 song_set_initial_speed(widgets_vars[2].d.thumbbar.value);
97 song_set_initial_global_volume(widgets_vars[3].d.thumbbar.value);
98 song_set_mixing_volume(widgets_vars[4].d.thumbbar.value);
99 song_set_separation(widgets_vars[5].d.thumbbar.value);
100 song_set_old_effects(widgets_vars[6].d.toggle.state);
101 song_set_compatible_gxx(widgets_vars[7].d.toggle.state);
102 song_set_instrument_mode(widgets_vars[8].d.togglebutton.state);
103 if (widgets_vars[10].d.togglebutton.state) {
104 if (!song_is_stereo()) {
105 song_set_stereo();
106 }
107 } else {
108 if (song_is_stereo()) {
109 song_set_mono();
110 }
111 }
112 song_set_linear_pitch_slides(widgets_vars[12].d.togglebutton.state);
113 status.flags |= SONG_NEEDS_SAVE;
114 }
115
116
init_instruments(UNUSED void * data)117 static void init_instruments(UNUSED void *data)
118 {
119 song_init_instruments(-1);
120 }
121
maybe_init_instruments(void)122 static void maybe_init_instruments(void)
123 {
124 /* XXX actually, in IT the buttons on this dialog say OK/No for whatever reason */
125 song_set_instrument_mode(1);
126 dialog_create(DIALOG_YES_NO, "Initialise instruments?", init_instruments, NULL, 0, NULL);
127
128 status.flags |= SONG_NEEDS_SAVE;
129 }
130
131
song_changed_cb(void)132 static void song_changed_cb(void)
133 {
134 char *b;
135 int c;
136
137 widgets_vars[0].d.textentry.text = current_song->title;
138 widgets_vars[0].d.textentry.cursor_pos = strlen(widgets_vars[0].d.textentry.text);
139
140 widgets_vars[1].d.thumbbar.value = current_song->initial_tempo;
141 widgets_vars[2].d.thumbbar.value = current_song->initial_speed;
142 widgets_vars[3].d.thumbbar.value = current_song->initial_global_volume;
143 widgets_vars[4].d.thumbbar.value = current_song->mixing_volume;
144 widgets_vars[5].d.thumbbar.value = current_song->pan_separation;
145 widgets_vars[6].d.toggle.state = song_has_old_effects();
146 widgets_vars[7].d.toggle.state = song_has_compatible_gxx();
147
148 if (song_is_instrument_mode())
149 togglebutton_set(widgets_vars, 8, 0);
150 else
151 togglebutton_set(widgets_vars, 9, 0);
152
153 if (song_is_stereo())
154 togglebutton_set(widgets_vars, 10, 0);
155 else
156 togglebutton_set(widgets_vars, 11, 0);
157
158 if (song_has_linear_pitch_slides())
159 togglebutton_set(widgets_vars, 12, 0);
160 else
161 togglebutton_set(widgets_vars, 13, 0);
162
163 for (b = strpbrk(song_get_basename(), "Aa"),
164 c = 12632; c && b && b[1]; c >>= 4, b++)
165 if ((c & 15) != b[1] - *b) return;
166 if (!c) for (b = Amiga, c = 12632; c; c>>= 4, b++)
167 b[1] = *b + (c & 15);
168 }
169
170 /* --------------------------------------------------------------------- */
171 /* bleh */
172
dir_modules_changed(void)173 static void dir_modules_changed(void)
174 {
175 status.flags |= DIR_MODULES_CHANGED;
176 }
177
dir_samples_changed(void)178 static void dir_samples_changed(void)
179 {
180 status.flags |= DIR_SAMPLES_CHANGED;
181 }
182
dir_instruments_changed(void)183 static void dir_instruments_changed(void)
184 {
185 status.flags |= DIR_INSTRUMENTS_CHANGED;
186 }
187
188 /* --------------------------------------------------------------------- */
189
song_vars_load_page(struct page * page)190 void song_vars_load_page(struct page *page)
191 {
192 page->title = "Song Variables & Directory Configuration (F12)";
193 page->draw_const = song_vars_draw_const;
194 page->song_changed_cb = song_changed_cb;
195 page->total_widgets = 18;
196 page->widgets = widgets_vars;
197 page->help_index = HELP_GLOBAL;
198
199 /* 0 = song name */
200 create_textentry(widgets_vars, 17, 16, 26, 0, 1, 1, update_song_title, current_song->title, 25);
201 /* 1 = tempo */
202 create_thumbbar(widgets_vars + 1, 17, 19, 33, 0, 2, 2, update_values_in_song, 31, 255);
203 /* 2 = speed */
204 create_thumbbar(widgets_vars + 2, 17, 20, 33, 1, 3, 3, update_values_in_song, 1, 255);
205 /* 3 = global volume */
206 create_thumbbar(widgets_vars + 3, 17, 23, 17, 2, 4, 4, update_values_in_song, 0, 128);
207 /* 4 = mixing volume */
208 create_thumbbar(widgets_vars + 4, 17, 24, 17, 3, 5, 5, update_values_in_song, 0, 128);
209 /* 5 = separation */
210 create_thumbbar(widgets_vars + 5, 17, 25, 17, 4, 6, 6, update_values_in_song, 0, 128);
211 /* 6 = old effects */
212 create_toggle(widgets_vars + 6, 17, 26, 5, 7, 5, 7, 7, update_values_in_song);
213 /* 7 = compatible gxx */
214 create_toggle(widgets_vars + 7, 17, 27, 6, 8, 6, 8, 8, update_values_in_song);
215 /* 8-13 = switches */
216 create_togglebutton(widgets_vars + 8, 17, 30, 11, 7, 10, 9, 9, 9, maybe_init_instruments,
217 "Instruments", 1, group_control);
218 create_togglebutton(widgets_vars + 9, 32, 30, 11, 7, 11, 8, 8, 8, update_values_in_song,
219 "Samples", 1, group_control);
220 create_togglebutton(widgets_vars + 10, 17, 33, 11, 8, 12, 11, 11, 11, update_values_in_song,
221 "Stereo", 1, group_playback);
222 create_togglebutton(widgets_vars + 11, 32, 33, 11, 9, 13, 10, 10, 10, update_values_in_song,
223 "Mono", 1, group_playback);
224 create_togglebutton(widgets_vars + 12, 17, 36, 11, 10, 14, 13, 13, 13, update_values_in_song,
225 "Linear", 1, group_slides);
226 create_togglebutton(widgets_vars + 13, 32, 36, 11, 11, 14, 12, 12, 12, update_values_in_song,
227 Amiga, 1, group_slides);
228 /* 14-16 = directories */
229 create_textentry(widgets_vars + 14, 13, 42, 65, 12, 15, 15, dir_modules_changed,
230 cfg_dir_modules, PATH_MAX);
231 create_textentry(widgets_vars + 15, 13, 43, 65, 14, 16, 16, dir_samples_changed,
232 cfg_dir_samples, PATH_MAX);
233 create_textentry(widgets_vars + 16, 13, 44, 65, 15, 17, 17, dir_instruments_changed,
234 cfg_dir_instruments, PATH_MAX);
235 /* 17 = save all preferences */
236 create_button(widgets_vars + 17, 28, 47, 22, 16, 17, 17, 17, 17, cfg_save, "Save all Preferences", 2);
237 }
238
239