Commit 8d1db37

Nick committed on
Work on the effect editor
commit 8d1db3794bd30d27ce3a05bc9dfc2b53e63ef0d3 parent 43020c9
9 changed files +176−153
Modifiedcodegen.pas +11−11
@@ -169,7 +169,7 @@ var
169 Proc: TProcess; 169 Proc: TProcess;
170 OutSL: TStringList; 170 OutSL: TStringList;
171 FilePath: String; 171 FilePath: String;
172 label AssemblyError, Cleanup; 172 label AssemblyError, Cleanup; // Eh, screw good practice. How bad can it be?
173 begin 173 begin
174 FilePath := Filename; 174 FilePath := Filename;
175 Filename := ExtractFileNameWithoutExt(ExtractFileNameOnly(Filename)); 175 Filename := ExtractFileNameWithoutExt(ExtractFileNameOnly(Filename));
@@ -238,20 +238,20 @@ begin
238 if Proc.ExitCode <> 0 then goto AssemblyError; 238 if Proc.ExitCode <> 0 then goto AssemblyError;
239 end; 239 end;
240 240
241 if not CopyFile(Filename+IfThen(Mode = emGBS, '.gbs', '.gb'), FilePath) then begin 241 if Mode <> emPreview then
242 MessageDlg('Error!', 242 if not CopyFile(Filename+IfThen(Mode = emGBS, '.gbs', '.gb'), FilePath) then begin
243 'Couldn''t move the file to its new location. Make sure your path is correct!', 243 MessageDlg('Error!',
244 mtError, 244 'Couldn''t move the file to its new location. Make sure your path is correct!',
245 [mbOk], 245 mtError,
246 0); 246 [mbOk],
247 Result := False; 247 0);
248 goto Cleanup; 248 Result := False;
249 end; 249 goto Cleanup;
250 end;
250 251
251 Result := True; 252 Result := True;
252 goto Cleanup; 253 goto Cleanup;
253 254
254 // Eh, screw good practice. How bad can it be?
255 AssemblyError: 255 AssemblyError:
256 Result := False; 256 Result := False;
257 OutSL.LoadFromStream(Proc.Output); 257 OutSL.LoadFromStream(Proc.Output);
Modifiedeffecteditor.lfm +14−7
@@ -1,7 +1,7 @@
1 object frmEffectEditor: TfrmEffectEditor 1 object frmEffectEditor: TfrmEffectEditor
2 Left = 474 2 Left = 779
3 Height = 416 3 Height = 416
4 Top = 532 4 Top = 565
5 Width = 684 5 Width = 684
6 BorderIcons = [biSystemMenu, biMinimize] 6 BorderIcons = [biSystemMenu, biMinimize]
7 BorderStyle = bsDialog 7 BorderStyle = bsDialog
@@ -12,6 +12,7 @@ object frmEffectEditor: TfrmEffectEditor
12 FormStyle = fsStayOnTop 12 FormStyle = fsStayOnTop
13 OnClose = FormClose 13 OnClose = FormClose
14 OnCloseQuery = FormCloseQuery 14 OnCloseQuery = FormCloseQuery
15 OnCreate = FormCreate
15 ShowInTaskBar = stNever 16 ShowInTaskBar = stNever
16 LCLVersion = '2.0.6.0' 17 LCLVersion = '2.0.6.0'
17 object ComboBox1: TComboBox 18 object ComboBox1: TComboBox
@@ -58,7 +59,7 @@ object frmEffectEditor: TfrmEffectEditor
58 Height = 320 59 Height = 320
59 Top = 80 60 Top = 80
60 Width = 642 61 Width = 642
61 PageIndex = 5 62 PageIndex = 1
62 TabOrder = 1 63 TabOrder = 1
63 object OneParamPage: TPage 64 object OneParamPage: TPage
64 object OneParamTrackBar: TTrackBar 65 object OneParamTrackBar: TTrackBar
@@ -177,7 +178,7 @@ object frmEffectEditor: TfrmEffectEditor
177 Top = 88 178 Top = 88
178 Width = 584 179 Width = 584
179 Max = 7 180 Max = 7
180 OnChange = OneParamTrackBarChange 181 OnChange = RightVolumeTrackBarChange
181 Position = 0 182 Position = 0
182 TabOrder = 0 183 TabOrder = 0
183 end 184 end
@@ -187,7 +188,7 @@ object frmEffectEditor: TfrmEffectEditor
187 Top = 152 188 Top = 152
188 Width = 584 189 Width = 584
189 Max = 7 190 Max = 7
190 OnChange = OneParamTrackBarChange 191 OnChange = RightVolumeTrackBarChange
191 Position = 0 192 Position = 0
192 TabOrder = 1 193 TabOrder = 1
193 end 194 end
@@ -210,7 +211,6 @@ object frmEffectEditor: TfrmEffectEditor
210 ChildSizing.ControlsPerLine = 1 211 ChildSizing.ControlsPerLine = 1
211 ClientHeight = 285 212 ClientHeight = 285
212 ClientWidth = 312 213 ClientWidth = 312
213 OnItemClick = LeftPanCheckGroupItemClick
214 TabOrder = 0 214 TabOrder = 0
215 object CheckBox1: TCheckBox 215 object CheckBox1: TCheckBox
216 Left = 6 216 Left = 6
@@ -218,6 +218,7 @@ object frmEffectEditor: TfrmEffectEditor
218 Top = 6 218 Top = 6
219 Width = 300 219 Width = 300
220 Caption = 'Duty 1' 220 Caption = 'Duty 1'
221 OnClick = CheckBox1Change
221 TabOrder = 0 222 TabOrder = 0
222 end 223 end
223 object CheckBox2: TCheckBox 224 object CheckBox2: TCheckBox
@@ -226,6 +227,7 @@ object frmEffectEditor: TfrmEffectEditor
226 Top = 75 227 Top = 75
227 Width = 300 228 Width = 300
228 Caption = 'Duty 2' 229 Caption = 'Duty 2'
230 OnClick = CheckBox1Change
229 TabOrder = 1 231 TabOrder = 1
230 end 232 end
231 object CheckBox3: TCheckBox 233 object CheckBox3: TCheckBox
@@ -234,6 +236,7 @@ object frmEffectEditor: TfrmEffectEditor
234 Top = 144 236 Top = 144
235 Width = 300 237 Width = 300
236 Caption = 'Wave' 238 Caption = 'Wave'
239 OnClick = CheckBox1Change
237 TabOrder = 2 240 TabOrder = 2
238 end 241 end
239 object CheckBox4: TCheckBox 242 object CheckBox4: TCheckBox
@@ -242,6 +245,7 @@ object frmEffectEditor: TfrmEffectEditor
242 Top = 213 245 Top = 213
243 Width = 300 246 Width = 300
244 Caption = 'Noise' 247 Caption = 'Noise'
248 OnClick = CheckBox1Change
245 TabOrder = 3 249 TabOrder = 3
246 end 250 end
247 end 251 end
@@ -262,7 +266,6 @@ object frmEffectEditor: TfrmEffectEditor
262 ChildSizing.ControlsPerLine = 1 266 ChildSizing.ControlsPerLine = 1
263 ClientHeight = 285 267 ClientHeight = 285
264 ClientWidth = 312 268 ClientWidth = 312
265 OnItemClick = LeftPanCheckGroupItemClick
266 TabOrder = 1 269 TabOrder = 1
267 object CheckBox5: TCheckBox 270 object CheckBox5: TCheckBox
268 Left = 6 271 Left = 6
@@ -270,6 +273,7 @@ object frmEffectEditor: TfrmEffectEditor
270 Top = 6 273 Top = 6
271 Width = 300 274 Width = 300
272 Caption = 'Duty 1' 275 Caption = 'Duty 1'
276 OnClick = CheckBox1Change
273 TabOrder = 0 277 TabOrder = 0
274 end 278 end
275 object CheckBox6: TCheckBox 279 object CheckBox6: TCheckBox
@@ -278,6 +282,7 @@ object frmEffectEditor: TfrmEffectEditor
278 Top = 75 282 Top = 75
279 Width = 300 283 Width = 300
280 Caption = 'Duty 2' 284 Caption = 'Duty 2'
285 OnClick = CheckBox1Change
281 TabOrder = 1 286 TabOrder = 1
282 end 287 end
283 object CheckBox7: TCheckBox 288 object CheckBox7: TCheckBox
@@ -286,6 +291,7 @@ object frmEffectEditor: TfrmEffectEditor
286 Top = 144 291 Top = 144
287 Width = 300 292 Width = 300
288 Caption = 'Wave' 293 Caption = 'Wave'
294 OnClick = CheckBox1Change
289 TabOrder = 2 295 TabOrder = 2
290 end 296 end
291 object CheckBox8: TCheckBox 297 object CheckBox8: TCheckBox
@@ -294,6 +300,7 @@ object frmEffectEditor: TfrmEffectEditor
294 Top = 213 300 Top = 213
295 Width = 300 301 Width = 300
296 Caption = 'Noise' 302 Caption = 'Noise'
303 OnClick = CheckBox1Change
297 TabOrder = 3 304 TabOrder = 3
298 end 305 end
299 end 306 end
Modifiedeffecteditor.pas +72−28
@@ -6,10 +6,17 @@ interface
6 6
7 uses 7 uses
8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, 8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
9 ComCtrls, hugeDatatypes; 9 ComCtrls, hugeDatatypes, utils;
10 10
11 type 11 type
12 12
13 { TCheckBoxHelper }
14
15 // What a hack.
16 TCheckBoxHelper = class helper for TCheckBox
17 procedure SetCheckedWithoutClick(AChecked: Boolean);
18 end;
19
13 { TfrmEffectEditor } 20 { TfrmEffectEditor }
14 21
15 TfrmEffectEditor = class(TForm) 22 TfrmEffectEditor = class(TForm)
@@ -45,13 +52,14 @@ type
45 VibratoPage: TPage; 52 VibratoPage: TPage;
46 TwoParamsPage: TPage; 53 TwoParamsPage: TPage;
47 procedure Button1Click(Sender: TObject); 54 procedure Button1Click(Sender: TObject);
55 procedure CheckBox1Change(Sender: TObject);
48 procedure ComboBox1Change(Sender: TObject); 56 procedure ComboBox1Change(Sender: TObject);
49 procedure DutyRadioGroupSelectionChanged(Sender: TObject); 57 procedure DutyRadioGroupSelectionChanged(Sender: TObject);
50 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); 58 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
51 procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); 59 procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
52 procedure FormCreate(Sender: TObject); 60 procedure FormCreate(Sender: TObject);
53 procedure LeftPanCheckGroupItemClick(Sender: TObject; Index: integer);
54 procedure OneParamTrackBarChange(Sender: TObject); 61 procedure OneParamTrackBarChange(Sender: TObject);
62 procedure RightVolumeTrackBarChange(Sender: TObject);
55 procedure TwoParamsTrackBar1Change(Sender: TObject); 63 procedure TwoParamsTrackBar1Change(Sender: TObject);
56 procedure TwoParamsTrackBar2Change(Sender: TObject); 64 procedure TwoParamsTrackBar2Change(Sender: TObject);
57 procedure VibratoDepthTrackBarChange(Sender: TObject); 65 procedure VibratoDepthTrackBarChange(Sender: TObject);
@@ -91,6 +99,18 @@ implementation
91 99
92 {$R *.lfm} 100 {$R *.lfm}
93 101
102 { TCheckBoxHelper }
103
104 procedure TCheckBoxHelper.SetCheckedWithoutClick(AChecked: Boolean);
105 begin
106 ClicksDisabled := True;
107 try
108 Checked := AChecked;
109 finally
110 ClicksDisabled := False;
111 end;
112 end;
113
94 { TfrmEffectEditor } 114 { TfrmEffectEditor }
95 115
96 procedure TfrmEffectEditor.ComboBox1Change(Sender: TObject); 116 procedure TfrmEffectEditor.ComboBox1Change(Sender: TObject);
@@ -104,6 +124,25 @@ begin
104 Close; 124 Close;
105 end; 125 end;
106 126
127 procedure TfrmEffectEditor.CheckBox1Change(Sender: TObject);
128 var
129 Val: Integer;
130 begin
131 Val := %00000000;
132
133 if CheckBox4.Checked then Val := Val or %00001000;
134 if CheckBox3.Checked then Val := Val or %00000100;
135 if CheckBox2.Checked then Val := Val or %00000010;
136 if CheckBox1.Checked then Val := Val or %00000001;
137
138 if CheckBox8.Checked then Val := Val or %10000000;
139 if CheckBox7.Checked then Val := Val or %01000000;
140 if CheckBox6.Checked then Val := Val or %00100000;
141 if CheckBox5.Checked then Val := Val or %00010000;
142
143 Cell^.EffectParams.Value := Val;
144 end;
145
107 procedure TfrmEffectEditor.DutyRadioGroupSelectionChanged(Sender: TObject); 146 procedure TfrmEffectEditor.DutyRadioGroupSelectionChanged(Sender: TObject);
108 begin 147 begin
109 case DutyRadioGroup.ItemIndex of 148 case DutyRadioGroup.ItemIndex of
@@ -129,40 +168,32 @@ procedure TfrmEffectEditor.FormCreate(Sender: TObject);
129 begin 168 begin
130 ComboBox1.ItemIndex := Cell^.EffectCode; 169 ComboBox1.ItemIndex := Cell^.EffectCode;
131 LoadEffect; 170 LoadEffect;
171 Value.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
132 end; 172 end;
133 173
134 procedure TfrmEffectEditor.LeftPanCheckGroupItemClick(Sender: TObject; 174 procedure TfrmEffectEditor.OneParamTrackBarChange(Sender: TObject);
135 Index: integer);
136 var
137 Val: Integer;
138 begin 175 begin
139 Val := %00000000; 176 Cell^.EffectParams.Value := OneParamTrackBar.Position;
140 if CheckBox4.Checked then Val := Val or %00001000; 177 Value.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
141 if CheckBox3.Checked then Val := Val or %00000100;
142 if CheckBox2.Checked then Val := Val or %00000010;
143 if CheckBox1.Checked then Val := Val or %00000001;
144
145 if CheckBox8.Checked then Val := Val or %10000000;
146 if CheckBox7.Checked then Val := Val or %01000000;
147 if CheckBox6.Checked then Val := Val or %00100000;
148 if CheckBox5.Checked then Val := Val or %00010000;
149
150 Cell^.EffectParams.Value := Val;
151 end; 178 end;
152 179
153 procedure TfrmEffectEditor.OneParamTrackBarChange(Sender: TObject); 180 procedure TfrmEffectEditor.RightVolumeTrackBarChange(Sender: TObject);
154 begin 181 begin
155 Cell^.EffectParams.Value := OneParamTrackBar.Position; 182 Cell^.EffectParams.Param1 := LeftVolumeTrackBar.Position;
183 Cell^.EffectParams.Param2 := RightVolumeTrackBar.Position;
184 Value2.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
156 end; 185 end;
157 186
158 procedure TfrmEffectEditor.TwoParamsTrackBar1Change(Sender: TObject); 187 procedure TfrmEffectEditor.TwoParamsTrackBar1Change(Sender: TObject);
159 begin 188 begin
160 Cell^.EffectParams.Param1 := TwoParamsTrackBar1.Position; 189 Cell^.EffectParams.Param1 := TwoParamsTrackBar1.Position;
190 Value1.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
161 end; 191 end;
162 192
163 procedure TfrmEffectEditor.TwoParamsTrackBar2Change(Sender: TObject); 193 procedure TfrmEffectEditor.TwoParamsTrackBar2Change(Sender: TObject);
164 begin 194 begin
165 Cell^.EffectParams.Param1 := TwoParamsTrackBar2.Position; 195 Cell^.EffectParams.Param1 := TwoParamsTrackBar2.Position;
196 Value1.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
166 end; 197 end;
167 198
168 procedure TfrmEffectEditor.VibratoDepthTrackBarChange(Sender: TObject); 199 procedure TfrmEffectEditor.VibratoDepthTrackBarChange(Sender: TObject);
@@ -207,12 +238,14 @@ end;
207 procedure TfrmEffectEditor.LoadOneParamData; 238 procedure TfrmEffectEditor.LoadOneParamData;
208 begin 239 begin
209 OneParamTrackBar.Position := Cell^.EffectParams.Value; 240 OneParamTrackBar.Position := Cell^.EffectParams.Value;
241 Value.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
210 end; 242 end;
211 243
212 procedure TfrmEffectEditor.LoadTwoParamData; 244 procedure TfrmEffectEditor.LoadTwoParamData;
213 begin 245 begin
214 TwoParamsTrackBar1.Position := Cell^.EffectParams.Param1; 246 TwoParamsTrackBar1.Position := Cell^.EffectParams.Param1;
215 TwoParamsTrackBar2.Position := Cell^.EffectParams.Param2; 247 TwoParamsTrackBar2.Position := Cell^.EffectParams.Param2;
248 Value1.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
216 end; 249 end;
217 250
218 procedure TfrmEffectEditor.LoadVibratoData; 251 procedure TfrmEffectEditor.LoadVibratoData;
@@ -231,18 +264,19 @@ procedure TfrmEffectEditor.LoadMasterVolumeData;
231 begin 264 begin
232 LeftVolumeTrackBar.Position := Cell^.EffectParams.Param1; 265 LeftVolumeTrackBar.Position := Cell^.EffectParams.Param1;
233 RightVolumeTrackBar.Position := Cell^.EffectParams.Param2; 266 RightVolumeTrackBar.Position := Cell^.EffectParams.Param2;
267 Value2.Caption := EffectToExplanation(Cell^.EffectCode, Cell^.EffectParams);
234 end; 268 end;
235 269
236 procedure TfrmEffectEditor.LoadPanningData; 270 procedure TfrmEffectEditor.LoadPanningData;
237 begin 271 begin
238 CheckBox1.Checked := (Cell^.EffectParams.Value and %00000001) <> 0; 272 CheckBox1.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00000001) <> 0);
239 CheckBox2.Checked := (Cell^.EffectParams.Value and %00000010) <> 0; 273 CheckBox2.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00000010) <> 0);
240 CheckBox3.Checked := (Cell^.EffectParams.Value and %00000100) <> 0; 274 CheckBox3.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00000100) <> 0);
241 CheckBox4.Checked := (Cell^.EffectParams.Value and %00001000) <> 0; 275 CheckBox4.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00001000) <> 0);
242 CheckBox5.Checked := (Cell^.EffectParams.Value and %00010000) <> 0; 276 CheckBox5.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00010000) <> 0);
243 CheckBox6.Checked := (Cell^.EffectParams.Value and %00100000) <> 0; 277 CheckBox6.SetCheckedWithoutClick((Cell^.EffectParams.Value and %00100000) <> 0);
244 CheckBox7.Checked := (Cell^.EffectParams.Value and %01000000) <> 0; 278 CheckBox7.SetCheckedWithoutClick((Cell^.EffectParams.Value and %01000000) <> 0);
245 CheckBox8.Checked := (Cell^.EffectParams.Value and %10000000) <> 0; 279 CheckBox8.SetCheckedWithoutClick((Cell^.EffectParams.Value and %10000000) <> 0);
246 end; 280 end;
247 281
248 procedure TfrmEffectEditor.LoadDutyCycleData; 282 procedure TfrmEffectEditor.LoadDutyCycleData;
@@ -264,18 +298,21 @@ end;
264 procedure TfrmEffectEditor.fx1; 298 procedure TfrmEffectEditor.fx1;
265 begin 299 begin
266 Notebook1.PageIndex := 0; 300 Notebook1.PageIndex := 0;
301 OneParamTrackBar.Max := $FF;
267 LoadOneParamData; 302 LoadOneParamData;
268 end; 303 end;
269 304
270 procedure TfrmEffectEditor.fx2; 305 procedure TfrmEffectEditor.fx2;
271 begin 306 begin
272 Notebook1.PageIndex := 0; 307 Notebook1.PageIndex := 0;
308 OneParamTrackBar.Max := $FF;
273 LoadOneParamData; 309 LoadOneParamData;
274 end; 310 end;
275 311
276 procedure TfrmEffectEditor.fx3; 312 procedure TfrmEffectEditor.fx3;
277 begin 313 begin
278 Notebook1.PageIndex := 0; 314 Notebook1.PageIndex := 0;
315 OneParamTrackBar.Max := $FF;
279 LoadOneParamData; 316 LoadOneParamData;
280 end; 317 end;
281 318
@@ -294,12 +331,14 @@ end;
294 procedure TfrmEffectEditor.fx6; 331 procedure TfrmEffectEditor.fx6;
295 begin 332 begin
296 Notebook1.PageIndex := 0; 333 Notebook1.PageIndex := 0;
334 OneParamTrackBar.Max := $FF;
297 LoadOneParamData; 335 LoadOneParamData;
298 end; 336 end;
299 337
300 procedure TfrmEffectEditor.fx7; 338 procedure TfrmEffectEditor.fx7;
301 begin 339 begin
302 Notebook1.PageIndex := 0; 340 Notebook1.PageIndex := 0;
341 OneParamTrackBar.Max := $FF;
303 LoadOneParamData; 342 LoadOneParamData;
304 end; 343 end;
305 344
@@ -324,30 +363,35 @@ end;
324 procedure TfrmEffectEditor.fxB; 363 procedure TfrmEffectEditor.fxB;
325 begin 364 begin
326 Notebook1.PageIndex := 0; 365 Notebook1.PageIndex := 0;
366 OneParamTrackBar.Max := $FF;
327 LoadOneParamData; 367 LoadOneParamData;
328 end; 368 end;
329 369
330 procedure TfrmEffectEditor.fxC; 370 procedure TfrmEffectEditor.fxC;
331 begin 371 begin
332 Notebook1.PageIndex := 0; 372 Notebook1.PageIndex := 0;
373 OneParamTrackBar.Max := $F;
333 LoadOneParamData; 374 LoadOneParamData;
334 end; 375 end;
335 376
336 procedure TfrmEffectEditor.fxD; 377 procedure TfrmEffectEditor.fxD;
337 begin 378 begin
338 Notebook1.PageIndex := 0; 379 Notebook1.PageIndex := 0;
380 OneParamTrackBar.Max := $FF;
339 LoadOneParamData; 381 LoadOneParamData;
340 end; 382 end;
341 383
342 procedure TfrmEffectEditor.fxE; 384 procedure TfrmEffectEditor.fxE;
343 begin 385 begin
344 Notebook1.PageIndex := 0; 386 Notebook1.PageIndex := 0;
387 OneParamTrackBar.Max := $FF;
345 LoadOneParamData; 388 LoadOneParamData;
346 end; 389 end;
347 390
348 procedure TfrmEffectEditor.fxF; 391 procedure TfrmEffectEditor.fxF;
349 begin 392 begin
350 Notebook1.PageIndex := 0; 393 Notebook1.PageIndex := 0;
394 OneParamTrackBar.Max := $FF;
351 LoadOneParamData; 395 LoadOneParamData;
352 end; 396 end;
353 397
Modifiedhalt.z80 +7−0
@@ -15,6 +15,13 @@ DB "NF"
15 15
16 SECTION "code", ROM0 16 SECTION "code", ROM0
17 yeah: 17 yeah:
18 _addr = _AUD3WAVERAM
19 REPT 16
20 ld a, $FF
21 ld [_addr], a
22 _addr = _addr + 1
23 ENDR
24
18 ld a, $80 25 ld a, $80
19 ld [rAUDENA], a 26 ld [rAUDENA], a
20 ; Enable all channels in stereo 27 ; Enable all channels in stereo
Modifiedinstruments.pas +5−3
@@ -45,7 +45,7 @@ type
45 45
46 // Noise 46 // Noise
47 // NR42 47 // NR42
48 ShiftClockFreq: Integer; 48 ShiftClockFreq: Integer; // Unused
49 CounterStep: TStepWidth; 49 CounterStep: TStepWidth;
50 DividingRatio: Integer; 50 DividingRatio: Integer;
51 end; 51 end;
@@ -155,6 +155,7 @@ type
155 end; 155 end;
156 156
157 function NoiseInstrumentToRegisters( 157 function NoiseInstrumentToRegisters(
158 Frequency: Word;
158 Initial: Boolean; 159 Initial: Boolean;
159 Instr: TInstrument): TRegisters; 160 Instr: TInstrument): TRegisters;
160 161
@@ -198,7 +199,7 @@ function NoiseInstrumentToBytes(Instrument: TInstrument): TAsmInstrument;
198 var 199 var
199 Regs: TRegisters; 200 Regs: TRegisters;
200 begin 201 begin
201 Regs := NoiseInstrumentToRegisters(True, Instrument); 202 Regs := NoiseInstrumentToRegisters(0, True, Instrument);
202 Result[0] :=Regs.NR41; 203 Result[0] :=Regs.NR41;
203 Result[1] :=Regs.NR42; 204 Result[1] :=Regs.NR42;
204 Result[2] :=Regs.NR43; 205 Result[2] :=Regs.NR43;
@@ -254,6 +255,7 @@ begin
254 end; 255 end;
255 256
256 function NoiseInstrumentToRegisters( 257 function NoiseInstrumentToRegisters(
258 Frequency: Word;
257 Initial: Boolean; 259 Initial: Boolean;
258 Instr: TInstrument): TRegisters; 260 Instr: TInstrument): TRegisters;
259 var 261 var
@@ -273,9 +275,9 @@ begin
273 NR42.SweepNumber := Instr.VolSweepAmount; 275 NR42.SweepNumber := Instr.VolSweepAmount;
274 NR42.Direction := Instr.VolSweepDirection = Up; 276 NR42.Direction := Instr.VolSweepDirection = Up;
275 277
278 NR43.ShiftClockFrequency := Instr.ShiftClockFreq; // Quantize CH4 note
276 NR43.DividingRatio:= Instr.DividingRatio; 279 NR43.DividingRatio:= Instr.DividingRatio;
277 NR43.SevenBitCounter:=Instr.CounterStep = Seven; 280 NR43.SevenBitCounter:=Instr.CounterStep = Seven;
278 NR43.ShiftClockFrequency:= Instr.ShiftClockFreq;
279 281
280 NR44.Initial:= Initial; 282 NR44.Initial:= Initial;
281 NR44.UseLength:=Instr.LengthEnabled; 283 NR44.UseLength:=Instr.LengthEnabled;
Modifiedtracker.lfm +21−73
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 634 2 Left = 820
3 Height = 1275 3 Height = 1275
4 Top = 354 4 Top = 191
5 Width = 2056 5 Width = 2056
6 Caption = 'hUGETracker' 6 Caption = 'hUGETracker'
7 ClientHeight = 1241 7 ClientHeight = 1241
@@ -53,12 +53,13 @@ object frmTracker: TfrmTracker
53 object PageControl1: TPageControl 53 object PageControl1: TPageControl
54 Left = 0 54 Left = 0
55 Height = 845 55 Height = 845
56 Hint = 'The comments section for your song. Greetings/links/etc'
56 Top = 0 57 Top = 0
57 Width = 1709 58 Width = 1709
58 ActivePage = CommentsTabSheet 59 ActivePage = InstrumentTabSheet
59 Align = alClient 60 Align = alClient
60 ParentFont = False 61 ParentFont = False
61 TabIndex = 4 62 TabIndex = 2
62 TabOrder = 0 63 TabOrder = 0
63 object GeneralTabSheet: TTabSheet 64 object GeneralTabSheet: TTabSheet
64 Caption = 'General' 65 Caption = 'General'
@@ -958,7 +959,7 @@ object frmTracker: TfrmTracker
958 end 959 end
959 object NoiseGroupBox: TGroupBox 960 object NoiseGroupBox: TGroupBox
960 Left = 1138 961 Left = 1138
961 Height = 296 962 Height = 222
962 Top = 346 963 Top = 346
963 Width = 462 964 Width = 462
964 Anchors = [] 965 Anchors = []
@@ -967,24 +968,16 @@ object frmTracker: TfrmTracker
967 BorderSpacing.Right = 12 968 BorderSpacing.Right = 12
968 BorderSpacing.Bottom = 12 969 BorderSpacing.Bottom = 12
969 Caption = 'Noise' 970 Caption = 'Noise'
970 ClientHeight = 261 971 ClientHeight = 187
971 ClientWidth = 458 972 ClientWidth = 458
972 Enabled = False 973 Enabled = False
973 ParentFont = False 974 ParentFont = False
974 TabOrder = 4 975 TabOrder = 4
975 object Label13: TLabel
976 Left = 14
977 Height = 30
978 Top = 28
979 Width = 95
980 Caption = 'Frequency'
981 ParentColor = False
982 ParentFont = False
983 end
984 object SevenBitCounterCheckbox: TCheckBox 976 object SevenBitCounterCheckbox: TCheckBox
985 Left = 14 977 Left = 14
986 Height = 34 978 Height = 34
987 Top = 140 979 Hint = 'Select LFSR width. When checked, output will sound like a tone rather than noise'
980 Top = 70
988 Width = 373 981 Width = 373
989 Alignment = taLeftJustify 982 Alignment = taLeftJustify
990 Caption = '7 bit counter (more tone-like output)' 983 Caption = '7 bit counter (more tone-like output)'
@@ -995,7 +988,7 @@ object frmTracker: TfrmTracker
995 object Label14: TLabel 988 object Label14: TLabel
996 Left = 14 989 Left = 14
997 Height = 30 990 Height = 30
998 Top = 84 991 Top = 16
999 Width = 124 992 Width = 124
1000 Caption = 'Dividing ratio' 993 Caption = 'Dividing ratio'
1001 ParentColor = False 994 ParentColor = False
@@ -1005,64 +998,17 @@ object frmTracker: TfrmTracker
1005 Left = 14 998 Left = 14
1006 Height = 44 999 Height = 44
1007 Hint = 'Randomize the noise instrument parameters to get a random drum-like sound' 1000 Hint = 'Randomize the noise instrument parameters to get a random drum-like sound'
1008 Top = 192 1001 Top = 120
1009 Width = 420 1002 Width = 380
1010 Caption = 'Randomize' 1003 Caption = 'Randomize'
1011 OnClick = RandomizeNoiseButtonClick 1004 OnClick = RandomizeNoiseButtonClick
1012 ParentFont = False 1005 ParentFont = False
1013 TabOrder = 1 1006 TabOrder = 1
1014 end 1007 end
1015 object NoiseFreqSpinner: TECSpinPosition
1016 Left = 150
1017 Height = 24
1018 Top = 12
1019 Width = 198
1020 Buttons.BtnBigDec.BtnOrder = 1
1021 Buttons.BtnBigDec.Visible = False
1022 Buttons.BtnBigInc.BtnOrder = 7
1023 Buttons.BtnBigInc.Visible = False
1024 Buttons.BtnDec.BtnOrder = 2
1025 Buttons.BtnDrag.BtnOrder = 4
1026 Buttons.BtnInc.BtnOrder = 6
1027 Buttons.BtnMax.BtnOrder = 8
1028 Buttons.BtnMax.Visible = False
1029 Buttons.BtnMenu.BtnOrder = 5
1030 Buttons.BtnMenu.Visible = False
1031 Buttons.BtnMiddle.BtnOrder = 3
1032 Buttons.BtnMiddle.Visible = False
1033 Buttons.BtnMin.BtnOrder = 0
1034 Buttons.BtnMin.Visible = False
1035 Buttons.DiscreteChange = 1
1036 Buttons.Increment = 1
1037 Buttons.Middle = 50
1038 Buttons.MouseIncrementX = 0.1
1039 Buttons.MouseIncrementY = 0.05
1040 Buttons.PageSize = 10
1041 Buttons.ParentFont = False
1042 Buttons.Style = ebsSplittedBlock
1043 ParentFont = False
1044 Position = 0
1045 ProgressFontOptions.FontSize = 0
1046 ProgressFontOptions.FontStyles = [fsBold]
1047 ProgressMiddlePos = 0
1048 ProgressStyle = epsGradient
1049 Scale.DateTimeFormat = 'hh:nn:ss'
1050 Scale.LogarithmBase = 10
1051 Scale.Max = 15
1052 Scale.Min = 0
1053 Scale.TickLongValue = 10
1054 Scale.TickMiddleValue = 5
1055 Scale.TickShortValue = 1
1056 Scale.TickVisible = etvNone
1057 Scale.ValueVisible = evvNone
1058 ScaleFontOptions.FontSize = 7
1059 ScaleFontOptions.FontStyles = []
1060 OnChange = NoiseFreqSpinnerChange
1061 end
1062 object DivRatioSpinner: TECSpinPosition 1008 object DivRatioSpinner: TECSpinPosition
1063 Left = 150 1009 Left = 152
1064 Height = 24 1010 Height = 24
1065 Top = 68 1011 Top = 16
1066 Width = 198 1012 Width = 198
1067 Buttons.BtnBigDec.BtnOrder = 1 1013 Buttons.BtnBigDec.BtnOrder = 1
1068 Buttons.BtnBigDec.Visible = False 1014 Buttons.BtnBigDec.Visible = False
@@ -1162,6 +1108,7 @@ object frmTracker: TfrmTracker
1162 object ImportWaveButton: TButton 1108 object ImportWaveButton: TButton
1163 Left = 28 1109 Left = 28
1164 Height = 44 1110 Height = 44
1111 Hint = 'Import a wave'
1165 Top = 84 1112 Top = 84
1166 Width = 257 1113 Width = 257
1167 Caption = 'Import' 1114 Caption = 'Import'
@@ -1172,6 +1119,7 @@ object frmTracker: TfrmTracker
1172 object ExportWaveButton: TButton 1119 object ExportWaveButton: TButton
1173 Left = 28 1120 Left = 28
1174 Height = 44 1121 Height = 44
1122 Hint = 'Export a wave'
1175 Top = 140 1123 Top = 140
1176 Width = 257 1124 Width = 257
1177 Caption = 'Export' 1125 Caption = 'Export'
@@ -1212,16 +1160,16 @@ object frmTracker: TfrmTracker
1212 end 1160 end
1213 object RoutinesTabSheet: TTabSheet 1161 object RoutinesTabSheet: TTabSheet
1214 Caption = 'Routines' 1162 Caption = 'Routines'
1215 ClientHeight = 903 1163 ClientHeight = 802
1216 ClientWidth = 1857 1164 ClientWidth = 1701
1217 ParentFont = False 1165 ParentFont = False
1218 inline RoutineSynedit: TSynEdit 1166 inline RoutineSynedit: TSynEdit
1219 AnchorSideTop.Control = Label19 1167 AnchorSideTop.Control = Label19
1220 AnchorSideTop.Side = asrBottom 1168 AnchorSideTop.Side = asrBottom
1221 Left = 0 1169 Left = 0
1222 Height = 660 1170 Height = 559
1223 Top = 243 1171 Top = 243
1224 Width = 1857 1172 Width = 1701
1225 Align = alBottom 1173 Align = alBottom
1226 BorderSpacing.Top = 23 1174 BorderSpacing.Top = 23
1227 Anchors = [akTop, akLeft, akRight, akBottom] 1175 Anchors = [akTop, akLeft, akRight, akBottom]
@@ -5018,7 +4966,7 @@ object frmTracker: TfrmTracker
5018 } 4966 }
5019 end 4967 end
5020 object Timer1: TTimer 4968 object Timer1: TTimer
5021 Interval = 20 4969 Interval = 25
5022 OnTimer = Timer1Timer 4970 OnTimer = Timer1Timer
5023 left = 504 4971 left = 504
5024 top = 80 4972 top = 80
Modifiedtracker.pas +7−23
@@ -129,7 +129,6 @@ type
129 Label10: TLabel; 129 Label10: TLabel;
130 Label11: TLabel; 130 Label11: TLabel;
131 Label12: TLabel; 131 Label12: TLabel;
132 Label13: TLabel;
133 Label14: TLabel; 132 Label14: TLabel;
134 Label7: TLabel; 133 Label7: TLabel;
135 Label8: TLabel; 134 Label8: TLabel;
@@ -168,7 +167,6 @@ type
168 StatusBar1: TStatusBar; 167 StatusBar1: TStatusBar;
169 StartVolSpinner: TECSpinPosition; 168 StartVolSpinner: TECSpinPosition;
170 EnvChangeSpinner: TECSpinPosition; 169 EnvChangeSpinner: TECSpinPosition;
171 NoiseFreqSpinner: TECSpinPosition;
172 DivRatioSpinner: TECSpinPosition; 170 DivRatioSpinner: TECSpinPosition;
173 TreeView1: TTreeView; 171 TreeView1: TTreeView;
174 TrackerGrid: TTrackerGrid; 172 TrackerGrid: TTrackerGrid;
@@ -212,7 +210,6 @@ type
212 procedure MenuItem21Click(Sender: TObject); 210 procedure MenuItem21Click(Sender: TObject);
213 procedure MenuItem22Click(Sender: TObject); 211 procedure MenuItem22Click(Sender: TObject);
214 procedure MenuItem5Click(Sender: TObject); 212 procedure MenuItem5Click(Sender: TObject);
215 procedure NoiseFreqSpinnerChange(Sender: TObject);
216 procedure NoiseVisualizerPaint(Sender: TObject); 213 procedure NoiseVisualizerPaint(Sender: TObject);
217 procedure OrderEditStringGridAfterSelection(Sender: TObject; aCol, 214 procedure OrderEditStringGridAfterSelection(Sender: TObject; aCol,
218 aRow: Integer); 215 aRow: Integer);
@@ -434,20 +431,15 @@ begin
434 Spokeb($FF30+I, NewWaveform[I]); 431 Spokeb($FF30+I, NewWaveform[I]);
435 432
436 Regs := WaveInstrumentToRegisters(Freq, True, Song.Instruments[Instr]); 433 Regs := WaveInstrumentToRegisters(Freq, True, Song.Instruments[Instr]);
437 {writeln(inttobin(Regs.NR30, 8, 20));
438 writeln(inttobin(Regs.NR31, 8, 20));
439 writeln(inttobin(Regs.NR32, 8, 20));
440 writeln(inttobin(Regs.NR33, 8, 20));
441 writeln(inttobin(Regs.NR34, 8, 20));}
442 434
443 Spokeb(NR30, Regs.NR30); 435 Spokeb(NR30, Regs.NR30);
444 Spokeb(NR31, Regs.NR31); // TODO: Figure out why this isn't working? 436 Spokeb(NR31, Regs.NR31);
445 Spokeb(NR32, Regs.NR32); 437 Spokeb(NR32, Regs.NR32);
446 Spokeb(NR33, Regs.NR33); 438 Spokeb(NR33, Regs.NR33);
447 Spokeb(NR34, Regs.NR34) 439 Spokeb(NR34, Regs.NR34)
448 end; 440 end;
449 Noise: begin 441 Noise: begin
450 Regs := NoiseInstrumentToRegisters(True, Song.Instruments[Instr]); 442 Regs := NoiseInstrumentToRegisters(Freq, True, Song.Instruments[Instr]);
451 Spokeb(NR41, Regs.NR41); 443 Spokeb(NR41, Regs.NR41);
452 Spokeb(NR42, Regs.NR42); 444 Spokeb(NR42, Regs.NR42);
453 Spokeb(NR43, Regs.NR43); 445 Spokeb(NR43, Regs.NR43);
@@ -690,7 +682,6 @@ begin
690 end; 682 end;
691 683
692 Noise: begin 684 Noise: begin
693 NoiseFreqSpinner.Position := CI^.ShiftClockFreq;
694 DivRatioSpinner.Position := CI^.DividingRatio; 685 DivRatioSpinner.Position := CI^.DividingRatio;
695 SevenBitCounterCheckbox.Checked := CI^.CounterStep = Seven; 686 SevenBitCounterCheckbox.Checked := CI^.CounterStep = Seven;
696 end; 687 end;
@@ -820,7 +811,6 @@ end;
820 811
821 procedure TfrmTracker.RandomizeNoiseButtonClick(Sender: TObject); 812 procedure TfrmTracker.RandomizeNoiseButtonClick(Sender: TObject);
822 begin 813 begin
823 NoiseFreqSpinner.Position := Random(Round(NoiseFreqSpinner.Max));
824 DivRatioSpinner.Position := Random(Round(DivRatioSpinner.Max)); 814 DivRatioSpinner.Position := Random(Round(DivRatioSpinner.Max));
825 SevenBitCounterCheckbox.Checked := Random <= 0.5; 815 SevenBitCounterCheckbox.Checked := Random <= 0.5;
826 LengthEnabledCheckbox.Checked := Random <= 0.5; 816 LengthEnabledCheckbox.Checked := Random <= 0.5;
@@ -873,6 +863,7 @@ begin
873 // Get the emulator ready to make sound... 863 // Get the emulator ready to make sound...
874 EmulationThread := TEmulationThread.Create('halt.gb'); 864 EmulationThread := TEmulationThread.Create('halt.gb');
875 EmulationThread.Start; 865 EmulationThread.Start;
866 ResetEmulationThread; //TODO: remove this hack
876 end; 867 end;
877 868
878 procedure TfrmTracker.FormKeyDown(Sender: TObject; var Key: Word; 869 procedure TfrmTracker.FormKeyDown(Sender: TObject; var Key: Word;
@@ -1211,11 +1202,6 @@ begin
1211 AboutForm.Free; 1202 AboutForm.Free;
1212 end; 1203 end;
1213 1204
1214 procedure TfrmTracker.NoiseFreqSpinnerChange(Sender: TObject);
1215 begin
1216 CurrentInstrument^.ShiftClockFreq := Round(NoiseFreqSpinner.Position);
1217 end;
1218
1219 procedure TfrmTracker.NoiseVisualizerPaint(Sender: TObject); 1205 procedure TfrmTracker.NoiseVisualizerPaint(Sender: TObject);
1220 begin 1206 begin
1221 DrawVizualizer(NoiseVisualizer, 4); 1207 DrawVizualizer(NoiseVisualizer, 4);
@@ -1336,10 +1322,12 @@ end;
1336 1322
1337 procedure TfrmTracker.ToolButton2Click(Sender: TObject); 1323 procedure TfrmTracker.ToolButton2Click(Sender: TObject);
1338 begin 1324 begin
1339 if Playing then ResetEmulationThread;
1340
1341 if PreparePreview then begin 1325 if PreparePreview then begin
1342 Playing := True; 1326 Playing := True;
1327
1328 PokeSymbol(SYM_CURRENT_ORDER, 2*(OrderEditStringGrid.Row-1));
1329 PokeSymbol(SYM_ROW, TrackerGrid.Cursor.Y);
1330
1343 EmulationThread.Start; 1331 EmulationThread.Start;
1344 end; 1332 end;
1345 end; 1333 end;
@@ -1348,10 +1336,6 @@ procedure TfrmTracker.ToolButton3Click(Sender: TObject);
1348 begin 1336 begin
1349 if PreparePreview then begin 1337 if PreparePreview then begin
1350 Playing := True; 1338 Playing := True;
1351
1352 PokeSymbol(SYM_CURRENT_ORDER, 2*(OrderEditStringGrid.Row-1));
1353 PokeSymbol(SYM_ROW, TrackerGrid.Cursor.Y);
1354
1355 EmulationThread.Start; 1339 EmulationThread.Start;
1356 end; 1340 end;
1357 end; 1341 end;
Modifiedtrackergrid.pas +15−8
@@ -916,21 +916,28 @@ begin
916 end; 916 end;
917 917
918 function TTrackerGrid.MousePosToSelection(X, Y: Integer): TSelectionPos; 918 function TTrackerGrid.MousePosToSelection(X, Y: Integer): TSelectionPos;
919 var
920 OrigX: Integer;
919 begin 921 begin
922 OrigX := X;
920 X := EnsureRange(Width-1, 0, X); 923 X := EnsureRange(Width-1, 0, X);
921 Y := EnsureRange(Height-1, 0, Y); 924 Y := EnsureRange(Height-1, 0, Y);
922 925
923 Result.X := Trunc((X/Width)*NUM_COLUMNS); 926 Result.X := Trunc((X/Width)*NUM_COLUMNS);
924 Result.Y := Trunc((Y/Height)*NUM_ROWS); 927 Result.Y := Trunc((Y/Height)*NUM_ROWS);
925 928
926 X := X mod ColumnWidth; 929 if OrigX <= 0 then
927 X := Trunc((X/ColumnWidth)*13); 930 Result.SelectedPart := cpNote
928 case X of 931 else begin
929 0..3: Result.SelectedPart := cpNote; 932 X := X mod ColumnWidth;
930 4..5: Result.SelectedPart := cpInstrument; 933 X := Trunc((X/ColumnWidth)*13);
931 6..8: Result.SelectedPart := cpVolume; 934 case X of
932 9: Result.SelectedPart := cpEffectCode; 935 0..3: Result.SelectedPart := cpNote;
933 10..12: Result.SelectedPart := cpEffectParams; 936 4..5: Result.SelectedPart := cpInstrument;
937 6..8: Result.SelectedPart := cpVolume;
938 9: Result.SelectedPart := cpEffectCode;
939 10..12: Result.SelectedPart := cpEffectParams;
940 end;
934 end; 941 end;
935 end; 942 end;
936 943
Modifiedutils.pas +24−0
@@ -20,6 +20,7 @@ function ConvertWaveform(Waveform: TWave): T4bitWave;
20 procedure BlankPattern(Pat: PPattern); 20 procedure BlankPattern(Pat: PPattern);
21 procedure BlankCell(var Cell: TCell); 21 procedure BlankCell(var Cell: TCell);
22 function EffectCodeToStr(Code: Integer; Params: TEffectParams): String; 22 function EffectCodeToStr(Code: Integer; Params: TEffectParams): String;
23 function EffectToExplanation(Code: Integer; Params: TEffectParams): String;
23 24
24 implementation 25 implementation
25 26
@@ -87,5 +88,28 @@ begin
87 Result := HexStr((Code shl 8) or Params.Value, 3); 88 Result := HexStr((Code shl 8) or Params.Value, 3);
88 end; 89 end;
89 90
91 function EffectToExplanation(Code: Integer; Params: TEffectParams): String;
92 var
93 P: String;
94 begin
95 Result := 'No explanation';
96 P := IntToStr(Params.Value);
97 case Code of
98 $0: Result := 'Arpeggiate by +'+IntToStr(Params.Param1)+', +'+IntToStr(Params.Param2)+' semitones';
99 $1: Result := 'Slide up by '+P+' units';
100 $2: Result := 'Slide down by '+P+' units';
101 $3: Result := 'Tone portamento by '+P+' units';
102 $5: Result := 'Set Left speaker vol to '+IntToStr(Params.Param1)+', Right speaker vol to '+IntToStr(Params.Param2);
103 $6: Result := 'Call routine #'+P;
104 $7: Result := 'Delay note by '+P+' ticks';
105 $A: Result := 'Increase volume by '+IntToStr(Params.Param1)+' units, decrease volume by '+IntToStr(Params.Param2)+' units';
106 $B: Result := 'Jump to order '+P;
107 $C: Result := 'Set volume to '+P+'/15';
108 $D: Result := 'Jump to row '+P+' on the next pattern';
109 $E: Result := 'Cut note after '+P+' ticks';
110 $F: Result := 'Set speed to '+P+' ticks';
111 end;
112 end;
113
90 end. 114 end.
91 115