Commit 3b526df

Nick Faro committed on
Correct generation of time wait commands
commit 3b526df32abb153c58c69647f951ffbde360a6c4 parent 9f5bc91
2 changed files +21−13
Modifiedtracker.pas +7−1
@@ -2015,6 +2015,9 @@ begin
2015 ParseSymFile('render/preview.sym'); 2015 ParseSymFile('render/preview.sym');
2016 2016
2017 ExportVGMFile(VGMSaveDialog.FileName, Song.Name, Song.Artist, Song.Comment); 2017 ExportVGMFile(VGMSaveDialog.FileName, Song.Name, Song.Artist, Song.Comment);
2018
2019 StartPlayback;
2020 HaltPlayback;
2018 end; 2021 end;
2019 end; 2022 end;
2020 2023
@@ -2046,11 +2049,14 @@ end;
2046 2049
2047 procedure TfrmTracker.DebugButtonClick(Sender: TObject); 2050 procedure TfrmTracker.DebugButtonClick(Sender: TObject);
2048 begin 2051 begin
2049 if RenderPreviewROM then begin 2052 if RenderPreviewROM then begin
2050 StopPlayback; 2053 StopPlayback;
2051 ParseSymFile('render/preview.sym'); 2054 ParseSymFile('render/preview.sym');
2052 2055
2053 ExportVGMFile('C:/tmp/yeah.vgm', 'Joogus', 'Nick Faro', 'This song sucks.'); 2056 ExportVGMFile('C:/tmp/yeah.vgm', 'Joogus', 'Nick Faro', 'This song sucks.');
2057
2058 StartPlayback;
2059 HaltPlayback;
2054 end; 2060 end;
2055 end; 2061 end;
2056 2062
Modifiedvgm.pas +14−12
@@ -68,12 +68,9 @@ type
68 K053260clock: UInt32; 68 K053260clock: UInt32;
69 Pokeyclock: UInt32; 69 Pokeyclock: UInt32;
70 QSoundclock: UInt32; 70 QSoundclock: UInt32;
71 Reserved3: UInt64; // 8 bytes 71 Reserved3: UInt64;
72 end; 72 end;
73 73
74 var
75 RecordingVGM: Boolean = False;
76
77 procedure ExportVGMFile(F: String; TrackName: String; ArtistName: String; Comments: String); 74 procedure ExportVGMFile(F: String; TrackName: String; ArtistName: String; Comments: String);
78 75
79 procedure VGMWriteReg(Reg: Integer; Value: Integer); 76 procedure VGMWriteReg(Reg: Integer; Value: Integer);
@@ -99,7 +96,8 @@ var
99 OrderChecker: TOrderChecker; 96 OrderChecker: TOrderChecker;
100 StartOfSong, CurrentOrder: Integer; 97 StartOfSong, CurrentOrder: Integer;
101 VGMFile: TFileStream; 98 VGMFile: TFileStream;
102 TotalWaitSamps: Integer; 99 TotalWaitSamps, LoopWaitSamps: LongInt;
100 CyclesSinceLastTick: Integer;
103 101
104 procedure WriteUtf16String(S: String); 102 procedure WriteUtf16String(S: String);
105 var 103 var
@@ -119,6 +117,7 @@ var
119 117
120 YY,MM,DD: Word; 118 YY,MM,DD: Word;
121 GD3Temp: Integer; 119 GD3Temp: Integer;
120 StepCycles: Integer;
122 begin 121 begin
123 // TODO: Manage these callbacks in a better way, maybe some sort of stack. 122 // TODO: Manage these callbacks in a better way, maybe some sort of stack.
124 OldFD := FDCallback; 123 OldFD := FDCallback;
@@ -143,8 +142,10 @@ begin
143 Header := Default(TVGMHeader); // Zero the header 142 Header := Default(TVGMHeader); // Zero the header
144 VGMFile.WriteBuffer(Header, SizeOf(Header)); // Write dummy header (will overwrite later) 143 VGMFile.WriteBuffer(Header, SizeOf(Header)); // Write dummy header (will overwrite later)
145 144
145 CyclesSinceLastTick := 0;
146 repeat 146 repeat
147 z80_decode 147 StepCycles := z80_decode;
148 Inc(CyclesSinceLastTick, StepCycles);
148 until StartOfSong <> -1; 149 until StartOfSong <> -1;
149 150
150 VGMFile.WriteByte($66); // End of data 151 VGMFile.WriteByte($66); // End of data
@@ -154,8 +155,8 @@ begin
154 // Update the header to point to the GD3 tag, then write it 155 // Update the header to point to the GD3 tag, then write it
155 Header.GD3offset := VGMFile.Position - $14; 156 Header.GD3offset := VGMFile.Position - $14;
156 157
157 VGMFile.WriteDWord($20336447); 158 VGMFile.WriteDWord($20336447); // 'Gd3 '
158 VGMFile.WriteDWord($00000100); 159 VGMFile.WriteDWord($00000100); // Version
159 160
160 GD3Temp := VGMFile.Position; 161 GD3Temp := VGMFile.Position;
161 VGMFile.WriteDWord(0); // dummy value... 162 VGMFile.WriteDWord(0); // dummy value...
@@ -209,9 +210,9 @@ end;
209 210
210 procedure VGMWait(Amount: Integer); 211 procedure VGMWait(Amount: Integer);
211 begin 212 begin
212 VGMFile.WriteByte($62); // TODO: Use the smaller commands if it matches 213 VGMFile.WriteByte($61); // TODO: Use the smaller commands if it matches
213 //VGMFile.WriteWord(Word(Amount)); 214 VGMFile.WriteWord(Word(Amount));
214 Inc(TotalWaitSamps, 735); 215 Inc(TotalWaitSamps, Amount);
215 end; 216 end;
216 217
217 { TOrderChecker } 218 { TOrderChecker }
@@ -231,7 +232,8 @@ end;
231 232
232 procedure TOrderChecker.TickCallback; 233 procedure TOrderChecker.TickCallback;
233 begin 234 begin
234 VGMWait(0); 235 VGMWait(Trunc((CyclesSinceLastTick / (4194304))*44100.0));
236 CyclesSinceLastTick := 0;
235 end; 237 end;
236 238
237 begin 239 begin