Commit 3a61fb4

Nick committed on
Improving wav/mp3 export feature
commit 3a61fb4c9dc07b7dd35e33e75669be53dcfd2763 parent 03a9b00
5 changed files +207−104
ModifiedGBEmu.lpi +1−0
@@ -286,6 +286,7 @@
286 <Filename Value="rendertowave.pas"/> 286 <Filename Value="rendertowave.pas"/>
287 <IsPartOfProject Value="True"/> 287 <IsPartOfProject Value="True"/>
288 <ComponentName Value="frmRenderToWave"/> 288 <ComponentName Value="frmRenderToWave"/>
289 <HasResources Value="True"/>
289 <ResourceBaseClass Value="Form"/> 290 <ResourceBaseClass Value="Form"/>
290 <UnitName Value="RenderToWave"/> 291 <UnitName Value="RenderToWave"/>
291 </Unit22> 292 </Unit22>
ModifiedSound/sound.pas +11−13
@@ -128,6 +128,8 @@ Bit0 Sound 1 on[1]/off[0]
128 128
129 *) 129 *)
130 130
131 uses Classes;
132
131 const 133 const
132 SAMPLE_BUFFER_SIZE = 1024; 134 SAMPLE_BUFFER_SIZE = 1024;
133 135
@@ -146,8 +148,8 @@ procedure SoundSetCycles(n: integer);
146 function SoundBufferTooFull: Boolean; 148 function SoundBufferTooFull: Boolean;
147 function SoundBufferSize: Integer; 149 function SoundBufferSize: Integer;
148 150
149 procedure BeginWritingSoundToFile(Filename: String); 151 procedure BeginWritingSoundToStream(Stream: TStream);
150 procedure EndWritingSoundToFile; 152 procedure EndWritingSoundToStream;
151 153
152 var 154 var
153 soundEnable: boolean; 155 soundEnable: boolean;
@@ -182,8 +184,7 @@ var
182 bufCycles, bufLVal, bufRVal: integer; 184 bufCycles, bufLVal, bufRVal: integer;
183 lfsr: Cardinal = 0; 185 lfsr: Cardinal = 0;
184 186
185 WritingSoundToFile: Boolean; 187 WritingSoundToStream: Boolean;
186 SoundOutFile: String;
187 WaveWriter: TWavWriter; 188 WaveWriter: TWavWriter;
188 189
189 procedure ResetSound; 190 procedure ResetSound;
@@ -215,12 +216,11 @@ begin
215 Result := SDL_GetQueuedAudioSize(playStream) 216 Result := SDL_GetQueuedAudioSize(playStream)
216 end; 217 end;
217 218
218 procedure BeginWritingSoundToFile(Filename: String); 219 procedure BeginWritingSoundToStream(Stream: TStream);
219 begin 220 begin
220 WritingSoundToFile := True; 221 WritingSoundToStream := True;
221 SoundOutFile := Filename;
222 WaveWriter := TWavWriter.Create; 222 WaveWriter := TWavWriter.Create;
223 WaveWriter.StoreToFile(Filename); 223 WaveWriter.StoreToStream(Stream);
224 with WaveWriter.fmt do begin 224 with WaveWriter.fmt do begin
225 SampleRate := playbackFrequency; 225 SampleRate := playbackFrequency;
226 BitsPerSample := 16; 226 BitsPerSample := 16;
@@ -229,11 +229,9 @@ begin
229 end; 229 end;
230 end; 230 end;
231 231
232 procedure EndWritingSoundToFile; 232 procedure EndWritingSoundToStream;
233 begin 233 begin
234 WritingSoundToFile := False; 234 WritingSoundToStream := False;
235
236 WaveWriter.FlushHeader;
237 WaveWriter.Free; 235 WaveWriter.Free;
238 end; 236 end;
239 237
@@ -291,7 +289,7 @@ begin
291 bufLVal := 0; 289 bufLVal := 0;
292 bufRVal := 0; 290 bufRVal := 0;
293 291
294 if WritingSoundToFile then begin 292 if WritingSoundToStream then begin
295 buf2[0] := Trunc(buf[0]*High(Smallint)); 293 buf2[0] := Trunc(buf[0]*High(Smallint));
296 buf2[1] := Trunc(buf[1]*High(Smallint)); 294 buf2[1] := Trunc(buf[1]*High(Smallint));
297 WaveWriter.WriteBuf(buf2, SizeOf(Smallint)*2); 295 WaveWriter.WriteBuf(buf2, SizeOf(Smallint)*2);
Modifiedrendertowave.lfm +67−41
@@ -1,32 +1,32 @@
1 object frmRenderToWave: TfrmRenderToWave 1 object frmRenderToWave: TfrmRenderToWave
2 Left = 2072 2 Left = 2038
3 Height = 361 3 Height = 313
4 Top = 149 4 Top = 144
5 Width = 294 5 Width = 451
6 Caption = 'Render to .WAV' 6 BorderStyle = bsSingle
7 ClientHeight = 361 7 Caption = 'Render song'
8 ClientWidth = 294 8 ClientHeight = 313
9 ClientWidth = 451
9 OnShow = FormShow 10 OnShow = FormShow
10 Position = poDefault 11 Position = poDefault
11 LCLVersion = '2.0.6.0' 12 LCLVersion = '2.0.6.0'
12 object Button1: TButton 13 object RenderButton: TButton
13 Left = 16 14 Left = 17
14 Height = 25 15 Height = 25
15 Top = 320 16 Top = 272
16 Width = 264 17 Width = 264
17 Caption = 'Render' 18 Caption = 'Render'
18 Enabled = False 19 Enabled = False
19 OnClick = Button1Click 20 OnClick = RenderButtonClick
20 TabOrder = 0 21 TabOrder = 0
21 end 22 end
22 object FileNameEdit1: TFileNameEdit 23 object FileNameEdit1: TFileNameEdit
23 Left = 72 24 Left = 72
24 Height = 23 25 Height = 23
25 Top = 8 26 Top = 8
26 Width = 208 27 Width = 248
27 FileName = 'FileNameEdit1'
28 OnAcceptFileName = FileNameEdit1AcceptFileName 28 OnAcceptFileName = FileNameEdit1AcceptFileName
29 Filter = 'Wave files|*.wav' 29 Filter = 'Wave Files|*.wav'
30 FilterIndex = 0 30 FilterIndex = 0
31 HideDirectories = False 31 HideDirectories = False
32 ButtonWidth = 23 32 ButtonWidth = 23
@@ -34,7 +34,6 @@ object frmRenderToWave: TfrmRenderToWave
34 MaxLength = 0 34 MaxLength = 0
35 TabOrder = 1 35 TabOrder = 1
36 OnChange = FileNameEdit1Change 36 OnChange = FileNameEdit1Change
37 Text = 'FileNameEdit1'
38 end 37 end
39 object Label1: TLabel 38 object Label1: TLabel
40 Left = 8 39 Left = 8
@@ -46,9 +45,9 @@ object frmRenderToWave: TfrmRenderToWave
46 end 45 end
47 object RadioGroup1: TRadioGroup 46 object RadioGroup1: TRadioGroup
48 Left = 8 47 Left = 8
49 Height = 90 48 Height = 58
50 Top = 40 49 Top = 40
51 Width = 273 50 Width = 193
52 AutoFill = True 51 AutoFill = True
53 Caption = 'Duration' 52 Caption = 'Duration'
54 ChildSizing.LeftRightSpacing = 6 53 ChildSizing.LeftRightSpacing = 6
@@ -57,9 +56,10 @@ object frmRenderToWave: TfrmRenderToWave
57 ChildSizing.ShrinkHorizontal = crsScaleChilds 56 ChildSizing.ShrinkHorizontal = crsScaleChilds
58 ChildSizing.ShrinkVertical = crsScaleChilds 57 ChildSizing.ShrinkVertical = crsScaleChilds
59 ChildSizing.Layout = cclLeftToRightThenTopToBottom 58 ChildSizing.Layout = cclLeftToRightThenTopToBottom
60 ChildSizing.ControlsPerLine = 1 59 ChildSizing.ControlsPerLine = 2
61 ClientHeight = 70 60 ClientHeight = 38
62 ClientWidth = 269 61 ClientWidth = 189
62 Columns = 2
63 ItemIndex = 0 63 ItemIndex = 0
64 Items.Strings = ( 64 Items.Strings = (
65 'Time in seconds' 65 'Time in seconds'
@@ -70,16 +70,16 @@ object frmRenderToWave: TfrmRenderToWave
70 end 70 end
71 object Notebook1: TNotebook 71 object Notebook1: TNotebook
72 Left = 8 72 Left = 8
73 Height = 152 73 Height = 112
74 Top = 136 74 Top = 104
75 Width = 272 75 Width = 425
76 PageIndex = 0 76 PageIndex = 1
77 TabOrder = 3 77 TabOrder = 3
78 object Page1: TPage 78 object Page1: TPage
79 object Label2: TLabel 79 object Label2: TLabel
80 Left = 8 80 Left = 16
81 Height = 15 81 Height = 15
82 Top = 40 82 Top = 24
83 Width = 44 83 Width = 44
84 Caption = 'Seconds' 84 Caption = 'Seconds'
85 ParentColor = False 85 ParentColor = False
@@ -87,49 +87,49 @@ object frmRenderToWave: TfrmRenderToWave
87 object SecondsSpinEdit: TSpinEdit 87 object SecondsSpinEdit: TSpinEdit
88 Left = 72 88 Left = 72
89 Height = 23 89 Height = 23
90 Top = 32 90 Top = 16
91 Width = 192 91 Width = 344
92 MaxValue = 0 92 MaxValue = 0
93 TabOrder = 0 93 TabOrder = 0
94 end 94 end
95 end 95 end
96 object Page2: TPage 96 object Page2: TPage
97 object Label3: TLabel 97 object Label3: TLabel
98 Left = 72 98 Left = 16
99 Height = 15 99 Height = 15
100 Top = 8 100 Top = 16
101 Width = 129 101 Width = 129
102 Caption = 'Stop playing when order' 102 Caption = 'Stop playing when order'
103 ParentColor = False 103 ParentColor = False
104 end 104 end
105 object OrderSpinEdit: TSpinEdit 105 object OrderSpinEdit: TSpinEdit
106 Left = 16 106 Left = 160
107 Height = 23 107 Height = 23
108 Top = 32 108 Top = 8
109 Width = 248 109 Width = 248
110 MaxValue = 0 110 MaxValue = 0
111 TabOrder = 0 111 TabOrder = 0
112 end 112 end
113 object Label4: TLabel 113 object Label4: TLabel
114 Left = 88 114 Left = 16
115 Height = 15 115 Height = 15
116 Top = 64 116 Top = 48
117 Width = 92 117 Width = 92
118 Caption = 'has been reached' 118 Caption = 'has been reached'
119 ParentColor = False 119 ParentColor = False
120 end 120 end
121 object LoopTimesSpinEdit: TSpinEdit 121 object LoopTimesSpinEdit: TSpinEdit
122 Left = 16 122 Left = 160
123 Height = 23 123 Height = 23
124 Top = 88 124 Top = 40
125 Width = 248 125 Width = 248
126 MaxValue = 0 126 MaxValue = 0
127 TabOrder = 1 127 TabOrder = 1
128 end 128 end
129 object Label5: TLabel 129 object Label5: TLabel
130 Left = 120 130 Left = 16
131 Height = 15 131 Height = 15
132 Top = 120 132 Top = 80
133 Width = 29 133 Width = 29
134 Caption = 'times' 134 Caption = 'times'
135 ParentColor = False 135 ParentColor = False
@@ -137,10 +137,36 @@ object frmRenderToWave: TfrmRenderToWave
137 end 137 end
138 end 138 end
139 object ProgressBar1: TProgressBar 139 object ProgressBar1: TProgressBar
140 Left = 16 140 Left = 17
141 Height = 28 141 Height = 28
142 Top = 280 142 Top = 232
143 Width = 264 143 Width = 417
144 TabOrder = 4 144 TabOrder = 4
145 end 145 end
146 object ComboBox1: TComboBox
147 Left = 328
148 Height = 23
149 Top = 8
150 Width = 105
151 ItemHeight = 15
152 ItemIndex = 0
153 Items.Strings = (
154 'WAV'
155 'MP3'
156 )
157 OnChange = ComboBox1Change
158 Style = csDropDownList
159 TabOrder = 5
160 Text = 'WAV'
161 end
162 object CancelButton: TButton
163 Left = 288
164 Height = 25
165 Top = 272
166 Width = 146
167 Caption = 'Cancel'
168 Enabled = False
169 OnClick = CancelButtonClick
170 TabOrder = 6
171 end
146 end 172 end
Modifiedrendertowave.pas +103−25
@@ -6,7 +6,7 @@ interface
6 6
7 uses 7 uses
8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn, 8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
9 ExtCtrls, Spin, ComCtrls, constants, fgl; 9 ExtCtrls, Spin, ComCtrls, constants, process, fgl;
10 10
11 type 11 type
12 TOrdersSeenSet = specialize TFPGMap<Integer, Boolean>; 12 TOrdersSeenSet = specialize TFPGMap<Integer, Boolean>;
@@ -18,7 +18,9 @@ type
18 { TfrmRenderToWave } 18 { TfrmRenderToWave }
19 19
20 TfrmRenderToWave = class(TForm) 20 TfrmRenderToWave = class(TForm)
21 Button1: TButton; 21 RenderButton: TButton;
22 CancelButton: TButton;
23 ComboBox1: TComboBox;
22 FileNameEdit1: TFileNameEdit; 24 FileNameEdit1: TFileNameEdit;
23 Label1: TLabel; 25 Label1: TLabel;
24 Label2: TLabel; 26 Label2: TLabel;
@@ -33,7 +35,9 @@ type
33 SecondsSpinEdit: TSpinEdit; 35 SecondsSpinEdit: TSpinEdit;
34 OrderSpinEdit: TSpinEdit; 36 OrderSpinEdit: TSpinEdit;
35 LoopTimesSpinEdit: TSpinEdit; 37 LoopTimesSpinEdit: TSpinEdit;
36 procedure Button1Click(Sender: TObject); 38 procedure CancelButtonClick(Sender: TObject);
39 procedure RenderButtonClick(Sender: TObject);
40 procedure ComboBox1Change(Sender: TObject);
37 procedure FileNameEdit1AcceptFileName(Sender: TObject; var Value: String); 41 procedure FileNameEdit1AcceptFileName(Sender: TObject; var Value: String);
38 procedure FileNameEdit1Change(Sender: TObject); 42 procedure FileNameEdit1Change(Sender: TObject);
39 procedure FormShow(Sender: TObject); 43 procedure FormShow(Sender: TObject);
@@ -43,6 +47,10 @@ type
43 TimesSeenTargetPattern: Integer; 47 TimesSeenTargetPattern: Integer;
44 48
45 OrdersSeen: TOrdersSeenSet; 49 OrdersSeen: TOrdersSeenSet;
50 Rendering: Boolean;
51 CancelRequested: Boolean;
52
53 procedure UpdateButtonEnabledStates;
46 54
47 procedure ExportWaveToFile(Filename: String; Seconds: Integer); overload; 55 procedure ExportWaveToFile(Filename: String; Seconds: Integer); overload;
48 procedure ExportWaveToFile(Filename: String; OrderNum: Integer; Loops: Integer); overload; 56 procedure ExportWaveToFile(Filename: String; OrderNum: Integer; Loops: Integer); overload;
@@ -64,20 +72,51 @@ uses sound, machine, mainloop, vars, symparser;
64 procedure TfrmRenderToWave.FileNameEdit1AcceptFileName(Sender: TObject; 72 procedure TfrmRenderToWave.FileNameEdit1AcceptFileName(Sender: TObject;
65 var Value: String); 73 var Value: String);
66 begin 74 begin
67 Button1.Enabled := (FileNameEdit1.FileName <> ''); 75 UpdateButtonEnabledStates;
76 end;
77
78 procedure TfrmRenderToWave.RenderButtonClick(Sender: TObject);
79 begin
80 ProgressBar1.Position := 0;
81 Rendering := True;
82 CancelRequested := False;
83 UpdateButtonEnabledStates;
84
85 try
86 if RadioGroup1.ItemIndex = 0 then
87 ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value)
88 else
89 ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value);
90 except
91 on E: Exception do begin
92 MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + ' !' + LineEnding +
93 LineEnding + E.Message, mtError, [mbOk], '');
94 end;
95 end;
96
97 ProgressBar1.Position := 0;
98 Rendering := False;
99 CancelRequested := False;
100 UpdateButtonEnabledStates;
101 end;
102
103 procedure TfrmRenderToWave.CancelButtonClick(Sender: TObject);
104 begin
105 CancelRequested := True;
106 UpdateButtonEnabledStates;
68 end; 107 end;
69 108
70 procedure TfrmRenderToWave.Button1Click(Sender: TObject); 109 procedure TfrmRenderToWave.ComboBox1Change(Sender: TObject);
71 begin 110 begin
72 if RadioGroup1.ItemIndex = 0 then 111 case ComboBox1.ItemIndex of
73 ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) 112 0: FileNameEdit1.Filter := 'Wave Files|*.wav';
74 else 113 1: FileNameEdit1.Filter := 'MP3 Files|*.mp3';
75 ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value); 114 end;
76 end; 115 end;
77 116
78 procedure TfrmRenderToWave.FileNameEdit1Change(Sender: TObject); 117 procedure TfrmRenderToWave.FileNameEdit1Change(Sender: TObject);
79 begin 118 begin
80 Button1.Enabled := (FileNameEdit1.FileName <> ''); 119 UpdateButtonEnabledStates;
81 end; 120 end;
82 121
83 procedure TfrmRenderToWave.FormShow(Sender: TObject); 122 procedure TfrmRenderToWave.FormShow(Sender: TObject);
@@ -95,13 +134,19 @@ begin
95 Notebook1.PageIndex := RadioGroup1.ItemIndex; 134 Notebook1.PageIndex := RadioGroup1.ItemIndex;
96 end; 135 end;
97 136
137 procedure TfrmRenderToWave.UpdateButtonEnabledStates;
138 begin
139 RenderButton.Enabled := (FileNameEdit1.FileName <> '') and not Rendering;
140 CancelButton.Enabled := Rendering and not CancelRequested;
141 end;
142
98 procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; Seconds: Integer); 143 procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; Seconds: Integer);
99 var 144 var
100 CompletedCycles: QWord = 0; 145 CompletedCycles: QWord = 0;
101 CyclesToDo: QWord; 146 CyclesToDo: QWord;
147 OutStream: TStream;
148 Proc: TProcess;
102 begin 149 begin
103 Button1.Enabled := False;
104
105 CyclesToDo := (70224*60)*Seconds; 150 CyclesToDo := (70224*60)*Seconds;
106 ProgressBar1.Position := 0; 151 ProgressBar1.Position := 0;
107 152
@@ -109,21 +154,54 @@ begin
109 ResetSound; 154 ResetSound;
110 enablesound; 155 enablesound;
111 156
112 BeginWritingSoundToFile(Filename);
113
114 FDCallback := nil; 157 FDCallback := nil;
115
116 load('hUGEDriver/preview.gb'); 158 load('hUGEDriver/preview.gb');
159 chdir('hUGEDriver');
160
161 if ComboBox1.ItemIndex = 0 then begin
162 OutStream := TFileStream.Create(Filename, fmCreate);
163 end
164 else begin
165 Proc := TProcess.Create(nil);
166 Proc.Executable := 'lame';
167 with Proc.Parameters do begin
168 Add('-');
169 Add(Filename);
170 end;
171 Proc.Options := [poUsePipes];
172 Proc.Execute;
117 173
118 while CompletedCycles < CyclesToDo do begin 174 OutStream := TMemoryStream.Create;
119 Inc(CompletedCycles, z80_decode);
120 ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100);
121 if Random(500) = 1 then Application.ProcessMessages;
122 end; 175 end;
123 176
124 EndWritingSoundToFile; 177 try
178 BeginWritingSoundToStream(OutStream);
179
180 while (CompletedCycles < CyclesToDo) and not CancelRequested do begin
181 Inc(CompletedCycles, z80_decode);
182 ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100);
183 if Random(500) = 1 then Application.ProcessMessages;
184 end;
185
186 if CancelRequested then Exit;
125 187
126 Button1.Enabled:=True; 188 finally
189 EndWritingSoundToStream;
190
191 Chdir('..');
192
193 try
194 if ComboBox1.ItemIndex = 1 then begin
195 OutStream.Seek(0, soFromBeginning);
196 Proc.Input.CopyFrom(OutStream, OutStream.Size);
197 Proc.CloseInput;
198 Proc.WaitOnExit;
199 end;
200 finally
201 if ComboBox1.ItemIndex = 1 then Proc.Free;
202 OutStream.Free
203 end;
204 end;
127 end; 205 end;
128 206
129 procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; 207 procedure TfrmRenderToWave.ExportWaveToFile(Filename: String;
@@ -131,7 +209,7 @@ procedure TfrmRenderToWave.ExportWaveToFile(Filename: String;
131 var 209 var
132 TimesToSeePattern: Integer; 210 TimesToSeePattern: Integer;
133 begin 211 begin
134 Button1.Enabled:=False; 212 RenderButton.Enabled:=False;
135 213
136 TimesToSeePattern := (LoopTimesSpinEdit.Value+1); 214 TimesToSeePattern := (LoopTimesSpinEdit.Value+1);
137 TimesSeenTargetPattern := 0; 215 TimesSeenTargetPattern := 0;
@@ -141,7 +219,7 @@ begin
141 ResetSound; 219 ResetSound;
142 enablesound; 220 enablesound;
143 221
144 BeginWritingSoundToFile(Filename); 222 //BeginWritingSoundToStream(Filename);
145 223
146 FDCallback := @OrderCheckFD; 224 FDCallback := @OrderCheckFD;
147 225
@@ -160,9 +238,9 @@ begin
160 end; 238 end;
161 end; 239 end;
162 240
163 EndWritingSoundToFile; 241 EndWritingSoundToStream;
164 242
165 Button1.Enabled:=True; 243 RenderButton.Enabled:=True;
166 end; 244 end;
167 245
168 procedure TfrmRenderToWave.OrderCheckFD; 246 procedure TfrmRenderToWave.OrderCheckFD;
Modifiedtracker.lfm +25−25
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 2040 2 Left = 2029
3 Height = 714 3 Height = 714
4 Top = 149 4 Top = 270
5 Width = 1181 5 Width = 1181
6 Caption = 'hUGETracker' 6 Caption = 'hUGETracker'
7 ClientHeight = 694 7 ClientHeight = 694
@@ -19,7 +19,7 @@ object frmTracker: TfrmTracker
19 LCLVersion = '2.0.6.0' 19 LCLVersion = '2.0.6.0'
20 object TreeView1: TTreeView 20 object TreeView1: TTreeView
21 Left = 0 21 Left = 0
22 Height = 463 22 Height = 468
23 Top = 203 23 Top = 203
24 Width = 193 24 Width = 193
25 Align = alLeft 25 Align = alLeft
@@ -37,24 +37,24 @@ object frmTracker: TfrmTracker
37 end 37 end
38 object Splitter1: TSplitter 38 object Splitter1: TSplitter
39 Left = 193 39 Left = 193
40 Height = 463 40 Height = 468
41 Top = 203 41 Top = 203
42 Width = 5 42 Width = 5
43 end 43 end
44 object Panel1: TPanel 44 object Panel1: TPanel
45 Left = 198 45 Left = 198
46 Height = 463 46 Height = 468
47 Top = 203 47 Top = 203
48 Width = 983 48 Width = 983
49 Align = alClient 49 Align = alClient
50 BevelOuter = bvNone 50 BevelOuter = bvNone
51 ClientHeight = 463 51 ClientHeight = 468
52 ClientWidth = 983 52 ClientWidth = 983
53 ParentFont = False 53 ParentFont = False
54 TabOrder = 2 54 TabOrder = 2
55 object PageControl1: TPageControl 55 object PageControl1: TPageControl
56 Left = 0 56 Left = 0
57 Height = 463 57 Height = 468
58 Top = 0 58 Top = 0
59 Width = 983 59 Width = 983
60 ActivePage = PatternTabSheet 60 ActivePage = PatternTabSheet
@@ -141,16 +141,16 @@ object frmTracker: TfrmTracker
141 end 141 end
142 object PatternTabSheet: TTabSheet 142 object PatternTabSheet: TTabSheet
143 Caption = 'Patterns' 143 Caption = 'Patterns'
144 ClientHeight = 435 144 ClientHeight = 440
145 ClientWidth = 975 145 ClientWidth = 975
146 ParentFont = False 146 ParentFont = False
147 object Panel3: TPanel 147 object Panel3: TPanel
148 Left = 224 148 Left = 224
149 Height = 435 149 Height = 440
150 Top = 0 150 Top = 0
151 Width = 751 151 Width = 751
152 Align = alClient 152 Align = alClient
153 ClientHeight = 435 153 ClientHeight = 440
154 ClientWidth = 751 154 ClientWidth = 751
155 ParentFont = False 155 ParentFont = False
156 TabOrder = 0 156 TabOrder = 0
@@ -199,7 +199,7 @@ object frmTracker: TfrmTracker
199 end 199 end
200 object ScrollBox1: TScrollBox 200 object ScrollBox1: TScrollBox
201 Left = 1 201 Left = 1
202 Height = 403 202 Height = 408
203 Top = 31 203 Top = 31
204 Width = 749 204 Width = 749
205 HorzScrollBar.Increment = 1 205 HorzScrollBar.Increment = 1
@@ -218,7 +218,7 @@ object frmTracker: TfrmTracker
218 end 218 end
219 object OrderEditStringGrid: TStringGrid 219 object OrderEditStringGrid: TStringGrid
220 Left = 0 220 Left = 0
221 Height = 435 221 Height = 440
222 Top = 0 222 Top = 0
223 Width = 224 223 Width = 224
224 Align = alLeft 224 Align = alLeft
@@ -1662,8 +1662,8 @@ object frmTracker: TfrmTracker
1662 end 1662 end
1663 object StatusBar1: TStatusBar 1663 object StatusBar1: TStatusBar
1664 Left = 0 1664 Left = 0
1665 Height = 28 1665 Height = 23
1666 Top = 666 1666 Top = 671
1667 Width = 1181 1667 Width = 1181
1668 AutoHint = True 1668 AutoHint = True
1669 Panels = < 1669 Panels = <
@@ -1702,7 +1702,7 @@ object frmTracker: TfrmTracker
1702 ParentShowHint = False 1702 ParentShowHint = False
1703 end 1703 end
1704 object PanicToolButton: TToolButton 1704 object PanicToolButton: TToolButton
1705 Left = 556 1705 Left = 557
1706 Hint = 'Stops all sound output' 1706 Hint = 'Stops all sound output'
1707 Top = 0 1707 Top = 0
1708 AutoSize = True 1708 AutoSize = True
@@ -1749,14 +1749,14 @@ object frmTracker: TfrmTracker
1749 Style = tbsDivider 1749 Style = tbsDivider
1750 end 1750 end
1751 object ToolButton7: TToolButton 1751 object ToolButton7: TToolButton
1752 Left = 1121 1752 Left = 1122
1753 Height = 22 1753 Height = 22
1754 Top = 0 1754 Top = 0
1755 Caption = 'ToolButton7' 1755 Caption = 'ToolButton7'
1756 Style = tbsSeparator 1756 Style = tbsSeparator
1757 end 1757 end
1758 object OctaveSpinEdit: TSpinEdit 1758 object OctaveSpinEdit: TSpinEdit
1759 Left = 662 1759 Left = 663
1760 Height = 23 1760 Height = 23
1761 Top = 0 1761 Top = 0
1762 Width = 90 1762 Width = 90
@@ -1766,14 +1766,14 @@ object frmTracker: TfrmTracker
1766 TabOrder = 0 1766 TabOrder = 0
1767 end 1767 end
1768 object ToolButton9: TToolButton 1768 object ToolButton9: TToolButton
1769 Left = 611 1769 Left = 612
1770 Height = 22 1770 Height = 22
1771 Top = 0 1771 Top = 0
1772 Caption = 'ToolButton9' 1772 Caption = 'ToolButton9'
1773 Style = tbsSeparator 1773 Style = tbsSeparator
1774 end 1774 end
1775 object Label22: TLabel 1775 object Label22: TLabel
1776 Left = 619 1776 Left = 620
1777 Height = 15 1777 Height = 15
1778 Top = 0 1778 Top = 0
1779 Width = 43 1779 Width = 43
@@ -1782,7 +1782,7 @@ object frmTracker: TfrmTracker
1782 ParentFont = False 1782 ParentFont = False
1783 end 1783 end
1784 object Label23: TLabel 1784 object Label23: TLabel
1785 Left = 752 1785 Left = 753
1786 Height = 15 1786 Height = 15
1787 Top = 0 1787 Top = 0
1788 Width = 70 1788 Width = 70
@@ -1791,7 +1791,7 @@ object frmTracker: TfrmTracker
1791 ParentFont = False 1791 ParentFont = False
1792 end 1792 end
1793 object InstrumentComboBox: TComboBox 1793 object InstrumentComboBox: TComboBox
1794 Left = 822 1794 Left = 823
1795 Height = 23 1795 Height = 23
1796 Top = 0 1796 Top = 0
1797 Width = 214 1797 Width = 214
@@ -1822,7 +1822,7 @@ object frmTracker: TfrmTracker
1822 Text = '(no instrument)' 1822 Text = '(no instrument)'
1823 end 1823 end
1824 object Label24: TLabel 1824 object Label24: TLabel
1825 Left = 1036 1825 Left = 1037
1826 Height = 15 1826 Height = 15
1827 Top = 0 1827 Top = 0
1828 Width = 35 1828 Width = 35
@@ -1831,7 +1831,7 @@ object frmTracker: TfrmTracker
1831 ParentFont = False 1831 ParentFont = False
1832 end 1832 end
1833 object StepSpinEdit: TSpinEdit 1833 object StepSpinEdit: TSpinEdit
1834 Left = 1071 1834 Left = 1072
1835 Height = 23 1835 Height = 23
1836 Top = 0 1836 Top = 0
1837 Width = 50 1837 Width = 50
@@ -1855,7 +1855,7 @@ object frmTracker: TfrmTracker
1855 OnClick = ExportGBSButtonClick 1855 OnClick = ExportGBSButtonClick
1856 end 1856 end
1857 object ToolButton5: TToolButton 1857 object ToolButton5: TToolButton
1858 Left = 551 1858 Left = 552
1859 Height = 22 1859 Height = 22
1860 Top = 0 1860 Top = 0
1861 Caption = 'ToolButton5' 1861 Caption = 'ToolButton5'
@@ -1864,7 +1864,7 @@ object frmTracker: TfrmTracker
1864 object ToolButton10: TToolButton 1864 object ToolButton10: TToolButton
1865 Left = 459 1865 Left = 459
1866 Top = 0 1866 Top = 0
1867 Caption = 'Export .WAV' 1867 Caption = 'Render Song'
1868 ImageIndex = 77 1868 ImageIndex = 77
1869 OnClick = ToolButton10Click 1869 OnClick = ToolButton10Click
1870 end 1870 end