Commit 043fcaa

Nick Faro committed on
Implement hardware timer based BPM
commit 043fcaa64a8ae1ecd2f5c373ffe54ce206c5f497 parent c38f1f3
7 changed files +267−136
Modifiedcodegen.pas +5−1
@@ -640,7 +640,11 @@ begin
640 end 640 end
641 else 641 else
642 begin 642 begin
643 if Assemble(Filename + '_player.obj', 'hUGEDriver/player.asm', ['SONG_DESCRIPTOR=song']) <> 0 then 643 if Assemble(Filename + '_player.obj',
644 'hUGEDriver/player.asm',
645 ['SONG_DESCRIPTOR=song',
646 IfThen(Song.TimerEnabled, 'USE_TIMER=1', ''),
647 'TIMER_MODULO='+IntToStr(Song.TimerDivider)]) <> 0 then
644 Die; 648 Die;
645 end; 649 end;
646 650
ModifiedhUGEDriver +1−1
@@ -1 +1 @@
1 Subproject commit 545486e17ae01dbda3f8067851ffafef35ee2bf7 1 Subproject commit 3facfeb04211126c53edbc37841957bd3e8cf91e
ModifiedhUGETracker.lpi +12−0
@@ -61,6 +61,10 @@
61 </Options> 61 </Options>
62 </Linking> 62 </Linking>
63 <Other> 63 <Other>
64 <Verbosity>
65 <ShoLineNum Value="True"/>
66 </Verbosity>
67 <WriteFPCLogo Value="False"/>
64 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/> 68 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/>
65 </Other> 69 </Other>
66 </CompilerOptions> 70 </CompilerOptions>
@@ -105,6 +109,10 @@
105 </Options> 109 </Options>
106 </Linking> 110 </Linking>
107 <Other> 111 <Other>
112 <Verbosity>
113 <ShoLineNum Value="True"/>
114 </Verbosity>
115 <WriteFPCLogo Value="False"/>
108 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/> 116 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/>
109 </Other> 117 </Other>
110 </CompilerOptions> 118 </CompilerOptions>
@@ -153,6 +161,10 @@
153 </Options> 161 </Options>
154 </Linking> 162 </Linking>
155 <Other> 163 <Other>
164 <Verbosity>
165 <ShoLineNum Value="True"/>
166 </Verbosity>
167 <WriteFPCLogo Value="False"/>
156 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/> 168 <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL -dPRODUCTION"/>
157 </Other> 169 </Other>
158 </CompilerOptions> 170 </CompilerOptions>
Modifiedmainloop.pas +1−1
@@ -74,7 +74,7 @@ begin
74 end; 74 end;
75 end; 75 end;
76 76
77 m_iram[$ff05] := t_count; 77 m_iram[$ff05] := Byte(t_count);
78 if (t_count > 255) then 78 if (t_count > 255) then
79 begin 79 begin
80 m_iram[$ff05] := m_iram[$ff06]; // TIMEMOD [RW] Timer Modulo 80 m_iram[$ff05] := m_iram[$ff06]; // TIMEMOD [RW] Timer Modulo
Modifiedsong.pas +8−0
@@ -100,6 +100,9 @@ type
100 OrderMatrix: TOrderMatrix; 100 OrderMatrix: TOrderMatrix;
101 101
102 Routines: TRoutineBank; 102 Routines: TRoutineBank;
103
104 TimerEnabled: Boolean;
105 TimerDivider: Integer;
103 end; 106 end;
104 107
105 { TSong } 108 { TSong }
@@ -514,6 +517,8 @@ begin
514 S.Routines[I] := ''; 517 S.Routines[I] := '';
515 518
516 S.TicksPerRow := 7; 519 S.TicksPerRow := 7;
520 S.TimerDivider := 0;
521 S.TimerEnabled := False;
517 S.Patterns := TPatternMap.Create; 522 S.Patterns := TPatternMap.Create;
518 end; 523 end;
519 524
@@ -792,6 +797,9 @@ begin
792 SV6.Waves := S.Waves; 797 SV6.Waves := S.Waves;
793 798
794 SV6.TicksPerRow:=S.TicksPerRow; 799 SV6.TicksPerRow:=S.TicksPerRow;
800 SV6.TimerEnabled := False;
801 SV6.TimerDivider := 0;
802
795 SV6.OrderMatrix:=S.OrderMatrix; 803 SV6.OrderMatrix:=S.OrderMatrix;
796 804
797 SV6.Routines:=S.Routines; 805 SV6.Routines:=S.Routines;
Modifiedtracker.lfm +195−133
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 1192 2 Left = 1621
3 Height = 857 3 Height = 857
4 Top = 177 4 Top = 130
5 Width = 1318 5 Width = 1318
6 AllowDropFiles = True 6 AllowDropFiles = True
7 Caption = 'hUGETracker' 7 Caption = 'hUGETracker'
@@ -17,7 +17,7 @@ object frmTracker: TfrmTracker
17 OnShow = FormShow 17 OnShow = FormShow
18 Position = poDefault 18 Position = poDefault
19 ShowHint = True 19 ShowHint = True
20 LCLVersion = '2.2.0.3' 20 LCLVersion = '2.2.3.0'
21 object TreeView1: TTreeView 21 object TreeView1: TTreeView
22 Left = 0 22 Left = 0
23 Height = 725 23 Height = 725
@@ -62,10 +62,10 @@ object frmTracker: TfrmTracker
62 Height = 725 62 Height = 725
63 Top = 0 63 Top = 0
64 Width = 1120 64 Width = 1120
65 ActivePage = InstrumentTabSheet 65 ActivePage = GeneralTabSheet
66 Align = alClient 66 Align = alClient
67 ParentFont = False 67 ParentFont = False
68 TabIndex = 2 68 TabIndex = 0
69 TabOrder = 0 69 TabOrder = 0
70 object GeneralTabSheet: TTabSheet 70 object GeneralTabSheet: TTabSheet
71 Caption = 'General' 71 Caption = 'General'
@@ -74,12 +74,12 @@ object frmTracker: TfrmTracker
74 ParentFont = False 74 ParentFont = False
75 object SongInformationGroupbox: TGroupBox 75 object SongInformationGroupbox: TGroupBox
76 Left = 8 76 Left = 8
77 Height = 136 77 Height = 192
78 Top = 8 78 Top = 8
79 Width = 305 79 Width = 297
80 Caption = 'Song information' 80 Caption = 'Song information'
81 ClientHeight = 116 81 ClientHeight = 172
82 ClientWidth = 301 82 ClientWidth = 293
83 ParentFont = False 83 ParentFont = False
84 TabOrder = 0 84 TabOrder = 0
85 object Label15: TLabel 85 object Label15: TLabel
@@ -88,6 +88,7 @@ object frmTracker: TfrmTracker
88 Top = 16 88 Top = 16
89 Width = 27 89 Width = 27
90 Caption = 'Song' 90 Caption = 'Song'
91 ParentColor = False
91 ParentFont = False 92 ParentFont = False
92 end 93 end
93 object Label16: TLabel 94 object Label16: TLabel
@@ -96,6 +97,7 @@ object frmTracker: TfrmTracker
96 Top = 48 97 Top = 48
97 Width = 28 98 Width = 28
98 Caption = 'Artist' 99 Caption = 'Artist'
100 ParentColor = False
99 ParentFont = False 101 ParentFont = False
100 end 102 end
101 object SongEdit: TEdit 103 object SongEdit: TEdit
@@ -126,13 +128,14 @@ object frmTracker: TfrmTracker
126 Top = 78 128 Top = 78
127 Width = 114 129 Width = 114
128 Caption = 'Tempo (ticks per row)' 130 Caption = 'Tempo (ticks per row)'
131 ParentColor = False
129 ParentFont = False 132 ParentFont = False
130 end 133 end
131 object TicksPerRowSpinEdit: TSpinEdit 134 object TicksPerRowSpinEdit: TSpinEdit
132 Left = 133 135 Left = 133
133 Height = 23 136 Height = 23
134 Hint = 'How many ticks should happen before the row changes. Higher means slower' 137 Hint = 'How many ticks should happen before the row changes. Higher means slower.'
135 Top = 73 138 Top = 72
136 Width = 50 139 Width = 50
137 MaxValue = 20 140 MaxValue = 20
138 MinValue = 1 141 MinValue = 1
@@ -141,6 +144,44 @@ object frmTracker: TfrmTracker
141 TabOrder = 2 144 TabOrder = 2
142 Value = 7 145 Value = 7
143 end 146 end
147 object TimerEnabledCheckBox: TCheckBox
148 Left = 7
149 Height = 19
150 Hint = 'Enable the GB hardware timer. This allows for more fine-grained tempo control.'
151 Top = 144
152 Width = 160
153 Caption = 'Enable timer-based tempo'
154 OnChange = TimerEnabledCheckBoxChange
155 TabOrder = 3
156 end
157 object TimerTempoLabel: TLabel
158 Left = 8
159 Height = 15
160 Top = 112
161 Width = 114
162 Caption = 'Tempo (timer divider)'
163 Enabled = False
164 ParentColor = False
165 end
166 object TimerDividerSpinEdit: TSpinEdit
167 Left = 133
168 Height = 23
169 Hint = 'The "modulo" value for the GB hardware timer. Higher means faster.'
170 Top = 108
171 Width = 50
172 Enabled = False
173 MaxValue = 255
174 OnChange = TimerDividerSpinEditChange
175 TabOrder = 4
176 end
177 object TempoBPMLabel: TLabel
178 Left = 192
179 Height = 15
180 Top = 96
181 Width = 89
182 Caption = 'TempoBPMLabel'
183 ParentColor = False
184 end
144 end 185 end
145 end 186 end
146 object PatternTabSheet: TTabSheet 187 object PatternTabSheet: TTabSheet
@@ -166,33 +207,33 @@ object frmTracker: TfrmTracker
166 Width = 886 207 Width = 886
167 DragReorder = False 208 DragReorder = False
168 Images = ImageList2 209 Images = ImageList2
169 Sections = < 210 Sections = <
170 item 211 item
171 Alignment = taLeftJustify 212 Alignment = taLeftJustify
172 Width = 32 213 Width = 32
173 Visible = True 214 Visible = True
174 end 215 end
175 item 216 item
176 Alignment = taCenter 217 Alignment = taCenter
177 ImageIndex = 1 218 ImageIndex = 1
178 Text = 'Duty 1' 219 Text = 'Duty 1'
179 Width = 133 220 Width = 133
180 Visible = True 221 Visible = True
181 end 222 end
182 item 223 item
183 Alignment = taCenter 224 Alignment = taCenter
184 ImageIndex = 1 225 ImageIndex = 1
185 Text = 'Duty 2' 226 Text = 'Duty 2'
186 Width = 133 227 Width = 133
187 Visible = True 228 Visible = True
188 end 229 end
189 item 230 item
190 Alignment = taCenter 231 Alignment = taCenter
191 ImageIndex = 1 232 ImageIndex = 1
192 Text = 'Wave' 233 Text = 'Wave'
193 Width = 133 234 Width = 133
194 Visible = True 235 Visible = True
195 end 236 end
196 item 237 item
197 Alignment = taCenter 238 Alignment = taCenter
198 ImageIndex = 1 239 ImageIndex = 1
@@ -252,28 +293,28 @@ object frmTracker: TfrmTracker
252 Align = alLeft 293 Align = alLeft
253 AutoEdit = False 294 AutoEdit = False
254 AutoFillColumns = True 295 AutoFillColumns = True
255 Columns = < 296 Columns = <
256 item 297 item
257 Alignment = taCenter 298 Alignment = taCenter
258 MinSize = 33 299 MinSize = 33
259 MaxSize = 33 300 MaxSize = 33
260 Title.Caption = 'Dty1' 301 Title.Caption = 'Dty1'
261 Width = 34 302 Width = 34
262 end 303 end
263 item 304 item
264 Alignment = taCenter 305 Alignment = taCenter
265 MinSize = 33 306 MinSize = 33
266 MaxSize = 33 307 MaxSize = 33
267 Title.Caption = 'Dty2' 308 Title.Caption = 'Dty2'
268 Width = 34 309 Width = 34
269 end 310 end
270 item 311 item
271 Alignment = taCenter 312 Alignment = taCenter
272 MinSize = 33 313 MinSize = 33
273 MaxSize = 33 314 MaxSize = 33
274 Title.Caption = 'Wav' 315 Title.Caption = 'Wav'
275 Width = 34 316 Width = 34
276 end 317 end
277 item 318 item
278 Alignment = taCenter 319 Alignment = taCenter
279 MinSize = 33 320 MinSize = 33
@@ -322,27 +363,27 @@ object frmTracker: TfrmTracker
322 Align = alClient 363 Align = alClient
323 AutoSize = True 364 AutoSize = True
324 BevelOuter = bvNone 365 BevelOuter = bvNone
325 ControlList = < 366 ControlList = <
326 item 367 item
327 Control = InstrumentGroupBox 368 Control = InstrumentGroupBox
328 WrapAfter = waAuto 369 WrapAfter = waAuto
329 Index = 0 370 Index = 0
330 end 371 end
331 item 372 item
332 Control = EnvelopeGroupBox 373 Control = EnvelopeGroupBox
333 WrapAfter = waAuto 374 WrapAfter = waAuto
334 Index = 1 375 Index = 1
335 end 376 end
336 item 377 item
337 Control = SquareGroupBox 378 Control = SquareGroupBox
338 WrapAfter = waAuto 379 WrapAfter = waAuto
339 Index = 2 380 Index = 2
340 end 381 end
341 item 382 item
342 Control = WaveGroupBox 383 Control = WaveGroupBox
343 WrapAfter = waAuto 384 WrapAfter = waAuto
344 Index = 3 385 Index = 3
345 end 386 end
346 item 387 item
347 Control = NoiseGroupBox 388 Control = NoiseGroupBox
348 WrapAfter = waAuto 389 WrapAfter = waAuto
@@ -386,6 +427,7 @@ object frmTracker: TfrmTracker
386 Top = 46 427 Top = 46
387 Width = 58 428 Width = 58
388 Caption = 'Instrument' 429 Caption = 'Instrument'
430 ParentColor = False
389 ParentFont = False 431 ParentFont = False
390 end 432 end
391 object Label2: TLabel 433 object Label2: TLabel
@@ -394,6 +436,7 @@ object frmTracker: TfrmTracker
394 Top = 78 436 Top = 78
395 Width = 32 437 Width = 32
396 Caption = 'Name' 438 Caption = 'Name'
439 ParentColor = False
397 ParentFont = False 440 ParentFont = False
398 end 441 end
399 object InstrumentNameEdit: TEdit 442 object InstrumentNameEdit: TEdit
@@ -414,6 +457,7 @@ object frmTracker: TfrmTracker
414 Width = 44 457 Width = 44
415 Caption = 'Channel' 458 Caption = 'Channel'
416 Font.Style = [fsBold] 459 Font.Style = [fsBold]
460 ParentColor = False
417 ParentFont = False 461 ParentFont = False
418 end 462 end
419 object InstrumentTypeCombobox: TComboBox 463 object InstrumentTypeCombobox: TComboBox
@@ -498,6 +542,7 @@ object frmTracker: TfrmTracker
498 Top = 152 542 Top = 152
499 Width = 61 543 Width = 61
500 Caption = 'Test octave:' 544 Caption = 'Test octave:'
545 ParentColor = False
501 ParentFont = False 546 ParentFont = False
502 end 547 end
503 object TestOctave5Button1: TButton 548 object TestOctave5Button1: TButton
@@ -591,6 +636,7 @@ object frmTracker: TfrmTracker
591 Top = 16 636 Top = 16
592 Width = 46 637 Width = 46
593 Caption = 'Start vol.' 638 Caption = 'Start vol.'
639 ParentColor = False
594 ParentFont = False 640 ParentFont = False
595 end 641 end
596 object Label5: TLabel 642 object Label5: TLabel
@@ -599,6 +645,7 @@ object frmTracker: TfrmTracker
599 Top = 54 645 Top = 54
600 Width = 48 646 Width = 48
601 Caption = 'Direction' 647 Caption = 'Direction'
648 ParentColor = False
602 ParentFont = False 649 ParentFont = False
603 end 650 end
604 object DirectionComboBox: TComboBox 651 object DirectionComboBox: TComboBox
@@ -625,6 +672,7 @@ object frmTracker: TfrmTracker
625 Top = 90 672 Top = 90
626 Width = 41 673 Width = 41
627 Caption = 'Change' 674 Caption = 'Change'
675 ParentColor = False
628 ParentFont = False 676 ParentFont = False
629 end 677 end
630 object Panel5: TPanel 678 object Panel5: TPanel
@@ -692,6 +740,7 @@ object frmTracker: TfrmTracker
692 Top = 16 740 Top = 16
693 Width = 61 741 Width = 61
694 Caption = 'Sweep time' 742 Caption = 'Sweep time'
743 ParentColor = False
695 ParentFont = False 744 ParentFont = False
696 end 745 end
697 object SweepTimeCombobox: TComboBox 746 object SweepTimeCombobox: TComboBox
@@ -746,6 +795,7 @@ object frmTracker: TfrmTracker
746 Top = 48 795 Top = 48
747 Width = 84 796 Width = 84
748 Caption = 'Sweep direction' 797 Caption = 'Sweep direction'
798 ParentColor = False
749 ParentFont = False 799 ParentFont = False
750 end 800 end
751 object Label9: TLabel 801 object Label9: TLabel
@@ -754,6 +804,7 @@ object frmTracker: TfrmTracker
754 Top = 88 804 Top = 88
755 Width = 56 805 Width = 56
756 Caption = 'Sweep size' 806 Caption = 'Sweep size'
807 ParentColor = False
757 ParentFont = False 808 ParentFont = False
758 end 809 end
759 object Label10: TLabel 810 object Label10: TLabel
@@ -762,6 +813,7 @@ object frmTracker: TfrmTracker
762 Top = 120 813 Top = 120
763 Width = 25 814 Width = 25
764 Caption = 'Duty' 815 Caption = 'Duty'
816 ParentColor = False
765 ParentFont = False 817 ParentFont = False
766 end 818 end
767 object DutyCombobox: TComboBox 819 object DutyCombobox: TComboBox
@@ -819,6 +871,7 @@ object frmTracker: TfrmTracker
819 Top = 16 871 Top = 16
820 Width = 40 872 Width = 40
821 Caption = 'Volume' 873 Caption = 'Volume'
874 ParentColor = False
822 ParentFont = False 875 ParentFont = False
823 end 876 end
824 object Label12: TLabel 877 object Label12: TLabel
@@ -827,6 +880,7 @@ object frmTracker: TfrmTracker
827 Top = 48 880 Top = 48
828 Width = 55 881 Width = 55
829 Caption = 'Waveform' 882 Caption = 'Waveform'
883 ParentColor = False
830 ParentFont = False 884 ParentFont = False
831 end 885 end
832 object WaveformCombobox: TComboBox 886 object WaveformCombobox: TComboBox
@@ -1022,6 +1076,7 @@ object frmTracker: TfrmTracker
1022 Top = 16 1076 Top = 16
1023 Width = 29 1077 Width = 29
1024 Caption = 'Wave' 1078 Caption = 'Wave'
1079 ParentColor = False
1025 ParentFont = False 1080 ParentFont = False
1026 end 1081 end
1027 object WaveEditNumberSpinner: TSpinEdit 1082 object WaveEditNumberSpinner: TSpinEdit
@@ -1073,6 +1128,7 @@ object frmTracker: TfrmTracker
1073 Top = 16 1128 Top = 16
1074 Width = 100 1129 Width = 100
1075 Caption = 'Hex representation' 1130 Caption = 'Hex representation'
1131 ParentColor = False
1076 ParentFont = False 1132 ParentFont = False
1077 end 1133 end
1078 object PlayWaveWhileDrawingCheckbox: TCheckBox 1134 object PlayWaveWhileDrawingCheckbox: TCheckBox
@@ -1113,6 +1169,7 @@ object frmTracker: TfrmTracker
1113 Top = 8 1169 Top = 8
1114 Width = 333 1170 Width = 333
1115 Caption = 'This is an area to write comments for anyone editing your tune.' 1171 Caption = 'This is an area to write comments for anyone editing your tune.'
1172 ParentColor = False
1116 ParentFont = False 1173 ParentFont = False
1117 end 1174 end
1118 end 1175 end
@@ -1144,423 +1201,423 @@ object frmTracker: TfrmTracker
1144 RightGutter.MouseActions = <> 1201 RightGutter.MouseActions = <>
1145 Highlighter = SynAnySyn1 1202 Highlighter = SynAnySyn1
1146 InsertCaret = ctBlock 1203 InsertCaret = ctBlock
1147 Keystrokes = < 1204 Keystrokes = <
1148 item 1205 item
1149 Command = ecUp 1206 Command = ecUp
1150 ShortCut = 38 1207 ShortCut = 38
1151 end 1208 end
1152 item 1209 item
1153 Command = ecSelUp 1210 Command = ecSelUp
1154 ShortCut = 8230 1211 ShortCut = 8230
1155 end 1212 end
1156 item 1213 item
1157 Command = ecScrollUp 1214 Command = ecScrollUp
1158 ShortCut = 16422 1215 ShortCut = 16422
1159 end 1216 end
1160 item 1217 item
1161 Command = ecDown 1218 Command = ecDown
1162 ShortCut = 40 1219 ShortCut = 40
1163 end 1220 end
1164 item 1221 item
1165 Command = ecSelDown 1222 Command = ecSelDown
1166 ShortCut = 8232 1223 ShortCut = 8232
1167 end 1224 end
1168 item 1225 item
1169 Command = ecScrollDown 1226 Command = ecScrollDown
1170 ShortCut = 16424 1227 ShortCut = 16424
1171 end 1228 end
1172 item 1229 item
1173 Command = ecLeft 1230 Command = ecLeft
1174 ShortCut = 37 1231 ShortCut = 37
1175 end 1232 end
1176 item 1233 item
1177 Command = ecSelLeft 1234 Command = ecSelLeft
1178 ShortCut = 8229 1235 ShortCut = 8229
1179 end 1236 end
1180 item 1237 item
1181 Command = ecWordLeft 1238 Command = ecWordLeft
1182 ShortCut = 16421 1239 ShortCut = 16421
1183 end 1240 end
1184 item 1241 item
1185 Command = ecSelWordLeft 1242 Command = ecSelWordLeft
1186 ShortCut = 24613 1243 ShortCut = 24613
1187 end 1244 end
1188 item 1245 item
1189 Command = ecRight 1246 Command = ecRight
1190 ShortCut = 39 1247 ShortCut = 39
1191 end 1248 end
1192 item 1249 item
1193 Command = ecSelRight 1250 Command = ecSelRight
1194 ShortCut = 8231 1251 ShortCut = 8231
1195 end 1252 end
1196 item 1253 item
1197 Command = ecWordRight 1254 Command = ecWordRight
1198 ShortCut = 16423 1255 ShortCut = 16423
1199 end 1256 end
1200 item 1257 item
1201 Command = ecSelWordRight 1258 Command = ecSelWordRight
1202 ShortCut = 24615 1259 ShortCut = 24615
1203 end 1260 end
1204 item 1261 item
1205 Command = ecPageDown 1262 Command = ecPageDown
1206 ShortCut = 34 1263 ShortCut = 34
1207 end 1264 end
1208 item 1265 item
1209 Command = ecSelPageDown 1266 Command = ecSelPageDown
1210 ShortCut = 8226 1267 ShortCut = 8226
1211 end 1268 end
1212 item 1269 item
1213 Command = ecPageBottom 1270 Command = ecPageBottom
1214 ShortCut = 16418 1271 ShortCut = 16418
1215 end 1272 end
1216 item 1273 item
1217 Command = ecSelPageBottom 1274 Command = ecSelPageBottom
1218 ShortCut = 24610 1275 ShortCut = 24610
1219 end 1276 end
1220 item 1277 item
1221 Command = ecPageUp 1278 Command = ecPageUp
1222 ShortCut = 33 1279 ShortCut = 33
1223 end 1280 end
1224 item 1281 item
1225 Command = ecSelPageUp 1282 Command = ecSelPageUp
1226 ShortCut = 8225 1283 ShortCut = 8225
1227 end 1284 end
1228 item 1285 item
1229 Command = ecPageTop 1286 Command = ecPageTop
1230 ShortCut = 16417 1287 ShortCut = 16417
1231 end 1288 end
1232 item 1289 item
1233 Command = ecSelPageTop 1290 Command = ecSelPageTop
1234 ShortCut = 24609 1291 ShortCut = 24609
1235 end 1292 end
1236 item 1293 item
1237 Command = ecLineStart 1294 Command = ecLineStart
1238 ShortCut = 36 1295 ShortCut = 36
1239 end 1296 end
1240 item 1297 item
1241 Command = ecSelLineStart 1298 Command = ecSelLineStart
1242 ShortCut = 8228 1299 ShortCut = 8228
1243 end 1300 end
1244 item 1301 item
1245 Command = ecEditorTop 1302 Command = ecEditorTop
1246 ShortCut = 16420 1303 ShortCut = 16420
1247 end 1304 end
1248 item 1305 item
1249 Command = ecSelEditorTop 1306 Command = ecSelEditorTop
1250 ShortCut = 24612 1307 ShortCut = 24612
1251 end 1308 end
1252 item 1309 item
1253 Command = ecLineEnd 1310 Command = ecLineEnd
1254 ShortCut = 35 1311 ShortCut = 35
1255 end 1312 end
1256 item 1313 item
1257 Command = ecSelLineEnd 1314 Command = ecSelLineEnd
1258 ShortCut = 8227 1315 ShortCut = 8227
1259 end 1316 end
1260 item 1317 item
1261 Command = ecEditorBottom 1318 Command = ecEditorBottom
1262 ShortCut = 16419 1319 ShortCut = 16419
1263 end 1320 end
1264 item 1321 item
1265 Command = ecSelEditorBottom 1322 Command = ecSelEditorBottom
1266 ShortCut = 24611 1323 ShortCut = 24611
1267 end 1324 end
1268 item 1325 item
1269 Command = ecToggleMode 1326 Command = ecToggleMode
1270 ShortCut = 45 1327 ShortCut = 45
1271 end 1328 end
1272 item 1329 item
1273 Command = ecCopy 1330 Command = ecCopy
1274 ShortCut = 16429 1331 ShortCut = 16429
1275 end 1332 end
1276 item 1333 item
1277 Command = ecPaste 1334 Command = ecPaste
1278 ShortCut = 8237 1335 ShortCut = 8237
1279 end 1336 end
1280 item 1337 item
1281 Command = ecDeleteChar 1338 Command = ecDeleteChar
1282 ShortCut = 46 1339 ShortCut = 46
1283 end 1340 end
1284 item 1341 item
1285 Command = ecCut 1342 Command = ecCut
1286 ShortCut = 8238 1343 ShortCut = 8238
1287 end 1344 end
1288 item 1345 item
1289 Command = ecDeleteLastChar 1346 Command = ecDeleteLastChar
1290 ShortCut = 8 1347 ShortCut = 8
1291 end 1348 end
1292 item 1349 item
1293 Command = ecDeleteLastChar 1350 Command = ecDeleteLastChar
1294 ShortCut = 8200 1351 ShortCut = 8200
1295 end 1352 end
1296 item 1353 item
1297 Command = ecDeleteLastWord 1354 Command = ecDeleteLastWord
1298 ShortCut = 16392 1355 ShortCut = 16392
1299 end 1356 end
1300 item 1357 item
1301 Command = ecUndo 1358 Command = ecUndo
1302 ShortCut = 32776 1359 ShortCut = 32776
1303 end 1360 end
1304 item 1361 item
1305 Command = ecRedo 1362 Command = ecRedo
1306 ShortCut = 40968 1363 ShortCut = 40968
1307 end 1364 end
1308 item 1365 item
1309 Command = ecLineBreak 1366 Command = ecLineBreak
1310 ShortCut = 13 1367 ShortCut = 13
1311 end 1368 end
1312 item 1369 item
1313 Command = ecSelectAll 1370 Command = ecSelectAll
1314 ShortCut = 16449 1371 ShortCut = 16449
1315 end 1372 end
1316 item 1373 item
1317 Command = ecCopy 1374 Command = ecCopy
1318 ShortCut = 16451 1375 ShortCut = 16451
1319 end 1376 end
1320 item 1377 item
1321 Command = ecBlockIndent 1378 Command = ecBlockIndent
1322 ShortCut = 24649 1379 ShortCut = 24649
1323 end 1380 end
1324 item 1381 item
1325 Command = ecLineBreak 1382 Command = ecLineBreak
1326 ShortCut = 16461 1383 ShortCut = 16461
1327 end 1384 end
1328 item 1385 item
1329 Command = ecInsertLine 1386 Command = ecInsertLine
1330 ShortCut = 16462 1387 ShortCut = 16462
1331 end 1388 end
1332 item 1389 item
1333 Command = ecDeleteWord 1390 Command = ecDeleteWord
1334 ShortCut = 16468 1391 ShortCut = 16468
1335 end 1392 end
1336 item 1393 item
1337 Command = ecBlockUnindent 1394 Command = ecBlockUnindent
1338 ShortCut = 24661 1395 ShortCut = 24661
1339 end 1396 end
1340 item 1397 item
1341 Command = ecPaste 1398 Command = ecPaste
1342 ShortCut = 16470 1399 ShortCut = 16470
1343 end 1400 end
1344 item 1401 item
1345 Command = ecCut 1402 Command = ecCut
1346 ShortCut = 16472 1403 ShortCut = 16472
1347 end 1404 end
1348 item 1405 item
1349 Command = ecDeleteLine 1406 Command = ecDeleteLine
1350 ShortCut = 16473 1407 ShortCut = 16473
1351 end 1408 end
1352 item 1409 item
1353 Command = ecDeleteEOL 1410 Command = ecDeleteEOL
1354 ShortCut = 24665 1411 ShortCut = 24665
1355 end 1412 end
1356 item 1413 item
1357 Command = ecUndo 1414 Command = ecUndo
1358 ShortCut = 16474 1415 ShortCut = 16474
1359 end 1416 end
1360 item 1417 item
1361 Command = ecRedo 1418 Command = ecRedo
1362 ShortCut = 24666 1419 ShortCut = 24666
1363 end 1420 end
1364 item 1421 item
1365 Command = ecGotoMarker0 1422 Command = ecGotoMarker0
1366 ShortCut = 16432 1423 ShortCut = 16432
1367 end 1424 end
1368 item 1425 item
1369 Command = ecGotoMarker1 1426 Command = ecGotoMarker1
1370 ShortCut = 16433 1427 ShortCut = 16433
1371 end 1428 end
1372 item 1429 item
1373 Command = ecGotoMarker2 1430 Command = ecGotoMarker2
1374 ShortCut = 16434 1431 ShortCut = 16434
1375 end 1432 end
1376 item 1433 item
1377 Command = ecGotoMarker3 1434 Command = ecGotoMarker3
1378 ShortCut = 16435 1435 ShortCut = 16435
1379 end 1436 end
1380 item 1437 item
1381 Command = ecGotoMarker4 1438 Command = ecGotoMarker4
1382 ShortCut = 16436 1439 ShortCut = 16436
1383 end 1440 end
1384 item 1441 item
1385 Command = ecGotoMarker5 1442 Command = ecGotoMarker5
1386 ShortCut = 16437 1443 ShortCut = 16437
1387 end 1444 end
1388 item 1445 item
1389 Command = ecGotoMarker6 1446 Command = ecGotoMarker6
1390 ShortCut = 16438 1447 ShortCut = 16438
1391 end 1448 end
1392 item 1449 item
1393 Command = ecGotoMarker7 1450 Command = ecGotoMarker7
1394 ShortCut = 16439 1451 ShortCut = 16439
1395 end 1452 end
1396 item 1453 item
1397 Command = ecGotoMarker8 1454 Command = ecGotoMarker8
1398 ShortCut = 16440 1455 ShortCut = 16440
1399 end 1456 end
1400 item 1457 item
1401 Command = ecGotoMarker9 1458 Command = ecGotoMarker9
1402 ShortCut = 16441 1459 ShortCut = 16441
1403 end 1460 end
1404 item 1461 item
1405 Command = ecSetMarker0 1462 Command = ecSetMarker0
1406 ShortCut = 24624 1463 ShortCut = 24624
1407 end 1464 end
1408 item 1465 item
1409 Command = ecSetMarker1 1466 Command = ecSetMarker1
1410 ShortCut = 24625 1467 ShortCut = 24625
1411 end 1468 end
1412 item 1469 item
1413 Command = ecSetMarker2 1470 Command = ecSetMarker2
1414 ShortCut = 24626 1471 ShortCut = 24626
1415 end 1472 end
1416 item 1473 item
1417 Command = ecSetMarker3 1474 Command = ecSetMarker3
1418 ShortCut = 24627 1475 ShortCut = 24627
1419 end 1476 end
1420 item 1477 item
1421 Command = ecSetMarker4 1478 Command = ecSetMarker4
1422 ShortCut = 24628 1479 ShortCut = 24628
1423 end 1480 end
1424 item 1481 item
1425 Command = ecSetMarker5 1482 Command = ecSetMarker5
1426 ShortCut = 24629 1483 ShortCut = 24629
1427 end 1484 end
1428 item 1485 item
1429 Command = ecSetMarker6 1486 Command = ecSetMarker6
1430 ShortCut = 24630 1487 ShortCut = 24630
1431 end 1488 end
1432 item 1489 item
1433 Command = ecSetMarker7 1490 Command = ecSetMarker7
1434 ShortCut = 24631 1491 ShortCut = 24631
1435 end 1492 end
1436 item 1493 item
1437 Command = ecSetMarker8 1494 Command = ecSetMarker8
1438 ShortCut = 24632 1495 ShortCut = 24632
1439 end 1496 end
1440 item 1497 item
1441 Command = ecSetMarker9 1498 Command = ecSetMarker9
1442 ShortCut = 24633 1499 ShortCut = 24633
1443 end 1500 end
1444 item 1501 item
1445 Command = EcFoldLevel1 1502 Command = EcFoldLevel1
1446 ShortCut = 41009 1503 ShortCut = 41009
1447 end 1504 end
1448 item 1505 item
1449 Command = EcFoldLevel2 1506 Command = EcFoldLevel2
1450 ShortCut = 41010 1507 ShortCut = 41010
1451 end 1508 end
1452 item 1509 item
1453 Command = EcFoldLevel3 1510 Command = EcFoldLevel3
1454 ShortCut = 41011 1511 ShortCut = 41011
1455 end 1512 end
1456 item 1513 item
1457 Command = EcFoldLevel4 1514 Command = EcFoldLevel4
1458 ShortCut = 41012 1515 ShortCut = 41012
1459 end 1516 end
1460 item 1517 item
1461 Command = EcFoldLevel5 1518 Command = EcFoldLevel5
1462 ShortCut = 41013 1519 ShortCut = 41013
1463 end 1520 end
1464 item 1521 item
1465 Command = EcFoldLevel6 1522 Command = EcFoldLevel6
1466 ShortCut = 41014 1523 ShortCut = 41014
1467 end 1524 end
1468 item 1525 item
1469 Command = EcFoldLevel7 1526 Command = EcFoldLevel7
1470 ShortCut = 41015 1527 ShortCut = 41015
1471 end 1528 end
1472 item 1529 item
1473 Command = EcFoldLevel8 1530 Command = EcFoldLevel8
1474 ShortCut = 41016 1531 ShortCut = 41016
1475 end 1532 end
1476 item 1533 item
1477 Command = EcFoldLevel9 1534 Command = EcFoldLevel9
1478 ShortCut = 41017 1535 ShortCut = 41017
1479 end 1536 end
1480 item 1537 item
1481 Command = EcFoldLevel0 1538 Command = EcFoldLevel0
1482 ShortCut = 41008 1539 ShortCut = 41008
1483 end 1540 end
1484 item 1541 item
1485 Command = EcFoldCurrent 1542 Command = EcFoldCurrent
1486 ShortCut = 41005 1543 ShortCut = 41005
1487 end 1544 end
1488 item 1545 item
1489 Command = EcUnFoldCurrent 1546 Command = EcUnFoldCurrent
1490 ShortCut = 41003 1547 ShortCut = 41003
1491 end 1548 end
1492 item 1549 item
1493 Command = EcToggleMarkupWord 1550 Command = EcToggleMarkupWord
1494 ShortCut = 32845 1551 ShortCut = 32845
1495 end 1552 end
1496 item 1553 item
1497 Command = ecNormalSelect 1554 Command = ecNormalSelect
1498 ShortCut = 24654 1555 ShortCut = 24654
1499 end 1556 end
1500 item 1557 item
1501 Command = ecColumnSelect 1558 Command = ecColumnSelect
1502 ShortCut = 24643 1559 ShortCut = 24643
1503 end 1560 end
1504 item 1561 item
1505 Command = ecLineSelect 1562 Command = ecLineSelect
1506 ShortCut = 24652 1563 ShortCut = 24652
1507 end 1564 end
1508 item 1565 item
1509 Command = ecTab 1566 Command = ecTab
1510 ShortCut = 9 1567 ShortCut = 9
1511 end 1568 end
1512 item 1569 item
1513 Command = ecShiftTab 1570 Command = ecShiftTab
1514 ShortCut = 8201 1571 ShortCut = 8201
1515 end 1572 end
1516 item 1573 item
1517 Command = ecMatchBracket 1574 Command = ecMatchBracket
1518 ShortCut = 24642 1575 ShortCut = 24642
1519 end 1576 end
1520 item 1577 item
1521 Command = ecColSelUp 1578 Command = ecColSelUp
1522 ShortCut = 40998 1579 ShortCut = 40998
1523 end 1580 end
1524 item 1581 item
1525 Command = ecColSelDown 1582 Command = ecColSelDown
1526 ShortCut = 41000 1583 ShortCut = 41000
1527 end 1584 end
1528 item 1585 item
1529 Command = ecColSelLeft 1586 Command = ecColSelLeft
1530 ShortCut = 40997 1587 ShortCut = 40997
1531 end 1588 end
1532 item 1589 item
1533 Command = ecColSelRight 1590 Command = ecColSelRight
1534 ShortCut = 40999 1591 ShortCut = 40999
1535 end 1592 end
1536 item 1593 item
1537 Command = ecColSelPageDown 1594 Command = ecColSelPageDown
1538 ShortCut = 40994 1595 ShortCut = 40994
1539 end 1596 end
1540 item 1597 item
1541 Command = ecColSelPageBottom 1598 Command = ecColSelPageBottom
1542 ShortCut = 57378 1599 ShortCut = 57378
1543 end 1600 end
1544 item 1601 item
1545 Command = ecColSelPageUp 1602 Command = ecColSelPageUp
1546 ShortCut = 40993 1603 ShortCut = 40993
1547 end 1604 end
1548 item 1605 item
1549 Command = ecColSelPageTop 1606 Command = ecColSelPageTop
1550 ShortCut = 57377 1607 ShortCut = 57377
1551 end 1608 end
1552 item 1609 item
1553 Command = ecColSelLineStart 1610 Command = ecColSelLineStart
1554 ShortCut = 40996 1611 ShortCut = 40996
1555 end 1612 end
1556 item 1613 item
1557 Command = ecColSelLineEnd 1614 Command = ecColSelLineEnd
1558 ShortCut = 40995 1615 ShortCut = 40995
1559 end 1616 end
1560 item 1617 item
1561 Command = ecColSelEditorTop 1618 Command = ecColSelEditorTop
1562 ShortCut = 57380 1619 ShortCut = 57380
1563 end 1620 end
1564 item 1621 item
1565 Command = ecColSelEditorBottom 1622 Command = ecColSelEditorBottom
1566 ShortCut = 57379 1623 ShortCut = 57379
@@ -1632,6 +1689,7 @@ object frmTracker: TfrmTracker
1632 Top = 16 1689 Top = 16
1633 Width = 41 1690 Width = 41
1634 Caption = 'Routine' 1691 Caption = 'Routine'
1692 ParentColor = False
1635 ParentFont = False 1693 ParentFont = False
1636 end 1694 end
1637 object RoutineNumberSpinner: TSpinEdit 1695 object RoutineNumberSpinner: TSpinEdit
@@ -1651,6 +1709,7 @@ object frmTracker: TfrmTracker
1651 Top = 40 1709 Top = 40
1652 Width = 506 1710 Width = 506
1653 Caption = 'Routines are an advanced feature of hUGETracker, and you likely won''t need them at all'#13#10'if you are only interested in composing music. If you want to create a custom effect, or interface'#13#10'with game code that you''re writing a soundtrack for, then routines will come in handy.'#13#10#13#10'Refer to the user manual for more information!' 1711 Caption = 'Routines are an advanced feature of hUGETracker, and you likely won''t need them at all'#13#10'if you are only interested in composing music. If you want to create a custom effect, or interface'#13#10'with game code that you''re writing a soundtrack for, then routines will come in handy.'#13#10#13#10'Refer to the user manual for more information!'
1712 ParentColor = False
1654 ParentFont = False 1713 ParentFont = False
1655 end 1714 end
1656 end 1715 end
@@ -1760,13 +1819,13 @@ object frmTracker: TfrmTracker
1760 Top = 814 1819 Top = 814
1761 Width = 1318 1820 Width = 1318
1762 AutoHint = True 1821 AutoHint = True
1763 Panels = < 1822 Panels = <
1764 item 1823 item
1765 Width = 467 1824 Width = 467
1766 end 1825 end
1767 item 1826 item
1768 Width = 200 1827 Width = 200
1769 end 1828 end
1770 item 1829 item
1771 Width = 200 1830 Width = 200
1772 end> 1831 end>
@@ -1872,6 +1931,7 @@ object frmTracker: TfrmTracker
1872 AutoSize = False 1931 AutoSize = False
1873 Caption = 'Octave ' 1932 Caption = 'Octave '
1874 Layout = tlCenter 1933 Layout = tlCenter
1934 ParentColor = False
1875 ParentFont = False 1935 ParentFont = False
1876 end 1936 end
1877 object Label23: TLabel 1937 object Label23: TLabel
@@ -1882,6 +1942,7 @@ object frmTracker: TfrmTracker
1882 AutoSize = False 1942 AutoSize = False
1883 Caption = ' Instrument ' 1943 Caption = ' Instrument '
1884 Layout = tlCenter 1944 Layout = tlCenter
1945 ParentColor = False
1885 ParentFont = False 1946 ParentFont = False
1886 end 1947 end
1887 object InstrumentComboBox: TComboBox 1948 object InstrumentComboBox: TComboBox
@@ -1910,6 +1971,7 @@ object frmTracker: TfrmTracker
1910 AutoSize = False 1971 AutoSize = False
1911 Caption = ' Step ' 1972 Caption = ' Step '
1912 Layout = tlCenter 1973 Layout = tlCenter
1974 ParentColor = False
1913 ParentFont = False 1975 ParentFont = False
1914 end 1976 end
1915 object StepSpinEdit: TSpinEdit 1977 object StepSpinEdit: TSpinEdit
Modifiedtracker.pas +45−0
@@ -42,8 +42,12 @@ type
42 { TfrmTracker } 42 { TfrmTracker }
43 43
44 TfrmTracker = class(TForm) 44 TfrmTracker = class(TForm)
45 TempoBPMLabel: TLabel;
46 TimerEnabledCheckBox: TCheckBox;
45 EnableSubpatternCheckbox: TCheckBox; 47 EnableSubpatternCheckbox: TCheckBox;
46 DecreaseOctaveAction: TAction; 48 DecreaseOctaveAction: TAction;
49 TimerTempoLabel: TLabel;
50 TimerDividerSpinEdit: TSpinEdit;
47 SubpatternGroupBox: TGroupBox; 51 SubpatternGroupBox: TGroupBox;
48 RowNumberStringGrid1: TStringGrid; 52 RowNumberStringGrid1: TStringGrid;
49 ScrollBox2: TScrollBox; 53 ScrollBox2: TScrollBox;
@@ -283,6 +287,8 @@ type
283 TreeView1: TTreeView; 287 TreeView1: TTreeView;
284 TrackerGrid: TTrackerGrid; 288 TrackerGrid: TTrackerGrid;
285 TableGrid: TTableGrid; 289 TableGrid: TTableGrid;
290 procedure TimerDividerSpinEditChange(Sender: TObject);
291 procedure TimerEnabledCheckBoxChange(Sender: TObject);
286 procedure TrackerPopupMixPasteClick(Sender: TObject); 292 procedure TrackerPopupMixPasteClick(Sender: TObject);
287 procedure EnableSubpatternCheckboxChange(Sender: TObject); 293 procedure EnableSubpatternCheckboxChange(Sender: TObject);
288 procedure FormShow(Sender: TObject); 294 procedure FormShow(Sender: TObject);
@@ -497,6 +503,8 @@ type
497 procedure UpdateUIAfterLoad(FileName: String = ''); 503 procedure UpdateUIAfterLoad(FileName: String = '');
498 procedure UpdateWindowTitle; 504 procedure UpdateWindowTitle;
499 procedure UpdateHexWaveTextbox; 505 procedure UpdateHexWaveTextbox;
506 procedure UpdateBPMLabel;
507
500 function CheckUnsavedChanges: Boolean; 508 function CheckUnsavedChanges: Boolean;
501 509
502 procedure DrawWaveform(PB: TPaintBox; Wave: TWave); 510 procedure DrawWaveform(PB: TPaintBox; Wave: TWave);
@@ -559,6 +567,13 @@ begin
559 CommentMemo.Text := Song.Comment; 567 CommentMemo.Text := Song.Comment;
560 568
561 TicksPerRowSpinEdit.Value := Song.TicksPerRow; 569 TicksPerRowSpinEdit.Value := Song.TicksPerRow;
570 TimerDividerSpinEdit.Value := Song.TimerDivider;
571 TimerEnabledCheckBox.Checked := Song.TimerEnabled;
572
573 TimerTempoLabel.Enabled := TimerEnabledCheckBox.Checked;
574 TimerDividerSpinEdit.Enabled := TimerEnabledCheckBox.Checked;
575
576 UpdateBPMLabel;
562 577
563 LoadedFilename := FileName; 578 LoadedFilename := FileName;
564 UpdateWindowTitle; 579 UpdateWindowTitle;
@@ -620,6 +635,20 @@ begin
620 HexWaveEdit.Text := ConvertWaveToHexString(WaveEditNumberSpinner.Value); 635 HexWaveEdit.Text := ConvertWaveToHexString(WaveEditNumberSpinner.Value);
621 end; 636 end;
622 637
638 procedure TfrmTracker.UpdateBPMLabel;
639 var
640 TimerHZ: Real;
641 BeatHZ: Real;
642 begin
643 if Song.TimerEnabled then
644 TimerHZ := 4096.0 / (($FF - Song.TimerDivider)+1)
645 else
646 TimerHZ := 59.727500569606; // VBlank hz
647
648 BeatHZ := (TimerHZ / Song.TicksPerRow) / 4; // 4 rows comprise one beat
649 TempoBPMLabel.Caption := '~'+FormatFloat('###.##', BeatHZ * 60)+' BPM';
650 end;
651
623 function TfrmTracker.CheckUnsavedChanges: Boolean; 652 function TfrmTracker.CheckUnsavedChanges: Boolean;
624 begin 653 begin
625 Result := True; 654 Result := True;
@@ -1970,6 +1999,21 @@ begin
1970 TrackerGrid.DoMixPaste 1999 TrackerGrid.DoMixPaste
1971 end; 2000 end;
1972 2001
2002 procedure TfrmTracker.TimerDividerSpinEditChange(Sender: TObject);
2003 begin
2004 Song.TimerDivider := TimerDividerSpinEdit.Value;
2005 UpdateBPMLabel
2006 end;
2007
2008 procedure TfrmTracker.TimerEnabledCheckBoxChange(Sender: TObject);
2009 begin
2010 Song.TimerEnabled := TimerEnabledCheckBox.Checked;
2011 TimerTempoLabel.Enabled := TimerEnabledCheckBox.Checked;
2012 TimerDividerSpinEdit.Enabled := TimerEnabledCheckBox.Checked;
2013
2014 UpdateBPMLabel
2015 end;
2016
1973 procedure TfrmTracker.FormShow(Sender: TObject); 2017 procedure TfrmTracker.FormShow(Sender: TObject);
1974 begin 2018 begin
1975 { HACK: This needs to be done due to a scaling bug in the LCL. 2019 { HACK: This needs to be done due to a scaling bug in the LCL.
@@ -2405,6 +2449,7 @@ end;
2405 procedure TfrmTracker.TicksPerRowSpinEditChange(Sender: TObject); 2449 procedure TfrmTracker.TicksPerRowSpinEditChange(Sender: TObject);
2406 begin 2450 begin
2407 Song.TicksPerRow := TicksPerRowSpinEdit.Value; 2451 Song.TicksPerRow := TicksPerRowSpinEdit.Value;
2452 UpdateBPMLabel
2408 end; 2453 end;
2409 2454
2410 procedure TfrmTracker.OscilloscopeUpdateTimerTimer(Sender: TObject); 2455 procedure TfrmTracker.OscilloscopeUpdateTimerTimer(Sender: TObject);