Commit 41039c9

Nick committed on
WIP note previewing
commit 41039c9feb3784d4abdb94941330fe335eb29db2 parent 42c916b
6 changed files +221−61
ModifiedGBEmu.lpi +2−2
@@ -187,8 +187,8 @@
187 <Version Value="11"/> 187 <Version Value="11"/>
188 <PathDelim Value="\"/> 188 <PathDelim Value="\"/>
189 <SearchPaths> 189 <SearchPaths>
190 <IncludeFiles Value="SDL2_headers;GPU;CPU;Sound;Global;$(ProjOutDir)"/> 190 <IncludeFiles Value="GPU;CPU;Sound;Global;$(ProjOutDir)"/>
191 <OtherUnitFiles Value="GPU;CPU;Sound;Global"/> 191 <OtherUnitFiles Value="GPU;CPU;Sound;Global;SDL2_headers"/>
192 <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 192 <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
193 </SearchPaths> 193 </SearchPaths>
194 <Parsing> 194 <Parsing>
ModifiedSound/sound.pas +2−1
@@ -169,6 +169,7 @@ implementation
169 uses vars, sdl2; 169 uses vars, sdl2;
170 170
171 const 171 const
172 SampleSize = SizeOf(Single)*2;
172 playbackFrequency = 44100; 173 playbackFrequency = 44100;
173 sampleCycles: longint = (8192 * 1024) div playbackFrequency; 174 sampleCycles: longint = (8192 * 1024) div playbackFrequency;
174 TooFullThreshold: Integer = (playbackFrequency div 10)*sizeof(single); //0.1s 175 TooFullThreshold: Integer = (playbackFrequency div 10)*sizeof(single); //0.1s
@@ -258,7 +259,7 @@ begin
258 bufCycles := 0; 259 bufCycles := 0;
259 bufLVal := 0; 260 bufLVal := 0;
260 bufRVal := 0; 261 bufRVal := 0;
261 SDL_QueueAudio(playStream, @buf, 8); 262 SDL_QueueAudio(playStream, @buf, SampleSize);
262 end; 263 end;
263 end; 264 end;
264 265
Modifiedconstants.pas +84−1
@@ -18,6 +18,7 @@ const
18 18
19 LM_FD = LM_USER + 0; 19 LM_FD = LM_USER + 0;
20 LM_UNDO_OCCURED = LM_USER + 1; 20 LM_UNDO_OCCURED = LM_USER + 1;
21 LM_PREVIEW_NOTE = LM_USER + 2;
21 22
22 SYM_ROW = 'row'; 23 SYM_ROW = 'row';
23 SYM_CURRENT_ORDER = 'current_order'; 24 SYM_CURRENT_ORDER = 'current_order';
@@ -221,6 +222,82 @@ begin
221 NotesToFreqs := TNoteToFreqMap.Create; 222 NotesToFreqs := TNoteToFreqMap.Create;
222 NoteToCodeMap := TNoteToCodeMap.Create; 223 NoteToCodeMap := TNoteToCodeMap.Create;
223 224
225 {%Region Notes->Freqs}
226 NotesToFreqs.Add(C_3, 44);
227 NotesToFreqs.Add(CS3, 156);
228 NotesToFreqs.Add(D_3, 262);
229 NotesToFreqs.Add(DS3, 363);
230 NotesToFreqs.Add(E_3, 457);
231 NotesToFreqs.Add(F_3, 547);
232 NotesToFreqs.Add(FS3, 631);
233 NotesToFreqs.Add(G_3, 710);
234 NotesToFreqs.Add(GS3, 786);
235 NotesToFreqs.Add(A_3, 854);
236 NotesToFreqs.Add(AS3, 923);
237 NotesToFreqs.Add(B_3, 986);
238 NotesToFreqs.Add(C_4, 1046);
239 NotesToFreqs.Add(CS4, 1102);
240 NotesToFreqs.Add(D_4, 1155);
241 NotesToFreqs.Add(DS4, 1205);
242 NotesToFreqs.Add(E_4, 1253);
243 NotesToFreqs.Add(F_4, 1297);
244 NotesToFreqs.Add(FS4, 1339);
245 NotesToFreqs.Add(G_4, 1379);
246 NotesToFreqs.Add(GS4, 1417);
247 NotesToFreqs.Add(A_4, 1452);
248 NotesToFreqs.Add(AS4, 1486);
249 NotesToFreqs.Add(B_4, 1517);
250 NotesToFreqs.Add(C_5, 1546);
251 NotesToFreqs.Add(CS5, 1575);
252 NotesToFreqs.Add(D_5, 1602);
253 NotesToFreqs.Add(DS5, 1627);
254 NotesToFreqs.Add(E_5, 1650);
255 NotesToFreqs.Add(F_5, 1673);
256 NotesToFreqs.Add(FS5, 1694);
257 NotesToFreqs.Add(G_5, 1714);
258 NotesToFreqs.Add(GS5, 1732);
259 NotesToFreqs.Add(A_5, 1750);
260 NotesToFreqs.Add(AS5, 1767);
261 NotesToFreqs.Add(B_5, 1783);
262 NotesToFreqs.Add(C_6, 1798);
263 NotesToFreqs.Add(CS6, 1812);
264 NotesToFreqs.Add(D_6, 1825);
265 NotesToFreqs.Add(DS6, 1837);
266 NotesToFreqs.Add(E_6, 1849);
267 NotesToFreqs.Add(F_6, 1860);
268 NotesToFreqs.Add(FS6, 1871);
269 NotesToFreqs.Add(G_6, 1881);
270 NotesToFreqs.Add(GS6, 1890);
271 NotesToFreqs.Add(A_6, 1899);
272 NotesToFreqs.Add(AS6, 1907);
273 NotesToFreqs.Add(B_6, 1915);
274 NotesToFreqs.Add(C_7, 1923);
275 NotesToFreqs.Add(CS7, 1930);
276 NotesToFreqs.Add(D_7, 1936);
277 NotesToFreqs.Add(DS7, 1943);
278 NotesToFreqs.Add(E_7, 1949);
279 NotesToFreqs.Add(F_7, 1954);
280 NotesToFreqs.Add(FS7, 1959);
281 NotesToFreqs.Add(G_7, 1964);
282 NotesToFreqs.Add(GS7, 1969);
283 NotesToFreqs.Add(A_7, 1974);
284 NotesToFreqs.Add(AS7, 1978);
285 NotesToFreqs.Add(B_7, 1982);
286 NotesToFreqs.Add(C_8, 1985);
287 NotesToFreqs.Add(CS8, 1988);
288 NotesToFreqs.Add(D_8, 1992);
289 NotesToFreqs.Add(DS8, 1995);
290 NotesToFreqs.Add(E_8, 1998);
291 NotesToFreqs.Add(F_8, 2001);
292 NotesToFreqs.Add(FS8, 2004);
293 NotesToFreqs.Add(G_8, 2006);
294 NotesToFreqs.Add(GS8, 2009);
295 NotesToFreqs.Add(A_8, 2011);
296 NotesToFreqs.Add(AS8, 2013);
297 NotesToFreqs.Add(B_8, 2015);
298 {%Endregion}
299
300 {%Region}
224 Keybindings.Add(VK_Q, C_3); 301 Keybindings.Add(VK_Q, C_3);
225 Keybindings.Add(VK_W, CS3); 302 Keybindings.Add(VK_W, CS3);
226 Keybindings.Add(VK_E, D_3); 303 Keybindings.Add(VK_E, D_3);
@@ -255,7 +332,9 @@ begin
255 Keybindings.Add(VK_OEM_COMMA, G_5); 332 Keybindings.Add(VK_OEM_COMMA, G_5);
256 Keybindings.Add(VK_OEM_PERIOD, GS5); 333 Keybindings.Add(VK_OEM_PERIOD, GS5);
257 Keybindings.Add(VK_OEM_2, A_5); 334 Keybindings.Add(VK_OEM_2, A_5);
335 {%EndRegion Keycodes->Notes}
258 336
337 {%Region Note names -> Notes}
259 NoteToCodeMap.add('C-3', C_3); 338 NoteToCodeMap.add('C-3', C_3);
260 NoteToCodeMap.add('C#3', Cs3); 339 NoteToCodeMap.add('C#3', Cs3);
261 NoteToCodeMap.add('D-3', D_3); 340 NoteToCodeMap.add('D-3', D_3);
@@ -328,7 +407,9 @@ begin
328 NoteToCodeMap.add('A-8', A_8); 407 NoteToCodeMap.add('A-8', A_8);
329 NoteToCodeMap.add('A#8', As8); 408 NoteToCodeMap.add('A#8', As8);
330 NoteToCodeMap.add('B-8', B_8); 409 NoteToCodeMap.add('B-8', B_8);
410 {%EndRegion}
331 411
412 {%Region Notes -> Note names}
332 NoteMap.add(C_3, 'C-3'); 413 NoteMap.add(C_3, 'C-3');
333 NoteMap.add(Cs3, 'C#3'); 414 NoteMap.add(Cs3, 'C#3');
334 NoteMap.add(D_3, 'D-3'); 415 NoteMap.add(D_3, 'D-3');
@@ -401,7 +482,9 @@ begin
401 NoteMap.add(A_8, 'A-8'); 482 NoteMap.add(A_8, 'A-8');
402 NoteMap.add(As8, 'A#8'); 483 NoteMap.add(As8, 'A#8');
403 NoteMap.add(B_8, 'B-8'); 484 NoteMap.add(B_8, 'B-8');
485 {%EndRegion}
404 486
487 {%Region Notes -> Driver constants}
405 NoteToDriverMap.add(C_3, 'C_3'); 488 NoteToDriverMap.add(C_3, 'C_3');
406 NoteToDriverMap.add(Cs3, 'C#3'); 489 NoteToDriverMap.add(Cs3, 'C#3');
407 NoteToDriverMap.add(D_3, 'D_3'); 490 NoteToDriverMap.add(D_3, 'D_3');
@@ -474,6 +557,6 @@ begin
474 NoteToDriverMap.add(A_8, 'A_8'); 557 NoteToDriverMap.add(A_8, 'A_8');
475 NoteToDriverMap.add(As8, 'A#8'); 558 NoteToDriverMap.add(As8, 'A#8');
476 NoteToDriverMap.add(B_8, 'B_8'); 559 NoteToDriverMap.add(B_8, 'B_8');
477 560 {%EndRegion}
478 561
479 end. 562 end.
Modifiedtracker.lfm +36−14
@@ -1,12 +1,13 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 843 2 Left = 1098
3 Height = 1376 3 Height = 1376
4 Top = 190 4 Top = 199
5 Width = 2212 5 Width = 2212
6 Caption = 'hUGETracker' 6 Caption = 'hUGETracker'
7 ClientHeight = 1342 7 ClientHeight = 1342
8 ClientWidth = 2212 8 ClientWidth = 2212
9 DesignTimePPI = 168 9 DesignTimePPI = 168
10 KeyPreview = True
10 Menu = MainMenu1 11 Menu = MainMenu1
11 OnClose = FormClose 12 OnClose = FormClose
12 OnCreate = FormCreate 13 OnCreate = FormCreate
@@ -54,10 +55,10 @@ object frmTracker: TfrmTracker
54 Height = 946 55 Height = 946
55 Top = 0 56 Top = 0
56 Width = 1865 57 Width = 1865
57 ActivePage = InstrumentTabSheet 58 ActivePage = WavesTabSheet
58 Align = alClient 59 Align = alClient
59 ParentFont = False 60 ParentFont = False
60 TabIndex = 2 61 TabIndex = 3
61 TabOrder = 0 62 TabOrder = 0
62 object GeneralTabSheet: TTabSheet 63 object GeneralTabSheet: TTabSheet
63 Caption = 'General' 64 Caption = 'General'
@@ -288,9 +289,9 @@ object frmTracker: TfrmTracker
288 AnchorSideTop.Side = asrBottom 289 AnchorSideTop.Side = asrBottom
289 AnchorSideBottom.Side = asrBottom 290 AnchorSideBottom.Side = asrBottom
290 Left = 0 291 Left = 0
291 Height = 321 292 Height = 249
292 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'
293 Top = 582 294 Top = 654
294 Width = 1857 295 Width = 1857
295 Align = alClient 296 Align = alClient
296 Color = clBlack 297 Color = clBlack
@@ -300,7 +301,7 @@ object frmTracker: TfrmTracker
300 end 301 end
301 object FlowPanel1: TFlowPanel 302 object FlowPanel1: TFlowPanel
302 Left = 0 303 Left = 0
303 Height = 582 304 Height = 654
304 Top = 0 305 Top = 0
305 Width = 1857 306 Width = 1857
306 Align = alTop 307 Align = alTop
@@ -338,7 +339,7 @@ object frmTracker: TfrmTracker
338 TabOrder = 0 339 TabOrder = 0
339 object InstrumentGroupBox: TGroupBox 340 object InstrumentGroupBox: TGroupBox
340 Left = 12 341 Left = 12
341 Height = 238 342 Height = 310
342 Top = 12 343 Top = 12
343 Width = 474 344 Width = 474
344 Anchors = [] 345 Anchors = []
@@ -347,7 +348,7 @@ object frmTracker: TfrmTracker
347 BorderSpacing.Right = 12 348 BorderSpacing.Right = 12
348 BorderSpacing.Bottom = 12 349 BorderSpacing.Bottom = 12
349 Caption = 'Instrument' 350 Caption = 'Instrument'
350 ClientHeight = 203 351 ClientHeight = 275
351 ClientWidth = 470 352 ClientWidth = 470
352 ParentFont = False 353 ParentFont = False
353 TabOrder = 0 354 TabOrder = 0
@@ -480,6 +481,24 @@ object frmTracker: TfrmTracker
480 ScaleFontOptions.FontStyles = [] 481 ScaleFontOptions.FontStyles = []
481 OnChange = LengthSpinnerChange 482 OnChange = LengthSpinnerChange
482 end 483 end
484 object InstrumentImportButton: TButton
485 Left = 24
486 Height = 44
487 Top = 200
488 Width = 203
489 Caption = 'Import'
490 OnClick = InstrumentImportButtonClick
491 TabOrder = 5
492 end
493 object InstrumentExportButton: TButton
494 Left = 245
495 Height = 44
496 Top = 200
497 Width = 203
498 Caption = 'Export'
499 OnClick = InstrumentExportButtonClick
500 TabOrder = 6
501 end
483 end 502 end
484 object EnvelopeGroupBox: TGroupBox 503 object EnvelopeGroupBox: TGroupBox
485 Left = 510 504 Left = 510
@@ -662,7 +681,7 @@ object frmTracker: TfrmTracker
662 object SquareGroupBox: TGroupBox 681 object SquareGroupBox: TGroupBox
663 Left = 12 682 Left = 12
664 Height = 296 683 Height = 296
665 Top = 274 684 Top = 346
666 Width = 558 685 Width = 558
667 Anchors = [] 686 Anchors = []
668 BorderSpacing.Left = 12 687 BorderSpacing.Left = 12
@@ -830,7 +849,7 @@ object frmTracker: TfrmTracker
830 object WaveGroupBox: TGroupBox 849 object WaveGroupBox: TGroupBox
831 Left = 594 850 Left = 594
832 Height = 296 851 Height = 296
833 Top = 274 852 Top = 346
834 Width = 520 853 Width = 520
835 Anchors = [] 854 Anchors = []
836 BorderSpacing.Left = 12 855 BorderSpacing.Left = 12
@@ -940,7 +959,7 @@ object frmTracker: TfrmTracker
940 object NoiseGroupBox: TGroupBox 959 object NoiseGroupBox: TGroupBox
941 Left = 1138 960 Left = 1138
942 Height = 296 961 Height = 296
943 Top = 274 962 Top = 346
944 Width = 462 963 Width = 462
945 Anchors = [] 964 Anchors = []
946 BorderSpacing.Left = 12 965 BorderSpacing.Left = 12
@@ -1150,13 +1169,13 @@ object frmTracker: TfrmTracker
1150 ParentFont = False 1169 ParentFont = False
1151 TabOrder = 1 1170 TabOrder = 1
1152 end 1171 end
1153 object ExportButton: TButton 1172 object ExportWaveButton: TButton
1154 Left = 28 1173 Left = 28
1155 Height = 44 1174 Height = 44
1156 Top = 140 1175 Top = 140
1157 Width = 257 1176 Width = 257
1158 Caption = 'Export' 1177 Caption = 'Export'
1159 OnClick = ExportButtonClick 1178 OnClick = ExportWaveButtonClick
1160 ParentFont = False 1179 ParentFont = False
1161 TabOrder = 2 1180 TabOrder = 2
1162 end 1181 end
@@ -2090,6 +2109,7 @@ object frmTracker: TfrmTracker
2090 object FileOpen1: TFileOpen 2109 object FileOpen1: TFileOpen
2091 Category = 'File' 2110 Category = 'File'
2092 Caption = '&Open ...' 2111 Caption = '&Open ...'
2112 Dialog.Filter = 'hUGETracker Modules|*.uge'
2093 Hint = 'Open' 2113 Hint = 'Open'
2094 ImageIndex = 42 2114 ImageIndex = 42
2095 ShortCut = 16463 2115 ShortCut = 16463
@@ -4654,10 +4674,12 @@ object frmTracker: TfrmTracker
4654 } 4674 }
4655 end 4675 end
4656 object OpenDialog1: TOpenDialog 4676 object OpenDialog1: TOpenDialog
4677 Filter = 'hUGETracker Instruments|*.ugi'
4657 left = 737 4678 left = 737
4658 top = 75 4679 top = 75
4659 end 4680 end
4660 object SaveDialog1: TSaveDialog 4681 object SaveDialog1: TSaveDialog
4682 Filter = 'hUGETracker Instruments|*.ugi'
4661 left = 868 4683 left = 868
4662 top = 75 4684 top = 75
4663 end 4685 end
Modifiedtracker.pas +90−39
@@ -16,6 +16,8 @@ type
16 { TfrmTracker } 16 { TfrmTracker }
17 17
18 TfrmTracker = class(TForm) 18 TfrmTracker = class(TForm)
19 InstrumentExportButton: TButton;
20 InstrumentImportButton: TButton;
19 InstrumentComboBox: TComboBox; 21 InstrumentComboBox: TComboBox;
20 CutAction: TAction; 22 CutAction: TAction;
21 ImageList2: TImageList; 23 ImageList2: TImageList;
@@ -52,7 +54,7 @@ type
52 EditPaste1: TEditPaste; 54 EditPaste1: TEditPaste;
53 EditSelectAll1: TEditSelectAll; 55 EditSelectAll1: TEditSelectAll;
54 EditUndo1: TEditUndo; 56 EditUndo1: TEditUndo;
55 ExportButton: TButton; 57 ExportWaveButton: TButton;
56 FileExit1: TFileExit; 58 FileExit1: TFileExit;
57 FileOpen1: TFileOpen; 59 FileOpen1: TFileOpen;
58 FileSaveAs1: TFileSaveAs; 60 FileSaveAs1: TFileSaveAs;
@@ -187,11 +189,13 @@ type
187 procedure DutyComboboxChange(Sender: TObject); 189 procedure DutyComboboxChange(Sender: TObject);
188 procedure EnvChangeSpinnerChange(Sender: TObject); 190 procedure EnvChangeSpinnerChange(Sender: TObject);
189 procedure EnvelopePaintboxPaint(Sender: TObject); 191 procedure EnvelopePaintboxPaint(Sender: TObject);
190 procedure ExportButtonClick(Sender: TObject); 192 procedure ExportWaveButtonClick(Sender: TObject);
191 procedure FormCreate(Sender: TObject); 193 procedure FormCreate(Sender: TObject);
192 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 194 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
193 procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 195 procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
194 procedure ImportWaveButtonClick(Sender: TObject); 196 procedure ImportWaveButtonClick(Sender: TObject);
197 procedure InstrumentExportButtonClick(Sender: TObject);
198 procedure InstrumentImportButtonClick(Sender: TObject);
195 procedure InstrumentNameEditChange(Sender: TObject); 199 procedure InstrumentNameEditChange(Sender: TObject);
196 procedure InstrumentNumberSpinnerChange(Sender: TObject); 200 procedure InstrumentNumberSpinnerChange(Sender: TObject);
197 procedure LengthSpinnerChange(Sender: TObject); 201 procedure LengthSpinnerChange(Sender: TObject);
@@ -257,7 +261,7 @@ type
257 261
258 EmulationThread: TThread; 262 EmulationThread: TThread;
259 263
260 PreviewingInstrument: Boolean; 264 PreviewingInstrument: Integer;
261 DrawingWave: Boolean; 265 DrawingWave: Boolean;
262 Playing: Boolean; 266 Playing: Boolean;
263 LoadingFile: Boolean; 267 LoadingFile: Boolean;
@@ -283,6 +287,7 @@ type
283 procedure PokeSymbol(Symbol: String; Value: Byte); 287 procedure PokeSymbol(Symbol: String; Value: Byte);
284 procedure OnFD(var Msg: TLMessage); message LM_FD; 288 procedure OnFD(var Msg: TLMessage); message LM_FD;
285 procedure OnUndoOccured(var Msg: TLMessage); message LM_UNDO_OCCURED; 289 procedure OnUndoOccured(var Msg: TLMessage); message LM_UNDO_OCCURED;
290 procedure OnNotePlaced(var Msg: TLMessage); message LM_PREVIEW_NOTE;
286 291
287 procedure RecreateTrackerGrid; 292 procedure RecreateTrackerGrid;
288 procedure UpdateUIAfterLoad; 293 procedure UpdateUIAfterLoad;
@@ -291,6 +296,7 @@ type
291 procedure DrawVizualizer(PB: TPaintBox; Channel: Integer); 296 procedure DrawVizualizer(PB: TPaintBox; Channel: Integer);
292 297
293 procedure PreviewInstrument(Freq: Integer; Instr: Integer); 298 procedure PreviewInstrument(Freq: Integer; Instr: Integer);
299 procedure Panic;
294 public 300 public
295 301
296 end; 302 end;
@@ -444,6 +450,24 @@ begin
444 end; 450 end;
445 end; 451 end;
446 452
453 procedure TfrmTracker.Panic;
454 begin
455 // Silence CH1
456 Spokeb(NR12, 0);
457 Spokeb(NR14, %10000000);
458
459 // Silence CH2
460 Spokeb(NR22, 0);
461 Spokeb(NR24, %10000000);
462
463 // Silence CH3
464 Spokeb(NR30, 0);
465
466 // Silence CH4
467 Spokeb(NR42, 0);
468 Spokeb(NR44, %10000000);
469 end;
470
447 procedure TfrmTracker.LoadWave(Wave: Integer); 471 procedure TfrmTracker.LoadWave(Wave: Integer);
448 begin 472 begin
449 CurrentWave := @Song.Waves[Wave]; 473 CurrentWave := @Song.Waves[Wave];
@@ -597,6 +621,11 @@ begin
597 Row := -1; 621 Row := -1;
598 end; 622 end;
599 623
624 procedure TfrmTracker.OnNotePlaced(var Msg: TLMessage);
625 begin
626 PreviewInstrument(NotesToFreqs.KeyData[msg.wParam], msg.lParam);
627 end;
628
600 procedure TfrmTracker.RecreateTrackerGrid; 629 procedure TfrmTracker.RecreateTrackerGrid;
601 begin 630 begin
602 if Assigned(TrackerGrid) then TrackerGrid.Free; 631 if Assigned(TrackerGrid) then TrackerGrid.Free;
@@ -799,6 +828,7 @@ var
799 Section: TCollectionItem; 828 Section: TCollectionItem;
800 begin 829 begin
801 ReturnNilIfGrowHeapFails := False; 830 ReturnNilIfGrowHeapFails := False;
831 PreviewingInstrument := -1;
802 832
803 InitializeSong(Song); 833 InitializeSong(Song);
804 834
@@ -841,32 +871,39 @@ end;
841 procedure TfrmTracker.FormKeyDown(Sender: TObject; var Key: Word; 871 procedure TfrmTracker.FormKeyDown(Sender: TObject; var Key: Word;
842 Shift: TShiftState); 872 Shift: TShiftState);
843 var 873 var
874 Note: Integer;
844 Freq: Integer; 875 Freq: Integer;
845 begin 876 begin
846 if PreviewingInstrument then exit; 877 if not Keybindings.TryGetData(Key, Note) then Exit;
878 Inc(Note, OctaveSpinEdit.Value*12);
879 EnsureRange(Note, LOWEST_NOTE, HIGHEST_NOTE);
880
881 if PreviewingInstrument <> Note then
882 PreviewingInstrument := -1;
883
884 if (PreviewingInstrument > 0) or
885 (not (ActiveControl = TrackerGrid)) or
886 (InstrumentComboBox.ItemIndex <= 0)
887 then exit;
847 888
848 Keybindings.TryGetData(Key, Freq); 889 if not NotesToFreqs.TryGetData(Note, Freq) then Exit;
849 if Freq <> 0 then
850 PreviewInstrument(Freq, InstrumentNumberSpinner.Value);
851 890
852 PreviewingInstrument := True; 891 PreviewInstrument(Freq, InstrumentNumberSpinner.Value);
892 PreviewingInstrument := Note;
853 end; 893 end;
854 894
855 procedure TfrmTracker.FormKeyUp(Sender: TObject; var Key: Word; 895 procedure TfrmTracker.FormKeyUp(Sender: TObject; var Key: Word;
856 Shift: TShiftState); 896 Shift: TShiftState);
857 begin 897 begin
858 PreviewingInstrument := False; 898 PreviewingInstrument := -1;
859 899 Panic;
860 // Silence channel 1
861 Spokeb(NR12, 0);
862 Spokeb(NR14, %10000000);
863 end; 900 end;
864 901
865 procedure TfrmTracker.ImportWaveButtonClick(Sender: TObject); 902 procedure TfrmTracker.ImportWaveButtonClick(Sender: TObject);
866 var 903 var
867 F: file of TWave; 904 F: file of TWave;
868 begin 905 begin
869 OpenDialog1.DefaultExt := '*.pcm'; 906 OpenDialog1.Filter := 'hUGETracker waves|*.ugw';
870 if OpenDialog1.Execute then begin 907 if OpenDialog1.Execute then begin
871 assignfile(F, OpenDialog1.FileName); 908 assignfile(F, OpenDialog1.FileName);
872 reset(F); 909 reset(F);
@@ -876,6 +913,44 @@ begin
876 end; 913 end;
877 end; 914 end;
878 915
916 procedure TfrmTracker.ExportWaveButtonClick(Sender: TObject);
917 var F: file of TWave;
918 begin
919 SaveDialog1.Filter := 'hUGETracker waves|*.ugw';
920 if SaveDialog1.Execute then begin
921 AssignFile(F, OpenDialog1.FileName);
922 Rewrite(F);
923 Write(F, CurrentWave^);
924 CloseFile(F);
925 end;
926 end;
927
928 procedure TfrmTracker.InstrumentExportButtonClick(Sender: TObject);
929 var
930 F: file of TInstrument;
931 begin
932 OpenDialog1.Filter := 'hUGETracker instruments|*.ugi';
933 if SaveDialog1.Execute then begin
934 AssignFile(F, SaveDialog1.FileName);
935 Rewrite(F);
936 Write(F, CurrentInstrument^);
937 CloseFile(F);
938 end;
939 end;
940
941 procedure TfrmTracker.InstrumentImportButtonClick(Sender: TObject);
942 var
943 F: file of TInstrument;
944 begin
945 OpenDialog1.Filter := 'hUGETracker instruments|*.ugi';
946 if OpenDialog1.Execute then begin
947 AssignFile(F, OpenDialog1.FileName);
948 Reset(F);
949 Read(F, CurrentInstrument^);
950 CloseFile(F);
951 end;
952 end;
953
879 procedure TfrmTracker.DirectionComboBoxChange(Sender: TObject); 954 procedure TfrmTracker.DirectionComboBoxChange(Sender: TObject);
880 begin 955 begin
881 case DirectionComboBox.Text of 956 case DirectionComboBox.Text of
@@ -1033,17 +1108,6 @@ begin
1033 end; 1108 end;
1034 end; 1109 end;
1035 1110
1036 procedure TfrmTracker.ExportButtonClick(Sender: TObject);
1037 var F: file of TWave;
1038 begin
1039 if SaveDialog1.Execute then begin
1040 AssignFile(F, OpenDialog1.FileName);
1041 Rewrite(F);
1042 Write(F, CurrentWave^);
1043 CloseFile(F);
1044 end;
1045 end;
1046
1047 procedure TfrmTracker.InstrumentNameEditChange(Sender: TObject); 1111 procedure TfrmTracker.InstrumentNameEditChange(Sender: TObject);
1048 begin 1112 begin
1049 CurrentInstrument^.Name := InstrumentNameEdit.Text; 1113 CurrentInstrument^.Name := InstrumentNameEdit.Text;
@@ -1200,20 +1264,7 @@ end;
1200 1264
1201 procedure TfrmTracker.PanicToolButtonClick(Sender: TObject); 1265 procedure TfrmTracker.PanicToolButtonClick(Sender: TObject);
1202 begin 1266 begin
1203 // Silence CH1 1267 Panic;
1204 Spokeb(NR12, 0);
1205 Spokeb(NR14, %10000000);
1206
1207 // Silence CH2
1208 Spokeb(NR22, 0);
1209 Spokeb(NR24, %10000000);
1210
1211 // Silence CH3
1212 Spokeb(NR30, 0);
1213
1214 // Silence CH4
1215 Spokeb(NR42, 0);
1216 Spokeb(NR44, %10000000);
1217 end; 1268 end;
1218 1269
1219 procedure TfrmTracker.TicksPerRowSpinEditChange(Sender: TObject); 1270 procedure TfrmTracker.TicksPerRowSpinEditChange(Sender: TObject);
Modifiedtrackergrid.pas +7−4
@@ -61,8 +61,7 @@ type
61 61
62 TTrackerGrid = class(TCustomControl) 62 TTrackerGrid = class(TCustomControl)
63 procedure Paint; override; 63 procedure Paint; override;
64 procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 64 procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
65 override;
66 procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 65 procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
67 procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; 66 procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
68 67
@@ -142,6 +141,8 @@ type
142 141
143 implementation 142 implementation
144 143
144 uses Tracker; // hack
145
145 { TSelectionEnumerator } 146 { TSelectionEnumerator }
146 147
147 constructor TSelectionEnumerator.Create(Grid: TPatternGrid; Cursor, 148 constructor TSelectionEnumerator.Create(Grid: TPatternGrid; Cursor,
@@ -655,11 +656,13 @@ begin
655 Keybindings.TryGetData(Key, Temp); 656 Keybindings.TryGetData(Key, Temp);
656 if Temp <> -1 then begin 657 if Temp <> -1 then begin
657 Note := Min(HIGHEST_NOTE, Temp+(SelectedOctave*12)); 658 Note := Min(HIGHEST_NOTE, Temp+(SelectedOctave*12));
658 if Instrument = 0 then 659 Instrument := SelectedInstrument;
659 Instrument := SelectedInstrument;
660 660
661 Inc(Cursor.Y, Step); 661 Inc(Cursor.Y, Step);
662 ClampCursors; 662 ClampCursors;
663
664 {if Instrument > 0 then
665 SendMessage(frmTracker.Handle, LM_PREVIEW_NOTE, Note, Instrument);}
663 end; 666 end;
664 end; 667 end;
665 668