aboutsummaryrefslogtreecommitdiffstats
path: root/unicode/src/screens/UScreenEditConvert.pas
diff options
context:
space:
mode:
Diffstat (limited to 'unicode/src/screens/UScreenEditConvert.pas')
-rw-r--r--unicode/src/screens/UScreenEditConvert.pas242
1 files changed, 146 insertions, 96 deletions
diff --git a/unicode/src/screens/UScreenEditConvert.pas b/unicode/src/screens/UScreenEditConvert.pas
index 328398aa..835590ed 100644
--- a/unicode/src/screens/UScreenEditConvert.pas
+++ b/unicode/src/screens/UScreenEditConvert.pas
@@ -48,21 +48,21 @@ uses
type
TNote = record
- Event: integer;
- EventType: integer;
- Channel: integer;
- Start: real;
- Len: real;
- Data1: integer;
- Data2: integer;
- Str: string;
+ Event: integer;
+ EventType: integer;
+ Channel: integer;
+ Start: real;
+ Len: real;
+ Data1: integer;
+ Data2: integer;
+ Str: string;
end;
TTrack = record
- Note: array of TNote;
- Name: string;
- Hear: boolean;
- Status: byte; // 0 - none, 1 - notes, 2 - lyrics, 3 - notes + lyrics
+ Note: array of TNote;
+ Name: string;
+ Hear: boolean;
+ Status: set of (notes, lyrics);
end;
TNuta = record
@@ -77,29 +77,29 @@ type
TScreenEditConvert = class(TMenu)
public
- ATrack: TArrayTrack; // actual track
-// Track: TArrayTrack;
- Channel: TArrayTrack;
- ColR: array[0..100] of real;
- ColG: array[0..100] of real;
- ColB: array[0..100] of real;
- Len: real;
- Sel: integer;
- Selected: boolean;
-// FileName: string;
+ ATrack: TArrayTrack; // actual track
+// Track: TArrayTrack;
+ Channel: TArrayTrack;
+ ColR: array[0..100] of real;
+ ColG: array[0..100] of real;
+ ColB: array[0..100] of real;
+ Len: real;
+ Sel: integer;
+ Selected: boolean;
+// FileName: string;
{$IFDEF UseMIDIPort}
- MidiFile: TMidiFile;
- MidiTrack: TMidiTrack;
- MidiEvent: pMidiEvent;
- MidiOut: TMidiOutput;
+ MidiFile: TMidiFile;
+ MidiTrack: TMidiTrack;
+ MidiEvent: pMidiEvent;
+ MidiOut: TMidiOutput;
{$ENDIF}
- Song: TSong;
- Lines: TLines;
- BPM: real;
- Ticks: real;
- Note: array of TNuta;
+ Song: TSong;
+ Lines: TLines;
+ BPM: real;
+ Ticks: real;
+ Note: array of TNuta;
procedure AddLyric(Start: integer; Text: string);
procedure Extract;
@@ -111,26 +111,30 @@ type
function SelectedNumber: integer;
constructor Create; override;
procedure onShow; override;
- function ParseInput(PressedKey: Cardinal; CharCode: UCS4Char; PressedDown: Boolean): Boolean; override;
+ function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
function Draw: boolean; override;
procedure onHide; override;
end;
+var
+ ConversionFileName: string;
+
implementation
uses
SysUtils,
+ TextGL,
gl,
- UGraphic,
UDrawTexture,
- TextGL,
UFiles,
- UMain,
+ UGraphic,
UIni,
+ UMain,
+ UPath,
USkins,
UUnicodeUtils;
-function TScreenEditConvert.ParseInput(PressedKey: Cardinal; CharCode: UCS4Char; PressedDown: Boolean): Boolean;
+function TScreenEditConvert.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
begin
Result := true;
If (PressedDown) Then
@@ -175,13 +179,16 @@ begin
{$ENDIF}
end;
- if Interaction = 2 then begin
+ if Interaction = 2 then
+ begin
Selected := true;
{$IFDEF UseMIDIPort}
MidiFile.OnMidiEvent := nil;
{$ENDIF}
- {for T := 0 to High(ATrack) do begin
- if ATrack[T].Hear then begin
+ {for T := 0 to High(ATrack) do
+ begin
+ if ATrack[T].Hear then
+ begin
MidiTrack := MidiFile.GetTrack(T);
MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
end;
@@ -189,8 +196,10 @@ begin
MidiFile.StartPlaying;//}
end;
- if Interaction = 3 then begin
- if SelectedNumber > 0 then begin
+ if Interaction = 3 then
+ begin
+ if SelectedNumber > 0 then
+ begin
Extract;
SaveSong(Song, Lines, ChangeFileExt(ConversionFileName, '.txt'), false);
end;
@@ -201,9 +210,19 @@ begin
SDLK_SPACE:
begin
// ATrack[Sel].Hear := not ATrack[Sel].Hear;
- ATrack[Sel].Status := (ATrack[Sel].Status + 1) mod 4;
-
-{ if Selected then begin
+ if Notes in ATrack[Sel].Status then
+ begin
+ ATrack[Sel].Status := ATrack[Sel].Status - [Notes];
+ if Lyrics in ATrack[Sel].Status then
+ ATrack[Sel].Status := ATrack[Sel].Status - [Lyrics]
+ else
+ ATrack[Sel].Status := ATrack[Sel].Status + [Lyrics];
+ end
+ else
+ ATrack[Sel].Status := ATrack[Sel].Status + [Notes];
+
+{ if Selected then
+ begin
MidiTrack := MidiFile.GetTrack(Sel);
if Track[Sel].Hear then
MidiTrack.OnMidiEvent := MidiFile1MidiEvent
@@ -225,12 +244,14 @@ begin
SDLK_DOWN:
begin
Inc(Sel);
- if Sel > High(ATrack) then Sel := 0;
+ if Sel > High(ATrack) then
+ Sel := 0;
end;
SDLK_UP:
begin
Dec(Sel);
- if Sel < 0 then Sel := High(ATrack);
+ if Sel < 0 then
+ Sel := High(ATrack);
end;
end;
end;
@@ -240,11 +261,15 @@ procedure TScreenEditConvert.AddLyric(Start: integer; Text: string);
var
N: integer;
begin
- for N := 0 to High(Note) do begin
- if Note[N].Start = Start then begin
+ for N := 0 to High(Note) do
+ begin
+ if Note[N].Start = Start then
+ begin
// check for new sentece
- if Copy(Text, 1, 1) = '\' then Delete(Text, 1, 1);
- if Copy(Text, 1, 1) = '/' then begin
+ if Copy(Text, 1, 1) = '\' then
+ Delete(Text, 1, 1);
+ if Copy(Text, 1, 1) = '/' then
+ begin
Delete(Text, 1, 1);
Note[N].NewSentence := true;
end;
@@ -279,11 +304,16 @@ begin
SetLength(Note, 0);
// extract notes
- for T := 0 to High(ATrack) do begin
-// if ATrack[T].Hear then begin
- if ((ATrack[T].Status div 1) and 1) = 1 then begin
- for N := 0 to High(ATrack[T].Note) do begin
- if (ATrack[T].Note[N].EventType = 9) and (ATrack[T].Note[N].Data2 > 0) then begin
+ for T := 0 to High(ATrack) do
+ begin
+// if ATrack[T].Hear then
+// begin
+ if Notes in ATrack[T].Status then
+ begin
+ for N := 0 to High(ATrack[T].Note) do
+ begin
+ if (ATrack[T].Note[N].EventType = 9) and (ATrack[T].Note[N].Data2 > 0) then
+ begin
Nu := Length(Note);
SetLength(Note, Nu + 1);
Note[Nu].Start := Round(ATrack[T].Note[N].Start / Ticks);
@@ -296,11 +326,16 @@ begin
end;
// extract lyrics
- for T := 0 to High(ATrack) do begin
-// if ATrack[T].Hear then begin
- if ((ATrack[T].Status div 2) and 1) = 1 then begin
- for N := 0 to High(ATrack[T].Note) do begin
- if (ATrack[T].Note[N].EventType = 15) then begin
+ for T := 0 to High(ATrack) do
+ begin
+// if ATrack[T].Hear then
+// begin
+ if Lyrics in ATrack[T].Status then
+ begin
+ for N := 0 to High(ATrack[T].Note) do
+ begin
+ if (ATrack[T].Note[N].EventType = 15) then
+ begin
// Log.LogStatus('<' + Track[T].Note[N].Str + '>', 'MIDI');
AddLyric(Round(ATrack[T].Note[N].Start / Ticks), ATrack[T].Note[N].Str);
end;
@@ -311,7 +346,8 @@ begin
// sort notes
for N := 0 to High(Note) do
for Nu := 0 to High(Note)-1 do
- if Note[Nu].Start > Note[Nu+1].Start then begin
+ if Note[Nu].Start > Note[Nu+1].Start then
+ begin
NoteTemp := Note[Nu];
Note[Nu] := Note[Nu+1];
Note[Nu+1] := NoteTemp;
@@ -331,8 +367,10 @@ begin
N := 0;
Lines.Line[C].HighNote := -1;
- for Nu := 0 to High(Note) do begin
- if Note[Nu].NewSentence then begin // nowa linijka
+ for Nu := 0 to High(Note) do
+ begin
+ if Note[Nu].NewSentence then // new line
+ begin
SetLength(Lines.Line, Length(Lines.Line)+1);
Lines.Number := Lines.Number + 1;
Lines.High := Lines.High + 1;
@@ -363,10 +401,10 @@ begin
end;
end;
- // tworzy miejsce na nowa nute
+ // create space for new note
SetLength(Lines.Line[C].Note, Length(Lines.Line[C].Note)+1);
- // dopisuje
+ // initialize note
Lines.Line[C].Note[N].Start := Note[Nu].Start;
Lines.Line[C].Note[N].Length := Note[Nu].Len;
Lines.Line[C].Note[N].Tone := Note[Nu].Tone;
@@ -383,8 +421,10 @@ var
begin
Result := 0;
for T := 0 to High(ATrack) do
-// if ATrack[T].Hear then Inc(Result);
- if ((ATrack[T].Status div 1) and 1) = 1 then Inc(Result);
+// if ATrack[T].Hear then
+// Inc(Result);
+ if Notes in ATrack[T].Status then
+ Inc(Result);
end;
{$IFDEF UseMIDIPort}
@@ -428,7 +468,8 @@ begin
MidiFile := TMidiFile.Create(nil);
{$ENDIF}
- for P := 0 to 100 do begin
+ for P := 0 to 100 do
+ begin
ColR[P] := Random(10)/10;
ColG[P] := Random(10)/10;
ColB[P] := Random(10)/10;
@@ -464,13 +505,15 @@ begin
BPM := MidiFile.Bpm;
Ticks := MidiFile.TicksPerQuarter / 4;
-{ for T := 0 to MidiFile.NumberOfTracks-1 do begin
+{ for T := 0 to MidiFile.NumberOfTracks-1 do
+ begin
SetLength(Track, Length(Track)+1);
MidiTrack := MidiFile.GetTrack(T);
MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
Track[T].Name := MidiTrack.getName;
- for N := 0 to MidiTrack.getEventCount-1 do begin
+ for N := 0 to MidiTrack.getEventCount-1 do
+ begin
SetLength(Track[T].Note, Length(Track[T].Note)+1);
MidiEvent := MidiTrack.GetEvent(N);
Track[T].Note[N].Start := MidiEvent.time;
@@ -487,20 +530,21 @@ begin
end;
end;}
-
SetLength(Channel, 16);
for T := 0 to 15 do
begin
Channel[T].Name := IntToStr(T+1);
SetLength(Channel[T].Note, 0);
- Channel[T].Status := 0;
+ Channel[T].Status := [];
end;
- for T := 0 to MidiFile.NumberOfTracks-1 do begin
+ for T := 0 to MidiFile.NumberOfTracks-1 do
+ begin
MidiTrack := MidiFile.GetTrack(T);
MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
- for N := 0 to MidiTrack.getEventCount-1 do begin
+ for N := 0 to MidiTrack.getEventCount-1 do
+ begin
MidiEvent := MidiTrack.GetEvent(N);
C := MidiEvent.event and 15;
@@ -530,8 +574,8 @@ end;
function TScreenEditConvert.Draw: boolean;
var
- Pet: integer;
- Pet2: integer;
+ Count: integer;
+ Count2: integer;
Bottom: real;
X: real;
Y: real;
@@ -544,7 +588,8 @@ begin
Y := 100;
H := Length(ATrack)*40;
- if H > 480 then H := 480;
+ if H > 480 then
+ H := 480;
Bottom := Y + H;
YSkip := H / Length(ATrack);
@@ -553,18 +598,21 @@ begin
DrawQuad(10, Y+Sel*YSkip, 780, YSkip, 0.8, 0.8, 0.8);
// selected - now me use Status System
- for Pet := 0 to High(ATrack) do
- if ATrack[Pet].Hear then
- DrawQuad(10, Y+Pet*YSkip, 50, YSkip, 0.8, 0.3, 0.3);
+ for Count := 0 to High(ATrack) do
+ if ATrack[Count].Hear then
+ DrawQuad(10, Y+Count*YSkip, 50, YSkip, 0.8, 0.3, 0.3);
glColor3f(0, 0, 0);
- for Pet := 0 to High(ATrack) do begin
- if ((ATrack[Pet].Status div 1) and 1) = 1 then begin
- SetFontPos(25, Y + Pet*YSkip + 10);
+ for Count := 0 to High(ATrack) do
+ begin
+ if Notes in ATrack[Count].Status then
+ begin
+ SetFontPos(25, Y + Count*YSkip + 10);
SetFontSize(15);
glPrint('N');
end;
- if ((ATrack[Pet].Status div 2) and 1) = 1 then begin
- SetFontPos(40, Y + Pet*YSkip + 10);
+ if Lyrics in ATrack[Count].Status then
+ begin
+ SetFontPos(40, Y + Count*YSkip + 10);
SetFontSize(15);
glPrint('L');
end;
@@ -574,21 +622,23 @@ begin
DrawLine(60, Y, 60, Bottom, 0, 0, 0);
DrawLine(790, Y, 790, Bottom, 0, 0, 0);
- for Pet := 0 to Length(ATrack) do
- DrawLine(10, Y+Pet*YSkip, 790, Y+Pet*YSkip, 0, 0, 0);
+ for Count := 0 to Length(ATrack) do
+ DrawLine(10, Y+Count*YSkip, 790, Y+Count*YSkip, 0, 0, 0);
- for Pet := 0 to High(ATrack) do begin
- SetFontPos(11, Y + 10 + Pet*YSkip);
+ for Count := 0 to High(ATrack) do
+ begin
+ SetFontPos(11, Y + 10 + Count*YSkip);
SetFontSize(15);
- glPrint(ATrack[Pet].Name);
+ glPrint(ATrack[Count].Name);
end;
- for Pet := 0 to High(ATrack) do
- for Pet2 := 0 to High(ATrack[Pet].Note) do begin
- if ATrack[Pet].Note[Pet2].EventType = 9 then
- DrawQuad(60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + (Pet+1)*YSkip - ATrack[Pet].Note[Pet2].Data1*35/127, 3, 3, ColR[Pet], ColG[Pet], ColB[Pet]);
- if ATrack[Pet].Note[Pet2].EventType = 15 then
- DrawLine(60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + 0.75 * YSkip + Pet*YSkip, 60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + YSkip + Pet*YSkip, ColR[Pet], ColG[Pet], ColB[Pet]);
+ for Count := 0 to High(ATrack) do
+ for Count2 := 0 to High(ATrack[Count].Note) do
+ begin
+ if ATrack[Count].Note[Count2].EventType = 9 then
+ DrawQuad(60 + ATrack[Count].Note[Count2].Start/Len * 725, Y + (Count+1)*YSkip - ATrack[Count].Note[Count2].Data1*35/127, 3, 3, ColR[Count], ColG[Count], ColB[Count]);
+ if ATrack[Count].Note[Count2].EventType = 15 then
+ DrawLine(60 + ATrack[Count].Note[Count2].Start/Len * 725, Y + 0.75 * YSkip + Count*YSkip, 60 + ATrack[Count].Note[Count2].Start/Len * 725, Y + YSkip + Count*YSkip, ColR[Count], ColG[Count], ColB[Count]);
end;
// playing line