Commit 5c34ba9

Nick committed on
WIP beepbox importing
commit 5c34ba98294c2c099c201ca21c8ebcd065c728af parent 3adb564
7 changed files +92−34
Addedbeepboximport.pas +55−0
@@ -0,0 +1,55 @@
1 unit BeepBoxImport;
2
3 {$mode objfpc}{$H+}
4
5 interface
6
7 uses
8 Classes, SysUtils, fpjson, Song, hugedatatypes, constants;
9
10 function LoadSongFromBeepBoxJsonStream(Stream: TStream): TSong;
11
12 implementation
13
14 procedure TranscribePattern(BBPat: TJSONObject; Pat: PPattern);
15 var
16 Notes: TJSONArray;
17 I: Integer;
18 NoteVal, TickStart, TickEnd: Integer;
19 begin
20 Notes := TJSONArray(BBPat.FindPath('notes'));
21 for I := 0 to Notes.Count-1 do begin
22 NoteVal := Notes[I].FindPath('pitches[0]').AsInteger - C_5;
23 TickStart := Notes[I].FindPath('points[0].tick').AsInteger;
24 TickEnd := Notes[I].FindPath('points[1].tick').AsInteger;
25
26 with Pat^[TickStart] do begin
27 Note := NoteVal;
28 Instrument := 1;
29 EffectCode := $0;
30 EffectParams.Value := $00;
31 end;
32
33 with Pat^[TickEnd] do begin
34 EffectCode := $E;
35 EffectParams.Value := $00;
36 end;
37 end;
38 end;
39
40 function LoadSongFromBeepBoxJsonStream(Stream: TStream): TSong;
41 var
42 jData: TJSONData;
43 jObject: TJSONObject;
44 begin
45 jData := GetJSON(Stream);
46 jObject := TJSONObject(jData);
47
48 InitializeSong(Result);
49 Result.TicksPerRow := 6;
50 TranscribePattern(TJSONObject(jObject.FindPath('channels[0].patterns[0]')), Result.Patterns.GetOrCreateNew(0));
51 TranscribePattern(TJSONObject(jObject.FindPath('channels[1].patterns[0]')), Result.Patterns.GetOrCreateNew(1));
52 end;
53
54 end.
55
ModifiedhUGETracker.lpi +6−1
@@ -221,7 +221,7 @@
221 <PackageName Value="LCL"/> 221 <PackageName Value="LCL"/>
222 </Item5> 222 </Item5>
223 </RequiredPackages> 223 </RequiredPackages>
224 <Units Count="24"> 224 <Units Count="25">
225 <Unit0> 225 <Unit0>
226 <Filename Value="hUGETracker.lpr"/> 226 <Filename Value="hUGETracker.lpr"/>
227 <IsPartOfProject Value="True"/> 227 <IsPartOfProject Value="True"/>
@@ -348,6 +348,11 @@
348 <IsPartOfProject Value="True"/> 348 <IsPartOfProject Value="True"/>
349 <UnitName Value="hUGESettings"/> 349 <UnitName Value="hUGESettings"/>
350 </Unit23> 350 </Unit23>
351 <Unit24>
352 <Filename Value="beepboximport.pas"/>
353 <IsPartOfProject Value="True"/>
354 <UnitName Value="BeepBoxImport"/>
355 </Unit24>
351 </Units> 356 </Units>
352 </ProjectOptions> 357 </ProjectOptions>
353 <CompilerOptions> 358 <CompilerOptions>
Modifiedhugedatatypes.pas +0−10
@@ -54,7 +54,6 @@ type
54 //TPatternMap = specialize TFPGMap<Integer, PPattern>; 54 //TPatternMap = specialize TFPGMap<Integer, PPattern>;
55 TPatternMap = class(specialize TFPGMap<Integer, PPattern>) 55 TPatternMap = class(specialize TFPGMap<Integer, PPattern>)
56 function GetOrCreateNew(Key: Integer): PPattern; 56 function GetOrCreateNew(Key: Integer): PPattern;
57 function CreateNewPattern(Key: Integer): PPattern;
58 function MaxKey: Integer; 57 function MaxKey: Integer;
59 58
60 procedure DeletePattern(Key: Integer); 59 procedure DeletePattern(Key: Integer);
@@ -164,15 +163,6 @@ begin
164 end; 163 end;
165 end; 164 end;
166 165
167 function TPatternMap.CreateNewPattern(Key: Integer): PPattern;
168 begin
169 if IndexOf(Key) <> -1 then Exit(KeyData[Key]);
170
171 New(Result);
172 BlankPattern(Result);
173 Self.Add(Key, Result);
174 end;
175
176 function TPatternMap.MaxKey: Integer; 166 function TPatternMap.MaxKey: Integer;
177 var 167 var
178 X: Integer; 168 X: Integer;
Modifiedmodimport.pas +4−4
@@ -229,10 +229,10 @@ begin
229 229
230 // Convert all patterns 230 // Convert all patterns
231 for I := Low(ModFile.Patterns) to High(ModFile.Patterns) do begin 231 for I := Low(ModFile.Patterns) to High(ModFile.Patterns) do begin
232 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.CreateNewPattern(I*10 + 0), 1); 232 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.GetOrCreateNew(I*10 + 0), 1);
233 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.CreateNewPattern(I*10 + 1), 2); 233 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.GetOrCreateNew(I*10 + 1), 2);
234 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.CreateNewPattern(I*10 + 2), 3); 234 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.GetOrCreateNew(I*10 + 2), 3);
235 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.CreateNewPattern(I*10 + 3), 4); 235 TranscribeColumn(ModFile.Patterns[I], Result.Patterns.GetOrCreateNew(I*10 + 3), 4);
236 end; 236 end;
237 237
238 // Import the order table. Uses a weird numbering scheme because hUGE has 238 // Import the order table. Uses a weird numbering scheme because hUGE has
Modifiedrendertowave.lfm +2−2
@@ -1,7 +1,7 @@
1 object frmRenderToWave: TfrmRenderToWave 1 object frmRenderToWave: TfrmRenderToWave
2 Left = 1806 2 Left = 1810
3 Height = 219 3 Height = 219
4 Top = 236 4 Top = 240
5 Width = 451 5 Width = 451
6 BorderStyle = bsSingle 6 BorderStyle = bsSingle
7 Caption = 'Render song' 7 Caption = 'Render song'
Modifiedtracker.lfm +5−7
@@ -1,7 +1,7 @@
1 object frmTracker: TfrmTracker 1 object frmTracker: TfrmTracker
2 Left = 484 2 Left = 487
3 Height = 653 3 Height = 653
4 Top = 122 4 Top = 125
5 Width = 1232 5 Width = 1232
6 AllowDropFiles = True 6 AllowDropFiles = True
7 Caption = 'hUGETracker' 7 Caption = 'hUGETracker'
@@ -2019,13 +2019,11 @@ object frmTracker: TfrmTracker
2019 end 2019 end
2020 object DebugPlayNoteButton: TMenuItem 2020 object DebugPlayNoteButton: TMenuItem
2021 Caption = 'Debug play note' 2021 Caption = 'Debug play note'
2022 Visible = False
2023 OnClick = DebugPlayNoteButtonClick 2022 OnClick = DebugPlayNoteButtonClick
2024 end 2023 end
2025 object DebugShiteButton: TMenuItem 2024 object DebugButton: TMenuItem
2026 Caption = 'Debug shite' 2025 Caption = 'Debug button'
2027 Visible = False 2026 OnClick = DebugButtonClick
2028 OnClick = DebugShiteButtonClick
2029 end 2027 end
2030 end 2028 end
2031 object MenuBarActionList: TActionList 2029 object MenuBarActionList: TActionList
Modifiedtracker.pas +20−10
@@ -10,7 +10,7 @@ uses
10 sound, vars, machine, about_hugetracker, TrackerGrid, lclintf, lmessages, 10 sound, vars, machine, about_hugetracker, TrackerGrid, lclintf, lmessages,
11 Buttons, Grids, DBCtrls, HugeDatatypes, LCLType, Clipbrd, RackCtls, Codegen, 11 Buttons, Grids, DBCtrls, HugeDatatypes, LCLType, Clipbrd, RackCtls, Codegen,
12 SymParser, options, bgrabitmap, effecteditor, RenderToWave, 12 SymParser, options, bgrabitmap, effecteditor, RenderToWave,
13 modimport, mainloop, strutils, Types, Keymap, hUGESettings; 13 modimport, beepboximport, mainloop, strutils, Types, Keymap, hUGESettings;
14 14
15 // TODO: Move to config file? 15 // TODO: Move to config file?
16 const 16 const
@@ -170,7 +170,7 @@ type
170 MenuItem13: TMenuItem; 170 MenuItem13: TMenuItem;
171 MenuItem14: TMenuItem; 171 MenuItem14: TMenuItem;
172 MenuItem15: TMenuItem; 172 MenuItem15: TMenuItem;
173 DebugShiteButton: TMenuItem; 173 DebugButton: TMenuItem;
174 N3: TMenuItem; 174 N3: TMenuItem;
175 N2: TMenuItem; 175 N2: TMenuItem;
176 MenuItem6: TMenuItem; 176 MenuItem6: TMenuItem;
@@ -258,7 +258,7 @@ type
258 TreeView1: TTreeView; 258 TreeView1: TTreeView;
259 TrackerGrid: TTrackerGrid; 259 TrackerGrid: TTrackerGrid;
260 procedure Button1Click(Sender: TObject); 260 procedure Button1Click(Sender: TObject);
261 procedure DebugShiteButtonClick(Sender: TObject); 261 procedure DebugButtonClick(Sender: TObject);
262 procedure DecrementCurrentInstrumentActionExecute(Sender: TObject); 262 procedure DecrementCurrentInstrumentActionExecute(Sender: TObject);
263 procedure DeleteRowActionExecute(Sender: TObject); 263 procedure DeleteRowActionExecute(Sender: TObject);
264 procedure DeleteRowActionUpdate(Sender: TObject); 264 procedure DeleteRowActionUpdate(Sender: TObject);
@@ -1436,9 +1436,9 @@ begin
1436 // Switch to general tab sheet 1436 // Switch to general tab sheet
1437 PageControl1.ActivePageIndex := 0; 1437 PageControl1.ActivePageIndex := 0;
1438 1438
1439 {$ifdef DEVELOPMENT} 1439 {$ifdef PRODUCTION}
1440 DebugShiteButton.Visible := True; 1440 DebugButton.Visible := False;
1441 DebugPlayNoteButton.Visible := True; 1441 DebugPlayNoteButton.Visible := False;
1442 {$endif} 1442 {$endif}
1443 1443
1444 // Load sample songs list 1444 // Load sample songs list
@@ -1946,9 +1946,19 @@ begin
1946 PreviewC5; 1946 PreviewC5;
1947 end; 1947 end;
1948 1948
1949 procedure TfrmTracker.DebugShiteButtonClick(Sender: TObject); 1949 procedure TfrmTracker.DebugButtonClick(Sender: TObject);
1950 var
1951 S: TStream;
1950 begin 1952 begin
1951 //writeln(UniqueOrdersDuringPlayback(Song, 0, 99999)); 1953 S := TFileStream.Create('C:/test/bbs.json', fmOpenRead);
1954 try
1955 DestroySong(Song);
1956 Song := LoadSongFromBeepBoxJsonStream(S);
1957 finally
1958 S.Free;
1959 end;
1960
1961 UpdateUIAfterLoad('Yeah!');
1952 end; 1962 end;
1953 1963
1954 procedure TfrmTracker.DecrementCurrentInstrumentActionExecute(Sender: TObject); 1964 procedure TfrmTracker.DecrementCurrentInstrumentActionExecute(Sender: TObject);
@@ -2138,7 +2148,7 @@ begin
2138 ); 2148 );
2139 2149
2140 for X := 0 to 3 do 2150 for X := 0 to 3 do
2141 Song.Patterns.CreateNewPattern(Highest+X); 2151 Song.Patterns.GetOrCreateNew(Highest+X);
2142 2152
2143 ReloadPatterns; 2153 ReloadPatterns;
2144 end; 2154 end;
@@ -2186,7 +2196,7 @@ begin
2186 ); 2196 );
2187 2197
2188 for X := 0 to 3 do 2198 for X := 0 to 3 do
2189 Song.Patterns.CreateNewPattern(Highest+X)^ := 2199 Song.Patterns.GetOrCreateNew(Highest+X)^ :=
2190 Song.Patterns.KeyData[StrToInt(Rows[Row][X+1])]^; 2200 Song.Patterns.KeyData[StrToInt(Rows[Row][X+1])]^;
2191 end; 2201 end;
2192 2202