Commit 8198950

Nick committed on
Fixed bug where invalid instruments could be generated
commit 819895044af82001b7a54c1822d06daa29606f6b parent f050b7e
4 changed files +84−23
Modifiedcodegen.pas +8−2
@@ -89,7 +89,11 @@ begin
89 else 89 else
90 SL.Add(NoteToDriverMap.KeyData[Cell.Note]); 90 SL.Add(NoteToDriverMap.KeyData[Cell.Note]);
91 91
92 SL.Add(IntToStr(Cell.Instrument)); 92 if InRange(Cell.Instrument, 0, 15) then
93 SL.Add(IntToStr(Cell.Instrument))
94 else
95 SL.Add('0');
96
93 SL.Add('$' + EffectCodeToStr(Cell.EffectCode, Cell.EffectParams)); 97 SL.Add('$' + EffectCodeToStr(Cell.EffectCode, Cell.EffectParams));
94 98
95 // RGBDS thinks you're defining a new macro if you don't have a space first. 99 // RGBDS thinks you're defining a new macro if you don't have a space first.
@@ -259,7 +263,9 @@ begin
259 'Error!', 263 'Error!',
260 'There was an error assembling the song for playback.'+LineEnding+LineEnding+ 264 'There was an error assembling the song for playback.'+LineEnding+LineEnding+
261 Proc.Executable+' output:'+LineEnding+ 265 Proc.Executable+' output:'+LineEnding+
262 OutSL.Text, 266 OutSL.Text+LineEnding+LineEnding+
267 'Please report this issue on the hUGETracker GitHub issues page, and '+
268 'post your song file!',
263 mtError, 269 mtError,
264 [mbOK], 270 [mbOK],
265 0); 271 0);
Modifiedtracker.lfm +33−17
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 550 2 Left = 861
3 Height = 1275 3 Height = 1275
4 Top = 338 4 Top = 189
5 Width = 2056 5 Width = 2056
6 Caption = 'hUGETracker' 6 Caption = 'hUGETracker'
7 ClientHeight = 1241 7 ClientHeight = 1241
@@ -55,10 +55,10 @@ object frmTracker: TfrmTracker
55 Height = 845 55 Height = 845
56 Top = 0 56 Top = 0
57 Width = 1709 57 Width = 1709
58 ActivePage = PatternTabSheet 58 ActivePage = WavesTabSheet
59 Align = alClient 59 Align = alClient
60 ParentFont = False 60 ParentFont = False
61 TabIndex = 1 61 TabIndex = 3
62 TabOrder = 0 62 TabOrder = 0
63 object GeneralTabSheet: TTabSheet 63 object GeneralTabSheet: TTabSheet
64 Caption = 'General' 64 Caption = 'General'
@@ -289,9 +289,9 @@ object frmTracker: TfrmTracker
289 AnchorSideTop.Side = asrBottom 289 AnchorSideTop.Side = asrBottom
290 AnchorSideBottom.Side = asrBottom 290 AnchorSideBottom.Side = asrBottom
291 Left = 0 291 Left = 0
292 Height = 148 292 Height = 102
293 Hint = 'Preview of how the resulting waveform will look with envelope applied' 293 Hint = 'Preview of how the resulting waveform will look with envelope applied'
294 Top = 654 294 Top = 700
295 Width = 1701 295 Width = 1701
296 Align = alClient 296 Align = alClient
297 Color = clBlack 297 Color = clBlack
@@ -302,7 +302,7 @@ object frmTracker: TfrmTracker
302 end 302 end
303 object FlowPanel1: TFlowPanel 303 object FlowPanel1: TFlowPanel
304 Left = 0 304 Left = 0
305 Height = 654 305 Height = 700
306 Top = 0 306 Top = 0
307 Width = 1701 307 Width = 1701
308 Align = alTop 308 Align = alTop
@@ -340,7 +340,7 @@ object frmTracker: TfrmTracker
340 TabOrder = 0 340 TabOrder = 0
341 object InstrumentGroupBox: TGroupBox 341 object InstrumentGroupBox: TGroupBox
342 Left = 12 342 Left = 12
343 Height = 310 343 Height = 356
344 Top = 12 344 Top = 12
345 Width = 474 345 Width = 474
346 Anchors = [] 346 Anchors = []
@@ -349,7 +349,7 @@ object frmTracker: TfrmTracker
349 BorderSpacing.Right = 12 349 BorderSpacing.Right = 12
350 BorderSpacing.Bottom = 12 350 BorderSpacing.Bottom = 12
351 Caption = 'Instrument' 351 Caption = 'Instrument'
352 ClientHeight = 275 352 ClientHeight = 321
353 ClientWidth = 470 353 ClientWidth = 470
354 ParentFont = False 354 ParentFont = False
355 TabOrder = 0 355 TabOrder = 0
@@ -488,7 +488,7 @@ object frmTracker: TfrmTracker
488 object InstrumentImportButton: TButton 488 object InstrumentImportButton: TButton
489 Left = 24 489 Left = 24
490 Height = 44 490 Height = 44
491 Top = 200 491 Top = 256
492 Width = 203 492 Width = 203
493 Caption = 'Import' 493 Caption = 'Import'
494 OnClick = InstrumentImportButtonClick 494 OnClick = InstrumentImportButtonClick
@@ -497,12 +497,21 @@ object frmTracker: TfrmTracker
497 object InstrumentExportButton: TButton 497 object InstrumentExportButton: TButton
498 Left = 245 498 Left = 245
499 Height = 44 499 Height = 44
500 Top = 200 500 Top = 256
501 Width = 203 501 Width = 203
502 Caption = 'Export' 502 Caption = 'Export'
503 OnClick = InstrumentExportButtonClick 503 OnClick = InstrumentExportButtonClick
504 TabOrder = 6 504 TabOrder = 6
505 end 505 end
506 object Button1: TButton
507 Left = 24
508 Height = 44
509 Top = 192
510 Width = 424
511 Caption = 'Test C-5'
512 OnClick = Button1Click
513 TabOrder = 7
514 end
506 end 515 end
507 object EnvelopeGroupBox: TGroupBox 516 object EnvelopeGroupBox: TGroupBox
508 Left = 510 517 Left = 510
@@ -619,7 +628,7 @@ object frmTracker: TfrmTracker
619 Left = 144 628 Left = 144
620 Height = 24 629 Height = 24
621 Hint = 'How much to change the volume each time' 630 Hint = 'How much to change the volume each time'
622 Top = 157 631 Top = 152
623 Width = 344 632 Width = 344
624 Buttons.BtnBigDec.BtnOrder = 1 633 Buttons.BtnBigDec.BtnOrder = 1
625 Buttons.BtnBigDec.Visible = False 634 Buttons.BtnBigDec.Visible = False
@@ -691,7 +700,7 @@ object frmTracker: TfrmTracker
691 object SquareGroupBox: TGroupBox 700 object SquareGroupBox: TGroupBox
692 Left = 12 701 Left = 12
693 Height = 296 702 Height = 296
694 Top = 346 703 Top = 392
695 Width = 558 704 Width = 558
696 Anchors = [] 705 Anchors = []
697 BorderSpacing.Left = 12 706 BorderSpacing.Left = 12
@@ -862,7 +871,7 @@ object frmTracker: TfrmTracker
862 object WaveGroupBox: TGroupBox 871 object WaveGroupBox: TGroupBox
863 Left = 594 872 Left = 594
864 Height = 296 873 Height = 296
865 Top = 346 874 Top = 392
866 Width = 520 875 Width = 520
867 Anchors = [] 876 Anchors = []
868 BorderSpacing.Left = 12 877 BorderSpacing.Left = 12
@@ -972,7 +981,7 @@ object frmTracker: TfrmTracker
972 object NoiseGroupBox: TGroupBox 981 object NoiseGroupBox: TGroupBox
973 Left = 1138 982 Left = 1138
974 Height = 296 983 Height = 296
975 Top = 346 984 Top = 392
976 Width = 462 985 Width = 462
977 Anchors = [] 986 Anchors = []
978 BorderSpacing.Left = 12 987 BorderSpacing.Left = 12
@@ -2141,6 +2150,7 @@ object frmTracker: TfrmTracker
2141 end 2150 end
2142 object DebugPlayNoteButton: TMenuItem 2151 object DebugPlayNoteButton: TMenuItem
2143 Caption = 'Debug play note' 2152 Caption = 'Debug play note'
2153 Visible = False
2144 OnClick = DebugPlayNoteButtonClick 2154 OnClick = DebugPlayNoteButtonClick
2145 end 2155 end
2146 object DebugShiteButton: TMenuItem 2156 object DebugShiteButton: TMenuItem
@@ -5062,9 +5072,9 @@ object frmTracker: TfrmTracker
5062 0000000000000000000000000000 5072 0000000000000000000000000000
5063 } 5073 }
5064 end 5074 end
5065 object Timer1: TTimer 5075 object OscilloscopeUpdateTimer: TTimer
5066 Interval = 25 5076 Interval = 25
5067 OnTimer = Timer1Timer 5077 OnTimer = OscilloscopeUpdateTimerTimer
5068 left = 504 5078 left = 504
5069 top = 80 5079 top = 80
5070 end 5080 end
@@ -5083,4 +5093,10 @@ object frmTracker: TfrmTracker
5083 left = 456 5093 left = 456
5084 top = 184 5094 top = 184
5085 end 5095 end
5096 object NoteHaltTimer: TTimer
5097 Enabled = False
5098 OnTimer = NoteHaltTimerTimer
5099 left = 344
5100 top = 176
5101 end
5086 end 5102 end
Modifiedtracker.pas +39−3
@@ -16,6 +16,7 @@ type
16 { TfrmTracker } 16 { TfrmTracker }
17 17
18 TfrmTracker = class(TForm) 18 TfrmTracker = class(TForm)
19 Button1: TButton;
19 ShiftClockSpinner: TECSpinPosition; 20 ShiftClockSpinner: TECSpinPosition;
20 InstrumentExportButton: TButton; 21 InstrumentExportButton: TButton;
21 InstrumentImportButton: TButton; 22 InstrumentImportButton: TButton;
@@ -28,6 +29,7 @@ type
28 MenuItem23: TMenuItem; 29 MenuItem23: TMenuItem;
29 MenuItem24: TMenuItem; 30 MenuItem24: TMenuItem;
30 MenuItem8: TMenuItem; 31 MenuItem8: TMenuItem;
32 NoteHaltTimer: TTimer;
31 WaveSaveDialog: TSaveDialog; 33 WaveSaveDialog: TSaveDialog;
32 Label22: TLabel; 34 Label22: TLabel;
33 Label23: TLabel; 35 Label23: TLabel;
@@ -47,7 +49,7 @@ type
47 OctaveSpinEdit: TSpinEdit; 49 OctaveSpinEdit: TSpinEdit;
48 GBSSaveDialog: TSaveDialog; 50 GBSSaveDialog: TSaveDialog;
49 StepSpinEdit: TSpinEdit; 51 StepSpinEdit: TSpinEdit;
50 Timer1: TTimer; 52 OscilloscopeUpdateTimer: TTimer;
51 ExportGBSButton: TToolButton; 53 ExportGBSButton: TToolButton;
52 ToolButton3: TToolButton; 54 ToolButton3: TToolButton;
53 ToolButton9: TToolButton; 55 ToolButton9: TToolButton;
@@ -173,6 +175,7 @@ type
173 DivRatioSpinner: TECSpinPosition; 175 DivRatioSpinner: TECSpinPosition;
174 TreeView1: TTreeView; 176 TreeView1: TTreeView;
175 TrackerGrid: TTrackerGrid; 177 TrackerGrid: TTrackerGrid;
178 procedure Button1Click(Sender: TObject);
176 procedure EditDelete1Execute(Sender: TObject); 179 procedure EditDelete1Execute(Sender: TObject);
177 procedure InstrumentComboBoxChange(Sender: TObject); 180 procedure InstrumentComboBoxChange(Sender: TObject);
178 procedure CopyActionExecute(Sender: TObject); 181 procedure CopyActionExecute(Sender: TObject);
@@ -219,6 +222,7 @@ type
219 procedure MenuItem5Click(Sender: TObject); 222 procedure MenuItem5Click(Sender: TObject);
220 procedure MenuItem8Click(Sender: TObject); 223 procedure MenuItem8Click(Sender: TObject);
221 procedure NoiseVisualizerPaint(Sender: TObject); 224 procedure NoiseVisualizerPaint(Sender: TObject);
225 procedure NoteHaltTimerTimer(Sender: TObject);
222 procedure OrderEditStringGridAfterSelection(Sender: TObject; aCol, 226 procedure OrderEditStringGridAfterSelection(Sender: TObject; aCol,
223 aRow: Integer); 227 aRow: Integer);
224 procedure OrderEditStringGridColRowDeleted(Sender: TObject; 228 procedure OrderEditStringGridColRowDeleted(Sender: TObject;
@@ -239,7 +243,7 @@ type
239 procedure ShiftClockSpinnerChange(Sender: TObject); 243 procedure ShiftClockSpinnerChange(Sender: TObject);
240 procedure StepSpinEditChange(Sender: TObject); 244 procedure StepSpinEditChange(Sender: TObject);
241 procedure TicksPerRowSpinEditChange(Sender: TObject); 245 procedure TicksPerRowSpinEditChange(Sender: TObject);
242 procedure Timer1Timer(Sender: TObject); 246 procedure OscilloscopeUpdateTimerTimer(Sender: TObject);
243 procedure ExportGBSButtonClick(Sender: TObject); 247 procedure ExportGBSButtonClick(Sender: TObject);
244 procedure ToolButton2Click(Sender: TObject); 248 procedure ToolButton2Click(Sender: TObject);
245 procedure ToolButton3Click(Sender: TObject); 249 procedure ToolButton3Click(Sender: TObject);
@@ -310,6 +314,7 @@ type
310 procedure DrawVizualizer(PB: TPaintBox; Channel: Integer); 314 procedure DrawVizualizer(PB: TPaintBox; Channel: Integer);
311 315
312 procedure PreviewInstrument(Freq: Integer; Instr: Integer); 316 procedure PreviewInstrument(Freq: Integer; Instr: Integer);
317 procedure PreviewC5;
313 procedure Panic; 318 procedure Panic;
314 public 319 public
315 320
@@ -464,6 +469,15 @@ begin
464 end; 469 end;
465 end; 470 end;
466 471
472 procedure TfrmTracker.PreviewC5;
473 begin
474 if not LoadingFile then begin
475 PreviewInstrument(NotesToFreqs.Data[C_5], InstrumentNumberSpinner.Value);
476 NoteHaltTimer.Enabled := False;
477 NoteHaltTimer.Enabled := True
478 end;
479 end;
480
467 procedure TfrmTracker.Panic; 481 procedure TfrmTracker.Panic;
468 begin 482 begin
469 // Silence CH1 483 // Silence CH1
@@ -1099,6 +1113,11 @@ begin
1099 1113
1100 end; 1114 end;
1101 1115
1116 procedure TfrmTracker.Button1Click(Sender: TObject);
1117 begin
1118 PreviewC5;
1119 end;
1120
1102 procedure TfrmTracker.PasteActionExecute(Sender: TObject); 1121 procedure TfrmTracker.PasteActionExecute(Sender: TObject);
1103 begin 1122 begin
1104 PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0); 1123 PostMessage(Screen.ActiveControl.Handle, LM_PASTE, 0, 0);
@@ -1204,18 +1223,24 @@ begin
1204 1223
1205 for X := 0 to 3 do 1224 for X := 0 to 3 do
1206 Song.Patterns.CreateNewPattern(Highest+X); 1225 Song.Patterns.CreateNewPattern(Highest+X);
1226
1227 ReloadPatterns;
1207 end; 1228 end;
1208 1229
1209 procedure TfrmTracker.MenuItem18Click(Sender: TObject); 1230 procedure TfrmTracker.MenuItem18Click(Sender: TObject);
1210 begin 1231 begin
1211 with OrderEditStringGrid do 1232 with OrderEditStringGrid do
1212 InsertRowWithValues(Row, ['', '0', '0', '0', '0']); 1233 InsertRowWithValues(Row, ['', '0', '0', '0', '0']);
1234
1235 ReloadPatterns;
1213 end; 1236 end;
1214 1237
1215 procedure TfrmTracker.MenuItem19Click(Sender: TObject); 1238 procedure TfrmTracker.MenuItem19Click(Sender: TObject);
1216 begin 1239 begin
1217 if OrderEditStringGrid.RowCount > 2 then 1240 if OrderEditStringGrid.RowCount > 2 then
1218 OrderEditStringGrid.DeleteRow(OrderEditStringGrid.Row); 1241 OrderEditStringGrid.DeleteRow(OrderEditStringGrid.Row);
1242
1243 ReloadPatterns;
1219 end; 1244 end;
1220 1245
1221 procedure TfrmTracker.MenuItem21Click(Sender: TObject); 1246 procedure TfrmTracker.MenuItem21Click(Sender: TObject);
@@ -1224,6 +1249,8 @@ begin
1224 InsertRowWithValues(Row, ['', '0', '0', '0', '0']); 1249 InsertRowWithValues(Row, ['', '0', '0', '0', '0']);
1225 Rows[Row-1] := Rows[Row]; 1250 Rows[Row-1] := Rows[Row];
1226 end; 1251 end;
1252
1253 ReloadPatterns;
1227 end; 1254 end;
1228 1255
1229 procedure TfrmTracker.MenuItem22Click(Sender: TObject); 1256 procedure TfrmTracker.MenuItem22Click(Sender: TObject);
@@ -1246,6 +1273,8 @@ begin
1246 Song.Patterns.CreateNewPattern(Highest+X)^ := 1273 Song.Patterns.CreateNewPattern(Highest+X)^ :=
1247 Song.Patterns.KeyData[StrToInt(Rows[Row][X+1])]^; 1274 Song.Patterns.KeyData[StrToInt(Rows[Row][X+1])]^;
1248 end; 1275 end;
1276
1277 ReloadPatterns;
1249 end; 1278 end;
1250 1279
1251 procedure TfrmTracker.MenuItem5Click(Sender: TObject); 1280 procedure TfrmTracker.MenuItem5Click(Sender: TObject);
@@ -1267,6 +1296,12 @@ begin
1267 DrawVizualizer(NoiseVisualizer, 4); 1296 DrawVizualizer(NoiseVisualizer, 4);
1268 end; 1297 end;
1269 1298
1299 procedure TfrmTracker.NoteHaltTimerTimer(Sender: TObject);
1300 begin
1301 Panic;
1302 NoteHaltTimer.Enabled := False;
1303 end;
1304
1270 procedure TfrmTracker.OrderEditStringGridAfterSelection(Sender: TObject; aCol, 1305 procedure TfrmTracker.OrderEditStringGridAfterSelection(Sender: TObject; aCol,
1271 aRow: Integer); 1306 aRow: Integer);
1272 begin 1307 begin
@@ -1332,6 +1367,7 @@ begin
1332 if Key = VK_DELETE then begin 1367 if Key = VK_DELETE then begin
1333 // TODO: Make this stop the editor from showing 1368 // TODO: Make this stop the editor from showing
1334 OrderEditStringGrid.DeleteRow(OrderEditStringGrid.Row); 1369 OrderEditStringGrid.DeleteRow(OrderEditStringGrid.Row);
1370 ReloadPatterns;
1335 end; 1371 end;
1336 end; 1372 end;
1337 1373
@@ -1345,7 +1381,7 @@ begin
1345 Song.TicksPerRow := TicksPerRowSpinEdit.Value; 1381 Song.TicksPerRow := TicksPerRowSpinEdit.Value;
1346 end; 1382 end;
1347 1383
1348 procedure TfrmTracker.Timer1Timer(Sender: TObject); 1384 procedure TfrmTracker.OscilloscopeUpdateTimerTimer(Sender: TObject);
1349 var 1385 var
1350 Max1, Max2: Integer; 1386 Max1, Max2: Integer;
1351 I: Integer; 1387 I: Integer;
Modifiedtrackergrid.pas +4−1
@@ -687,11 +687,14 @@ procedure TTrackerGrid.InputInstrument(Key: Word);
687 var 687 var
688 Temp: Nibble; 688 Temp: Nibble;
689 begin 689 begin
690 with Patterns[Cursor.X]^[Cursor.Y] do 690 with Patterns[Cursor.X]^[Cursor.Y] do begin
691 if Key = VK_DELETE then Instrument := 0 691 if Key = VK_DELETE then Instrument := 0
692 else if KeycodeToHexNumber(Key, Temp) and InRange(Temp, 0, 9) then 692 else if KeycodeToHexNumber(Key, Temp) and InRange(Temp, 0, 9) then
693 Instrument := ((Instrument mod 10) * 10) + Temp; 693 Instrument := ((Instrument mod 10) * 10) + Temp;
694 694
695 Instrument := EnsureRange(Instrument, 0, 15);
696 end;
697
695 Invalidate; 698 Invalidate;
696 SaveUndoState; 699 SaveUndoState;
697 end; 700 end;