Skip to content

Commit cac7959

Browse files
committed
support djh2 effects using a new EFFECTS midi track
1 parent b089937 commit cac7959

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

Sharktooth/Mub/MubExport.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public void Export(string path)
2222
MidiEventCollection mid = new MidiEventCollection(1, DELTA_TICKS_PER_QUARTER);
2323
mid.AddTrack(CreateTempoTrack());
2424
mid.AddTrack(CreateTrack());
25+
List<MidiEvent> effectsTrack = CreateEffectsTrack();
26+
if (effectsTrack != null)
27+
mid.AddTrack(effectsTrack);
2528

2629
MidiFile.Export(path, mid);
2730
}
@@ -51,6 +54,10 @@ private List<MidiEvent> CreateTrack()
5154
long start = (long)(entry.Start * ticksPerMeasure);
5255
long end = (long)(start + (entry.Length * ticksPerMeasure));
5356

57+
// DJH2 effect type - 0x05FFFFFF through 0x06000009
58+
// Should not be added to the notes track
59+
if ((entry.Modifier & 0xFF000000) == 0x06000000 || entry.Modifier == 0x05FFFFFF) continue;
60+
5461
if ((entry.Modifier & 0xFFFFFF) == 0xFFFFFF)
5562
{
5663
// Text event?
@@ -87,5 +94,46 @@ private List<MidiEvent> CreateTrack()
8794
track.Add(new MetaEvent(MetaEventType.EndTrack, 0, track.Last().AbsoluteTime));
8895
return track;
8996
}
97+
98+
private List<MidiEvent> CreateEffectsTrack()
99+
{
100+
List<MidiEvent> effects = null;
101+
102+
int ticksPerMeasure = DELTA_TICKS_PER_QUARTER * 4; // Assume 4/4
103+
foreach (var entry in _mub.Entries)
104+
{
105+
long start = (long)(entry.Start * ticksPerMeasure);
106+
long end = (long)(start + (entry.Length * ticksPerMeasure));
107+
108+
if ((entry.Modifier & 0xFF000000) == 0x06000000)
109+
{
110+
if (effects == null)
111+
{
112+
effects = new List<MidiEvent>();
113+
effects.Add(new NAudio.Midi.TextEvent("EFFECTS", MetaEventType.SequenceTrackName, 0));
114+
}
115+
effects.Add(new NoteEvent(start, 1, MidiCommandCode.NoteOn, entry.Modifier & 0xFF, 100));
116+
effects.Add(new NoteEvent(end, 1, MidiCommandCode.NoteOff, entry.Modifier & 0xFF, 100));
117+
continue;
118+
}
119+
}
120+
121+
if (effects != null)
122+
{
123+
effects.Sort((x, y) =>
124+
{
125+
if (x.AbsoluteTime < y.AbsoluteTime)
126+
return -1;
127+
else if (x.AbsoluteTime > y.AbsoluteTime)
128+
return 1;
129+
else
130+
return 0;
131+
});
132+
133+
// Adds end track
134+
effects.Add(new MetaEvent(MetaEventType.EndTrack, 0, effects.Last().AbsoluteTime));
135+
}
136+
return effects;
137+
}
90138
}
91139
}

Sharktooth/Mub/MubImport.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,29 @@ public Mub ExportToMub()
6262
textNote.Text));
6363
}
6464

65+
// DJ Hero 2 effects
66+
var effectTrack = existingTracks.Keys
67+
.Where(x => x == "EFFECTS")
68+
.Select(x => existingTracks[x])
69+
.FirstOrDefault();
70+
71+
if (effectTrack != null)
72+
{
73+
var effects = effectTrack
74+
.Where(x => x is NoteOnEvent)
75+
.Select(x => x as NoteOnEvent);
76+
77+
foreach (var effect in effects)
78+
{
79+
if (effect.Velocity <= 0)
80+
continue;
81+
82+
mubNotes.Add(new MubEntry((effect.AbsoluteTime / (DeltaTicksPerQuarter * 4)),
83+
effect.NoteNumber + 0x06_00_00_00,
84+
(effect.NoteLength / (DeltaTicksPerQuarter * 4))));
85+
}
86+
}
87+
6588
return new Mub()
6689
{
6790
Version = 2,

0 commit comments

Comments
 (0)