@@ -5,7 +5,7 @@ unit Utils; |
| 5 |
interface |
5 |
interface |
| 6 |
|
6 |
|
| 7 |
uses |
7 |
uses |
| 8 |
Classes, SysUtils, Song, Waves, HugeDatatypes, Constants, gHashSet, fgl, instruments; |
8 |
Classes, SysUtils, Song, Waves, HugeDatatypes, Constants, gHashSet, fgl, instruments, math; |
| 9 |
|
9 |
|
| 10 |
function Lerp(v0, v1, t: Double): Double; |
10 |
function Lerp(v0, v1, t: Double): Double; |
| 11 |
function Snap(Value, Every: Integer): Integer; |
11 |
function Snap(Value, Every: Integer): Integer; |
@@ -16,6 +16,7 @@ procedure BlankPattern(Pat: PPattern); |
| 16 |
procedure BlankCell(var Cell: TCell); |
16 |
procedure BlankCell(var Cell: TCell); |
| 17 |
function EffectCodeToStr(Code: Integer; Params: TEffectParams): String; |
17 |
function EffectCodeToStr(Code: Integer; Params: TEffectParams): String; |
| 18 |
function EffectToExplanation(Code: Integer; Params: TEffectParams): String; |
18 |
function EffectToExplanation(Code: Integer; Params: TEffectParams): String; |
|
|
19 |
function UniqueOrdersDuringPlayback(Song: TSong; FromPos, ToPos: Integer): Integer; |
| 19 |
|
20 |
|
| 20 |
function ModInst(Inst: Integer): Integer; |
21 |
function ModInst(Inst: Integer): Integer; |
| 21 |
function UnmodInst(Bank: TInstrumentType; Inst: Integer): Integer; |
22 |
function UnmodInst(Bank: TInstrumentType; Inst: Integer): Integer; |
@@ -98,6 +99,76 @@ begin |
| 98 |
end; |
99 |
end; |
| 99 |
end; |
100 |
end; |
| 100 |
|
101 |
|
|
|
102 |
{function UniqueOrdersDuringPlayback(Song: TSong; FromPos, ToPos: Integer |
|
|
103 |
): Integer; |
|
|
104 |
var |
|
|
105 |
Seen: array of Integer; |
|
|
106 |
CurOrder, CurRow: Integer; |
|
|
107 |
OrderChanged: Boolean; |
|
|
108 |
NextOrder, NextRow: Integer; |
|
|
109 |
OrderCount, TotalSeenOrders: Integer; |
|
|
110 |
Cell: TCell; |
|
|
111 |
I: Integer; |
|
|
112 |
Pat: TPattern; |
|
|
113 |
begin |
|
|
114 |
CurOrder := FromPos; |
|
|
115 |
CurRow := 0; |
|
|
116 |
OrderChanged := True; |
|
|
117 |
TotalSeenOrders := 0; |
|
|
118 |
|
|
|
119 |
with Song do |
|
|
120 |
OrderCount := MaxIntValue([High(OrderMatrix[0]), High(OrderMatrix[1]), |
|
|
121 |
High(OrderMatrix[2]), High(OrderMatrix[3])]); |
|
|
122 |
|
|
|
123 |
SetLength(Seen, OrderCount); |
|
|
124 |
|
|
|
125 |
NextOrder := -1; |
|
|
126 |
NextRow := -1; |
|
|
127 |
repeat |
|
|
128 |
if OrderChanged then begin |
|
|
129 |
OrderChanged := False; |
|
|
130 |
Inc(Seen[CurOrder]); |
|
|
131 |
Inc(TotalSeenOrders); |
|
|
132 |
end; |
|
|
133 |
|
|
|
134 |
for I := 0 to 3 do begin |
|
|
135 |
Pat := Song.Patterns[Song.OrderMatrix[I, CurOrder]]^; |
|
|
136 |
Cell := Pat[CurRow]; |
|
|
137 |
case Cell.EffectCode of |
|
|
138 |
$B: NextOrder := Max(Cell.EffectParams.Value-1, OrderCount-1); |
|
|
139 |
$D: NextRow := Cell.EffectParams.Value; |
|
|
140 |
end; |
|
|
141 |
end; |
|
|
142 |
|
|
|
143 |
if NextOrder = -1 then |
|
|
144 |
NextOrder := CurOrder; |
|
|
145 |
|
|
|
146 |
if NextRow = -1 then |
|
|
147 |
NextRow := CurRow + 1; |
|
|
148 |
|
|
|
149 |
if NextRow > High(TPattern) then begin |
|
|
150 |
NextRow := 0; |
|
|
151 |
NextOrder := CurOrder + 1; |
|
|
152 |
end; |
|
|
153 |
|
|
|
154 |
if NextOrder > OrderCount-1 then begin |
|
|
155 |
OrderChanged := True; |
|
|
156 |
NextOrder := 0; |
|
|
157 |
end; |
|
|
158 |
|
|
|
159 |
if CurOrder <> NextOrder then |
|
|
160 |
OrderChanged := True; |
|
|
161 |
|
|
|
162 |
CurOrder := NextOrder; |
|
|
163 |
CurRow := NextRow; |
|
|
164 |
NextOrder := -1; |
|
|
165 |
NextRow := -1; |
|
|
166 |
writeln(CurOrder, ' ', curRow); |
|
|
167 |
until (Seen[CurOrder] > 1) or (CurOrder = ToPos); |
|
|
168 |
|
|
|
169 |
Result := TotalSeenOrders; |
|
|
170 |
end;} |
|
|
171 |
|
| 101 |
function ModInst(Inst: Integer): Integer; |
172 |
function ModInst(Inst: Integer): Integer; |
| 102 |
begin |
173 |
begin |
| 103 |
Result := ((Inst-1) mod 15)+1; |
174 |
Result := ((Inst-1) mod 15)+1; |