@@ -52,8 +52,10 @@ type |
| 52 |
|
52 |
|
| 53 |
procedure UpdateButtonEnabledStates; |
53 |
procedure UpdateButtonEnabledStates; |
| 54 |
|
54 |
|
| 55 |
procedure ExportWaveToFile(Filename: String; Seconds: Integer); overload; |
55 |
procedure ExportWaveToFile(Filename: String); overload; |
| 56 |
procedure ExportWaveToFile(Filename: String; OrderNum: Integer; Loops: Integer); overload; |
56 |
|
|
|
57 |
procedure RenderSeconds(Seconds: Integer); |
|
|
58 |
procedure RenderLoops(TargetOrder: Integer; Loops: Integer); |
| 57 |
|
59 |
|
| 58 |
procedure OrderCheckFD; |
60 |
procedure OrderCheckFD; |
| 59 |
public |
61 |
public |
@@ -83,10 +85,11 @@ begin |
| 83 |
UpdateButtonEnabledStates; |
85 |
UpdateButtonEnabledStates; |
| 84 |
|
86 |
|
| 85 |
try |
87 |
try |
| 86 |
if RadioGroup1.ItemIndex = 0 then |
88 |
ExportWaveToFile(FileNameEdit1.FileName); |
|
|
89 |
{if RadioGroup1.ItemIndex = 0 then |
| 87 |
ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) |
90 |
ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) |
| 88 |
else |
91 |
else |
| 89 |
ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value); |
92 |
ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value);} |
| 90 |
except |
93 |
except |
| 91 |
on E: Exception do begin |
94 |
on E: Exception do begin |
| 92 |
MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + ' !' + LineEnding + |
95 |
MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + ' !' + LineEnding + |
@@ -140,14 +143,11 @@ begin |
| 140 |
CancelButton.Enabled := Rendering and not CancelRequested; |
143 |
CancelButton.Enabled := Rendering and not CancelRequested; |
| 141 |
end; |
144 |
end; |
| 142 |
|
145 |
|
| 143 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; Seconds: Integer); |
146 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String); |
| 144 |
var |
147 |
var |
| 145 |
CompletedCycles: QWord = 0; |
|
|
| 146 |
CyclesToDo: QWord; |
|
|
| 147 |
OutStream: TStream; |
148 |
OutStream: TStream; |
| 148 |
Proc: TProcess; |
149 |
Proc: TProcess; |
| 149 |
begin |
150 |
begin |
| 150 |
CyclesToDo := (70224*60)*Seconds; |
|
|
| 151 |
ProgressBar1.Position := 0; |
151 |
ProgressBar1.Position := 0; |
| 152 |
|
152 |
|
| 153 |
z80_reset; |
153 |
z80_reset; |
@@ -177,10 +177,10 @@ begin |
| 177 |
try |
177 |
try |
| 178 |
BeginWritingSoundToStream(OutStream); |
178 |
BeginWritingSoundToStream(OutStream); |
| 179 |
|
179 |
|
| 180 |
while (CompletedCycles < CyclesToDo) and not CancelRequested do begin |
180 |
// Choose which rendering time strategy to use |
| 181 |
Inc(CompletedCycles, z80_decode); |
181 |
case RadioGroup1.ItemIndex of |
| 182 |
ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100); |
182 |
0: RenderSeconds(SecondsSpinEdit.Value); |
| 183 |
if Random(500) = 1 then Application.ProcessMessages; |
183 |
1: RenderLoops(OrderSpinEdit.Value, LoopTimesSpinEdit.Value); |
| 184 |
end; |
184 |
end; |
| 185 |
|
185 |
|
| 186 |
if CancelRequested then Exit; |
186 |
if CancelRequested then Exit; |
@@ -204,43 +204,37 @@ begin |
| 204 |
end; |
204 |
end; |
| 205 |
end; |
205 |
end; |
| 206 |
|
206 |
|
| 207 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; |
207 |
procedure TfrmRenderToWave.RenderSeconds(Seconds: Integer); |
| 208 |
OrderNum: Integer; Loops: Integer); |
|
|
| 209 |
var |
208 |
var |
| 210 |
TimesToSeePattern: Integer; |
209 |
CompletedCycles: QWord = 0; |
|
|
210 |
CyclesToDo: QWord; |
| 211 |
begin |
211 |
begin |
| 212 |
RenderButton.Enabled:=False; |
212 |
CyclesToDo := (70224*60)*Seconds; |
| 213 |
|
213 |
while (CompletedCycles < CyclesToDo) and not CancelRequested do begin |
| 214 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
214 |
Inc(CompletedCycles, z80_decode); |
| 215 |
TimesSeenTargetPattern := 0; |
215 |
ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100); |
| 216 |
CurrentSeenPattern := -1; |
216 |
if Random(500) = 1 then Application.ProcessMessages; |
| 217 |
|
217 |
end; |
| 218 |
z80_reset; |
218 |
end; |
| 219 |
ResetSound; |
|
|
| 220 |
enablesound; |
|
|
| 221 |
|
|
|
| 222 |
//BeginWritingSoundToStream(Filename); |
|
|
| 223 |
|
219 |
|
|
|
220 |
procedure TfrmRenderToWave.RenderLoops(TargetOrder: Integer; Loops: Integer); |
|
|
221 |
var |
|
|
222 |
TimesToSeePattern: Integer; |
|
|
223 |
OldFD: TFDCallback; |
|
|
224 |
begin |
|
|
225 |
OldFD := FDCallback; |
| 224 |
FDCallback := @OrderCheckFD; |
226 |
FDCallback := @OrderCheckFD; |
| 225 |
|
227 |
|
| 226 |
load('hUGEDriver/preview.gb'); |
228 |
CurrentSeenPattern := -1; |
| 227 |
SymbolTable := ParseSymFile('hUGEDriver/preview.sym'); |
229 |
TimesSeenTargetPattern := 0; |
| 228 |
|
230 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
| 229 |
try |
231 |
while (TimesSeenTargetPattern < TimesToSeePattern) and not CancelRequested do begin |
| 230 |
while TimesSeenTargetPattern < TimesToSeePattern do begin |
232 |
z80_decode; |
| 231 |
z80_decode; |
233 |
ProgressBar1.Position := Trunc((TimesSeenTargetPattern / TimesToSeePattern)*100); |
| 232 |
ProgressBar1.Position := Trunc((TimesSeenTargetPattern / TimesToSeePattern)*100); |
234 |
if Random(500) = 1 then Application.ProcessMessages; |
| 233 |
if Random(500) = 1 then Application.ProcessMessages; |
|
|
| 234 |
end; |
|
|
| 235 |
except |
|
|
| 236 |
on E: EHaltingProblem do begin |
|
|
| 237 |
MessageDlg('Error!', E.Message, mtError, [mbOK], ''); |
|
|
| 238 |
end; |
|
|
| 239 |
end; |
235 |
end; |
| 240 |
|
236 |
|
| 241 |
EndWritingSoundToStream; |
237 |
FDCallback := OldFD; |
| 242 |
|
|
|
| 243 |
RenderButton.Enabled:=True; |
|
|
| 244 |
end; |
238 |
end; |
| 245 |
|
239 |
|
| 246 |
procedure TfrmRenderToWave.OrderCheckFD; |
240 |
procedure TfrmRenderToWave.OrderCheckFD; |