@@ -23,6 +23,8 @@ type |
| 23 |
function GetOrCreateNew(Key: Integer): PPattern; |
23 |
function GetOrCreateNew(Key: Integer): PPattern; |
| 24 |
function CreateNewPattern(Key: Integer): PPattern; |
24 |
function CreateNewPattern(Key: Integer): PPattern; |
| 25 |
function MaxKey: Integer; |
25 |
function MaxKey: Integer; |
|
|
26 |
|
|
|
27 |
procedure DeletePattern(Key: Integer); |
| 26 |
end; |
28 |
end; |
| 27 |
|
29 |
|
| 28 |
{ TSongUsageReport } |
30 |
{ TSongUsageReport } |
@@ -31,6 +33,10 @@ type |
| 31 |
UsedInstruments: TUsedMap; |
33 |
UsedInstruments: TUsedMap; |
| 32 |
UsedRoutines: TUsedMap; |
34 |
UsedRoutines: TUsedMap; |
| 33 |
UsedPatterns: TUsedMap; |
35 |
UsedPatterns: TUsedMap; |
|
|
36 |
|
|
|
37 |
{UnusedInstruments: TUsedMap; |
|
|
38 |
UnusedRoutines: TUsedMap;} |
|
|
39 |
UnusedPatterns: TUsedMap; |
| 34 |
end; |
40 |
end; |
| 35 |
|
41 |
|
| 36 |
function Lerp(v0, v1, t: Double): Double; |
42 |
function Lerp(v0, v1, t: Double): Double; |
@@ -49,7 +55,7 @@ implementation |
| 49 |
|
55 |
|
| 50 |
class function TIntegerHash.hash(I: Integer; N: Integer): Integer; |
56 |
class function TIntegerHash.hash(I: Integer; N: Integer): Integer; |
| 51 |
begin |
57 |
begin |
| 52 |
Result := I; |
58 |
Result := I mod N; |
| 53 |
end; |
59 |
end; |
| 54 |
|
60 |
|
| 55 |
{ TOrderMapHelper } |
61 |
{ TOrderMapHelper } |
@@ -84,6 +90,12 @@ begin |
| 84 |
Inc(Result); |
90 |
Inc(Result); |
| 85 |
end; |
91 |
end; |
| 86 |
|
92 |
|
|
|
93 |
procedure TOrderMapHelper.DeletePattern(Key: Integer); |
|
|
94 |
begin |
|
|
95 |
Dispose(KeyData[Key]); |
|
|
96 |
Self.Remove(Key); |
|
|
97 |
end; |
|
|
98 |
|
| 87 |
function Lerp(v0, v1, t: Double): Double; |
99 |
function Lerp(v0, v1, t: Double): Double; |
| 88 |
begin |
100 |
begin |
| 89 |
Result := ((1 - t) * v0) + (t * v1); |
101 |
Result := ((1 - t) * v0) + (t * v1); |
@@ -152,12 +164,13 @@ begin |
| 152 |
Result.UsedPatterns := TUsedMap.Create; |
164 |
Result.UsedPatterns := TUsedMap.Create; |
| 153 |
Result.UsedInstruments := TUsedMap.Create; |
165 |
Result.UsedInstruments := TUsedMap.Create; |
| 154 |
Result.UsedRoutines := TUsedMap.Create; |
166 |
Result.UsedRoutines := TUsedMap.Create; |
|
|
167 |
Result.UnusedPatterns := TUsedMap.Create; |
|
|
168 |
{Result.UnusedInstruments := TUsedMap.Create; |
|
|
169 |
Result.UnusedRoutines := TUsedMap.Create;} |
| 155 |
|
170 |
|
| 156 |
for X := Low(Song.OrderMatrix) to High(Song.OrderMatrix) do |
171 |
for X := Low(Song.OrderMatrix) to High(Song.OrderMatrix) do |
| 157 |
for Y := Low(Song.OrderMatrix[X]) to High(Song.OrderMatrix[X]) do begin |
172 |
for Y := Low(Song.OrderMatrix[X]) to High(Song.OrderMatrix[X]) do |
| 158 |
Writeln(X, ' ', Y, ' ', Song.OrderMatrix[X, Y]); |
|
|
| 159 |
Result.UsedPatterns.insert(Song.OrderMatrix[X, Y]); |
173 |
Result.UsedPatterns.insert(Song.OrderMatrix[X, Y]); |
| 160 |
end; |
|
|
| 161 |
|
174 |
|
| 162 |
for I := 0 to Song.Patterns.Count-1 do begin |
175 |
for I := 0 to Song.Patterns.Count-1 do begin |
| 163 |
if not Result.UsedPatterns.contains(Song.Patterns.Keys[I]) |
176 |
if not Result.UsedPatterns.contains(Song.Patterns.Keys[I]) |
@@ -167,11 +180,27 @@ begin |
| 167 |
|
180 |
|
| 168 |
for J := Low(Pat^) to High(Pat^) do |
181 |
for J := Low(Pat^) to High(Pat^) do |
| 169 |
with Pat^[J] do begin |
182 |
with Pat^[J] do begin |
| 170 |
Result.UsedInstruments.insert(Instrument); |
183 |
if Instrument <> 0 then Result.UsedInstruments.insert(Instrument); |
| 171 |
if EffectCode = $6 then // Call routine |
184 |
if EffectCode = $6 then // Call routine |
| 172 |
Result.UsedRoutines.insert(EffectParams.Value); |
185 |
Result.UsedRoutines.insert(EffectParams.Value); |
| 173 |
end; |
186 |
end; |
| 174 |
end; |
187 |
end; |
|
|
188 |
|
|
|
189 |
for X := 0 to Song.Patterns.Count-1 do |
|
|
190 |
if not Result.UsedPatterns.contains(Song.Patterns.Keys[X]) then |
|
|
191 |
Result.UnusedPatterns.insert(Song.Patterns.Keys[X]); |
|
|
192 |
|
|
|
193 |
{for I := Low(TInstrumentIndex) to High(TInstrumentIndex) do |
|
|
194 |
Result.UnusedInstruments.insert(I); |
|
|
195 |
|
|
|
196 |
for I in Result.UsedInstruments.Iterator do |
|
|
197 |
Result.UnusedInstruments.delete(I); |
|
|
198 |
|
|
|
199 |
for I := Low(TRoutineIndex) do High(TRoutineIndex) do |
|
|
200 |
Result.UnusedRoutines.insert(I); |
|
|
201 |
|
|
|
202 |
for I in Result.UsedRoutines do |
|
|
203 |
Result.UnusedRoutines.delete(I);} |
| 175 |
end; |
204 |
end; |
| 176 |
|
205 |
|
| 177 |
procedure FreeUsageReport(Report: TSongUsageReport); |
206 |
procedure FreeUsageReport(Report: TSongUsageReport); |
@@ -179,6 +208,10 @@ begin |
| 179 |
Report.UsedPatterns.Free; |
208 |
Report.UsedPatterns.Free; |
| 180 |
Report.UsedInstruments.Free; |
209 |
Report.UsedInstruments.Free; |
| 181 |
Report.UsedRoutines.Free; |
210 |
Report.UsedRoutines.Free; |
|
|
211 |
|
|
|
212 |
Report.UnusedPatterns.Free; |
|
|
213 |
//Report.UnusedInstruments.Free; |
|
|
214 |
//Report.UnusedRoutines.Free; |
| 182 |
end; |
215 |
end; |
| 183 |
|
216 |
|
| 184 |
end. |
217 |
end. |