1
+
2
+ using NAudio . Midi ;
3
+ using System . Runtime . CompilerServices ;
4
+ using static IronPython . Modules . _ast ;
5
+
6
+ namespace mml2vgmIDEx64
7
+ {
8
+ internal class SimpleMIDIKbd
9
+ {
10
+
11
+ public bool previewMode = true ;
12
+
13
+ public SimpleMIDIKbd ( FrmMain parent , Setting setting )
14
+ {
15
+ this . parent = parent ;
16
+ this . setting = setting ;
17
+
18
+ if ( setting . midiKbd . simpleChangePreviewMode_Type != - 1 )
19
+ shortCut [ setting . midiKbd . simpleChangePreviewMode_Type ] . Add ( setting . midiKbd . simpleChangePreviewMode_Adr , ChangePreviewMode ) ;
20
+ if ( setting . midiKbd . simpleUndo_Type != - 1 )
21
+ shortCut [ setting . midiKbd . simpleUndo_Type ] . Add ( setting . midiKbd . simpleUndo_Adr , Undo ) ;
22
+ if ( setting . midiKbd . simpleWriteSpace_Type != - 1 )
23
+ shortCut [ setting . midiKbd . simpleWriteSpace_Type ] . Add ( setting . midiKbd . simpleWriteSpace_Adr , WriteSpace ) ;
24
+ if ( setting . midiKbd . simpleWriteEnter_Type != - 1 )
25
+ shortCut [ setting . midiKbd . simpleWriteEnter_Type ] . Add ( setting . midiKbd . simpleWriteEnter_Adr , WriteEnter ) ;
26
+
27
+ //shortCut[(int)enmTyp.ControlChange].Add(97, ChangePreviewMode);
28
+ //shortCut[(int)enmTyp.ControlChange].Add(96, Undo);
29
+ //shortCut[(int)enmTyp.Note].Add(48, ChangePreviewMode);
30
+ //shortCut[(int)enmTyp.Note].Add(50, Undo);
31
+ }
32
+
33
+ public void StartMIDIInMonitoring ( )
34
+ {
35
+ if ( setting . midiKbd . MidiInDeviceName == "" )
36
+ return ;
37
+ ReleaseMIDIIn ( ) ;
38
+ RegistMIDIIn ( ) ;
39
+ }
40
+
41
+ public void StopMIDIInMonitoring ( )
42
+ {
43
+ if ( midiin == null ) return ;
44
+ ReleaseMIDIIn ( ) ;
45
+ }
46
+
47
+
48
+
49
+ private Setting setting ;
50
+ private MidiIn midiin = null ;
51
+ private FrmMain parent = null ;
52
+ private const string notes = "c c+d d+e f f+g g+a a+b " ;
53
+ private int oldOct = - 1 ;
54
+ private enum enmTyp : int
55
+ {
56
+ ControlChange = 0 ,
57
+ Note
58
+ }
59
+
60
+ private Dictionary < int , Action < int > > [ ] shortCut = [ [ ] , [ ] ] ;
61
+
62
+ private void ReleaseMIDIIn ( )
63
+ {
64
+ if ( midiin == null ) return ;
65
+
66
+ try
67
+ {
68
+ midiin . Stop ( ) ;
69
+ midiin . Dispose ( ) ;
70
+ midiin . MessageReceived -= midiIn_MessageReceived ;
71
+ midiin . ErrorReceived -= midiIn_ErrorReceived ;
72
+ midiin = null ;
73
+ }
74
+ catch
75
+ {
76
+ midiin = null ;
77
+ }
78
+ }
79
+
80
+ private void RegistMIDIIn ( )
81
+ {
82
+ if ( ! setting . midiKbd . UseMIDIKeyboard ) return ;
83
+ if ( midiin != null ) return ;
84
+
85
+ for ( int i = 0 ; i < MidiIn . NumberOfDevices ; i ++ )
86
+ {
87
+ if ( setting . midiKbd . MidiInDeviceName != MidiIn . DeviceInfo ( i ) . ProductName )
88
+ continue ;
89
+
90
+ try
91
+ {
92
+ midiin = new MidiIn ( i ) ;
93
+ midiin . MessageReceived += midiIn_MessageReceived ;
94
+ midiin . ErrorReceived += midiIn_ErrorReceived ;
95
+ midiin . Start ( ) ;
96
+ break ;
97
+ }
98
+ catch
99
+ {
100
+ midiin = null ;
101
+ }
102
+ }
103
+ }
104
+
105
+ private void midiIn_ErrorReceived ( object sender , MidiInMessageEventArgs e )
106
+ {
107
+ log . ForcedWrite ( String . Format ( "Error Time {0} Message 0x{1:X8} Event {2}" ,
108
+ e . Timestamp , e . RawMessage , e . MidiEvent ) ) ;
109
+ }
110
+
111
+ private void midiIn_MessageReceived ( object sender , MidiInMessageEventArgs e )
112
+ {
113
+ if ( ! setting . midiKbd . UseMIDIKeyboard ) return ;
114
+
115
+ NoteEvent ne ;
116
+ switch ( e . MidiEvent . CommandCode )
117
+ {
118
+ case MidiCommandCode . NoteOn :
119
+ if ( e . MidiEvent is NoteOnEvent )
120
+ {
121
+ NoteOnEvent noe = ( NoteOnEvent ) e . MidiEvent ;
122
+ NoteOn ( noe . NoteNumber ) ;
123
+ }
124
+ else if ( e . MidiEvent is NoteEvent )
125
+ {
126
+ ne = ( NoteEvent ) e . MidiEvent ;
127
+ if ( ne . Velocity == 0 )
128
+ {
129
+ NoteOff ( ne . NoteNumber ) ;
130
+ }
131
+ }
132
+ break ;
133
+ case MidiCommandCode . NoteOff :
134
+ ne = ( NoteEvent ) e . MidiEvent ;
135
+ NoteOff ( ne . NoteNumber ) ;
136
+ break ;
137
+ case MidiCommandCode . ControlChange :
138
+ // ---- 押したCCがショートカットに割り当てられているかチェック
139
+ int n = ( ( int ) ( ( ControlChangeEvent ) e . MidiEvent ) . Controller ) ;
140
+ log . Write ( string . Format ( "CC:{0} {1}" , n , ( ( ControlChangeEvent ) e . MidiEvent ) . Controller ) ) ;
141
+ if ( shortCut [ ( int ) enmTyp . ControlChange ] . ContainsKey ( n ) )
142
+ {
143
+ shortCut [ ( int ) enmTyp . ControlChange ] [ n ] (
144
+ ( ( ControlChangeEvent ) e . MidiEvent ) . ControllerValue
145
+ ) ;
146
+ return ;
147
+ }
148
+ break ;
149
+ case MidiCommandCode . TimingClock :
150
+ break ;
151
+ case MidiCommandCode . AutoSensing :
152
+ break ;
153
+ default :
154
+ log . Write ( string . Format ( "MIDIevent:{0}" , e . MidiEvent . CommandCode ) ) ;
155
+ break ;
156
+ }
157
+ }
158
+
159
+ private void NoteOn ( int n )
160
+ {
161
+ // ---- 押した音程がショートカットに割り当てられているかチェック
162
+ if ( shortCut [ ( int ) enmTyp . Note ] . ContainsKey ( n ) )
163
+ {
164
+ shortCut [ ( int ) enmTyp . Note ] [ n ] ( 0 ) ;
165
+ return ;
166
+ }
167
+
168
+ // ---- 押した音程をエディタに入力する
169
+
170
+ string nt = "" ;
171
+ // オクターブ変更チェック
172
+ int oct = n / 12 ;
173
+ if ( oldOct == - 1 )
174
+ {
175
+ oldOct = oct ;
176
+ }
177
+ else if ( oldOct != oct )
178
+ {
179
+ while ( oldOct < oct )
180
+ {
181
+ nt += setting . midiKbd . simpleOctaveChange ? "<" : ">" ;
182
+ oldOct ++ ;
183
+ }
184
+ while ( oldOct > oct )
185
+ {
186
+ nt += setting . midiKbd . simpleOctaveChange ? ">" : "<" ;
187
+ oldOct -- ;
188
+ }
189
+ }
190
+
191
+ nt += notes . Substring ( ( n % 12 ) * 2 , 2 ) . Trim ( ) ;
192
+ log . Write ( string . Format ( "MIDIKbd:Note On {0}" , nt ) ) ;
193
+
194
+ // プレビューモード(試し弾き)の場合は入力せずに終了
195
+ if ( previewMode ) return ;
196
+ parent . WriteDocument ( nt ) ;
197
+ }
198
+
199
+ private void NoteOff ( int n )
200
+ {
201
+ log . Write ( string . Format ( "MIDIKbd:Note Off{0}" , n ) ) ;
202
+ }
203
+
204
+ private void ChangePreviewMode ( int _ )
205
+ {
206
+ previewMode = ! previewMode ;
207
+ parent . SetSimpleMIDIKbdPreviewMode ( previewMode ) ;
208
+ }
209
+
210
+ private void Undo ( int _ )
211
+ {
212
+ if ( previewMode ) return ;
213
+ parent . UndoDocument ( ) ;
214
+ }
215
+
216
+ private void WriteSpace ( int _ )
217
+ {
218
+ // プレビューモード(試し弾き)の場合は入力せずに終了
219
+ if ( previewMode ) return ;
220
+ parent . WriteDocument ( " " ) ;
221
+ }
222
+
223
+ private void WriteEnter ( int _ )
224
+ {
225
+ // プレビューモード(試し弾き)の場合は入力せずに終了
226
+ if ( previewMode ) return ;
227
+ parent . WriteEnter ( ) ;
228
+ }
229
+ }
230
+ }
0 commit comments