@@ -231,6 +231,7 @@ type |
| 231 |
PreviewingInstrument: Boolean; |
231 |
PreviewingInstrument: Boolean; |
| 232 |
DrawingWave: Boolean; |
232 |
DrawingWave: Boolean; |
| 233 |
Playing: Boolean; |
233 |
Playing: Boolean; |
|
|
234 |
LoadingFile: Boolean; |
| 234 |
|
235 |
|
| 235 |
PatternsNode, InstrumentsNode, WavesNode, RoutinesNode: TTreeNode; |
236 |
PatternsNode, InstrumentsNode, WavesNode, RoutinesNode: TTreeNode; |
| 236 |
|
237 |
|
@@ -243,10 +244,12 @@ type |
| 243 |
procedure LoadWave(Wave: Integer); |
244 |
procedure LoadWave(Wave: Integer); |
| 244 |
procedure ReloadPatterns; |
245 |
procedure ReloadPatterns; |
| 245 |
procedure CopyOrderGridToOrderMatrix; |
246 |
procedure CopyOrderGridToOrderMatrix; |
|
|
247 |
procedure CopyOrderMatrixToOrderGrid; |
| 246 |
function PeekSymbol(Symbol: String): Integer; |
248 |
function PeekSymbol(Symbol: String): Integer; |
| 247 |
procedure ResetEmulationThread; |
249 |
procedure ResetEmulationThread; |
| 248 |
procedure OnFD; |
250 |
procedure OnFD; |
| 249 |
|
251 |
|
|
|
252 |
procedure RecreateTrackerGrid; |
| 250 |
procedure UpdateUIAfterLoad; |
253 |
procedure UpdateUIAfterLoad; |
| 251 |
|
254 |
|
| 252 |
procedure DrawWaveform(PB: TPaintBox; Wave: TWave); |
255 |
procedure DrawWaveform(PB: TPaintBox; Wave: TWave); |
@@ -267,6 +270,7 @@ implementation |
| 267 |
|
270 |
|
| 268 |
procedure TfrmTracker.UpdateUIAfterLoad; |
271 |
procedure TfrmTracker.UpdateUIAfterLoad; |
| 269 |
begin |
272 |
begin |
|
|
273 |
LoadingFile := True; // HACK!!!!! |
| 270 |
LoadInstrument(1); |
274 |
LoadInstrument(1); |
| 271 |
LoadWave(0); |
275 |
LoadWave(0); |
| 272 |
|
276 |
|
@@ -275,6 +279,14 @@ begin |
| 275 |
CommentMemo.Text := Song.Comment; |
279 |
CommentMemo.Text := Song.Comment; |
| 276 |
|
280 |
|
| 277 |
TicksPerRowSpinEdit.Value := Song.TicksPerRow; |
281 |
TicksPerRowSpinEdit.Value := Song.TicksPerRow; |
|
|
282 |
|
|
|
283 |
RecreateTrackerGrid; |
|
|
284 |
CopyOrderMatrixToOrderGrid; |
|
|
285 |
|
|
|
286 |
LoadingFile := False; // HACK!!!! |
|
|
287 |
|
|
|
288 |
OrderEditStringGrid.Row := 1; |
|
|
289 |
ReloadPatterns; |
| 278 |
end; |
290 |
end; |
| 279 |
|
291 |
|
| 280 |
procedure TfrmTracker.DrawWaveform(PB: TPaintBox; Wave: TWave); |
292 |
procedure TfrmTracker.DrawWaveform(PB: TPaintBox; Wave: TWave); |
@@ -369,6 +381,8 @@ var |
| 369 |
I: Integer; |
381 |
I: Integer; |
| 370 |
OrderNum: Integer; |
382 |
OrderNum: Integer; |
| 371 |
begin |
383 |
begin |
|
|
384 |
if LoadingFile then Exit; |
|
|
385 |
|
| 372 |
for I := 0 to 3 do begin |
386 |
for I := 0 to 3 do begin |
| 373 |
OrderNum := 0; |
387 |
OrderNum := 0; |
| 374 |
TryStrToInt( |
388 |
TryStrToInt( |
@@ -399,6 +413,38 @@ begin |
| 399 |
end; |
413 |
end; |
| 400 |
end; |
414 |
end; |
| 401 |
|
415 |
|
|
|
416 |
procedure TfrmTracker.CopyOrderMatrixToOrderGrid; |
|
|
417 |
|
|
|
418 |
function IntToStr_(X: Integer): String; |
|
|
419 |
begin |
|
|
420 |
if X = 0 then Result := '' else Result := IntToStr(X); |
|
|
421 |
end; |
|
|
422 |
|
|
|
423 |
var |
|
|
424 |
MaxRows, C, R: Integer; |
|
|
425 |
begin |
|
|
426 |
MaxRows := -1; |
|
|
427 |
OrderEditStringGrid.Clean([gzNormal]); |
|
|
428 |
|
|
|
429 |
for C := Low(TOrderMatrix) to High(TOrderMatrix) do |
|
|
430 |
if Length(Song.OrderMatrix[C]) > MaxRows then |
|
|
431 |
MaxRows := Length(Song.OrderMatrix[C]); |
|
|
432 |
|
|
|
433 |
OrderEditStringGrid.RowCount := MaxRows; |
|
|
434 |
|
|
|
435 |
for C := Low(Song.OrderMatrix) to High(Song.OrderMatrix) do begin |
|
|
436 |
for R := 0 to High(Song.OrderMatrix[C])-1 do |
|
|
437 |
OrderEditStringGrid.Cells[C+1, R+1] := IntToStr_(Song.OrderMatrix[C, R]); |
|
|
438 |
end; |
|
|
439 |
|
|
|
440 |
// Show zeroes where they belong |
|
|
441 |
for R := 1 to OrderEditStringGrid.RowCount-1 do |
|
|
442 |
if Trim(OrderEditStringGrid.Rows[R].Text) <> '' then |
|
|
443 |
for C := 1 to OrderEditStringGrid.ColCount-1 do |
|
|
444 |
if OrderEditStringGrid.Cells[C, R] = '' then |
|
|
445 |
OrderEditStringGrid.Cells[C, R] := '0'; |
|
|
446 |
end; |
|
|
447 |
|
| 402 |
function TfrmTracker.PeekSymbol(Symbol: String): Integer; |
448 |
function TfrmTracker.PeekSymbol(Symbol: String): Integer; |
| 403 |
begin |
449 |
begin |
| 404 |
if SymbolTable = nil then exit; |
450 |
if SymbolTable = nil then exit; |
@@ -426,6 +472,12 @@ begin |
| 426 |
TrackerGrid.HighlightedRow:=PeekSymbol(SYM_ROW); |
472 |
TrackerGrid.HighlightedRow:=PeekSymbol(SYM_ROW); |
| 427 |
end; |
473 |
end; |
| 428 |
|
474 |
|
|
|
475 |
procedure TfrmTracker.RecreateTrackerGrid; |
|
|
476 |
begin |
|
|
477 |
if TrackerGrid <> nil then TrackerGrid.Free; |
|
|
478 |
TrackerGrid := TTrackerGrid.Create(Self, ScrollBox1, Song.Patterns); |
|
|
479 |
end; |
|
|
480 |
|
| 429 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
481 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
| 430 |
var |
482 |
var |
| 431 |
CI: ^TInstrument; |
483 |
CI: ^TInstrument; |
@@ -619,8 +671,7 @@ begin |
| 619 |
|
671 |
|
| 620 |
// Create pattern editor control |
672 |
// Create pattern editor control |
| 621 |
Song.Patterns := TPatternMap.Create; |
673 |
Song.Patterns := TPatternMap.Create; |
| 622 |
TrackerGrid := TTrackerGrid.Create(Self, ScrollBox1, Song.Patterns); |
674 |
RecreateTrackerGrid; |
| 623 |
|
|
|
| 624 |
|
675 |
|
| 625 |
// Fix the size of the channel headers |
676 |
// Fix the size of the channel headers |
| 626 |
for Section in HeaderControl1.Sections do |
677 |
for Section in HeaderControl1.Sections do |
@@ -738,13 +789,29 @@ begin |
| 738 |
end; |
789 |
end; |
| 739 |
|
790 |
|
| 740 |
procedure TfrmTracker.FileSaveAs1Accept(Sender: TObject); |
791 |
procedure TfrmTracker.FileSaveAs1Accept(Sender: TObject); |
| 741 |
{var |
792 |
var |
| 742 |
F: file of TSong;} |
793 |
Stream: TStream; |
| 743 |
begin |
794 |
begin |
| 744 |
{AssignFile(F, FileSaveAs1.Dialog.FileName); |
795 |
stream := TFileStream.Create(FileSaveAs1.Dialog.FileName, fmCreate); |
| 745 |
Rewrite(F); |
796 |
try |
| 746 |
Write(F, Song); |
797 |
WriteSongToStream(stream, Song); |
| 747 |
CloseFile(F);} |
798 |
finally |
|
|
799 |
stream.Free; |
|
|
800 |
end; |
|
|
801 |
end; |
|
|
802 |
|
|
|
803 |
procedure TfrmTracker.FileOpen1Accept(Sender: TObject); |
|
|
804 |
var |
|
|
805 |
Stream: TStream; |
|
|
806 |
begin |
|
|
807 |
stream := TFileStream.Create(FileOpen1.Dialog.FileName, fmOpenRead); |
|
|
808 |
try |
|
|
809 |
ReadSongFromStream(stream, Song); |
|
|
810 |
finally |
|
|
811 |
stream.Free; |
|
|
812 |
end; |
|
|
813 |
|
|
|
814 |
UpdateUIAfterLoad; |
| 748 |
end; |
815 |
end; |
| 749 |
|
816 |
|
| 750 |
procedure TfrmTracker.HeaderControl1MouseDown(Sender: TObject; |
817 |
procedure TfrmTracker.HeaderControl1MouseDown(Sender: TObject; |
@@ -787,18 +854,6 @@ begin |
| 787 |
Section.Width := TrackerGrid.ColumnWidth; |
854 |
Section.Width := TrackerGrid.ColumnWidth; |
| 788 |
end; |
855 |
end; |
| 789 |
|
856 |
|
| 790 |
procedure TfrmTracker.FileOpen1Accept(Sender: TObject); |
|
|
| 791 |
{var |
|
|
| 792 |
F: file of TSong;} |
|
|
| 793 |
begin |
|
|
| 794 |
{AssignFile(F, FileOpen1.Dialog.FileName); |
|
|
| 795 |
Reset(F); |
|
|
| 796 |
Read(F, Song); |
|
|
| 797 |
CloseFile(F); |
|
|
| 798 |
|
|
|
| 799 |
UpdateUIAfterLoad;} |
|
|
| 800 |
end; |
|
|
| 801 |
|
|
|
| 802 |
procedure TfrmTracker.CutActionExecute(Sender: TObject); |
857 |
procedure TfrmTracker.CutActionExecute(Sender: TObject); |
| 803 |
begin |
858 |
begin |
| 804 |
PostMessage(Screen.ActiveControl.Handle, LM_CUT, 0, 0); |
859 |
PostMessage(Screen.ActiveControl.Handle, LM_CUT, 0, 0); |