@@ -6,19 +6,22 @@ interface |
| 6 |
|
6 |
|
| 7 |
uses |
7 |
uses |
| 8 |
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls, |
8 |
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls, |
| 9 |
Menus, Spin, StdCtrls, Grids, ValEdit, PopupNotifier, ActnList, StdActns, |
9 |
Menus, Spin, StdCtrls, ActnList, StdActns, SynEdit, |
| 10 |
SynEdit, VirtualTrees, ECSlider, ECProgressBar, math, Instruments, Waves, |
10 |
ECSlider, ECProgressBar, math, Instruments, Waves, Song, EmulationThread, |
| 11 |
Song, EmulationThread, Utils, Constants, StrUtils, mainloop, sound, vars, |
11 |
Utils, Constants, sound, vars, machine, about_hugetracker, Clipbrd, ValEdit, |
| 12 |
machine, about_hugetracker; |
12 |
Grids, TrackerGrid, lclintf, lmessages; |
| 13 |
|
13 |
|
| 14 |
type |
14 |
type |
| 15 |
{ TfrmTracker } |
15 |
{ TfrmTracker } |
| 16 |
|
16 |
|
| 17 |
TfrmTracker = class(TForm) |
17 |
TfrmTracker = class(TForm) |
|
|
18 |
CutAction: TAction; |
|
|
19 |
EditCut1: TEditCut; |
|
|
20 |
PasteAction: TAction; |
|
|
21 |
CopyAction: TAction; |
| 18 |
HelpLookupManual: TAction; |
22 |
HelpLookupManual: TAction; |
| 19 |
ActionList1: TActionList; |
23 |
ActionList1: TActionList; |
| 20 |
EditCopy1: TEditCopy; |
24 |
EditCopy1: TEditCopy; |
| 21 |
EditCut1: TEditCut; |
|
|
| 22 |
EditDelete1: TEditDelete; |
25 |
EditDelete1: TEditDelete; |
| 23 |
EditPaste1: TEditPaste; |
26 |
EditPaste1: TEditPaste; |
| 24 |
EditSelectAll1: TEditSelectAll; |
27 |
EditSelectAll1: TEditSelectAll; |
@@ -39,6 +42,7 @@ type |
| 39 |
MenuItem13: TMenuItem; |
42 |
MenuItem13: TMenuItem; |
| 40 |
MenuItem14: TMenuItem; |
43 |
MenuItem14: TMenuItem; |
| 41 |
MenuItem15: TMenuItem; |
44 |
MenuItem15: TMenuItem; |
|
|
45 |
MenuItem16: TMenuItem; |
| 42 |
N3: TMenuItem; |
46 |
N3: TMenuItem; |
| 43 |
N2: TMenuItem; |
47 |
N2: TMenuItem; |
| 44 |
N1: TMenuItem; |
48 |
N1: TMenuItem; |
@@ -48,7 +52,8 @@ type |
| 48 |
MenuItem9: TMenuItem; |
52 |
MenuItem9: TMenuItem; |
| 49 |
OpenDialog1: TOpenDialog; |
53 |
OpenDialog1: TOpenDialog; |
| 50 |
SaveDialog1: TSaveDialog; |
54 |
SaveDialog1: TSaveDialog; |
| 51 |
SpinEdit1: TSpinEdit; |
55 |
ScrollBox1: TScrollBox; |
|
|
56 |
TicksPerRowSpinEdit: TSpinEdit; |
| 52 |
ToolBar1: TToolBar; |
57 |
ToolBar1: TToolBar; |
| 53 |
ToolButton1: TToolButton; |
58 |
ToolButton1: TToolButton; |
| 54 |
PanicToolButton: TToolButton; |
59 |
PanicToolButton: TToolButton; |
@@ -126,6 +131,11 @@ type |
| 126 |
NoiseFreqSpinner: TECSpinPosition; |
131 |
NoiseFreqSpinner: TECSpinPosition; |
| 127 |
DivRatioSpinner: TECSpinPosition; |
132 |
DivRatioSpinner: TECSpinPosition; |
| 128 |
TreeView1: TTreeView; |
133 |
TreeView1: TTreeView; |
|
|
134 |
TrackerGrid: TTrackerGrid; |
|
|
135 |
procedure CopyActionExecute(Sender: TObject); |
|
|
136 |
procedure CutActionExecute(Sender: TObject); |
|
|
137 |
procedure FileOpen1Accept(Sender: TObject); |
|
|
138 |
procedure FileSaveAs1Accept(Sender: TObject); |
| 129 |
procedure HelpLookupManualExecute(Sender: TObject); |
139 |
procedure HelpLookupManualExecute(Sender: TObject); |
| 130 |
procedure ArtistEditChange(Sender: TObject); |
140 |
procedure ArtistEditChange(Sender: TObject); |
| 131 |
procedure CommentMemoChange(Sender: TObject); |
141 |
procedure CommentMemoChange(Sender: TObject); |
@@ -143,10 +153,12 @@ type |
| 143 |
procedure InstrumentNumberSpinnerChange(Sender: TObject); |
153 |
procedure InstrumentNumberSpinnerChange(Sender: TObject); |
| 144 |
procedure LengthSpinnerChange(Sender: TObject); |
154 |
procedure LengthSpinnerChange(Sender: TObject); |
| 145 |
procedure DebugButtonClick(Sender: TObject); |
155 |
procedure DebugButtonClick(Sender: TObject); |
|
|
156 |
procedure MenuItem16Click(Sender: TObject); |
| 146 |
procedure MenuItem5Click(Sender: TObject); |
157 |
procedure MenuItem5Click(Sender: TObject); |
| 147 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
158 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
| 148 |
procedure PanicToolButtonClick(Sender: TObject); |
159 |
procedure PanicToolButtonClick(Sender: TObject); |
| 149 |
procedure SpinEdit1Change(Sender: TObject); |
160 |
procedure PasteActionExecute(Sender: TObject); |
|
|
161 |
procedure TicksPerRowSpinEditChange(Sender: TObject); |
| 150 |
procedure WaveEditNumberSpinnerChange(Sender: TObject); |
162 |
procedure WaveEditNumberSpinnerChange(Sender: TObject); |
| 151 |
procedure WaveEditPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; |
163 |
procedure WaveEditPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; |
| 152 |
Shift: TShiftState; X, Y: Integer); |
164 |
Shift: TShiftState; X, Y: Integer); |
@@ -184,6 +196,8 @@ type |
| 184 |
procedure LoadInstrument(Instr: Integer); |
196 |
procedure LoadInstrument(Instr: Integer); |
| 185 |
procedure LoadWave(Wave: Integer); |
197 |
procedure LoadWave(Wave: Integer); |
| 186 |
|
198 |
|
|
|
199 |
procedure UpdateUIAfterLoad; |
|
|
200 |
|
| 187 |
procedure DrawWaveform(PB: TPaintBox; Wave: TWave); |
201 |
procedure DrawWaveform(PB: TPaintBox; Wave: TWave); |
| 188 |
|
202 |
|
| 189 |
procedure PreviewInstrument(Freq: Integer; Instr: Integer); |
203 |
procedure PreviewInstrument(Freq: Integer; Instr: Integer); |
@@ -200,6 +214,18 @@ implementation |
| 200 |
|
214 |
|
| 201 |
{ TfrmTracker } |
215 |
{ TfrmTracker } |
| 202 |
|
216 |
|
|
|
217 |
procedure TfrmTracker.UpdateUIAfterLoad; |
|
|
218 |
begin |
|
|
219 |
LoadInstrument(1); |
|
|
220 |
LoadWave(0); |
|
|
221 |
|
|
|
222 |
SongEdit.Text := Song.Name; |
|
|
223 |
ArtistEdit.Text := Song.Artist; |
|
|
224 |
CommentMemo.Text := Song.Comment; |
|
|
225 |
|
|
|
226 |
TicksPerRowSpinEdit.Value := Song.TicksPerRow; |
|
|
227 |
end; |
|
|
228 |
|
| 203 |
procedure TfrmTracker.DrawWaveform(PB: TPaintBox; Wave: TWave); |
229 |
procedure TfrmTracker.DrawWaveform(PB: TPaintBox; Wave: TWave); |
| 204 |
var |
230 |
var |
| 205 |
Interval, HInterval: Integer; |
231 |
Interval, HInterval: Integer; |
@@ -258,14 +284,14 @@ begin |
| 258 |
Spokeb($FF30+I, NewWaveform[I]); |
284 |
Spokeb($FF30+I, NewWaveform[I]); |
| 259 |
|
285 |
|
| 260 |
Regs := WaveInstrumentToRegisters(Freq, True, Song.Instruments[Instr]); |
286 |
Regs := WaveInstrumentToRegisters(Freq, True, Song.Instruments[Instr]); |
| 261 |
writeln(inttobin(Regs.NR30, 8, 20)); |
287 |
{writeln(inttobin(Regs.NR30, 8, 20)); |
| 262 |
writeln(inttobin(Regs.NR31, 8, 20)); |
288 |
writeln(inttobin(Regs.NR31, 8, 20)); |
| 263 |
writeln(inttobin(Regs.NR32, 8, 20)); |
289 |
writeln(inttobin(Regs.NR32, 8, 20)); |
| 264 |
writeln(inttobin(Regs.NR33, 8, 20)); |
290 |
writeln(inttobin(Regs.NR33, 8, 20)); |
| 265 |
writeln(inttobin(Regs.NR34, 8, 20)); |
291 |
writeln(inttobin(Regs.NR34, 8, 20));} |
| 266 |
|
292 |
|
| 267 |
Spokeb(NR30, Regs.NR30); |
293 |
Spokeb(NR30, Regs.NR30); |
| 268 |
Spokeb(NR31, Regs.NR31); |
294 |
Spokeb(NR31, Regs.NR31); // TODO: Figure out why this isn't working? |
| 269 |
Spokeb(NR32, Regs.NR32); |
295 |
Spokeb(NR32, Regs.NR32); |
| 270 |
Spokeb(NR33, Regs.NR33); |
296 |
Spokeb(NR33, Regs.NR33); |
| 271 |
Spokeb(NR34, Regs.NR34) |
297 |
Spokeb(NR34, Regs.NR34) |
@@ -500,6 +526,10 @@ begin |
| 500 |
LoadInstrument(1); |
526 |
LoadInstrument(1); |
| 501 |
LoadWave(0); |
527 |
LoadWave(0); |
| 502 |
|
528 |
|
|
|
529 |
// Create pattern editor control |
|
|
530 |
TrackerGrid := TTrackerGrid.Create(Self, ScrollBox1); |
|
|
531 |
//TrackerGrid.Parent := ScrollBox1; |
|
|
532 |
|
| 503 |
// Get the emulator ready to make sound... |
533 |
// Get the emulator ready to make sound... |
| 504 |
EmulationThread := TEmulationThread.Create; |
534 |
EmulationThread := TEmulationThread.Create; |
| 505 |
EmulationThread.Start; |
535 |
EmulationThread.Start; |
@@ -531,13 +561,13 @@ end; |
| 531 |
|
561 |
|
| 532 |
procedure TfrmTracker.ImportWaveButtonClick(Sender: TObject); |
562 |
procedure TfrmTracker.ImportWaveButtonClick(Sender: TObject); |
| 533 |
var |
563 |
var |
| 534 |
F: file of byte; |
564 |
F: file of TWave; |
| 535 |
begin |
565 |
begin |
| 536 |
OpenDialog1.DefaultExt := '*.pcm'; |
566 |
OpenDialog1.DefaultExt := '*.pcm'; |
| 537 |
if OpenDialog1.Execute then begin |
567 |
if OpenDialog1.Execute then begin |
| 538 |
assignfile(F, OpenDialog1.FileName); |
568 |
assignfile(F, OpenDialog1.FileName); |
| 539 |
reset(F); |
569 |
reset(F); |
| 540 |
BlockRead(F, Song.Waves[WaveEditNumberSpinner.Value], 32); |
570 |
Read(F, Song.Waves[WaveEditNumberSpinner.Value]); |
| 541 |
CloseFile(F); |
571 |
CloseFile(F); |
| 542 |
WaveEditPaintBox.Invalidate; |
572 |
WaveEditPaintBox.Invalidate; |
| 543 |
end; |
573 |
end; |
@@ -566,6 +596,43 @@ begin |
| 566 |
|
596 |
|
| 567 |
end; |
597 |
end; |
| 568 |
|
598 |
|
|
|
599 |
procedure TfrmTracker.FileSaveAs1Accept(Sender: TObject); |
|
|
600 |
{var |
|
|
601 |
F: file of TSong;} |
|
|
602 |
begin |
|
|
603 |
{AssignFile(F, FileSaveAs1.Dialog.FileName); |
|
|
604 |
Rewrite(F); |
|
|
605 |
Write(F, Song); |
|
|
606 |
CloseFile(F);} |
|
|
607 |
end; |
|
|
608 |
|
|
|
609 |
procedure TfrmTracker.FileOpen1Accept(Sender: TObject); |
|
|
610 |
{var |
|
|
611 |
F: file of TSong;} |
|
|
612 |
begin |
|
|
613 |
{AssignFile(F, FileOpen1.Dialog.FileName); |
|
|
614 |
Reset(F); |
|
|
615 |
Read(F, Song); |
|
|
616 |
CloseFile(F); |
|
|
617 |
|
|
|
618 |
UpdateUIAfterLoad;} |
|
|
619 |
end; |
|
|
620 |
|
|
|
621 |
procedure TfrmTracker.CutActionExecute(Sender: TObject); |
|
|
622 |
begin |
|
|
623 |
PostMessage(Screen.ActiveControl.Handle, LM_CUT, 0, 0); |
|
|
624 |
end; |
|
|
625 |
|
|
|
626 |
procedure TfrmTracker.CopyActionExecute(Sender: TObject); |
|
|
627 |
begin |
|
|
628 |
PostMessage(Screen.ActiveControl.Handle, LM_COPY, 0, 0); |
|
|
629 |
end; |
|
|
630 |
|
|
|
631 |
procedure TfrmTracker.PasteActionExecute(Sender: TObject); |
|
|
632 |
begin |
|
|
633 |
PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0); |
|
|
634 |
end; |
|
|
635 |
|
| 569 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
636 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
| 570 |
begin |
637 |
begin |
| 571 |
CurrentInstrument^.DividingRatio := Round(DivRatioSpinner.Position); |
638 |
CurrentInstrument^.DividingRatio := Round(DivRatioSpinner.Position); |
@@ -590,12 +657,12 @@ begin |
| 590 |
end; |
657 |
end; |
| 591 |
|
658 |
|
| 592 |
procedure TfrmTracker.ExportButtonClick(Sender: TObject); |
659 |
procedure TfrmTracker.ExportButtonClick(Sender: TObject); |
| 593 |
var F: file of Byte; |
660 |
var F: file of TWave; |
| 594 |
begin |
661 |
begin |
| 595 |
if SaveDialog1.Execute then begin |
662 |
if SaveDialog1.Execute then begin |
| 596 |
AssignFile(F, OpenDialog1.FileName); |
663 |
AssignFile(F, OpenDialog1.FileName); |
| 597 |
Rewrite(F); |
664 |
Rewrite(F); |
| 598 |
BlockWrite(F, CurrentWave^, 32); |
665 |
Write(F, CurrentWave^); |
| 599 |
CloseFile(F); |
666 |
CloseFile(F); |
| 600 |
end; |
667 |
end; |
| 601 |
end; |
668 |
end; |
@@ -620,6 +687,11 @@ begin |
| 620 |
PreviewInstrument(C_5, InstrumentNumberSpinner.Value); |
687 |
PreviewInstrument(C_5, InstrumentNumberSpinner.Value); |
| 621 |
end; |
688 |
end; |
| 622 |
|
689 |
|
|
|
690 |
procedure TfrmTracker.MenuItem16Click(Sender: TObject); |
|
|
691 |
begin |
|
|
692 |
PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0); |
|
|
693 |
end; |
|
|
694 |
|
| 623 |
procedure TfrmTracker.MenuItem5Click(Sender: TObject); |
695 |
procedure TfrmTracker.MenuItem5Click(Sender: TObject); |
| 624 |
var |
696 |
var |
| 625 |
AboutForm: TfrmAboutHugeTracker; |
697 |
AboutForm: TfrmAboutHugeTracker; |
@@ -652,9 +724,9 @@ begin |
| 652 |
Spokeb(NR44, %10000000); |
724 |
Spokeb(NR44, %10000000); |
| 653 |
end; |
725 |
end; |
| 654 |
|
726 |
|
| 655 |
procedure TfrmTracker.SpinEdit1Change(Sender: TObject); |
727 |
procedure TfrmTracker.TicksPerRowSpinEditChange(Sender: TObject); |
| 656 |
begin |
728 |
begin |
| 657 |
Song.TicksPerRow := SpinEdit1.Value; |
729 |
Song.TicksPerRow := TicksPerRowSpinEdit.Value; |
| 658 |
end; |
730 |
end; |
| 659 |
|
731 |
|
| 660 |
procedure TfrmTracker.WaveEditNumberSpinnerChange(Sender: TObject); |
732 |
procedure TfrmTracker.WaveEditNumberSpinnerChange(Sender: TObject); |