Commit 2f731e2

Nick committed on
WIP some really hairy function for calculating the orders used when a song is played
commit 2f731e212b247b009279248ec69a39a3ad084878 parent 45c0b51
5 changed files +98−19
Modifiedrendertowave.lfm +1−1
@@ -27,7 +27,7 @@ object frmRenderToWave: TfrmRenderToWave
27 Top = 8 27 Top = 8
28 Width = 353 28 Width = 353
29 OnAcceptFileName = FileNameEdit1AcceptFileName 29 OnAcceptFileName = FileNameEdit1AcceptFileName
30 Filter = 'Wave Files|*.wav|MP3 Files|*.mp3' 30 Filter = 'Wave|*.wav|Ogg Vorbis|*.ogg|MP3|*.mp3|FLAC|*.flac|AAC|*.aac'
31 FilterIndex = 0 31 FilterIndex = 0
32 HideDirectories = False 32 HideDirectories = False
33 ButtonWidth = 23 33 ButtonWidth = 23
Modifiedrendertowave.pas +16−15
@@ -134,21 +134,22 @@ begin
134 Proc := TProcess.Create(nil); 134 Proc := TProcess.Create(nil);
135 Proc.Executable := 'ffmpeg'; 135 Proc.Executable := 'ffmpeg';
136 with Proc.Parameters do begin 136 with Proc.Parameters do begin
137 // HACK: to prevent ffmpeg from writing to stderr, we disable all output 137 // HACK: to prevent ffmpeg from writing to stderr, we disable all output
138 // This is needed because ffmpeg blocks unless you read what it writes 138 // This is needed because ffmpeg blocks unless you read what it writes
139 Add('-nostats'); 139 Add('-nostats');
140 Add('-loglevel'); 140 Add('-loglevel');
141 Add('0'); 141 Add('0');
142 142
143 Add('-sample_rate'); 143 Add('-sample_rate');
144 Add(IntToStr(PlaybackFrequency)); 144 Add(IntToStr(PlaybackFrequency));
145 Add('-f'); 145 Add('-y');
146 Add('f32le'); 146 Add('-f');
147 Add('-channels'); 147 Add('f32le');
148 Add('2'); 148 Add('-channels');
149 Add('-i'); 149 Add('2');
150 Add('-'); 150 Add('-i');
151 Add(Filename); 151 Add('-');
152 Add(Filename);
152 end; 153 end;
153 Proc.Options := [poUsePipes, poNoConsole]; 154 Proc.Options := [poUsePipes, poNoConsole];
154 Proc.Execute; 155 Proc.Execute;
Modifiedtracker.lfm +3−2
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 778 2 Left = 1280
3 Height = 653 3 Height = 653
4 Top = 307 4 Top = 417
5 Width = 1232 5 Width = 1232
6 AllowDropFiles = True 6 AllowDropFiles = True
7 Caption = 'hUGETracker' 7 Caption = 'hUGETracker'
@@ -2023,6 +2023,7 @@ object frmTracker: TfrmTracker
2023 object DebugShiteButton: TMenuItem 2023 object DebugShiteButton: TMenuItem
2024 Caption = 'Debug shite' 2024 Caption = 'Debug shite'
2025 Visible = False 2025 Visible = False
2026 OnClick = DebugShiteButtonClick
2026 end 2027 end
2027 end 2028 end
2028 object MenuBarActionList: TActionList 2029 object MenuBarActionList: TActionList
Modifiedtracker.pas +6−0
@@ -258,6 +258,7 @@ type
258 TreeView1: TTreeView; 258 TreeView1: TTreeView;
259 TrackerGrid: TTrackerGrid; 259 TrackerGrid: TTrackerGrid;
260 procedure Button1Click(Sender: TObject); 260 procedure Button1Click(Sender: TObject);
261 procedure DebugShiteButtonClick(Sender: TObject);
261 procedure DecrementCurrentInstrumentActionExecute(Sender: TObject); 262 procedure DecrementCurrentInstrumentActionExecute(Sender: TObject);
262 procedure DeleteRowActionExecute(Sender: TObject); 263 procedure DeleteRowActionExecute(Sender: TObject);
263 procedure DeleteRowActionUpdate(Sender: TObject); 264 procedure DeleteRowActionUpdate(Sender: TObject);
@@ -1896,6 +1897,11 @@ begin
1896 PreviewC5; 1897 PreviewC5;
1897 end; 1898 end;
1898 1899
1900 procedure TfrmTracker.DebugShiteButtonClick(Sender: TObject);
1901 begin
1902 writeln(UniqueOrdersDuringPlayback(Song, 0, 99999));
1903 end;
1904
1899 procedure TfrmTracker.DecrementCurrentInstrumentActionExecute(Sender: TObject); 1905 procedure TfrmTracker.DecrementCurrentInstrumentActionExecute(Sender: TObject);
1900 begin 1906 begin
1901 InstrumentComboBox.ItemIndex := EnsureRange(InstrumentComboBox.ItemIndex-1, 0, InstrumentComboBox.Items.Count-1); 1907 InstrumentComboBox.ItemIndex := EnsureRange(InstrumentComboBox.ItemIndex-1, 0, InstrumentComboBox.Items.Count-1);
Modifiedutils.pas +72−1
@@ -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;