public MidiEventBase(MidiEventBase aMidiEvent) { delta = aMidiEvent.GetDelta(); state = ( byte )(aMidiEvent.GetState() | aMidiEvent.GetChannel()); data1 = aMidiEvent.GetData1(); data2 = aMidiEvent.GetData2(); }
public static MidiEventBase Execute(int aDelta, byte aState, AByteArray aByteArray) { MidiEventBase lMidiEvent = null; switch (aState & 0xF0) { case 0x80: lMidiEvent = new MidiEventNoteOff(aDelta, aState, aByteArray); break; case 0x90: MidiEventNoteOn lNoteOn = new MidiEventNoteOn(aDelta, aState, aByteArray); if (lNoteOn.GetVelocity() == 0) { lMidiEvent = new MidiEventNoteOff(lNoteOn); } else { lMidiEvent = lNoteOn; } break; case 0xA0: lMidiEvent = new MidiEventKeyPressure(aDelta, aState, aByteArray); break; case 0xB0: lMidiEvent = new MidiEventControlChange(aDelta, aState, aByteArray); break; case 0xC0: lMidiEvent = new MidiEventProgramChange(aDelta, aState, aByteArray); break; case 0xD0: lMidiEvent = new MidiEventChannelPressure(aDelta, aState, aByteArray); break; case 0xE0: lMidiEvent = new MidiEventPitchWheelChange(aDelta, aState, aByteArray); break; case 0xF0: lMidiEvent = new MidiEventSystemExclusive(aDelta, aState, aByteArray); break; default: // 未定義のイベントメッセージ. Logger.Error("Undefined Midi Event:" + aState); throw new Exception(); } return(lMidiEvent); }
// トラックのイベントを読み込む. private void ReadTrack(AByteArray aByteArray) { int lDelta = 0; byte lStatePre = 0; int lPositionPre = aByteArray.Position; // トラック終了まで読み込む. while (aByteArray.Position < lPositionPre + size) { lDelta += GetVariableLengthByte(aByteArray); byte lState = aByteArray.ReadByte(); // ランニングステータス対応. if (lState < 0x80) { lState = lStatePre; aByteArray.SubPosition(1); } lStatePre = lState; if (lState != 0xFF) { // MIDIイベント読み込み. MidiEventBase lMidiEvent = MidiEventReader.Execute(lDelta, lState, aByteArray); midiEventList.Add(lMidiEvent); } else { // メタイベント読み込み. MetaEventBase lMetaEvent = MetaEventReader.Execute(lDelta, aByteArray); metaEventList.Add(lMetaEvent); } } }
public MidiEventNoteOff(MidiEventBase aMidiEvent) : base(aMidiEvent) { }