1- using Melanchall . DryWetMidi . Common ;
2- using Melanchall . DryWetMidi . Core ;
1+ using Melanchall . DryWetMidi . Core ;
32using Melanchall . DryWetMidi . Multimedia ;
43
54namespace Openthesia ;
@@ -9,6 +8,12 @@ public class IOHandle
98 public static List < int > PressedKeys { get ; private set ; } = new ( ) ;
109
1110 public static List < NoteRect > NoteRects = new ( ) ;
11+
12+ private static HashSet < int > _sustainedNotes = new ( ) ; // Keeps track of sustained notes
13+
14+ private static bool _sustainPedalActive = false ;
15+ public static bool SustainPedalActive => _sustainPedalActive ;
16+
1217 public struct NoteRect
1318 {
1419 public int KeyNum ;
@@ -22,6 +27,13 @@ public struct NoteRect
2227
2328 private static void OnKeyPress ( NoteOnEvent ev )
2429 {
30+ // Check if sustain pedal is active
31+ if ( _sustainPedalActive )
32+ {
33+ // add to sustained notes
34+ _sustainedNotes . Add ( ev . NoteNumber ) ;
35+ }
36+
2537 if ( Router . Route == Router . Routes . PlayMode )
2638 {
2739 bool isBlack = ev . GetNoteName ( ) . ToString ( ) . EndsWith ( "Sharp" ) ;
@@ -36,26 +48,55 @@ private static void OnKeyPress(NoteOnEvent ev)
3648 } ;
3749 NoteRects . Add ( note ) ;
3850 }
39-
51+ //MidiPlayer.RealTimeSoundFontPlayer.Synthesizer.ProcessMidiMessage(0, 144 /*NOTE ON*/, ev.NoteNumber, ev.Velocity);
52+ MidiPlayer . SoundFontEngine ? . PlayNote ( 0 , ev . NoteNumber , ev . Velocity ) ;
4053 PressedKeys . Add ( ev . NoteNumber ) ;
4154 }
4255
4356 private static void OnKeyRelease ( NoteOffEvent ev )
4457 {
58+ if ( _sustainPedalActive )
59+ {
60+ // If sustain pedal is active, don't stop the note immediately
61+ _sustainedNotes . Add ( ev . NoteNumber ) ;
62+ }
63+ else
64+ {
65+ // If sustain pedal is not active, stop the note immediately
66+ //MidiPlayer.RealTimeSoundFontPlayer.Synthesizer.ProcessMidiMessage(0, 128, ev.NoteNumber, ev.Velocity);
67+ MidiPlayer . SoundFontEngine ? . StopNote ( 0 , ev . NoteNumber ) ;
68+ }
69+
4570 if ( Router . Route == Router . Routes . PlayMode )
4671 {
4772 int index = NoteRects . FindIndex ( x => x . KeyNum == ev . NoteNumber && ! x . WasReleased ) ;
4873 var n = NoteRects [ index ] ;
4974 //var n = NoteRects.Find(x => x.KeyNum == ev.NoteNumber && !x.WasReleased);
5075 //var n = NoteRects[NoteRects.Count - 1];
5176 n . WasReleased = true ;
52- n . FinalTime = n . Time ;
77+ n . FinalTime = n . Time ;
5378 NoteRects [ index ] = n ;
5479 }
55-
80+
5681 PressedKeys . Remove ( ev . NoteNumber ) ;
5782 }
5883
84+ private static void OnSustainPedalOn ( )
85+ {
86+ _sustainPedalActive = true ;
87+ }
88+
89+ private static void OnSustainPedalOff ( )
90+ {
91+ _sustainPedalActive = false ;
92+ // Stop all sustained notes when the sustain pedal is released
93+ foreach ( var note in _sustainedNotes )
94+ {
95+ MidiPlayer . SoundFontEngine ? . StopNote ( 0 , note ) ;
96+ }
97+ _sustainedNotes . Clear ( ) ;
98+ }
99+
59100 public static void OnEventReceived ( object sender , MidiEventReceivedEventArgs e )
60101 {
61102 var eType = e . Event . EventType ;
@@ -68,6 +109,20 @@ public static void OnEventReceived(object sender, MidiEventReceivedEventArgs e)
68109 case MidiEventType . NoteOff :
69110 OnKeyRelease ( ( NoteOffEvent ) e . Event ) ;
70111 break ;
112+ case MidiEventType . ControlChange :
113+ var controlChangeEvent = ( ControlChangeEvent ) e . Event ;
114+ if ( controlChangeEvent . ControlNumber == 64 ) // 64 is the sustain pedal
115+ {
116+ if ( controlChangeEvent . ControlValue > 63 ) // Sustain pedal ON (value greater than 63)
117+ {
118+ OnSustainPedalOn ( ) ;
119+ }
120+ else // Sustain pedal OFF (value <= 63)
121+ {
122+ OnSustainPedalOff ( ) ;
123+ }
124+ }
125+ break ;
71126 }
72127 }
73128
@@ -87,6 +142,20 @@ public static void OnEventReceived(object sender, MidiEventPlayedEventArgs e)
87142 case MidiEventType . NoteOff :
88143 OnKeyRelease ( ( NoteOffEvent ) e . Event ) ;
89144 break ;
145+ case MidiEventType . ControlChange :
146+ var controlChangeEvent = ( ControlChangeEvent ) e . Event ;
147+ if ( controlChangeEvent . ControlNumber == 64 ) // 64 is the sustain pedal
148+ {
149+ if ( controlChangeEvent . ControlValue > 63 ) // Sustain pedal ON (value greater than 63)
150+ {
151+ OnSustainPedalOn ( ) ;
152+ }
153+ else // Sustain pedal OFF (value <= 63)
154+ {
155+ OnSustainPedalOff ( ) ;
156+ }
157+ }
158+ break ;
90159 }
91160 }
92161
0 commit comments