Author: ken1.64881098.dev
(2011/06/03 15:47) 12 months ago
23
private const int STATE_CLOSE = 2;
24
private const int STATE_PLAYING = 3;
25
26
public uint Division { set; get; }
27
public CLI()
28
{
29
this.init();
30
...
31
public void init()
33
32
34
master = new MidiMaster();
35
player = new MidiPlayer();
36
player = new MidiPlayer(master.Division);
}
37
38
int PlayTrack = 0;
39
253
255
254
256
MidiFileReader reader = new MidiFileReader();
257
List<MiOpe> miList = reader.Read(importFileName);
258
List<MiOpe> miList = reader.Read(importFileName, master.Division);
259
if (miList != null)
260
261
59
<Compile Include="MiParseException.cs" />
60
<Compile Include="MiParser.cs" />
61
<Compile Include="mi\cc\MiBendrange.cs" />
62
<Compile Include="mi\cc\MiCc.cs" />
<Compile Include="mi\cc\MiExpression.cs" />
63
<Compile Include="mi\cc\MiPan.cs" />
64
<Compile Include="mi\MiChoking.cs" />
65
5
6
namespace mi.mi
7
8
class MiChorus : MiCc
class MiChorus : MiControlChange
9
10
public string CHORUS_STR = "chorus";
11
protected override byte getControlChangeNo()
class MiCc : MiOpe
abstract class MiControlChange : MiOpe
// ControlChange関連
private string CC_STR = "cc";
12
private string NO_STR = "no";
13
public byte No { set; get; }
14
15
// value関連
16
private Boolean ControlChangeParseOK = false;
17
public string VALUE_STR = "value";
public string NOTELEN_STR = "note";
18
public uint Len { set; get; }
19
20
public MiCc()
21
public MiControlChange()
22
this.Len = 0;
129
return listData;
124
130
125
131
126
132
public override string getLine()
127
abstract protected byte getControlChangeNo();
133
134
StringBuilder sb = new StringBuilder();
135
136
sb.Append(base.getLine());
137
sb.Append(CC_STR);
138
sb.Append("\t");
139
sb.Append(NO_STR);
140
sb.Append("=");
141
sb.Append(No);
142
143
sb.Append("value=");
144
sb.Append(this.Value);
145
146
sb.Append("ch=");
147
sb.Append(this.Channel + 1);
148
149
return sb.ToString();
150
151
152
virtual protected byte getControlChangeNo()
153
154
return No;
155
156
128
157
namespace mi.mi.cc
class MiExpression : MiCc
class MiExpression : MiControlChange
public string EXP_STR = "expression";
class MiModulation : MiCc
class MiModulation : MiControlChange
public string MODULATION_STR = "modulation";
class MiPan : MiCc
class MiPan : MiControlChange
public string PAN_STR = "pan";
class MiReverb : MiCc
class MiReverb : MiControlChange
public string REVERB_STR = "reverb";
class MiVolume : MiCc
class MiVolume : MiControlChange
public string VOLUME_STR = "volume";
public string CHANNEL_STR = "ch";
public uint Channel { set; get; }
// Len関連
public MiOpe()
/// <summary>
///
/// </summary>
public static int[] GUITAR_G_CODE = { G[3], B[3], D[4], G[4], B[4], G[5] };
public static int[] GUITAR_A_CODE = { A[3], E[4], A[4], C[5]+1, E[5] };
public static int[] GUITAR_B_CODE = { F[3]+1, B[3], F[4]+1, B[4], D[5]+1, F[5]+1 };
public const int DIVISION = 120;
public static uint DIVISION = 120;
public const byte STATUS_NOTE_ON = 0x09;
public const byte STATUS_NOTE_OFF = 0x08;
56
public const int KEY_FLAT = -1;
57
public const int KEY_DOUBLE_FLAT = -2;
58
public const int NOTE_4 = DIVISION;
public static uint NOTE_4 = DIVISION;
public const int NOTE_8 = NOTE_4 / 2;
public static uint NOTE_8 = NOTE_4 / 2;
public const int NOTE_16 = NOTE_8 / 2;
public static uint NOTE_16 = NOTE_8 / 2;
public const int NOTE_32 = NOTE_16 / 2;
public static uint NOTE_32 = NOTE_16 / 2;
public const int NOTE_2 = DIVISION * 2;
public static uint NOTE_2 = DIVISION * 2;
public const int NOTE_3 = NOTE_2 + NOTE_1;
public static uint NOTE_3 = NOTE_2 + NOTE_1;
public const int NOTE_1 = NOTE_2 * 2;
public static uint NOTE_1 = NOTE_2 * 2;
66
67
public const int NOTE_45 = NOTE_4 + NOTE_8;
public static uint NOTE_45 = NOTE_4 + NOTE_8;
68
public const int NOTE_85 = NOTE_8 + NOTE_16;
public static uint NOTE_85 = NOTE_8 + NOTE_16;
69
public const int NOTE_165 = NOTE_16 + NOTE_32;
public static uint NOTE_165 = NOTE_16 + NOTE_32;
70
71
// 連譜
72
public const int NOTE_166 = NOTE_4 / 6;
public static uint NOTE_166 = NOTE_4 / 6;
73
public const int NOTE_163 = NOTE_8 / 3;
public static uint NOTE_163 = NOTE_8 / 3;
74
75
public const int PARSE_ERROR = 0;
76
public const int PARSE_MIDIDATA = 1;
public byte[] data;
public List<MiOpe> Read(string fileName)
public List<MiOpe> Read(string fileName, uint Division)
try
int position = 0;
short Format;
short TruckNum;
short Division;
// Get Chunk Type
byte[] Mthd = reader.ReadBytes(4);
53
52
54
// Get division
55
short division = reader.ReadInt16();
Division = BigLittleConverter16(division);
Division = (uint)BigLittleConverter16(division);
position += 2;
// Truck毎のサイズ、データを読み取る。(解析はしない。)
90
List<MiOpe> miList = new List<MiOpe>();
89
91
// TruckDataByteArray解析。
92
byte channel = 1;
93
Boolean rpnLSBOn = false;
94
Boolean rpnMSBOn = false;
95
Boolean dataLSBOn = false;
96
Boolean dataMSBOn = false;
97
foreach (TruckDataByteArray info in truckDataInfoList)
98
99
uint dataPosition = 0;
113
for (int i = 0; i < 4; i++)
109
114
110
115
byte tmp = info.data[dataPosition++];
111
116
deltaTime = (deltaTime << 7) + (byte)(tmp & 0x7F);
112
//deltaTime = (deltaTime << 7) + (byte)(tmp & 0x7F);
deltaTimeBuf[i] = tmp;
117
if (tmp < 0x80) break;
118
119
120
totalTick += deltaTime;
totalTick += (uint)GetIntegerFromMSB(deltaTimeBuf);
121
// midiData.PrevTick = (uint)deltaTime;
122
123
uint bar = totalTick / (MidiInfo.DIVISION * 4);
uint bar = (uint)(totalTick / (Division * 4));
uint pos = totalTick % (MidiInfo.DIVISION * 4);
uint pos = (uint)(totalTick % (Division * 4));
// EventTypeを取得する
prevStatus = currentStatus;
// コントロールチェンジ
250
else if ((currentStatus >> 4) == MidiInfo.STATUS_CONTROLCHANGE)
251
252
MiCc mi;
MiControlChange mi;
// チャネルボイスメッセージ
if (nextData < 120)
MiCc miCc = new MiCc();
miCc.Bar = bar;
miCc.Pos = pos;
miCc.Channel = channel;
miCc.No = nextData;
262
miCc.Value = info.data[dataPosition++];
263
miList.Add(miCc);
264
/*
switch (nextData)
265
266
case MidiInfo.CONTROL_CHANGE_CHORUS:
267
331
dataPosition++;
336
332
break;
337
333
default:
338
334
mi = new MiCc();
339
mi = new MiControlChange();
335
mi.Bar = bar;
340
mi.Pos = pos;
341
mi.Channel = channel;
342
miList.Add(mi);
345
346
347
348
*/
343
349
344
// チャネルモードメッセージ
350
else
351
526
532
527
private int GetIntegerFromMSB(byte[] tmp)
533
528
534
535
529
int data = 0;
536
530
for (int i = 0; i < tmp.Length; i++)
537
531
538
data += ((tmp[i] & 0x7F) << (7 * i));
539
540
return data;
541
542
543
544
for (int i = tmp.Length-1;i>=0;i--)
545
546
data = (data << 7) | (tmp[i] & 0x7F);
547
548
549
550
551
552
553
byte t = tmp[i];
554
data <<= 7;
555
data |= t & 0x7F;
556
if ((t < 0x80)) break;
557
558
559
560
561
562
private List<AbstractMidiData> MasterTrack;
public uint Division{set;get;}
public List<AbstractMidiData> getMasterTrack()
return MasterTrack;
40
42
41
public MidiMaster()
43
44
45
Division = MidiInfo.DIVISION;
TrackData = new List<AbstractMidiData>[MidiInfo.MIDI_TRACK_NUM + 1];
46
47
for (int i = 0; i < MidiInfo.MIDI_TRACK_NUM; i++)
48
private int OpenDeviceID = MIDI.MAPPAR;
public MidiPlayer()
public MidiPlayer(uint division)
this.Division = division;
Tempo = 120;
Tempo2Msec();
// Close();
uint Division { set; get; }
private void Tempo2Msec()
MsecPerTick = (60.0 * 1000.0 / (Tempo * 120.0));
MsecPerTick = (60.0 * 1000.0 / (Tempo * this.Division));
public void Close()
214
lexResultList = ExceptCommentList;
215
216
217
218
219
this.bar = lexResultList[0];
220
this.pos = lexResultList[1];
221
222
// string bar = this.bar.ToString();
223
// string pos = this.pos.ToString();
224
225
this.opeStr = lexResultList[2];
226
lexResultList.RemoveAt(0);
227
281
string className = "Mi" + VBStrings.Left(opeStr, 1).ToUpper() + VBStrings.Mid(opeStr, 2);
276
282
Type classType = Type.GetType(className);
277
283
278
284
result = (MiOpe)AAAA(bar, pos, className);
279
if (className == "ParsePattern")
285
if (result == null)
286
280
287
if (PatternTable.Keys.Contains(opeStr))
return null;
288
289
MiPattern patternData = (MiPattern)ParsePattern(bar, pos);
290
291
List<AbstractMidiData> tmpList = PatternTable[opeStr];
292
foreach (AbstractMidiData idata in tmpList)
293
294
if (idata is MidiData)
295
296
MidiData data = (MidiData)idata.Clone();
297
data.Bar += (uint)(uint.Parse(bar) - 1);
298
data.Channel = patternData.Channel;
299
300
retList.Add(data);
301
302
303
304
lexResultList.Clear();
305
return retList;
306
307
308
309
throw new MiParseException();
310
311
MiOpe testMiOpe = getMiOpe(bar, pos, className);
return testMiOpe;
312
313
314
string methodName = "Parse" + VBStrings.Left(opeStr,1).ToUpper() + VBStrings.Mid(opeStr,2);
328
329
330
patternData.PatternName = opeStr;
return patternData;
353
// return null;
354
355
356
315
357
return result;
316
358
359
360
361
362
363
364
365
366
retList = result.getMidiData();
367
368
369
370
371
372
317
373
318
374
private void Pattern1(string bar, string pos, MiOpe result)
319
401
nextPos = tmpNextPos % (MidiInfo.DIVISION * 4);
402
403
404
private Object AAAA(string bar, string pos, string className)
private MiOpe getMiOpe(string bar, string pos, string className)
405
406
Type classType = Type.GetType("mi.mi."+className);
407
if (classType == null)
352
413
414
415
416
object abc = classType.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
MiOpe retMiOpe = (MiOpe)classType.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
// bar
417
Object[] barArgs = { "bar", bar };
418
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, barArgs);
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, barArgs);
419
// pos
420
Object[] posArgs = { "pos", pos };
421
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, posArgs);
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, posArgs);
422
423
Object[] args = new Object[2];
424
for (int i = 0; i < lexResultList.Count; i += 2)
425
426
args[0] = lexResultList[i];
427
args[1] = lexResultList[i + 1];
375
428
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, args);
376
classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, args);
429
377
430
378
431
uint numBar = uint.Parse(bar);
379
434
prevPos = numPos;
382
435
383
436
PropertyInfo tmp = classType.GetProperty("Len");
384
385
uint tmpLne = (uint)tmp.GetValue(retMiOpe, null);
437
386
438
if (tmp != null)
387
if (tmpLne != 0)
439
388
440
// uint tmpNextPos = numPos + result.Len;
441
uint tmpNextPos = numPos;
389
442
nextBar = numBar + tmpNextPos / (MidiInfo.DIVISION * 4);
390
443
391
444
392
445
393
446
return abc;
394
return (MiOpe)retMiOpe;
447
395
448
396
449
private MiOpe ParsePattern(string bar, string pos)
397
public uint Division { set; get; }{{{{player = new MidiPlayer(master.Division);List<MiOpe> miList = reader.Read(importFileName, master.Division);{{{{class MiChorus : MiCcclass MiChorus : MiControlChange{{{{class MiCc : MiOpeabstract class MiControlChange : MiOpe{{// ControlChange関連private string CC_STR = "cc";private string NO_STR = "no";public byte No { set; get; }public uint Len { set; get; }public uint Len { set; get; }public MiCc()public MiControlChange(){{public override string getLine()abstract protected byte getControlChangeNo();{StringBuilder sb = new StringBuilder();sb.Append(base.getLine());sb.Append(CC_STR);sb.Append("\t");sb.Append(NO_STR);sb.Append("=");sb.Append(No);sb.Append("\t");sb.Append("value=");sb.Append(this.Value);sb.Append("\t");sb.Append("ch=");sb.Append(this.Channel + 1);return sb.ToString();}virtual protected byte getControlChangeNo(){return No;}{{class MiExpression : MiCcclass MiExpression : MiControlChange{{{{class MiModulation : MiCcclass MiModulation : MiControlChange{{{{class MiPan : MiCcclass MiPan : MiControlChange{{{{class MiReverb : MiCcclass MiReverb : MiControlChange{{{{class MiVolume : MiCcclass MiVolume : MiControlChange{{public uint Channel { set; get; }public uint Channel { set; get; }public uint Len { set; get; }{public static int[] GUITAR_G_CODE = { G[3], B[3], D[4], G[4], B[4], G[5] };public static int[] GUITAR_G_CODE = { G[3], B[3], D[4], G[4], B[4], G[5] };public static int[] GUITAR_A_CODE = { A[3], E[4], A[4], C[5]+1, E[5] };public static int[] GUITAR_A_CODE = { A[3], E[4], A[4], C[5]+1, E[5] };public static int[] GUITAR_B_CODE = { F[3]+1, B[3], F[4]+1, B[4], D[5]+1, F[5]+1 };public static int[] GUITAR_B_CODE = { F[3]+1, B[3], F[4]+1, B[4], D[5]+1, F[5]+1 };public const int DIVISION = 120;public static uint DIVISION = 120;public const int NOTE_4 = DIVISION;public static uint NOTE_4 = DIVISION;public const int NOTE_8 = NOTE_4 / 2;public static uint NOTE_8 = NOTE_4 / 2;public const int NOTE_16 = NOTE_8 / 2;public static uint NOTE_16 = NOTE_8 / 2;public const int NOTE_32 = NOTE_16 / 2;public static uint NOTE_32 = NOTE_16 / 2;public const int NOTE_2 = DIVISION * 2;public static uint NOTE_2 = DIVISION * 2;public const int NOTE_3 = NOTE_2 + NOTE_1;public static uint NOTE_3 = NOTE_2 + NOTE_1;public const int NOTE_1 = NOTE_2 * 2;public static uint NOTE_1 = NOTE_2 * 2;public const int NOTE_45 = NOTE_4 + NOTE_8;public static uint NOTE_45 = NOTE_4 + NOTE_8;public const int NOTE_85 = NOTE_8 + NOTE_16;public static uint NOTE_85 = NOTE_8 + NOTE_16;public const int NOTE_165 = NOTE_16 + NOTE_32;public static uint NOTE_165 = NOTE_16 + NOTE_32;public const int NOTE_166 = NOTE_4 / 6;public static uint NOTE_166 = NOTE_4 / 6;public const int NOTE_163 = NOTE_8 / 3;public static uint NOTE_163 = NOTE_8 / 3;public List<MiOpe> Read(string fileName, uint Division){{{{short Division;Division = (uint)BigLittleConverter16(division);Boolean rpnLSBOn = false;Boolean rpnMSBOn = false;Boolean dataLSBOn = false;Boolean dataMSBOn = false;{{{{//deltaTime = (deltaTime << 7) + (byte)(tmp & 0x7F);deltaTimeBuf[i] = tmp;totalTick += deltaTime;totalTick += (uint)GetIntegerFromMSB(deltaTimeBuf);uint bar = totalTick / (MidiInfo.DIVISION * 4);uint bar = (uint)(totalTick / (Division * 4));uint pos = totalTick % (MidiInfo.DIVISION * 4);uint pos = (uint)(totalTick % (Division * 4));{{MiCc mi;MiControlChange mi;{{{{mi = new MiCc();mi = new MiControlChange();{{{{{{public uint Division{set;get;}{{{{public MidiPlayer(uint division){{uint Division { set; get; }{{MsecPerTick = (60.0 * 1000.0 / (Tempo * 120.0));MsecPerTick = (60.0 * 1000.0 / (Tempo * this.Division));// string bar = this.bar.ToString();// string pos = this.pos.ToString();result = (MiOpe)AAAA(bar, pos, className);if (className == "ParsePattern")if (result == null){{if (PatternTable.Keys.Contains(opeStr))return null;{MiPattern patternData = (MiPattern)ParsePattern(bar, pos);List<AbstractMidiData> tmpList = PatternTable[opeStr];foreach (AbstractMidiData idata in tmpList){if (idata is MidiData){MidiData data = (MidiData)idata.Clone();data.Bar += (uint)(uint.Parse(bar) - 1);data.Channel = patternData.Channel;retList.Add(data);}}lexResultList.Clear();return retList;}else{throw new MiParseException();}{{{return patternData;/*List<AbstractMidiData> tmpList = PatternTable[opeStr];foreach (AbstractMidiData idata in tmpList){if (idata is MidiData){MidiData data = (MidiData)idata.Clone();data.Bar += (uint)(uint.Parse(bar) - 1);data.Channel = patternData.Channel;retList.Add(data);}}lexResultList.Clear();return retList;*/{{/*if (result == null){throw new MiParseException();// return null;}else{retList = result.getMidiData();lexResultList.Clear();return retList;}*/private Object AAAA(string bar, string pos, string className)private MiOpe getMiOpe(string bar, string pos, string className){{Type classType = Type.GetType("mi.mi."+className);Type classType = Type.GetType("mi.mi."+className);object abc = classType.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);MiOpe retMiOpe = (MiOpe)classType.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);// barObject[] barArgs = { "bar", bar };Object[] barArgs = { "bar", bar };classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, barArgs);classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, barArgs);Object[] posArgs = { "pos", pos };Object[] posArgs = { "pos", pos };classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, posArgs);classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, posArgs);{{classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, abc, args);classType.InvokeMember("Add", BindingFlags.InvokeMethod, null, retMiOpe, args);PropertyInfo tmp = classType.GetProperty("Len");PropertyInfo tmp = classType.GetProperty("Len");if (tmp != null)if (tmpLne != 0){{// uint tmpNextPos = numPos + result.Len;return abc;return (MiOpe)retMiOpe;