@@ -9,8 +9,6 @@ uses |
| 9 |
ExtCtrls, Spin, ComCtrls, constants, process, fgl; |
9 |
ExtCtrls, Spin, ComCtrls, constants, process, fgl; |
| 10 |
|
10 |
|
| 11 |
type |
11 |
type |
| 12 |
TOrdersSeenSet = specialize TFPGMap<Integer, Boolean>; |
|
|
| 13 |
|
|
|
| 14 |
{ EHaltingProblem } |
12 |
{ EHaltingProblem } |
| 15 |
|
13 |
|
| 16 |
EHaltingProblem = class(Exception); |
14 |
EHaltingProblem = class(Exception); |
@@ -43,10 +41,8 @@ type |
| 43 |
procedure FormShow(Sender: TObject); |
41 |
procedure FormShow(Sender: TObject); |
| 44 |
procedure RadioGroup1Click(Sender: TObject); |
42 |
procedure RadioGroup1Click(Sender: TObject); |
| 45 |
private |
43 |
private |
| 46 |
CurrentSeenPattern: Integer; |
44 |
PatternsSeen, CurrentSeenPattern, TimesSeenTargetPattern: Integer; |
| 47 |
TimesSeenTargetPattern: Integer; |
|
|
| 48 |
|
45 |
|
| 49 |
OrdersSeen: TOrdersSeenSet; |
|
|
| 50 |
Rendering: Boolean; |
46 |
Rendering: Boolean; |
| 51 |
CancelRequested: Boolean; |
47 |
CancelRequested: Boolean; |
| 52 |
|
48 |
|
@@ -86,13 +82,9 @@ begin |
| 86 |
|
82 |
|
| 87 |
try |
83 |
try |
| 88 |
ExportWaveToFile(FileNameEdit1.FileName); |
84 |
ExportWaveToFile(FileNameEdit1.FileName); |
| 89 |
{if RadioGroup1.ItemIndex = 0 then |
|
|
| 90 |
ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) |
|
|
| 91 |
else |
|
|
| 92 |
ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value);} |
|
|
| 93 |
except |
85 |
except |
| 94 |
on E: Exception do begin |
86 |
on E: Exception do begin |
| 95 |
MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + ' !' + LineEnding + |
87 |
MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + '!' + LineEnding + |
| 96 |
LineEnding + E.Message, mtError, [mbOk], ''); |
88 |
LineEnding + E.Message, mtError, [mbOk], ''); |
| 97 |
end; |
89 |
end; |
| 98 |
end; |
90 |
end; |
@@ -221,17 +213,25 @@ procedure TfrmRenderToWave.RenderLoops(TargetOrder: Integer; Loops: Integer); |
| 221 |
var |
213 |
var |
| 222 |
TimesToSeePattern: Integer; |
214 |
TimesToSeePattern: Integer; |
| 223 |
OldFD: TFDCallback; |
215 |
OldFD: TFDCallback; |
|
|
216 |
OrderCount: Integer; |
| 224 |
begin |
217 |
begin |
| 225 |
OldFD := FDCallback; |
218 |
OldFD := FDCallback; |
| 226 |
FDCallback := @OrderCheckFD; |
219 |
FDCallback := @OrderCheckFD; |
| 227 |
|
220 |
|
|
|
221 |
OrderCount := PeekSymbol(SYM_ORDER_COUNT) div 2; |
|
|
222 |
|
| 228 |
CurrentSeenPattern := -1; |
223 |
CurrentSeenPattern := -1; |
| 229 |
TimesSeenTargetPattern := 0; |
224 |
TimesSeenTargetPattern := 0; |
|
|
225 |
PatternsSeen := 0; |
| 230 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
226 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
|
|
227 |
|
| 231 |
while (TimesSeenTargetPattern < TimesToSeePattern) and not CancelRequested do begin |
228 |
while (TimesSeenTargetPattern < TimesToSeePattern) and not CancelRequested do begin |
| 232 |
z80_decode; |
229 |
z80_decode; |
| 233 |
ProgressBar1.Position := Trunc((TimesSeenTargetPattern / TimesToSeePattern)*100); |
230 |
ProgressBar1.Position := Trunc((TimesSeenTargetPattern / TimesToSeePattern)*100); |
| 234 |
if Random(500) = 1 then Application.ProcessMessages; |
231 |
if Random(500) = 1 then Application.ProcessMessages; |
|
|
232 |
|
|
|
233 |
if (PatternsSeen > OrderCount) and (TimesSeenTargetPattern <= 1) then |
|
|
234 |
raise EHaltingProblem.Create('The specified loop point cannot be reached more than once!'); |
| 235 |
end; |
235 |
end; |
| 236 |
|
236 |
|
| 237 |
FDCallback := OldFD; |
237 |
FDCallback := OldFD; |
@@ -241,12 +241,9 @@ procedure TfrmRenderToWave.OrderCheckFD; |
| 241 |
var |
241 |
var |
| 242 |
Pat: Integer; |
242 |
Pat: Integer; |
| 243 |
begin |
243 |
begin |
| 244 |
{if ((OrdersSeen.IndexOf(Pat) <> -1) and (OrdersSeen.KeyData[Pat])) and |
|
|
| 245 |
(OrdersSeen.IndexOf(OrderSpinEdit.Value) = -1) then |
|
|
| 246 |
raise EHaltingProblem.Create('The specified target order is never reached again in the song!');} |
|
|
| 247 |
|
|
|
| 248 |
Pat := (PeekSymbol(SYM_CURRENT_ORDER) div 2); |
244 |
Pat := (PeekSymbol(SYM_CURRENT_ORDER) div 2); |
| 249 |
if CurrentSeenPattern <> Pat then begin |
245 |
if CurrentSeenPattern <> Pat then begin |
|
|
246 |
Inc(PatternsSeen); |
| 250 |
CurrentSeenPattern := Pat; |
247 |
CurrentSeenPattern := Pat; |
| 251 |
|
248 |
|
| 252 |
if Pat = OrderSpinEdit.Value then |
249 |
if Pat = OrderSpinEdit.Value then |