Commit 83029d0

Nick committed on
Fix lfsr bug
commit 83029d07cc0ef20e2ddffccb61738e12d6331f27 parent 7c008ba
7 changed files +124−55
ModifiedSound/sound.pas +8−6
@@ -177,6 +177,7 @@ const
177 var 177 var
178 playStream: TSDL_AudioDeviceID; 178 playStream: TSDL_AudioDeviceID;
179 bufCycles, bufLVal, bufRVal: integer; 179 bufCycles, bufLVal, bufRVal: integer;
180 lfsr: Cardinal = 0;
180 181
181 procedure ResetSound; 182 procedure ResetSound;
182 var 183 var
@@ -288,24 +289,24 @@ const
288 289
289 var 290 var
290 swpClk, envClk, lenClk, freqClk, freq4Clk: longint; 291 swpClk, envClk, lenClk, freqClk, freq4Clk: longint;
291 lfsr: Integer = 0; 292
292 293
293 // Yanked from SameBoy: https://github.com/LIJI32/SameBoy/blob/master/Core/apu.c#L489 294 // Yanked from SameBoy: https://github.com/LIJI32/SameBoy/blob/master/Core/apu.c#L489
294 // carrying on the tradition of translating existing C audio code 295 // carrying on the tradition of translating existing C audio code
295 function NextLFSRBit(Narrow: Boolean): Integer; 296 function NextLFSRBit(Narrow: Boolean): Byte;
296 var 297 var
297 HighBitMask: Integer; 298 HighBitMask: Cardinal;
298 NewHighBit: Integer; 299 NewHighBit: Boolean;
299 begin 300 begin
300 if Narrow then 301 if Narrow then
301 HighBitMask := $4040 302 HighBitMask := $4040
302 else 303 else
303 HighBitMask := $4000; 304 HighBitMask := $4000;
304 305
305 NewHighBit := ((lfsr xor (lfsr shr 1)) xor 1) and 1; 306 NewHighBit := (((lfsr xor (lfsr shr 1)) xor 1) and 1) <> 0;
306 lfsr := lfsr shr 1; 307 lfsr := lfsr shr 1;
307 308
308 if NewHighBit <> 0 then 309 if NewHighBit then
309 lfsr := lfsr or HighBitMask 310 lfsr := lfsr or HighBitMask
310 else 311 else
311 lfsr := lfsr and not HighBitMask; 312 lfsr := lfsr and not HighBitMask;
@@ -377,6 +378,7 @@ begin
377 snd[4].Len := 64 - (m_iram[$FF20] and 63); 378 snd[4].Len := 64 - (m_iram[$FF20] and 63);
378 m_iram[$FF23] := m_iram[$FF23] and $7f; 379 m_iram[$FF23] := m_iram[$FF23] and $7f;
379 snd[4].Enable := True; 380 snd[4].Enable := True;
381 lfsr := 0;
380 end; 382 end;
381 383
382 sndRegChange := False; 384 sndRegChange := False;
Modifiedeffecteditor.lfm +4−12
@@ -1,7 +1,7 @@
1 object frmEffectEditor: TfrmEffectEditor 1 object frmEffectEditor: TfrmEffectEditor
2 Left = 825 2 Left = 474
3 Height = 416 3 Height = 416
4 Top = 226 4 Top = 532
5 Width = 684 5 Width = 684
6 BorderIcons = [biSystemMenu, biMinimize] 6 BorderIcons = [biSystemMenu, biMinimize]
7 BorderStyle = bsDialog 7 BorderStyle = bsDialog
@@ -19,6 +19,7 @@ object frmEffectEditor: TfrmEffectEditor
19 Height = 38 19 Height = 38
20 Top = 16 20 Top = 16
21 Width = 530 21 Width = 530
22 DropDownCount = 99
22 ItemHeight = 30 23 ItemHeight = 30
23 ItemIndex = 0 24 ItemIndex = 0
24 Items.Strings = ( 25 Items.Strings = (
@@ -57,7 +58,7 @@ object frmEffectEditor: TfrmEffectEditor
57 Height = 320 58 Height = 320
58 Top = 80 59 Top = 80
59 Width = 642 60 Width = 642
60 PageIndex = 1 61 PageIndex = 5
61 TabOrder = 1 62 TabOrder = 1
62 object OneParamPage: TPage 63 object OneParamPage: TPage
63 object OneParamTrackBar: TTrackBar 64 object OneParamTrackBar: TTrackBar
@@ -112,15 +113,6 @@ object frmEffectEditor: TfrmEffectEditor
112 Caption = 'Value1' 113 Caption = 'Value1'
113 ParentColor = False 114 ParentColor = False
114 end 115 end
115 object Button1: TButton
116 Left = 280
117 Height = 44
118 Top = 224
119 Width = 131
120 Caption = 'Button1'
121 OnClick = Button1Click
122 TabOrder = 2
123 end
124 end 116 end
125 object VibratoPage: TPage 117 object VibratoPage: TPage
126 object VibratoRateRadioGroup: TRadioGroup 118 object VibratoRateRadioGroup: TRadioGroup
Modifiedeffecteditor.pas +73−5
@@ -13,7 +13,6 @@ type
13 { TfrmEffectEditor } 13 { TfrmEffectEditor }
14 14
15 TfrmEffectEditor = class(TForm) 15 TfrmEffectEditor = class(TForm)
16 Button1: TButton;
17 CheckBox1: TCheckBox; 16 CheckBox1: TCheckBox;
18 CheckBox2: TCheckBox; 17 CheckBox2: TCheckBox;
19 CheckBox3: TCheckBox; 18 CheckBox3: TCheckBox;
@@ -61,6 +60,12 @@ type
61 Cell: PCell; 60 Cell: PCell;
62 61
63 procedure LoadEffect; 62 procedure LoadEffect;
63 procedure LoadOneParamData;
64 procedure LoadTwoParamData;
65 procedure LoadVibratoData;
66 procedure LoadMasterVolumeData;
67 procedure LoadPanningData;
68 procedure LoadDutyCycleData;
64 69
65 procedure fx0; 70 procedure fx0;
66 procedure fx1; 71 procedure fx1;
@@ -112,14 +117,12 @@ end;
112 procedure TfrmEffectEditor.FormClose(Sender: TObject; 117 procedure TfrmEffectEditor.FormClose(Sender: TObject;
113 var CloseAction: TCloseAction); 118 var CloseAction: TCloseAction);
114 begin 119 begin
115 writeln('ok');
116 end; 120 end;
117 121
118 procedure TfrmEffectEditor.FormCloseQuery(Sender: TObject; var CanClose: boolean 122 procedure TfrmEffectEditor.FormCloseQuery(Sender: TObject; var CanClose: boolean
119 ); 123 );
120 begin 124 begin
121 ModalResult:=mrClose; 125 ModalResult:=mrClose;
122 writeln('hi');
123 end; 126 end;
124 127
125 procedure TfrmEffectEditor.FormCreate(Sender: TObject); 128 procedure TfrmEffectEditor.FormCreate(Sender: TObject);
@@ -155,7 +158,6 @@ end;
155 procedure TfrmEffectEditor.TwoParamsTrackBar1Change(Sender: TObject); 158 procedure TfrmEffectEditor.TwoParamsTrackBar1Change(Sender: TObject);
156 begin 159 begin
157 Cell^.EffectParams.Param1 := TwoParamsTrackBar1.Position; 160 Cell^.EffectParams.Param1 := TwoParamsTrackBar1.Position;
158 writeln('test');
159 end; 161 end;
160 162
161 procedure TfrmEffectEditor.TwoParamsTrackBar2Change(Sender: TObject); 163 procedure TfrmEffectEditor.TwoParamsTrackBar2Change(Sender: TObject);
@@ -202,91 +204,157 @@ begin
202 end; 204 end;
203 end; 205 end;
204 206
207 procedure TfrmEffectEditor.LoadOneParamData;
208 begin
209 OneParamTrackBar.Position := Cell^.EffectParams.Value;
210 end;
211
212 procedure TfrmEffectEditor.LoadTwoParamData;
213 begin
214 TwoParamsTrackBar1.Position := Cell^.EffectParams.Param1;
215 TwoParamsTrackBar2.Position := Cell^.EffectParams.Param2;
216 end;
217
218 procedure TfrmEffectEditor.LoadVibratoData;
219 begin
220 case Cell^.EffectParams.Param1 of
221 $0: VibratoRateRadioGroup.ItemIndex := 0;
222 $1: VibratoRateRadioGroup.ItemIndex := 1;
223 $3: VibratoRateRadioGroup.ItemIndex := 2;
224 $7: VibratoRateRadioGroup.ItemIndex := 3;
225 $F: VibratoRateRadioGroup.ItemIndex := 4;
226 end;
227 VibratoDepthTrackBar.Position := Cell^.EffectParams.Param2;
228 end;
229
230 procedure TfrmEffectEditor.LoadMasterVolumeData;
231 begin
232 LeftVolumeTrackBar.Position := Cell^.EffectParams.Param1;
233 RightVolumeTrackBar.Position := Cell^.EffectParams.Param2;
234 end;
235
236 procedure TfrmEffectEditor.LoadPanningData;
237 begin
238 CheckBox1.Checked := (Cell^.EffectParams.Value and %00000001) <> 0;
239 CheckBox2.Checked := (Cell^.EffectParams.Value and %00000010) <> 0;
240 CheckBox3.Checked := (Cell^.EffectParams.Value and %00000100) <> 0;
241 CheckBox4.Checked := (Cell^.EffectParams.Value and %00001000) <> 0;
242 CheckBox5.Checked := (Cell^.EffectParams.Value and %00010000) <> 0;
243 CheckBox6.Checked := (Cell^.EffectParams.Value and %00100000) <> 0;
244 CheckBox7.Checked := (Cell^.EffectParams.Value and %01000000) <> 0;
245 CheckBox8.Checked := (Cell^.EffectParams.Value and %10000000) <> 0;
246 end;
247
248 procedure TfrmEffectEditor.LoadDutyCycleData;
249 begin
250 case Cell^.EffectParams.Value of
251 $00: DutyRadioGroup.ItemIndex := 0;
252 $40: DutyRadioGroup.ItemIndex := 1;
253 $80: DutyRadioGroup.ItemIndex := 2;
254 $C0: DutyRadioGroup.ItemIndex := 3;
255 end;
256 end;
257
205 procedure TfrmEffectEditor.fx0; 258 procedure TfrmEffectEditor.fx0;
206 begin 259 begin
207 Notebook1.PageIndex := 1; 260 Notebook1.PageIndex := 1;
261 LoadTwoParamData;
208 end; 262 end;
209 263
210 procedure TfrmEffectEditor.fx1; 264 procedure TfrmEffectEditor.fx1;
211 begin 265 begin
212 Notebook1.PageIndex := 0; 266 Notebook1.PageIndex := 0;
267 LoadOneParamData;
213 end; 268 end;
214 269
215 procedure TfrmEffectEditor.fx2; 270 procedure TfrmEffectEditor.fx2;
216 begin 271 begin
217 Notebook1.PageIndex := 0; 272 Notebook1.PageIndex := 0;
273 LoadOneParamData;
218 end; 274 end;
219 275
220 procedure TfrmEffectEditor.fx3; 276 procedure TfrmEffectEditor.fx3;
221 begin 277 begin
222 Notebook1.PageIndex := 0; 278 Notebook1.PageIndex := 0;
279 LoadOneParamData;
223 end; 280 end;
224 281
225 procedure TfrmEffectEditor.fx4; 282 procedure TfrmEffectEditor.fx4;
226 begin 283 begin
227 Notebook1.PageIndex := 2; 284 Notebook1.PageIndex := 2;
285 LoadVibratoData;
228 end; 286 end;
229 287
230 procedure TfrmEffectEditor.fx5; 288 procedure TfrmEffectEditor.fx5;
231 begin 289 begin
232 Notebook1.PageIndex := 3; 290 Notebook1.PageIndex := 3;
291 LoadMasterVolumeData;
233 end; 292 end;
234 293
235 procedure TfrmEffectEditor.fx6; 294 procedure TfrmEffectEditor.fx6;
236 begin 295 begin
237 Notebook1.PageIndex := 0; 296 Notebook1.PageIndex := 0;
297 LoadOneParamData;
238 end; 298 end;
239 299
240 procedure TfrmEffectEditor.fx7; 300 procedure TfrmEffectEditor.fx7;
241 begin 301 begin
242 Notebook1.PageIndex := 0; 302 Notebook1.PageIndex := 0;
303 LoadOneParamData;
243 end; 304 end;
244 305
245 procedure TfrmEffectEditor.fx8; 306 procedure TfrmEffectEditor.fx8;
246 begin 307 begin
247 Notebook1.PageIndex := 4; 308 Notebook1.PageIndex := 4;
309 LoadPanningData;
248 end; 310 end;
249 311
250 procedure TfrmEffectEditor.fx9; 312 procedure TfrmEffectEditor.fx9;
251 begin 313 begin
252 Notebook1.PageIndex := 5; 314 Notebook1.PageIndex := 5;
315 LoadDutyCycleData;
253 end; 316 end;
254 317
255 procedure TfrmEffectEditor.fxA; 318 procedure TfrmEffectEditor.fxA;
256 begin 319 begin
257 Notebook1.PageIndex := 1; 320 Notebook1.PageIndex := 1;
321 LoadTwoParamData;
258 end; 322 end;
259 323
260 procedure TfrmEffectEditor.fxB; 324 procedure TfrmEffectEditor.fxB;
261 begin 325 begin
262 Notebook1.PageIndex := 0; 326 Notebook1.PageIndex := 0;
327 LoadOneParamData;
263 end; 328 end;
264 329
265 procedure TfrmEffectEditor.fxC; 330 procedure TfrmEffectEditor.fxC;
266 begin 331 begin
267 Notebook1.PageIndex := 0; 332 Notebook1.PageIndex := 0;
333 LoadOneParamData;
268 end; 334 end;
269 335
270 procedure TfrmEffectEditor.fxD; 336 procedure TfrmEffectEditor.fxD;
271 begin 337 begin
272 Notebook1.PageIndex := 0; 338 Notebook1.PageIndex := 0;
339 LoadOneParamData;
273 end; 340 end;
274 341
275 procedure TfrmEffectEditor.fxE; 342 procedure TfrmEffectEditor.fxE;
276 begin 343 begin
277 Notebook1.PageIndex := 0; 344 Notebook1.PageIndex := 0;
345 LoadOneParamData;
278 end; 346 end;
279 347
280 procedure TfrmEffectEditor.fxF; 348 procedure TfrmEffectEditor.fxF;
281 begin 349 begin
282 Notebook1.PageIndex := 0; 350 Notebook1.PageIndex := 0;
351 LoadOneParamData;
283 end; 352 end;
284 353
285 constructor TfrmEffectEditor.Create(Cell_: PCell); 354 constructor TfrmEffectEditor.Create(Cell_: PCell);
286 begin 355 begin
287 inherited Create(nil); 356 inherited Create(nil);
288 Self.Cell := Cell_; 357 Self.Cell := Cell_;
289 writeln('created');
290 end; 358 end;
291 359
292 end. 360 end.
Modifiedhalt.z80 +3−0
@@ -23,4 +23,7 @@ yeah:
23 ; Set volume 23 ; Set volume
24 ld a, $77 24 ld a, $77
25 ld [rAUDVOL], a 25 ld [rAUDVOL], a
26 ; silence ch3
27 ld a, 0
28 ld [rAUD3LEVEL], a
26 halt 29 halt
Modifiedtracker.lfm +28−29
@@ -1,11 +1,11 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 842 2 Left = 839
3 Height = 1376 3 Height = 1275
4 Top = 192 4 Top = 187
5 Width = 2212 5 Width = 2056
6 Caption = 'hUGETracker' 6 Caption = 'hUGETracker'
7 ClientHeight = 1342 7 ClientHeight = 1241
8 ClientWidth = 2212 8 ClientWidth = 2056
9 DesignTimePPI = 168 9 DesignTimePPI = 168
10 KeyPreview = True 10 KeyPreview = True
11 Menu = MainMenu1 11 Menu = MainMenu1
@@ -13,12 +13,11 @@ object frmTracker: TfrmTracker
13 OnCreate = FormCreate 13 OnCreate = FormCreate
14 OnKeyDown = FormKeyDown 14 OnKeyDown = FormKeyDown
15 OnKeyUp = FormKeyUp 15 OnKeyUp = FormKeyUp
16 Position = poDefault
17 ShowHint = True 16 ShowHint = True
18 LCLVersion = '2.0.6.0' 17 LCLVersion = '2.0.6.0'
19 object TreeView1: TTreeView 18 object TreeView1: TTreeView
20 Left = 0 19 Left = 0
21 Height = 946 20 Height = 845
22 Top = 353 21 Top = 353
23 Width = 338 22 Width = 338
24 Align = alLeft 23 Align = alLeft
@@ -36,26 +35,26 @@ object frmTracker: TfrmTracker
36 end 35 end
37 object Splitter1: TSplitter 36 object Splitter1: TSplitter
38 Left = 338 37 Left = 338
39 Height = 946 38 Height = 845
40 Top = 353 39 Top = 353
41 Width = 9 40 Width = 9
42 end 41 end
43 object Panel1: TPanel 42 object Panel1: TPanel
44 Left = 347 43 Left = 347
45 Height = 946 44 Height = 845
46 Top = 353 45 Top = 353
47 Width = 1865 46 Width = 1709
48 Align = alClient 47 Align = alClient
49 BevelOuter = bvNone 48 BevelOuter = bvNone
50 ClientHeight = 946 49 ClientHeight = 845
51 ClientWidth = 1865 50 ClientWidth = 1709
52 ParentFont = False 51 ParentFont = False
53 TabOrder = 2 52 TabOrder = 2
54 object PageControl1: TPageControl 53 object PageControl1: TPageControl
55 Left = 0 54 Left = 0
56 Height = 946 55 Height = 845
57 Top = 0 56 Top = 0
58 Width = 1865 57 Width = 1709
59 ActivePage = InstrumentTabSheet 58 ActivePage = InstrumentTabSheet
60 Align = alClient 59 Align = alClient
61 ParentFont = False 60 ParentFont = False
@@ -282,18 +281,18 @@ object frmTracker: TfrmTracker
282 end 281 end
283 object InstrumentTabSheet: TTabSheet 282 object InstrumentTabSheet: TTabSheet
284 Caption = 'Instruments' 283 Caption = 'Instruments'
285 ClientHeight = 903 284 ClientHeight = 802
286 ClientWidth = 1857 285 ClientWidth = 1701
287 ParentFont = False 286 ParentFont = False
288 object PaintBox1: TPaintBox 287 object PaintBox1: TPaintBox
289 AnchorSideTop.Control = FlowPanel1 288 AnchorSideTop.Control = FlowPanel1
290 AnchorSideTop.Side = asrBottom 289 AnchorSideTop.Side = asrBottom
291 AnchorSideBottom.Side = asrBottom 290 AnchorSideBottom.Side = asrBottom
292 Left = 0 291 Left = 0
293 Height = 249 292 Height = 148
294 Hint = 'Preview of how the resulting waveform will look with envelope applied' 293 Hint = 'Preview of how the resulting waveform will look with envelope applied'
295 Top = 654 294 Top = 654
296 Width = 1857 295 Width = 1701
297 Align = alClient 296 Align = alClient
298 Color = clBlack 297 Color = clBlack
299 ParentColor = False 298 ParentColor = False
@@ -304,7 +303,7 @@ object frmTracker: TfrmTracker
304 Left = 0 303 Left = 0
305 Height = 654 304 Height = 654
306 Top = 0 305 Top = 0
307 Width = 1857 306 Width = 1701
308 Align = alTop 307 Align = alTop
309 AutoSize = True 308 AutoSize = True
310 BevelOuter = bvNone 309 BevelOuter = bvNone
@@ -1757,16 +1756,16 @@ object frmTracker: TfrmTracker
1757 Left = 0 1756 Left = 0
1758 Height = 312 1757 Height = 312
1759 Top = 41 1758 Top = 41
1760 Width = 2212 1759 Width = 2056
1761 Align = alTop 1760 Align = alTop
1762 BevelOuter = bvNone 1761 BevelOuter = bvNone
1763 ChildSizing.HorizontalSpacing = 10 1762 ChildSizing.HorizontalSpacing = 10
1764 ClientHeight = 312 1763 ClientHeight = 312
1765 ClientWidth = 2212 1764 ClientWidth = 2056
1766 ParentFont = False 1765 ParentFont = False
1767 TabOrder = 3 1766 TabOrder = 3
1768 object Panel6: TPanel 1767 object Panel6: TPanel
1769 Left = 1522 1768 Left = 1366
1770 Height = 312 1769 Height = 312
1771 Top = 0 1770 Top = 0
1772 Width = 690 1771 Width = 690
@@ -1806,7 +1805,7 @@ object frmTracker: TfrmTracker
1806 end 1805 end
1807 object LEDMeter1: TLEDMeter 1806 object LEDMeter1: TLEDMeter
1808 AnchorSideRight.Side = asrBottom 1807 AnchorSideRight.Side = asrBottom
1809 Left = 1432 1808 Left = 1276
1810 Height = 312 1809 Height = 312
1811 Top = 0 1810 Top = 0
1812 Width = 88 1811 Width = 88
@@ -1830,7 +1829,7 @@ object frmTracker: TfrmTracker
1830 end 1829 end
1831 object LEDMeter2: TLEDMeter 1830 object LEDMeter2: TLEDMeter
1832 AnchorSideRight.Side = asrBottom 1831 AnchorSideRight.Side = asrBottom
1833 Left = 1344 1832 Left = 1188
1834 Height = 312 1833 Height = 312
1835 Top = 0 1834 Top = 0
1836 Width = 88 1835 Width = 88
@@ -1856,8 +1855,8 @@ object frmTracker: TfrmTracker
1856 object StatusBar1: TStatusBar 1855 object StatusBar1: TStatusBar
1857 Left = 0 1856 Left = 0
1858 Height = 43 1857 Height = 43
1859 Top = 1299 1858 Top = 1198
1860 Width = 2212 1859 Width = 2056
1861 AutoHint = True 1860 AutoHint = True
1862 Panels = < 1861 Panels = <
1863 item 1862 item
@@ -1878,7 +1877,7 @@ object frmTracker: TfrmTracker
1878 Left = 0 1877 Left = 0
1879 Height = 41 1878 Height = 41
1880 Top = 0 1879 Top = 0
1881 Width = 2212 1880 Width = 2056
1882 AutoSize = True 1881 AutoSize = True
1883 Caption = 'ToolBar1' 1882 Caption = 'ToolBar1'
1884 EdgeBorders = [ebBottom] 1883 EdgeBorders = [ebBottom]
@@ -4980,7 +4979,7 @@ object frmTracker: TfrmTracker
4980 } 4979 }
4981 end 4980 end
4982 object Timer1: TTimer 4981 object Timer1: TTimer
4983 Interval = 10 4982 Interval = 20
4984 OnTimer = Timer1Timer 4983 OnTimer = Timer1Timer
4985 left = 504 4984 left = 504
4986 top = 80 4985 top = 80
Modifiedtracker.pas +1−2
@@ -463,7 +463,7 @@ begin
463 Spokeb(NR24, %10000000); 463 Spokeb(NR24, %10000000);
464 464
465 // Silence CH3 465 // Silence CH3
466 Spokeb(NR30, 0); 466 Spokeb(NR32, 0);
467 467
468 // Silence CH4 468 // Silence CH4
469 Spokeb(NR42, 0); 469 Spokeb(NR42, 0);
@@ -1134,7 +1134,6 @@ end;
1134 1134
1135 procedure TfrmTracker.MenuItem16Click(Sender: TObject); 1135 procedure TfrmTracker.MenuItem16Click(Sender: TObject);
1136 begin 1136 begin
1137 PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0);
1138 end; 1137 end;
1139 1138
1140 procedure TfrmTracker.MenuItem17Click(Sender: TObject); 1139 procedure TfrmTracker.MenuItem17Click(Sender: TObject);
Modifiedtrackergrid.pas +7−1
@@ -334,10 +334,16 @@ begin
334 FXEditor := TfrmEffectEditor.Create(@Patterns[Cursor.X]^[Cursor.Y]); 334 FXEditor := TfrmEffectEditor.Create(@Patterns[Cursor.X]^[Cursor.Y]);
335 try 335 try
336 FXEditor.ShowModal; 336 FXEditor.ShowModal;
337 Invalidate;
338 finally 337 finally
339 FXEditor.Free; 338 FXEditor.Free;
340 end; 339 end;
340
341 NormalizeCursors;
342
343 MouseButtonDown := False;
344 DigitInputting := False;
345
346 Invalidate;
341 end; 347 end;
342 348
343 procedure TTrackerGrid.KeyDown(var Key: Word; Shift: TShiftState); 349 procedure TTrackerGrid.KeyDown(var Key: Word; Shift: TShiftState);