@@ -9,16 +9,20 @@ uses |
| 9 |
Menus, Spin, StdCtrls, ActnList, StdActns, SynEdit, math, Instruments, Waves, |
9 |
Menus, Spin, StdCtrls, ActnList, StdActns, SynEdit, math, Instruments, Waves, |
| 10 |
Song, EmulationThread, Utils, Constants, sound, vars, machine, |
10 |
Song, EmulationThread, Utils, Constants, sound, vars, machine, |
| 11 |
about_hugetracker, TrackerGrid, lclintf, lmessages, Buttons, Grids, DBCtrls, |
11 |
about_hugetracker, TrackerGrid, lclintf, lmessages, Buttons, Grids, DBCtrls, |
| 12 |
ECProgressBar, ECSpinCtrls, ECCheckListBox, ECGrid; |
12 |
ECProgressBar, HugeDatatypes; |
| 13 |
|
13 |
|
| 14 |
type |
14 |
type |
| 15 |
{ TfrmTracker } |
15 |
{ TfrmTracker } |
| 16 |
|
16 |
|
| 17 |
TfrmTracker = class(TForm) |
17 |
TfrmTracker = class(TForm) |
| 18 |
CutAction: TAction; |
18 |
CutAction: TAction; |
| 19 |
DrawGrid1: TStringGrid; |
19 |
OrderEditStringGrid: TStringGrid; |
| 20 |
EditCut1: TEditCut; |
20 |
EditCut1: TEditCut; |
| 21 |
HeaderControl1: THeaderControl; |
21 |
HeaderControl1: THeaderControl; |
|
|
22 |
MenuItem17: TMenuItem; |
|
|
23 |
MenuItem18: TMenuItem; |
|
|
24 |
MenuItem19: TMenuItem; |
|
|
25 |
MenuItem20: TMenuItem; |
| 22 |
Panel3: TPanel; |
26 |
Panel3: TPanel; |
| 23 |
PasteAction: TAction; |
27 |
PasteAction: TAction; |
| 24 |
CopyAction: TAction; |
28 |
CopyAction: TAction; |
@@ -54,6 +58,7 @@ type |
| 54 |
MenuItem8: TMenuItem; |
58 |
MenuItem8: TMenuItem; |
| 55 |
MenuItem9: TMenuItem; |
59 |
MenuItem9: TMenuItem; |
| 56 |
OpenDialog1: TOpenDialog; |
60 |
OpenDialog1: TOpenDialog; |
|
|
61 |
OrderEditPopup: TPopupMenu; |
| 57 |
SaveDialog1: TSaveDialog; |
62 |
SaveDialog1: TSaveDialog; |
| 58 |
ScrollBox1: TScrollBox; |
63 |
ScrollBox1: TScrollBox; |
| 59 |
TicksPerRowSpinEdit: TSpinEdit; |
64 |
TicksPerRowSpinEdit: TSpinEdit; |
@@ -165,6 +170,17 @@ type |
| 165 |
procedure MenuItem16Click(Sender: TObject); |
170 |
procedure MenuItem16Click(Sender: TObject); |
| 166 |
procedure MenuItem5Click(Sender: TObject); |
171 |
procedure MenuItem5Click(Sender: TObject); |
| 167 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
172 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
|
|
173 |
procedure OrderEditStringGridAfterSelection(Sender: TObject; aCol, |
|
|
174 |
aRow: Integer); |
|
|
175 |
procedure OrderEditStringGridColRowDeleted(Sender: TObject; |
|
|
176 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
177 |
procedure OrderEditStringGridColRowExchanged(Sender: TObject; |
|
|
178 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
179 |
procedure OrderEditStringGridColRowInserted(Sender: TObject; |
|
|
180 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
181 |
procedure OrderEditStringGridColRowMoved(Sender: TObject; |
|
|
182 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
183 |
procedure OrderEditStringGridEditingDone(Sender: TObject); |
| 168 |
procedure PanicToolButtonClick(Sender: TObject); |
184 |
procedure PanicToolButtonClick(Sender: TObject); |
| 169 |
procedure PasteActionExecute(Sender: TObject); |
185 |
procedure PasteActionExecute(Sender: TObject); |
| 170 |
procedure TicksPerRowSpinEditChange(Sender: TObject); |
186 |
procedure TicksPerRowSpinEditChange(Sender: TObject); |
@@ -201,11 +217,14 @@ type |
| 201 |
|
217 |
|
| 202 |
Ticks: Integer; |
218 |
Ticks: Integer; |
| 203 |
|
219 |
|
|
|
220 |
Orders: TOrderMap; |
|
|
221 |
|
| 204 |
procedure ChangeToSquare; |
222 |
procedure ChangeToSquare; |
| 205 |
procedure ChangeToWave; |
223 |
procedure ChangeToWave; |
| 206 |
procedure ChangeToNoise; |
224 |
procedure ChangeToNoise; |
| 207 |
procedure LoadInstrument(Instr: Integer); |
225 |
procedure LoadInstrument(Instr: Integer); |
| 208 |
procedure LoadWave(Wave: Integer); |
226 |
procedure LoadWave(Wave: Integer); |
|
|
227 |
procedure ReloadPatterns; |
| 209 |
|
228 |
|
| 210 |
procedure UpdateUIAfterLoad; |
229 |
procedure UpdateUIAfterLoad; |
| 211 |
|
230 |
|
@@ -324,6 +343,23 @@ begin |
| 324 |
WaveEditPaintBox.Invalidate; |
343 |
WaveEditPaintBox.Invalidate; |
| 325 |
end; |
344 |
end; |
| 326 |
|
345 |
|
|
|
346 |
procedure TfrmTracker.ReloadPatterns; |
|
|
347 |
var |
|
|
348 |
I: Integer; |
|
|
349 |
OrderNum: Integer; |
|
|
350 |
Pat: PPattern; |
|
|
351 |
begin |
|
|
352 |
for I := 0 to 3 do begin |
|
|
353 |
OrderNum := 0; |
|
|
354 |
TryStrToInt( |
|
|
355 |
OrderEditStringGrid.Cells[I+1, OrderEditStringGrid.Row], |
|
|
356 |
OrderNum |
|
|
357 |
); |
|
|
358 |
Pat := Orders.GetOrCreateNew(OrderNum); |
|
|
359 |
TrackerGrid.LoadPattern(I, Pat); |
|
|
360 |
end; |
|
|
361 |
end; |
|
|
362 |
|
| 327 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
363 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
| 328 |
var |
364 |
var |
| 329 |
CI: ^TInstrument; |
365 |
CI: ^TInstrument; |
@@ -512,7 +548,10 @@ procedure TfrmTracker.FormCreate(Sender: TObject); |
| 512 |
var |
548 |
var |
| 513 |
I, J: Integer; |
549 |
I, J: Integer; |
| 514 |
Section: TCollectionItem; |
550 |
Section: TCollectionItem; |
|
|
551 |
Pattern0: PPattern; |
| 515 |
begin |
552 |
begin |
|
|
553 |
ReturnNilIfGrowHeapFails := False; |
|
|
554 |
|
| 516 |
for I := Low(Song.Instruments) to High(Song.Instruments) do |
555 |
for I := Low(Song.Instruments) to High(Song.Instruments) do |
| 517 |
with Song.Instruments[I] do begin |
556 |
with Song.Instruments[I] do begin |
| 518 |
Type_ := Square; |
557 |
Type_ := Square; |
@@ -538,13 +577,23 @@ begin |
| 538 |
LoadInstrument(1); |
577 |
LoadInstrument(1); |
| 539 |
LoadWave(0); |
578 |
LoadWave(0); |
| 540 |
|
579 |
|
|
|
580 |
// Initialize order table |
|
|
581 |
for I := 0 to 4 do |
|
|
582 |
OrderEditStringGrid.Cells[I, 1] := '0'; |
|
|
583 |
|
|
|
584 |
// Create the order map and pattern 0 |
|
|
585 |
New(Pattern0); |
|
|
586 |
Pattern0^ := Default(TPattern); |
|
|
587 |
Orders := TOrderMap.Create; |
|
|
588 |
Orders.Add(0, Pattern0); |
|
|
589 |
|
| 541 |
// Create pattern editor control |
590 |
// Create pattern editor control |
| 542 |
TrackerGrid := TTrackerGrid.Create(Self, ScrollBox1); |
591 |
TrackerGrid := TTrackerGrid.Create(Self, ScrollBox1, Pattern0, Pattern0, Pattern0, Pattern0); |
| 543 |
for Section in HeaderControl1.Sections do |
592 |
for Section in HeaderControl1.Sections do |
| 544 |
(Section as THeaderSection).Width := TrackerGrid.ColumnWidth; |
593 |
(Section as THeaderSection).Width := TrackerGrid.ColumnWidth; |
| 545 |
|
594 |
|
| 546 |
// Manually resize the fixed column in the order editor |
595 |
// Manually resize the fixed column in the order editor |
| 547 |
DrawGrid1.ColWidths[0]:=50; |
596 |
OrderEditStringGrid.ColWidths[0]:=50; |
| 548 |
|
597 |
|
| 549 |
// Get the emulator ready to make sound... |
598 |
// Get the emulator ready to make sound... |
| 550 |
EmulationThread := TEmulationThread.Create; |
599 |
EmulationThread := TEmulationThread.Create; |
@@ -722,6 +771,54 @@ begin |
| 722 |
CurrentInstrument^.ShiftClockFreq := Round(NoiseFreqSpinner.Position); |
771 |
CurrentInstrument^.ShiftClockFreq := Round(NoiseFreqSpinner.Position); |
| 723 |
end; |
772 |
end; |
| 724 |
|
773 |
|
|
|
774 |
procedure TfrmTracker.OrderEditStringGridAfterSelection(Sender: TObject; aCol, |
|
|
775 |
aRow: Integer); |
|
|
776 |
begin |
|
|
777 |
ReloadPatterns; |
|
|
778 |
end; |
|
|
779 |
|
|
|
780 |
procedure TfrmTracker.OrderEditStringGridColRowDeleted(Sender: TObject; |
|
|
781 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
782 |
begin |
|
|
783 |
ReloadPatterns; |
|
|
784 |
end; |
|
|
785 |
|
|
|
786 |
procedure TfrmTracker.OrderEditStringGridColRowExchanged(Sender: TObject; |
|
|
787 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
788 |
begin |
|
|
789 |
ReloadPatterns; |
|
|
790 |
end; |
|
|
791 |
|
|
|
792 |
procedure TfrmTracker.OrderEditStringGridColRowInserted(Sender: TObject; |
|
|
793 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
794 |
begin |
|
|
795 |
ReloadPatterns; |
|
|
796 |
end; |
|
|
797 |
|
|
|
798 |
procedure TfrmTracker.OrderEditStringGridColRowMoved(Sender: TObject; |
|
|
799 |
IsColumn: Boolean; sIndex, tIndex: Integer); |
|
|
800 |
begin |
|
|
801 |
ReloadPatterns; |
|
|
802 |
end; |
|
|
803 |
|
|
|
804 |
procedure TfrmTracker.OrderEditStringGridEditingDone(Sender: TObject); |
|
|
805 |
var |
|
|
806 |
Temp: Integer; |
|
|
807 |
begin |
|
|
808 |
// TODO: Fix this hack! For some reason OnValidateEntry is giving bad pointers |
|
|
809 |
// for its NewValue and OldValue params. This is the workaround for now. |
|
|
810 |
if not TryStrToInt( |
|
|
811 |
OrderEditStringGrid.Cells[OrderEditStringGrid.Col, OrderEditStringGrid.Row], |
|
|
812 |
Temp |
|
|
813 |
) then |
|
|
814 |
OrderEditStringGrid.Cells[ |
|
|
815 |
OrderEditStringGrid.Col, |
|
|
816 |
OrderEditStringGrid.Row |
|
|
817 |
] := ''; |
|
|
818 |
|
|
|
819 |
ReloadPatterns; |
|
|
820 |
end; |
|
|
821 |
|
| 725 |
procedure TfrmTracker.PanicToolButtonClick(Sender: TObject); |
822 |
procedure TfrmTracker.PanicToolButtonClick(Sender: TObject); |
| 726 |
begin |
823 |
begin |
| 727 |
// Silence CH1 |
824 |
// Silence CH1 |