@@ -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