Skip to content

Commit 95b1db3

Browse files
committed
DJH2 lyrics support, including LYRIC_PAGE and LYRIC_COLOR markers.
Also better handling of unknown notetypes
1 parent efc0a1a commit 95b1db3

File tree

2 files changed

+92
-17
lines changed

2 files changed

+92
-17
lines changed

Sharktooth/Mub/MubExport.cs

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,28 +153,50 @@ private List<MidiEvent> CreateTrack()
153153
{
154154
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.Copyright, 0));
155155
}
156-
// 0xFFFFFFFF?
157-
else if ((entry.Modifier & 0xFF000000) == 0xFF000000)
156+
// section
157+
else if ((entry.Modifier & 0xFF000000) == 0x09000000)
158158
{
159-
// ignore
159+
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.TextEvent, start));
160160
}
161-
// Just a section
161+
// unknown
162162
else
163163
{
164-
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.TextEvent, start));
164+
track.Add(new NAudio.Midi.TextEvent($"UNK_{entry.Modifier:X}_{entry.Text}", MetaEventType.Marker, start));
165165
}
166166
}
167+
// 0xFFFFFFFF?
168+
else if ((entry.Modifier & 0xFF000000) == 0xFF000000)
169+
{
170+
// ignore
171+
}
172+
else
173+
{
174+
track.Add(new NAudio.Midi.TextEvent($"UNK_{entry.Modifier:X}", MetaEventType.Marker, start));
175+
}
167176
continue;
168177
}
169178

179+
// Lyric Marker
180+
if ((entry.Modifier & 0xFFFFFF00) == 0x1100)
181+
{
182+
string lyricMarker;
183+
int markerMod = entry.Modifier & 0xFF;
184+
if (markerMod == 1)
185+
lyricMarker = "LYRIC_PAGE";
186+
else if (markerMod == 3 || markerMod == 4)
187+
lyricMarker = "LYRIC_COLOR";
188+
else
189+
lyricMarker = $"LYRIC_UNK_{markerMod}";
190+
track.Add(new NAudio.Midi.TextEvent(lyricMarker, MetaEventType.Marker, start));
191+
}
192+
170193
if (entry.Length <= 0) continue;
171194

172-
if (!string.IsNullOrEmpty(entry.Text))
195+
// Lyric
196+
if ((entry.Modifier & 0xFFFFFF00) == 0x1000)
173197
{
174-
if ((entry.Modifier & 0xFF00) == 0x1000)
175-
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.Lyric, start)); // Lyric event?
176-
else
177-
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.TextEvent, start));
198+
if (!string.IsNullOrEmpty(entry.Text))
199+
track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.Lyric, start));
178200
}
179201

180202
int noteMod = entry.Modifier & 0xFF;

Sharktooth/Mub/MubImport.cs

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ public Mub ExportToMub()
148148
var metaEvents = noteTrack
149149
.Where(x => x is TextEvent te
150150
&& (te.MetaEventType == MetaEventType.TextEvent
151-
|| te.MetaEventType == MetaEventType.Lyric
152151
|| te.MetaEventType == MetaEventType.Copyright
153-
|| te.MetaEventType == MetaEventType.CuePoint))
152+
|| te.MetaEventType == MetaEventType.CuePoint
153+
|| te.MetaEventType == MetaEventType.Marker))
154154
.Select(x => x as TextEvent);
155155

156156
foreach (var textNote in metaEvents)
157157
{
158-
// Sections and Lyrics
159-
if (textNote.MetaEventType == MetaEventType.TextEvent || textNote.MetaEventType == MetaEventType.Lyric)
158+
// Sections
159+
if (textNote.MetaEventType == MetaEventType.TextEvent)
160160
{
161161
mubNotes.Add(new MubEntry((float)NoteTicksToPos(textNote.AbsoluteTime),
162162
0x09_FF_FF_FF,
@@ -183,14 +183,32 @@ public Mub ExportToMub()
183183
0.0f,
184184
BitConverter.ToInt32(BitConverter.GetBytes(bpm),0)));
185185
}
186+
// Lyric Page
187+
else if (textNote.MetaEventType == MetaEventType.Marker && textNote.Text.ToUpper() == "LYRIC_PAGE")
188+
{
189+
mubNotes.Add(new MubEntry((float)NoteTicksToPos(textNote.AbsoluteTime),
190+
0x00_00_11_01,
191+
0.0f,
192+
0));
193+
}
186194
}
187195

188-
// 0xFFFFFFFF note at beginning of chart needed for DJH2 Beginner charts
196+
// 0xFFFFFFFF note at beginning of chart needed
189197
mubNotes.Add(new MubEntry(0.0f,
190198
-1, // 0xFFFFFFFF
191199
0.0f,
192200
0));
193201

202+
var lyricEvents = new Queue<TextEvent>(noteTrack
203+
.Where(x => x is TextEvent te
204+
&& (te.MetaEventType == MetaEventType.Lyric))
205+
.Select(x => x as TextEvent));
206+
207+
var lyricColorEvents = new Queue<TextEvent>(noteTrack
208+
.Where(x => x is TextEvent te
209+
&& (te.MetaEventType == MetaEventType.Marker && te.Text.ToUpper() == "LYRIC_COLOR"))
210+
.Select(x => x as TextEvent));
211+
194212
var notes = noteTrack
195213
.Where(x => x is NoteOnEvent)
196214
.Select(x => x as NoteOnEvent);
@@ -199,10 +217,45 @@ public Mub ExportToMub()
199217
{
200218
double start = NoteTicksToPos(note.AbsoluteTime);
201219
double end = NoteTicksToPos(note.AbsoluteTime + note.NoteLength);
220+
int noteNumber = note.NoteNumber;
221+
string lyricString = "";
222+
223+
if (noteNumber == 3 || noteNumber == 4)
224+
{
225+
if (lyricColorEvents.Count > 0)
226+
{
227+
var lyricColor = lyricColorEvents.Peek();
228+
if (lyricColor.AbsoluteTime == note.AbsoluteTime)
229+
{
230+
lyricColorEvents.Dequeue();
231+
noteNumber += 0x1100;
232+
}
233+
else if (lyricColor.AbsoluteTime < note.AbsoluteTime)
234+
{
235+
throw new Exception($"LYRIC_COLOR marker not associated with a MIDI note: {NoteTicksToPos(lyricColor.AbsoluteTime, false) }");
236+
}
237+
}
238+
}
239+
else if (lyricEvents.Count > 0)
240+
{
241+
var lyricEvent = lyricEvents.Peek();
242+
if (lyricEvent.AbsoluteTime == note.AbsoluteTime)
243+
{
244+
lyricString = lyricEvent.Text;
245+
lyricEvents.Dequeue();
246+
noteNumber += 0x1000;
247+
}
248+
else if (lyricEvent.AbsoluteTime < note.AbsoluteTime)
249+
{
250+
throw new Exception($"Lyric \"{lyricEvent.Text}\"not associated with a MIDI note: {NoteTicksToPos(lyricEvent.AbsoluteTime, false) }");
251+
}
252+
}
253+
202254
mubNotes.Add(new MubEntry((float)start,
203-
note.NoteNumber,
255+
noteNumber,
204256
(float)(end - start),
205-
note.Velocity - 1));
257+
note.Velocity - 1,
258+
lyricString));
206259
}
207260

208261
// DJ Hero 2 effects

0 commit comments

Comments
 (0)