@@ -16,7 +16,7 @@ type |
| 16 |
{ TfrmTracker } |
16 |
{ TfrmTracker } |
| 17 |
|
17 |
|
| 18 |
TfrmTracker = class(TForm) |
18 |
TfrmTracker = class(TForm) |
| 19 |
ComboBox1: TComboBox; |
19 |
InstrumentComboBox: TComboBox; |
| 20 |
CutAction: TAction; |
20 |
CutAction: TAction; |
| 21 |
ImageList2: TImageList; |
21 |
ImageList2: TImageList; |
| 22 |
Label22: TLabel; |
22 |
Label22: TLabel; |
@@ -24,8 +24,6 @@ type |
| 24 |
Label24: TLabel; |
24 |
Label24: TLabel; |
| 25 |
LEDMeter1: TLEDMeter; |
25 |
LEDMeter1: TLEDMeter; |
| 26 |
LEDMeter2: TLEDMeter; |
26 |
LEDMeter2: TLEDMeter; |
| 27 |
LEDMeter3: TLEDMeter; |
|
|
| 28 |
LEDMeter4: TLEDMeter; |
|
|
| 29 |
OrderEditStringGrid: TStringGrid; |
27 |
OrderEditStringGrid: TStringGrid; |
| 30 |
EditCut1: TEditCut; |
28 |
EditCut1: TEditCut; |
| 31 |
HeaderControl1: THeaderControl; |
29 |
HeaderControl1: THeaderControl; |
@@ -34,8 +32,9 @@ type |
| 34 |
MenuItem19: TMenuItem; |
32 |
MenuItem19: TMenuItem; |
| 35 |
MenuItem20: TMenuItem; |
33 |
MenuItem20: TMenuItem; |
| 36 |
Duty1Visualizer: TPaintBox; |
34 |
Duty1Visualizer: TPaintBox; |
| 37 |
SpinEdit1: TSpinEdit; |
35 |
OctaveSpinEdit: TSpinEdit; |
| 38 |
SpinEdit2: TSpinEdit; |
36 |
StepSpinEdit: TSpinEdit; |
|
|
37 |
Timer1: TTimer; |
| 39 |
ToolButton3: TToolButton; |
38 |
ToolButton3: TToolButton; |
| 40 |
ToolButton9: TToolButton; |
39 |
ToolButton9: TToolButton; |
| 41 |
WaveVisualizer: TPaintBox; |
40 |
WaveVisualizer: TPaintBox; |
@@ -165,13 +164,14 @@ type |
| 165 |
DivRatioSpinner: TECSpinPosition; |
164 |
DivRatioSpinner: TECSpinPosition; |
| 166 |
TreeView1: TTreeView; |
165 |
TreeView1: TTreeView; |
| 167 |
TrackerGrid: TTrackerGrid; |
166 |
TrackerGrid: TTrackerGrid; |
| 168 |
procedure ComboBox1Change(Sender: TObject); |
167 |
procedure InstrumentComboBoxChange(Sender: TObject); |
| 169 |
procedure CopyActionExecute(Sender: TObject); |
168 |
procedure CopyActionExecute(Sender: TObject); |
| 170 |
procedure CutActionExecute(Sender: TObject); |
169 |
procedure CutActionExecute(Sender: TObject); |
| 171 |
procedure Duty1VisualizerPaint(Sender: TObject); |
170 |
procedure Duty1VisualizerPaint(Sender: TObject); |
| 172 |
procedure Duty2VisualizerPaint(Sender: TObject); |
171 |
procedure Duty2VisualizerPaint(Sender: TObject); |
| 173 |
procedure FileOpen1Accept(Sender: TObject); |
172 |
procedure FileOpen1Accept(Sender: TObject); |
| 174 |
procedure FileSaveAs1Accept(Sender: TObject); |
173 |
procedure FileSaveAs1Accept(Sender: TObject); |
|
|
174 |
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); |
| 175 |
procedure HeaderControl1MouseDown(Sender: TObject; Button: TMouseButton; |
175 |
procedure HeaderControl1MouseDown(Sender: TObject; Button: TMouseButton; |
| 176 |
Shift: TShiftState; X, Y: Integer); |
176 |
Shift: TShiftState; X, Y: Integer); |
| 177 |
procedure HeaderControl1SectionClick(HeaderControl: TCustomHeaderControl; |
177 |
procedure HeaderControl1SectionClick(HeaderControl: TCustomHeaderControl; |
@@ -218,9 +218,10 @@ type |
| 218 |
Shift: TShiftState); |
218 |
Shift: TShiftState); |
| 219 |
procedure PanicToolButtonClick(Sender: TObject); |
219 |
procedure PanicToolButtonClick(Sender: TObject); |
| 220 |
procedure PasteActionExecute(Sender: TObject); |
220 |
procedure PasteActionExecute(Sender: TObject); |
| 221 |
procedure SpinEdit1Change(Sender: TObject); |
221 |
procedure OctaveSpinEditChange(Sender: TObject); |
| 222 |
procedure SpinEdit2Change(Sender: TObject); |
222 |
procedure StepSpinEditChange(Sender: TObject); |
| 223 |
procedure TicksPerRowSpinEditChange(Sender: TObject); |
223 |
procedure TicksPerRowSpinEditChange(Sender: TObject); |
|
|
224 |
procedure Timer1Timer(Sender: TObject); |
| 224 |
procedure ToolButton2Click(Sender: TObject); |
225 |
procedure ToolButton2Click(Sender: TObject); |
| 225 |
procedure ToolButton3Click(Sender: TObject); |
226 |
procedure ToolButton3Click(Sender: TObject); |
| 226 |
procedure ToolButton4Click(Sender: TObject); |
227 |
procedure ToolButton4Click(Sender: TObject); |
@@ -278,7 +279,7 @@ type |
| 278 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
279 |
procedure WordPokeSymbol(Symbol: String; Value: Word); |
| 279 |
function PeekSymbol(Symbol: String): Integer; |
280 |
function PeekSymbol(Symbol: String): Integer; |
| 280 |
procedure PokeSymbol(Symbol: String; Value: Byte); |
281 |
procedure PokeSymbol(Symbol: String; Value: Byte); |
| 281 |
procedure OnFD; |
282 |
procedure OnFD(var msg: TLMessage); message LM_FD; |
| 282 |
|
283 |
|
| 283 |
procedure RecreateTrackerGrid; |
284 |
procedure RecreateTrackerGrid; |
| 284 |
procedure UpdateUIAfterLoad; |
285 |
procedure UpdateUIAfterLoad; |
@@ -301,6 +302,8 @@ implementation |
| 301 |
{ TfrmTracker } |
302 |
{ TfrmTracker } |
| 302 |
|
303 |
|
| 303 |
procedure TfrmTracker.UpdateUIAfterLoad; |
304 |
procedure TfrmTracker.UpdateUIAfterLoad; |
|
|
305 |
var |
|
|
306 |
I: Integer; |
| 304 |
begin |
307 |
begin |
| 305 |
LoadingFile := True; // HACK!!!!! |
308 |
LoadingFile := True; // HACK!!!!! |
| 306 |
LoadInstrument(1); |
309 |
LoadInstrument(1); |
@@ -315,6 +318,9 @@ begin |
| 315 |
RecreateTrackerGrid; |
318 |
RecreateTrackerGrid; |
| 316 |
CopyOrderMatrixToOrderGrid; |
319 |
CopyOrderMatrixToOrderGrid; |
| 317 |
|
320 |
|
|
|
321 |
for I := Low(Song.Instruments) to High(song.Instruments) do |
|
|
322 |
InstrumentComboBox.Items[I] := IntToStr(I)+': '+Song.Instruments[I].Name; |
|
|
323 |
|
| 318 |
LoadingFile := False; // HACK!!!! |
324 |
LoadingFile := False; // HACK!!!! |
| 319 |
|
325 |
|
| 320 |
OrderEditStringGrid.Row := 1; |
326 |
OrderEditStringGrid.Row := 1; |
@@ -357,8 +363,34 @@ begin |
| 357 |
end; |
363 |
end; |
| 358 |
|
364 |
|
| 359 |
procedure TfrmTracker.DrawVizualizer(PB: TPaintBox; Channel: Integer); |
365 |
procedure TfrmTracker.DrawVizualizer(PB: TPaintBox; Channel: Integer); |
|
|
366 |
var |
|
|
367 |
I, J, X: Integer; |
| 360 |
begin |
368 |
begin |
|
|
369 |
with PB.Canvas do begin |
|
|
370 |
MoveTo(0, PB.Height div 2); |
|
|
371 |
|
|
|
372 |
Brush.Color := clBlack; |
|
|
373 |
Clear; |
|
|
374 |
|
|
|
375 |
Pen.Color := clGray; |
|
|
376 |
Rectangle(0, 0, PB.Width, PB.Height); |
| 361 |
|
377 |
|
|
|
378 |
Pen.Color := clLime; |
|
|
379 |
Pen.Width := 2; |
|
|
380 |
|
|
|
381 |
X := 0; |
|
|
382 |
I := 0; |
|
|
383 |
J := SampleBuffers[Channel].Cursor; |
|
|
384 |
while I < SAMPLE_BUFFER_SIZE-1 do begin |
|
|
385 |
LineTo(X, (PB.Height div 2) + |
|
|
386 |
Trunc((SampleBuffers[Channel].BufferL[J]/512)*PB.Height) + |
|
|
387 |
Trunc((SampleBuffers[Channel].BufferR[J]/512)*PB.Height)); |
|
|
388 |
J := (J+1) mod SAMPLE_BUFFER_SIZE; |
|
|
389 |
|
|
|
390 |
X := Trunc((I/SAMPLE_BUFFER_SIZE)*PB.Width); |
|
|
391 |
Inc(I, 2); |
|
|
392 |
end; |
|
|
393 |
end; |
| 362 |
end; |
394 |
end; |
| 363 |
|
395 |
|
| 364 |
procedure TfrmTracker.PreviewInstrument(Freq: Integer; Instr: Integer); |
396 |
procedure TfrmTracker.PreviewInstrument(Freq: Integer; Instr: Integer); |
@@ -542,9 +574,9 @@ begin |
| 542 |
EmulationThread.Start; |
574 |
EmulationThread.Start; |
| 543 |
end; |
575 |
end; |
| 544 |
|
576 |
|
| 545 |
procedure TfrmTracker.OnFD; |
577 |
procedure TfrmTracker.OnFD(var Msg: TLMessage); |
| 546 |
begin |
578 |
begin |
| 547 |
TrackerGrid.HighlightedRow:=PeekSymbol(SYM_ROW); |
579 |
TrackerGrid.HighlightedRow := PeekSymbol(SYM_ROW); |
| 548 |
OrderEditStringGrid.Row := (PeekSymbol(SYM_CURRENT_ORDER) div 2) + 1; |
580 |
OrderEditStringGrid.Row := (PeekSymbol(SYM_CURRENT_ORDER) div 2) + 1; |
| 549 |
end; |
581 |
end; |
| 550 |
|
582 |
|
@@ -562,7 +594,7 @@ begin |
| 562 |
CI := CurrentInstrument; |
594 |
CI := CurrentInstrument; |
| 563 |
|
595 |
|
| 564 |
InstrumentNumberSpinner.Value := Instr; |
596 |
InstrumentNumberSpinner.Value := Instr; |
| 565 |
InstrumentNameEdit.Text := CI^.Name; |
597 |
//InstrumentNameEdit.Text := CI^.Name; |
| 566 |
LengthEnabledCheckbox.Checked := CI^.LengthEnabled; |
598 |
LengthEnabledCheckbox.Checked := CI^.LengthEnabled; |
| 567 |
LengthSpinner.Position := CI^.Length; |
599 |
LengthSpinner.Position := CI^.Length; |
| 568 |
|
600 |
|
@@ -656,7 +688,7 @@ end; |
| 656 |
|
688 |
|
| 657 |
procedure TfrmTracker.WaveVisualizerPaint(Sender: TObject); |
689 |
procedure TfrmTracker.WaveVisualizerPaint(Sender: TObject); |
| 658 |
begin |
690 |
begin |
| 659 |
|
691 |
DrawVizualizer(WaveVisualizer, 3); |
| 660 |
end; |
692 |
end; |
| 661 |
|
693 |
|
| 662 |
procedure TfrmTracker.WaveVolumeComboboxChange(Sender: TObject); |
694 |
procedure TfrmTracker.WaveVolumeComboboxChange(Sender: TObject); |
@@ -761,8 +793,6 @@ begin |
| 761 |
for Section in HeaderControl1.Sections do |
793 |
for Section in HeaderControl1.Sections do |
| 762 |
(Section as THeaderSection).Width := TrackerGrid.ColumnWidth; |
794 |
(Section as THeaderSection).Width := TrackerGrid.ColumnWidth; |
| 763 |
|
795 |
|
| 764 |
FDCallback := @Self.OnFD; |
|
|
| 765 |
|
|
|
| 766 |
for I := Low(Song.Instruments) to High(Song.Instruments) do |
796 |
for I := Low(Song.Instruments) to High(Song.Instruments) do |
| 767 |
with Song.Instruments[I] do begin |
797 |
with Song.Instruments[I] do begin |
| 768 |
Type_ := Square; |
798 |
Type_ := Square; |
@@ -884,6 +914,11 @@ begin |
| 884 |
end; |
914 |
end; |
| 885 |
end; |
915 |
end; |
| 886 |
|
916 |
|
|
|
917 |
procedure TfrmTracker.FormClose(Sender: TObject; var CloseAction: TCloseAction); |
|
|
918 |
begin |
|
|
919 |
|
|
|
920 |
end; |
|
|
921 |
|
| 887 |
procedure TfrmTracker.FileOpen1Accept(Sender: TObject); |
922 |
procedure TfrmTracker.FileOpen1Accept(Sender: TObject); |
| 888 |
var |
923 |
var |
| 889 |
Stream: TStream; |
924 |
Stream: TStream; |
@@ -945,12 +980,12 @@ end; |
| 945 |
|
980 |
|
| 946 |
procedure TfrmTracker.Duty1VisualizerPaint(Sender: TObject); |
981 |
procedure TfrmTracker.Duty1VisualizerPaint(Sender: TObject); |
| 947 |
begin |
982 |
begin |
| 948 |
|
983 |
DrawVizualizer(Duty1Visualizer, 1); |
| 949 |
end; |
984 |
end; |
| 950 |
|
985 |
|
| 951 |
procedure TfrmTracker.Duty2VisualizerPaint(Sender: TObject); |
986 |
procedure TfrmTracker.Duty2VisualizerPaint(Sender: TObject); |
| 952 |
begin |
987 |
begin |
| 953 |
|
988 |
DrawVizualizer(Duty2Visualizer, 2); |
| 954 |
end; |
989 |
end; |
| 955 |
|
990 |
|
| 956 |
procedure TfrmTracker.CopyActionExecute(Sender: TObject); |
991 |
procedure TfrmTracker.CopyActionExecute(Sender: TObject); |
@@ -958,9 +993,9 @@ begin |
| 958 |
PostMessage(Screen.ActiveControl.Handle, LM_COPY, 0, 0); |
993 |
PostMessage(Screen.ActiveControl.Handle, LM_COPY, 0, 0); |
| 959 |
end; |
994 |
end; |
| 960 |
|
995 |
|
| 961 |
procedure TfrmTracker.ComboBox1Change(Sender: TObject); |
996 |
procedure TfrmTracker.InstrumentComboBoxChange(Sender: TObject); |
| 962 |
begin |
997 |
begin |
| 963 |
TrackerGrid.SelectedInstrument := ComboBox1.ItemIndex; |
998 |
TrackerGrid.SelectedInstrument := InstrumentComboBox.ItemIndex; |
| 964 |
end; |
999 |
end; |
| 965 |
|
1000 |
|
| 966 |
procedure TfrmTracker.PasteActionExecute(Sender: TObject); |
1001 |
procedure TfrmTracker.PasteActionExecute(Sender: TObject); |
@@ -968,14 +1003,14 @@ begin |
| 968 |
PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0); |
1003 |
PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0); |
| 969 |
end; |
1004 |
end; |
| 970 |
|
1005 |
|
| 971 |
procedure TfrmTracker.SpinEdit1Change(Sender: TObject); |
1006 |
procedure TfrmTracker.OctaveSpinEditChange(Sender: TObject); |
| 972 |
begin |
1007 |
begin |
| 973 |
TrackerGrid.SelectedOctave := SpinEdit1.Value; |
1008 |
TrackerGrid.SelectedOctave := OctaveSpinEdit.Value; |
| 974 |
end; |
1009 |
end; |
| 975 |
|
1010 |
|
| 976 |
procedure TfrmTracker.SpinEdit2Change(Sender: TObject); |
1011 |
procedure TfrmTracker.StepSpinEditChange(Sender: TObject); |
| 977 |
begin |
1012 |
begin |
| 978 |
TrackerGrid.Step := SpinEdit2.Value; |
1013 |
TrackerGrid.Step := StepSpinEdit.Value; |
| 979 |
end; |
1014 |
end; |
| 980 |
|
1015 |
|
| 981 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
1016 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
@@ -1015,6 +1050,8 @@ end; |
| 1015 |
procedure TfrmTracker.InstrumentNameEditChange(Sender: TObject); |
1050 |
procedure TfrmTracker.InstrumentNameEditChange(Sender: TObject); |
| 1016 |
begin |
1051 |
begin |
| 1017 |
CurrentInstrument^.Name := InstrumentNameEdit.Text; |
1052 |
CurrentInstrument^.Name := InstrumentNameEdit.Text; |
|
|
1053 |
InstrumentComboBox.Items[InstrumentNumberSpinner.Value] := |
|
|
1054 |
IntToStr(InstrumentNumberSpinner.Value) + ': ' + InstrumentNameEdit.Text; |
| 1018 |
end; |
1055 |
end; |
| 1019 |
|
1056 |
|
| 1020 |
procedure TfrmTracker.InstrumentNumberSpinnerChange(Sender: TObject); |
1057 |
procedure TfrmTracker.InstrumentNumberSpinnerChange(Sender: TObject); |
@@ -1084,7 +1121,7 @@ end; |
| 1084 |
|
1121 |
|
| 1085 |
procedure TfrmTracker.NoiseVisualizerPaint(Sender: TObject); |
1122 |
procedure TfrmTracker.NoiseVisualizerPaint(Sender: TObject); |
| 1086 |
begin |
1123 |
begin |
| 1087 |
|
1124 |
DrawVizualizer(NoiseVisualizer, 4); |
| 1088 |
end; |
1125 |
end; |
| 1089 |
|
1126 |
|
| 1090 |
procedure TfrmTracker.OrderEditStringGridAfterSelection(Sender: TObject; aCol, |
1127 |
procedure TfrmTracker.OrderEditStringGridAfterSelection(Sender: TObject; aCol, |
@@ -1176,6 +1213,35 @@ begin |
| 1176 |
Song.TicksPerRow := TicksPerRowSpinEdit.Value; |
1213 |
Song.TicksPerRow := TicksPerRowSpinEdit.Value; |
| 1177 |
end; |
1214 |
end; |
| 1178 |
|
1215 |
|
|
|
1216 |
procedure TfrmTracker.Timer1Timer(Sender: TObject); |
|
|
1217 |
var |
|
|
1218 |
Max1, Max2: Integer; |
|
|
1219 |
I: Integer; |
|
|
1220 |
Samp: Integer; |
|
|
1221 |
begin |
|
|
1222 |
Max1 := -1; |
|
|
1223 |
Max2 := -1; |
|
|
1224 |
for I := 0 to SAMPLE_BUFFER_SIZE do begin |
|
|
1225 |
Samp := Abs(SampleBuffers[0].BufferL[I] div 2); |
|
|
1226 |
if Samp > Max1 then Max1 := Samp; |
|
|
1227 |
Samp := Abs(SampleBuffers[0].BufferR[I] div 2); |
|
|
1228 |
if Samp > Max2 then Max2 := Samp; |
|
|
1229 |
end; |
|
|
1230 |
|
|
|
1231 |
Duty1Visualizer.Invalidate; |
|
|
1232 |
Duty2Visualizer.Invalidate; |
|
|
1233 |
NoiseVisualizer.Invalidate; |
|
|
1234 |
WaveVisualizer.Invalidate; |
|
|
1235 |
|
|
|
1236 |
LEDMeter1.Position := LEDMeter1.Position-2; |
|
|
1237 |
LEDMeter2.Position := LEDMeter2.Position-2; |
|
|
1238 |
|
|
|
1239 |
Max1 := Trunc((Max1/512)*100); |
|
|
1240 |
Max2 := Trunc((Max2/512)*100); |
|
|
1241 |
if Max1 > LEDMeter1.Position then LEDMeter1.Position := Max1; |
|
|
1242 |
if Max2 > LEDMeter2.Position then LEDMeter2.Position := Max2; |
|
|
1243 |
end; |
|
|
1244 |
|
| 1179 |
procedure TfrmTracker.ToolButton2Click(Sender: TObject); |
1245 |
procedure TfrmTracker.ToolButton2Click(Sender: TObject); |
| 1180 |
begin |
1246 |
begin |
| 1181 |
if Playing then ResetEmulationThread; |
1247 |
if Playing then ResetEmulationThread; |