@@ -126,6 +126,14 @@ begin |
| 126 |
itWave: Result := Instrument <= UsedStuff.HighestWaveInst; |
126 |
itWave: Result := Instrument <= UsedStuff.HighestWaveInst; |
| 127 |
itNoise: Result := Instrument <= UsedStuff.HighestNoiseInst; |
127 |
itNoise: Result := Instrument <= UsedStuff.HighestNoiseInst; |
| 128 |
end; |
128 |
end; |
|
|
129 |
|
|
|
130 |
function OrderCount(const Song: TSong): Integer; |
|
|
131 |
var |
|
|
132 |
OrderMatrix: TOrderMatrix; |
|
|
133 |
begin |
|
|
134 |
OrderMatrix := Song.OrderMatrix; |
|
|
135 |
Result := MaxIntValue([High(OrderMatrix[0]), High(OrderMatrix[1]), |
|
|
136 |
High(OrderMatrix[2]), High(OrderMatrix[3])]) * 2; |
| 129 |
end; |
137 |
end; |
| 130 |
|
138 |
|
| 131 |
procedure RenderSongToGBDKC(Song: TSong; DescriptorName: String; Filename: string; Bank: Integer = -1); |
139 |
procedure RenderSongToGBDKC(Song: TSong; DescriptorName: String; Filename: string; Bank: Integer = -1); |
@@ -302,7 +310,6 @@ procedure RenderSongToGBDKC(Song: TSong; DescriptorName: String; Filename: strin |
| 302 |
var |
310 |
var |
| 303 |
OrderMatrix: TOrderMatrix; |
311 |
OrderMatrix: TOrderMatrix; |
| 304 |
OutSL: TStringList; |
312 |
OutSL: TStringList; |
| 305 |
OrderCnt: integer; |
|
|
| 306 |
I: integer; |
313 |
I: integer; |
| 307 |
F: Text; |
314 |
F: Text; |
| 308 |
TypePrefix: String; |
315 |
TypePrefix: String; |
@@ -322,13 +329,6 @@ begin |
| 322 |
OutSL.Add('#include <stddef.h>'); |
329 |
OutSL.Add('#include <stddef.h>'); |
| 323 |
OutSL.Add(''); |
330 |
OutSL.Add(''); |
| 324 |
|
331 |
|
| 325 |
OrderMatrix := Song.OrderMatrix; |
|
|
| 326 |
OrderCnt := MaxIntValue([High(OrderMatrix[0]), High(OrderMatrix[1]), |
|
|
| 327 |
High(OrderMatrix[2]), High(OrderMatrix[3])]); |
|
|
| 328 |
|
|
|
| 329 |
OutSL.Add(Format('static const unsigned char order_cnt = %d;', [OrderCnt * 2])); |
|
|
| 330 |
OutSL.Add(''); |
|
|
| 331 |
|
|
|
| 332 |
for I := 0 to Song.Patterns.Count - 1 do |
332 |
for I := 0 to Song.Patterns.Count - 1 do |
| 333 |
if PatternIsUsed(Song.Patterns.Keys[I], UsedStuff) then |
333 |
if PatternIsUsed(Song.Patterns.Keys[I], UsedStuff) then |
| 334 |
OutSL.Add(RenderGBDKPattern('P' + IntToStr(Song.Patterns.Keys[I]), |
334 |
OutSL.Add(RenderGBDKPattern('P' + IntToStr(Song.Patterns.Keys[I]), |
@@ -362,9 +362,12 @@ begin |
| 362 |
OutSL.Add(Format('const void __at(%d) __bank_%s;', [Bank, DescriptorName])); |
362 |
OutSL.Add(Format('const void __at(%d) __bank_%s;', [Bank, DescriptorName])); |
| 363 |
|
363 |
|
| 364 |
OutSL.Add(Format( |
364 |
OutSL.Add(Format( |
| 365 |
'const hUGESong_t %s = {%d, &order_cnt, order1, order2, order3,'+ |
365 |
'const hUGESong_t %s = {%d, %d, %d, %d, %d, order1, order2, order3,'+ |
| 366 |
'order4, duty_instruments, wave_instruments, noise_instruments, NULL, waves};', |
366 |
'order4, duty_instruments, wave_instruments, noise_instruments, NULL, waves};', |
| 367 |
[DescriptorName, Song.TicksPerRow])); |
367 |
[DescriptorName, |
|
|
368 |
Song.TicksPerRow[0], Song.TicksPerRow[1], Song.TicksPerRow[2], Song.TicksPerRow[3], |
|
|
369 |
OrderCount(Song) |
|
|
370 |
])); |
| 368 |
|
371 |
|
| 369 |
AssignFile(F, Filename); |
372 |
AssignFile(F, Filename); |
| 370 |
Rewrite(F); |
373 |
Rewrite(F); |
@@ -392,13 +395,9 @@ function RenderOrderTable(OrderMatrix: TOrderMatrix): string; |
| 392 |
|
395 |
|
| 393 |
var |
396 |
var |
| 394 |
Res: TStringList; |
397 |
Res: TStringList; |
| 395 |
OrderCnt: integer; |
|
|
| 396 |
begin |
398 |
begin |
| 397 |
Res := TStringList.Create; |
399 |
Res := TStringList.Create; |
| 398 |
OrderCnt := MaxIntValue([High(OrderMatrix[0]), High(OrderMatrix[1]), |
|
|
| 399 |
High(OrderMatrix[2]), High(OrderMatrix[3])]); |
|
|
| 400 |
|
400 |
|
| 401 |
Res.Add('order_cnt: db ' + IntToStr(OrderCnt * 2)); |
|
|
| 402 |
Res.Add('order1: dw ' + ArrayHelper(OrderMatrix[0])); |
401 |
Res.Add('order1: dw ' + ArrayHelper(OrderMatrix[0])); |
| 403 |
Res.Add('order2: dw ' + ArrayHelper(OrderMatrix[1])); |
402 |
Res.Add('order2: dw ' + ArrayHelper(OrderMatrix[1])); |
| 404 |
Res.Add('order3: dw ' + ArrayHelper(OrderMatrix[2])); |
403 |
Res.Add('order3: dw ' + ArrayHelper(OrderMatrix[2])); |
@@ -583,8 +582,11 @@ begin |
| 583 |
|
582 |
|
| 584 |
// Render song descriptor |
583 |
// Render song descriptor |
| 585 |
OutSL.Add(DescriptorName+'::'); |
584 |
OutSL.Add(DescriptorName+'::'); |
| 586 |
OutSL.Add('db '+IntToStr(Song.TicksPerRow)); |
585 |
OutSL.Add('db '+IntToStr(Song.TicksPerRow[0])+', ' |
| 587 |
OutSL.Add('dw order_cnt'); |
586 |
+IntToStr(Song.TicksPerRow[1])+', ' |
|
|
587 |
+IntToStr(Song.TicksPerRow[2])+', ' |
|
|
588 |
+IntToStr(Song.TicksPerRow[3])); |
|
|
589 |
OutSL.Add('dw '+IntToStr(OrderCount(Song))); |
| 588 |
OutSL.Add('dw order1, order2, order3, order4'); |
590 |
OutSL.Add('dw order1, order2, order3, order4'); |
| 589 |
OutSL.Add('dw duty_instruments, wave_instruments, noise_instruments'); |
591 |
OutSL.Add('dw duty_instruments, wave_instruments, noise_instruments'); |
| 590 |
OutSL.Add('dw routines'); |
592 |
OutSL.Add('dw routines'); |
@@ -600,7 +602,7 @@ begin |
| 600 |
OutSL.Add(RenderPattern('P' + IntToStr(Song.Patterns.Keys[I]), Song.Patterns.Data[I]^)); |
602 |
OutSL.Add(RenderPattern('P' + IntToStr(Song.Patterns.Keys[I]), Song.Patterns.Data[I]^)); |
| 601 |
|
603 |
|
| 602 |
// Render subpatterns |
604 |
// Render subpatterns |
| 603 |
for I := Low(Song.Instruments.All) to High(Song.Instruments.All) do |
605 |
for I := Low(Song.Instruments.All) to High(Song.Instruments.All) do |
| 604 |
if InstrumentIsUsed(ModInst(I), Song.Instruments.All[I].Type_, UsedStuff) then |
606 |
if InstrumentIsUsed(ModInst(I), Song.Instruments.All[I].Type_, UsedStuff) then |
| 605 |
with Song.Instruments.All[I] do begin |
607 |
with Song.Instruments.All[I] do begin |
| 606 |
if SubpatternEnabled then begin |
608 |
if SubpatternEnabled then begin |
@@ -778,7 +780,7 @@ begin |
| 778 |
AssignFile(OutFile, ConcatPaths([CacheDir, 'render', 'subpattern.htt'])); |
780 |
AssignFile(OutFile, ConcatPaths([CacheDir, 'render', 'subpattern.htt'])); |
| 779 |
Rewrite(OutFile); |
781 |
Rewrite(OutFile); |
| 780 |
|
782 |
|
| 781 |
for I := Low(Song.Instruments.All) to High(Song.Instruments.All) do |
783 |
for I := Low(Song.Instruments.All) to High(Song.Instruments.All) do |
| 782 |
if InstrumentIsUsed(ModInst(I), Song.Instruments.All[I].Type_, UsedStuff) then |
784 |
if InstrumentIsUsed(ModInst(I), Song.Instruments.All[I].Type_, UsedStuff) then |
| 783 |
with Song.Instruments.All[I] do begin |
785 |
with Song.Instruments.All[I] do begin |
| 784 |
if SubpatternEnabled then begin |
786 |
if SubpatternEnabled then begin |
@@ -805,7 +807,12 @@ begin |
| 805 |
|
807 |
|
| 806 |
if Assemble(Filename + '_song.obj', |
808 |
if Assemble(Filename + '_song.obj', |
| 807 |
ConcatPaths([RuntimeDir, 'hUGEDriver', 'song.asm']), |
809 |
ConcatPaths([RuntimeDir, 'hUGEDriver', 'song.asm']), |
| 808 |
['SONG_DESCRIPTOR=song', 'TICKS='+IntToStr(Song.TicksPerRow)]) <> 0 then Die; |
810 |
['SONG_DESCRIPTOR=song', |
|
|
811 |
'ORDER_COUNT='+IntToStr(OrderCount(Song)), |
|
|
812 |
'TICKS0='+IntToStr(Song.TicksPerRow[0]), |
|
|
813 |
'TICKS1='+IntToStr(Song.TicksPerRow[1]), |
|
|
814 |
'TICKS2='+IntToStr(Song.TicksPerRow[2]), |
|
|
815 |
'TICKS3='+IntToStr(Song.TicksPerRow[3])]) <> 0 then Die; |
| 809 |
|
816 |
|
| 810 |
if Mode = emGBS then |
817 |
if Mode = emGBS then |
| 811 |
begin |
818 |
begin |