Skip to content

Commit 8b6e49a

Browse files
author
kumatan
committed
TAG759 2024/12/21
IDE:MIDI鍵盤の機能をシンプルなものに変更。 鍵盤を弾くことによってその音程がエディタに入力することが出来ます。 初期状態ではプレビューモードになっているので、 切り替えに割り当てられている鍵盤又はコントロールボタンを押し、入力モードに切り替えます。 モードは左下のステータスバーに表示されます。 [Prv] プレビューモード [Ins] 入力モード  アンドゥ、空白、改行(パート情報補完付き)の入力も可能です。 割り当ては設定画面で変更が可能です。 初期割り当ては  プレビューモード切り替え 鍵盤48 (o3c)  アンドゥ  鍵盤50 (o3d)  空白  鍵盤52 (o3e)  改行  鍵盤53 (o3f) です。 相対オクターブコマンドを逆転させることも可能です。
1 parent 9d07c3a commit 8b6e49a

File tree

13 files changed

+1475
-725
lines changed

13 files changed

+1475
-725
lines changed

mml2vgm/CHANGE.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
11
�X�V����
2+
TAG759 2024/12/21
3+
IDE:MIDI���Ղ̋@�\���V���v���Ȃ��̂ɕύX�B
4+
���Ղ�e�����Ƃɂ���Ă��̉������G�f�B�^�ɓ��͂��邱�Ƃ��o���܂��B
5+
������Ԃł̓v���r���[���[�h�ɂȂ��Ă���̂ŁA
6+
�؂�ւ��Ɋ��蓖�Ă��Ă��錮�Ֆ��̓R���g���[���{�^���������A���̓��[�h�ɐ؂�ւ��܂��B
7+
���[�h�͍����̃X�e�[�^�X�o�[�ɕ\������܂��B
8+
[Prv] �v���r���[���[�h
9+
[Ins] ���̓��[�h
10+
�@�A���h�D�A�󔒁A���s(�p�[�g���⊮�t��)�̓��͂��”\�ł��B
11+
���蓖�Ă͐ݒ��ʂŕύX���”\�ł��B
12+
�������蓖�Ă�
13+
�@�v���r���[���[�h�؂�ւ��@����48 (o3c)
14+
�@�A���h�D �@����50 (o3d)
15+
�@�� �@����52 (o3e)
16+
�@���s �@����53 (o3f)
17+
�ł��B
18+
���΃I�N�^�[�u�R�}���h���t�]�����邱�Ƃ��”\�ł��B
19+
220
TAG758 2024/12/17
321
Core:�p�[�g�w�肪�s���ȏꍇ�A��O���łē��삪�s����ɂȂ��Ă����̂��C���B(�x���Ƃ��Ĉ����A���̍s�͖������܂��B)
422

mml2vgm/IDE.txt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,22 @@
182182
音源chip毎の音量バランスを設定するためのウィンドウです。
183183
このウィンドウはドッキングできません。
184184

185-
MIDIキーボード(TBD)
186-
TBD
185+
MIDIキーボード
186+
鍵盤を弾くことによってその音程がエディタに入力することが出来ます。
187+
初期状態ではプレビューモードになっているので、
188+
切り替えに割り当てられている鍵盤又はコントロールボタンを押し、入力モードに切り替えます。
189+
モードは左下のステータスバーに表示されます。
190+
[Prv] プレビューモード
191+
[Ins] 入力モード
192+
 アンドゥ、空白、改行(パート情報補完付き)の入力も可能です。
193+
割り当ては設定画面で変更が可能です。
194+
初期割り当ては
195+
 プレビューモード切り替え 鍵盤48 (o3c)
196+
 アンドゥ  鍵盤50 (o3d)
197+
 空白  鍵盤52 (o3e)
198+
 改行  鍵盤53 (o3f)
199+
です。
200+
相対オクターブコマンドを逆転させることも可能です。
187201

188202
デバッグ
189203
デバッグ向けの情報を表示するウィンドウです。

mml2vgm/mml2vgmIDEx64/MMLParameter/YM2151_mucom.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void SetAssign(int ch, int pt, int pg, bool flg)
5454
chip.silentVoice[ch] = flg;
5555
chip.silentVoicePG[ch] = pt * 10 + pg;
5656

57-
midiKbd.SetAssignChipCh(EnmChip.YM2151, ch);
57+
midiKbd?.SetAssignChipCh(EnmChip.YM2151, ch);
5858
}
5959

6060
protected override void SetInstrument(outDatum od, int ch, int cc)

mml2vgm/mml2vgmIDEx64/MMLParameter/YM2608_mucom.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public void SetAssign(int ch, int pt, int pg, bool flg)
8181
chip.silentVoice[17] = flg;
8282
}
8383

84-
midiKbd.SetAssignChipCh(EnmChip.YM2608, ch);
84+
midiKbd?.SetAssignChipCh(EnmChip.YM2608, ch);
8585
}
8686

8787
protected override void SetPan(outDatum od, int ch, int cc)

mml2vgm/mml2vgmIDEx64/Setting.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3598,6 +3598,31 @@ public bool AlwaysTop
35983598
public LfoParam[] LfoParams { get => _LfoParams; set => _LfoParams = value; }
35993599
public bool UseQuantize { get => _UseQuantize; set => _UseQuantize = value; }
36003600

3601+
private bool _useOldFunction = false;
3602+
3603+
private int _simpleChangePreviewMode_Type = 1;
3604+
private int _simpleChangePreviewMode_Adr = 48;//o3c
3605+
private int _simpleUndo_Type = 1;
3606+
private int _simpleUndo_Adr = 50;//o3d
3607+
private int _simpleWriteSpace_Type = 1;
3608+
private int _simpleWriteSpace_Adr = 52;//o3e
3609+
private int _simpleWriteEnter_Type = 1;
3610+
private int _simpleWriteEnter_Adr = 53;//o3f
3611+
3612+
private bool _simpleOctaveChange = false;
3613+
3614+
public bool useOldFunction { get => _useOldFunction; set => _useOldFunction = value; }
3615+
3616+
public int simpleChangePreviewMode_Type { get => _simpleChangePreviewMode_Type; set => _simpleChangePreviewMode_Type = value; }
3617+
public int simpleChangePreviewMode_Adr { get => _simpleChangePreviewMode_Adr; set => _simpleChangePreviewMode_Adr = value; }
3618+
public int simpleUndo_Type { get => _simpleUndo_Type; set => _simpleUndo_Type = value; }
3619+
public int simpleUndo_Adr { get => _simpleUndo_Adr; set => _simpleUndo_Adr = value; }
3620+
public int simpleWriteSpace_Type { get => _simpleWriteSpace_Type; set => _simpleWriteSpace_Type = value; }
3621+
public int simpleWriteSpace_Adr { get => _simpleWriteSpace_Adr; set => _simpleWriteSpace_Adr = value; }
3622+
public int simpleWriteEnter_Type { get => _simpleWriteEnter_Type; set => _simpleWriteEnter_Type = value; }
3623+
public int simpleWriteEnter_Adr { get => _simpleWriteEnter_Adr; set => _simpleWriteEnter_Adr = value; }
3624+
public bool simpleOctaveChange { get => _simpleOctaveChange; set => _simpleOctaveChange = value; }
3625+
36013626
public MidiKbd Copy()
36023627
{
36033628
MidiKbd midiKbd = new MidiKbd();
@@ -3640,6 +3665,16 @@ public MidiKbd Copy()
36403665
midiKbd.LfoParams[i] = this.LfoParams[i].Copy();
36413666
}
36423667
}
3668+
midiKbd.useOldFunction = this.useOldFunction;
3669+
midiKbd.simpleChangePreviewMode_Type = this.simpleChangePreviewMode_Type;
3670+
midiKbd.simpleChangePreviewMode_Adr = this.simpleChangePreviewMode_Adr;
3671+
midiKbd.simpleUndo_Type = this.simpleUndo_Type;
3672+
midiKbd.simpleUndo_Adr = this.simpleUndo_Adr;
3673+
midiKbd.simpleWriteSpace_Type = this.simpleWriteSpace_Type;
3674+
midiKbd.simpleWriteSpace_Adr = this.simpleWriteSpace_Adr;
3675+
midiKbd.simpleWriteEnter_Type = this.simpleWriteEnter_Type;
3676+
midiKbd.simpleWriteEnter_Adr = this.simpleWriteEnter_Adr;
3677+
midiKbd.simpleOctaveChange=this.simpleOctaveChange;
36433678
return midiKbd;
36443679
}
36453680
}
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
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

Comments
 (0)