@@ -7,7 +7,8 @@ interface |
| 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, SynEdit, VirtualTrees, ECSlider, ECProgressBar, |
9 |
Menus, Spin, StdCtrls, SynEdit, VirtualTrees, ECSlider, ECProgressBar, |
| 10 |
instruments, song; |
10 |
Instruments, Song, EmulationThread, Utils, |
|
|
11 |
mainloop, sound, vars, machine; |
| 11 |
|
12 |
|
| 12 |
type |
13 |
type |
| 13 |
{ TfrmTracker } |
14 |
{ TfrmTracker } |
@@ -15,6 +16,7 @@ type |
| 15 |
TfrmTracker = class(TForm) |
16 |
TfrmTracker = class(TForm) |
| 16 |
CommentMemo: TMemo; |
17 |
CommentMemo: TMemo; |
| 17 |
Label19: TLabel; |
18 |
Label19: TLabel; |
|
|
19 |
MenuItem6: TMenuItem; |
| 18 |
RoutineNumberSpinner: TSpinEdit; |
20 |
RoutineNumberSpinner: TSpinEdit; |
| 19 |
Label17: TLabel; |
21 |
Label17: TLabel; |
| 20 |
EnvelopePaintbox: TPaintBox; |
22 |
EnvelopePaintbox: TPaintBox; |
@@ -85,6 +87,7 @@ type |
| 85 |
NoiseFreqSpinner: TECSpinPosition; |
87 |
NoiseFreqSpinner: TECSpinPosition; |
| 86 |
DivRatioSpinner: TECSpinPosition; |
88 |
DivRatioSpinner: TECSpinPosition; |
| 87 |
TreeView1: TTreeView; |
89 |
TreeView1: TTreeView; |
|
|
90 |
procedure ArtistEditChange(Sender: TObject); |
| 88 |
procedure CommentMemoChange(Sender: TObject); |
91 |
procedure CommentMemoChange(Sender: TObject); |
| 89 |
procedure DirectionComboBoxChange(Sender: TObject); |
92 |
procedure DirectionComboBoxChange(Sender: TObject); |
| 90 |
procedure DivRatioSpinnerChange(Sender: TObject); |
93 |
procedure DivRatioSpinnerChange(Sender: TObject); |
@@ -95,12 +98,14 @@ type |
| 95 |
procedure InstrumentNameEditChange(Sender: TObject); |
98 |
procedure InstrumentNameEditChange(Sender: TObject); |
| 96 |
procedure InstrumentNumberSpinnerChange(Sender: TObject); |
99 |
procedure InstrumentNumberSpinnerChange(Sender: TObject); |
| 97 |
procedure LengthSpinnerChange(Sender: TObject); |
100 |
procedure LengthSpinnerChange(Sender: TObject); |
|
|
101 |
procedure MenuItem6Click(Sender: TObject); |
| 98 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
102 |
procedure NoiseFreqSpinnerChange(Sender: TObject); |
| 99 |
procedure RandomizeNoiseButtonClick(Sender: TObject); |
103 |
procedure RandomizeNoiseButtonClick(Sender: TObject); |
| 100 |
procedure InstrumentTypeComboboxChange(Sender: TObject); |
104 |
procedure InstrumentTypeComboboxChange(Sender: TObject); |
| 101 |
procedure LengthEnabledCheckboxChange(Sender: TObject); |
105 |
procedure LengthEnabledCheckboxChange(Sender: TObject); |
| 102 |
procedure PaintBox1Paint(Sender: TObject); |
106 |
procedure PaintBox1Paint(Sender: TObject); |
| 103 |
procedure SevenBitCounterCheckboxChange(Sender: TObject); |
107 |
procedure SevenBitCounterCheckboxChange(Sender: TObject); |
|
|
108 |
procedure SongEditChange(Sender: TObject); |
| 104 |
procedure StartVolSpinnerChange(Sender: TObject); |
109 |
procedure StartVolSpinnerChange(Sender: TObject); |
| 105 |
procedure SweepDirectionComboboxChange(Sender: TObject); |
110 |
procedure SweepDirectionComboboxChange(Sender: TObject); |
| 106 |
procedure SweepSizeSpinnerChange(Sender: TObject); |
111 |
procedure SweepSizeSpinnerChange(Sender: TObject); |
@@ -111,10 +116,14 @@ type |
| 111 |
Song: TSong; |
116 |
Song: TSong; |
| 112 |
CurrentInstrument: ^TInstrument; |
117 |
CurrentInstrument: ^TInstrument; |
| 113 |
|
118 |
|
|
|
119 |
EmulationThread: TThread; |
|
|
120 |
|
| 114 |
procedure ChangeToSquare; |
121 |
procedure ChangeToSquare; |
| 115 |
procedure ChangeToWave; |
122 |
procedure ChangeToWave; |
| 116 |
procedure ChangeToNoise; |
123 |
procedure ChangeToNoise; |
| 117 |
procedure LoadInstrument(Instr: Integer); |
124 |
procedure LoadInstrument(Instr: Integer); |
|
|
125 |
|
|
|
126 |
procedure PlayC4WithInstrument(Instr: Integer); |
| 118 |
public |
127 |
public |
| 119 |
|
128 |
|
| 120 |
end; |
129 |
end; |
@@ -128,6 +137,44 @@ implementation |
| 128 |
|
137 |
|
| 129 |
{ TfrmTracker } |
138 |
{ TfrmTracker } |
| 130 |
|
139 |
|
|
|
140 |
const |
|
|
141 |
NR10 = $FF10; |
|
|
142 |
NR11 = $FF11; |
|
|
143 |
NR12 = $FF12; |
|
|
144 |
NR13 = $FF13; |
|
|
145 |
NR14 = $FF14; |
|
|
146 |
NR21 = $FF16; |
|
|
147 |
NR22 = $FF17; |
|
|
148 |
NR23 = $FF18; |
|
|
149 |
NR24 = $FF19; |
|
|
150 |
NR30 = $FF1A; |
|
|
151 |
NR31 = $FF1B; |
|
|
152 |
NR32 = $FF1C; |
|
|
153 |
NR33 = $FF1D; |
|
|
154 |
NR34 = $FF1E; |
|
|
155 |
NR41 = $FF20; |
|
|
156 |
NR42 = $FF21; |
|
|
157 |
NR43 = $FF22; |
|
|
158 |
NR44 = $FF23; |
|
|
159 |
|
|
|
160 |
procedure TfrmTracker.PlayC4WithInstrument(Instr: Integer); |
|
|
161 |
var |
|
|
162 |
Regs: TRegisters; |
|
|
163 |
begin |
|
|
164 |
with Song.Instruments[Instr] do |
|
|
165 |
begin |
|
|
166 |
case Type_ of |
|
|
167 |
Noise: begin |
|
|
168 |
Regs := NoiseInstrumentToRegisters(True, Song.Instruments[Instr]); |
|
|
169 |
Spokeb(NR41, Regs.NR41); |
|
|
170 |
Spokeb(NR42, Regs.NR42); |
|
|
171 |
Spokeb(NR43, Regs.NR43); |
|
|
172 |
Spokeb(NR44, Regs.NR44); |
|
|
173 |
end; |
|
|
174 |
end; |
|
|
175 |
end; |
|
|
176 |
end; |
|
|
177 |
|
| 131 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
178 |
procedure TfrmTracker.LoadInstrument(Instr: Integer); |
| 132 |
var |
179 |
var |
| 133 |
CI: ^TInstrument; |
180 |
CI: ^TInstrument; |
@@ -230,6 +277,11 @@ begin |
| 230 |
CurrentInstrument^.CounterStep := Fifteen; |
277 |
CurrentInstrument^.CounterStep := Fifteen; |
| 231 |
end; |
278 |
end; |
| 232 |
|
279 |
|
|
|
280 |
procedure TfrmTracker.SongEditChange(Sender: TObject); |
|
|
281 |
begin |
|
|
282 |
Song.Name := SongEdit.Text; |
|
|
283 |
end; |
|
|
284 |
|
| 233 |
procedure TfrmTracker.StartVolSpinnerChange(Sender: TObject); |
285 |
procedure TfrmTracker.StartVolSpinnerChange(Sender: TObject); |
| 234 |
begin |
286 |
begin |
| 235 |
CurrentInstrument^.InitialVolume := Round(StartVolSpinner.Position); |
287 |
CurrentInstrument^.InitialVolume := Round(StartVolSpinner.Position); |
@@ -276,6 +328,10 @@ begin |
| 276 |
NoiseFreqSpinner.Position := Random(Round(NoiseFreqSpinner.Max)); |
328 |
NoiseFreqSpinner.Position := Random(Round(NoiseFreqSpinner.Max)); |
| 277 |
DivRatioSpinner.Position := Random(Round(DivRatioSpinner.Max)); |
329 |
DivRatioSpinner.Position := Random(Round(DivRatioSpinner.Max)); |
| 278 |
SevenBitCounterCheckbox.Checked := Random <= 0.5; |
330 |
SevenBitCounterCheckbox.Checked := Random <= 0.5; |
|
|
331 |
LengthEnabledCheckbox.Checked := Random <= 0.5; |
|
|
332 |
LengthSpinner.Position := Random(Round(LengthSpinner.Max)); |
|
|
333 |
|
|
|
334 |
PlayC4WithInstrument(InstrumentNumberSpinner.Value); |
| 279 |
end; |
335 |
end; |
| 280 |
|
336 |
|
| 281 |
procedure TfrmTracker.FormCreate(Sender: TObject); |
337 |
procedure TfrmTracker.FormCreate(Sender: TObject); |
@@ -299,6 +355,10 @@ begin |
| 299 |
end; |
355 |
end; |
| 300 |
|
356 |
|
| 301 |
LoadInstrument(1); |
357 |
LoadInstrument(1); |
|
|
358 |
|
|
|
359 |
// Get the emulator ready to make sound... |
|
|
360 |
EmulationThread := TEmulationThread.Create; |
|
|
361 |
EmulationThread.Start; |
| 302 |
end; |
362 |
end; |
| 303 |
|
363 |
|
| 304 |
procedure TfrmTracker.DirectionComboBoxChange(Sender: TObject); |
364 |
procedure TfrmTracker.DirectionComboBoxChange(Sender: TObject); |
@@ -314,6 +374,11 @@ begin |
| 314 |
Song.Comment := CommentMemo.Text; |
374 |
Song.Comment := CommentMemo.Text; |
| 315 |
end; |
375 |
end; |
| 316 |
|
376 |
|
|
|
377 |
procedure TfrmTracker.ArtistEditChange(Sender: TObject); |
|
|
378 |
begin |
|
|
379 |
Song.Artist := ArtistEdit.Text; |
|
|
380 |
end; |
|
|
381 |
|
| 317 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
382 |
procedure TfrmTracker.DivRatioSpinnerChange(Sender: TObject); |
| 318 |
begin |
383 |
begin |
| 319 |
CurrentInstrument^.DividingRatio := Round(DivRatioSpinner.Position); |
384 |
CurrentInstrument^.DividingRatio := Round(DivRatioSpinner.Position); |
@@ -352,6 +417,16 @@ begin |
| 352 |
CurrentInstrument^.Length := Round(LengthSpinner.Position); |
417 |
CurrentInstrument^.Length := Round(LengthSpinner.Position); |
| 353 |
end; |
418 |
end; |
| 354 |
|
419 |
|
|
|
420 |
procedure TfrmTracker.MenuItem6Click(Sender: TObject); |
|
|
421 |
begin |
|
|
422 |
PlayC4WithInstrument(InstrumentNumberSpinner.Value); |
|
|
423 |
{Spokeb($FF10, 0); |
|
|
424 |
Spokeb($FF11, %11111111); |
|
|
425 |
Spokeb($FF12, %11110000); |
|
|
426 |
Spokeb($FF13, 10); |
|
|
427 |
Spokeb($FF14, %10000000 or 6);} |
|
|
428 |
end; |
|
|
429 |
|
| 355 |
procedure TfrmTracker.NoiseFreqSpinnerChange(Sender: TObject); |
430 |
procedure TfrmTracker.NoiseFreqSpinnerChange(Sender: TObject); |
| 356 |
begin |
431 |
begin |
| 357 |
CurrentInstrument^.ShiftClockFreq := Round(NoiseFreqSpinner.Position); |
432 |
CurrentInstrument^.ShiftClockFreq := Round(NoiseFreqSpinner.Position); |