@@ -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}
0 commit comments